Как вводить и выводить информацию

Операции ввода/вывода в языке Си организованы посредством библиотечных функций (их довольно много). Описания заголовков библиотечных функций стандартного ввода/вывода находятся в заголовочном файле stdio.h. Чтобы библиотечные функции стали доступны программе, к ней необходимо подключить данный файл. Подключение осуществляется с помощью директивы препроцессора #include <stdio.h> помещаемой в начало программы.

Самый простой механизм ввода - чтение по одному символу из стандартного входного потока (с клавиатуры) с помощью функции getchar( ). Она имеет следующий прототип (т.е. описание заголовка):

int getchar(void);

Здесь определен тип единственного аргумента (void) и тип возвращаемого функцией значения (int).

Оператор вида: х = getchar( ); присваивает переменной х очередной вводимый символ. Переменная х должна иметь символьный или целый тип.

Заметим, что для функции getchar( ) после выбора символа необходимо нажать клавишу <Enter>. Иногда это создает определенные неудобства. Функции getch( ) и getche( ) устраняют их. Они имеют следующие прототипы:

int getch(void);

int getche(void);

Обе эти функции вводят символ сразу же после нажатия соответствующей клавиши (здесь не надо дополнительно нажимать клавишу <Enter>). Отличие между ними заключается в том, что getche( ) отображает вводимый символ на экране дисплея, а getch( ) - нет. Прототипы этих функций содержатся в файле conio.h (консольный ввод/вывод). Для их использования файл conio.h также следует подключить к программе с помощью директивы #include . Другая функция - putchar(х) выдает значение переменной x в стандартный выходной поток (на экран дисплея). Функция putchar( ) имеет прототип:

int putchar(int);

Форматированный вывод на экран. Функция printf( ) (прототип содержится в файле stdio.h) обеспечивает форматированный вывод. Ее можно записать в следующем формальном виде:

рrintf ("управляющая строка", аргумент _1, аргумент _2,...);

Управляющая строка содержит компоненты трех типов: обычные символы, которые просто копируются в стандартный выходной поток (выводятся на экран дисплея); спецификации преобразования, каждая из которых вызывает вывод на экран очередного аргумента из последующего списка; управляющие символьные константы.

Каждая спецификация преобразования начинается со знака % и заканчивается некоторым символом, задающим преобразование. Между знаком % и символом преобразования могут встречаться другие знаки в соответствии со следующим форматом:

% [признаки] [ширина_поля] [точность] c_n

Все параметры в квадратных скобках не являются обязательными.

На месте параметра c_n (символ преобразования) могут быть записаны:

с - значением аргумента является символ;

d или i - значением аргумента является десятичное целое число;

е или Е - значением аргумента является вещественное десятичное число в экспоненциальной форме вида 1.23e+2 или 1.23E+2;

f - значением аргумента является вещественное десятичное число с плавающей точкой;

g (или G) - используется, как е или f, и исключает вывод незначащих нулей;

о - значением аргумента является восьмеричное целое число;

s - значением аргумента является строка символов (символы строки выводятся до тех пор, пока не встретится символ конца строки или же не будет, выведено число символов, заданное точностью);

u - значением аргумента является беззнаковое целое число;

х или Х - значением аргумента является шестнадцатеричное целое число с цифрами 0,..., 9, а, b, с, d, е, f или 0,..., 9, А, В, С, О, Е, F;

р - значением аргумента является указатель;

Необязательные параметры в спецификации преобразования:

признак минус (-) указывает, что преобразованный параметр должен быть выровнен влево в своем поле;

признак плюс (+) требует вывода результата со знаком;

строка цифр, задающая минимальный размер поля (ширина поля). Здесь может так же использоваться символ *, который тоже позволяет задать минимальную ширину поля и точность представления выводимого числа;

точка (.), отделяющая размер поля от последующей строки цифр;

строка цифр, задающая максимальное число выводимых символов, или же количество цифр, выводимых справа от десятичной точки в значениях типов float или double (точность);

Если после знака % записан не символ преобразования, то он выводится на экран. Таким образом, строка %% приводит к выводу на экран знака %.

Функция printf( ) использует управляющую строку, чтобы определить, сколько всего аргументов и каковы их типы. Аргументами могут быть переменные, константы, выражения, вызовы функций; главное, чтобы их значения соответствовали заданной спецификации.

При наличии ошибок, например, в числе аргументов или типе преобразования, результаты будут неверными.

Среди управляющих символьных констант наиболее часто используются следующие:

\а - для кратковременной подачи звукового сигнала;

\b - для перевода курсора влево на одну позицию;

\f - для подачи формата;

\n - для перехода на новую строку;

\r - для возврата каретки;

\t - горизонтальная табуляция;

\v - вертикальная табуляция;

\\ - вывод символа \;

\' - вывод символа ' ;

\" - вывод символа ";

\? - вывод символа ?.

Например, в результате вызова функции:

printf("\tComputer\n%d\n", i);

Сначала выполняется горизонтальная табуляция (\t), т.е. курсор сместится от края экрана, затем на экран будет выведено слово Computer, после этого курсор переместится в начало следующей строки (\n), затем будет выведено целое число i по формату %d (десятичное целое), и, окончательно, курсор перейдет в начало новой строки (\n).

Напечатать строку символов можно и так:

printf("Это строка символов");

После выполнения следующих операторов

float m, p;

int k;

m=84.3; k=–12; p=32.15;

printf(“\nm=%f\tk=%d\tp=%e”, m, k, p);

на экран выведется строка:

m=84.299999 k=–12 p=3.21500e+01

Внесем изменения в оператор вывода для рассмотренного выше примера.

printf(“\nm=%5.2f\tk=%5d\tp=%8.2e\tp=%11.4e”,m, k, p, p);

В результате на экране получим:

m=84.30 k= –12 p= 32.15 p= 3.2150e+01

Если в пределы указанной ширины поля выводимое значение не помещается, то этот параметр игнорируется, и величина будет выводиться полностью.

Форматированный ввод. Функция scanf( ) (прототип содержится в файле stdio.h) обеспечивает форматированный ввод. Ее можно записать в следующем формальном виде:

scanf("управляющая строка", аргумент_1, аргумент_2,...);

Аргументы scanf( ) должны быть указателями на соответствующие значения. Для этого перед именем переменной записывается символ &. Назначение указателей будет рассмотрено далее.

Управляющая строка содержит спецификации преобразования и используется для установления количества и типов аргументов. В нее могут включаться:

· пробелы, символы табуляции и перехода на новую строку (все они игнорируются);

· спецификации преобразования, состоящие из знака %, возможно, символа * (запрещение присваивания), возможно, числа, задающего максимальный размер поля, и самого символа преобразования;

· обычные символы, кроме % (считается, что они должны совпадать с очередными неизвестными символами во входном потоке).

Рассмотрим символы преобразования функции scanf( ) (указываются после символа %):

с - на входе ожидается появление одиночного символа;

d или i - на входе ожидается десятичное целое число и аргумент является указателем на переменную типа int;

D или l - на входе ожидается десятичное целое число и аргумент является указателем на переменную типа long;

е или Е - на входе ожидается вещественное число с плавающей точкой;

f - на входе ожидается вещественное число с плавающей точкой;

о - на входе ожидается восьмеричное целое число и аргумент является указателем на переменную типа int;

О - на входе ожидается восьмеричное целое число и аргумент является указателем на переменную типа long;

s - на входе ожидается появление строки символов;

х - на входе ожидается шестнадцатеричное целое число и аргумент является указателем на переменную типа int;

Х - на входе ожидается шестнадцатеричное целое число и аргумент является указателем на переменную типа long.

Ввести целое число (int a;), символ (char b;) и вещественное число (float t;) можно так: scanf("%d", &a); scanf("%c", &b); scanf("%f", &t); или scanf("%d%c%f",&a, &b, &t); В этом случае последовательность ввода должна выглядеть например так

-5 К2.4 <Enter>

Переменные получат следующие значения: a=-5, b=К, c=2.4. Разделителем в потоке ввода между различными значениями числовыми может быть любое количество пробелов, а также другие «пробельные» символы: знак табуляции, конец строки. Только после нажатия клавиши <Enter> вводимые значения присвоятся соответствующим переменным. До этого входной поток помещается в буфер клавиатуры и может редактироваться.

В спецификациях ввода функции scanf() допустимо использование модификаторов ‘h’, ‘l’, ‘L’. Они применяются при вводе значений модифицированных типов:

hd – для ввода значений типа short int;

ld – для ввода значений типа long int;

lf, le – для ввода значений типа double в форме с фиксированной и плавающей точкой;

Lf, Le - для ввода значений типа long double в форме с фиксированной и плавающей точкой.

Потоковый ввод-вывод в Си++.Программируя на языке Си++, можно пользоваться средствами ввода-вывода стандартной библиотеки Си, подключаемой с помощью заголовочного файла stdio.h, как это делалось выше. Однако в Си++ имеются свои специфические средства ввода-вывода. Это библиотека классов, подключаемая к программе с помощью файла iostream.h. В этой библиотеке определены в качестве объектов стандартные символьные потоки со следующими именами:

cin - стандартный поток ввода с клавиатуры;

cout – стандартный поток вывода на экран.

Ввод данных интерпретируется как извлечение из потока cin и присваивание значений соответствующим переменным. В Си++ определена операция извлечения из стандартного потока, знак которой “>>”. Например, ввод значений в переменную х реализуется оператором:

cin>>x;

Вывод данных интерпретируется как помещение в стандартный поток cout выводимых значений. Выводится могут тексты, заключенные в двойные кавычки и значения выражений. Знак операции помещения в поток – “<<”. Примеры использования потокового вывода:

cout<<a+b;

cout<<”\nРезультат=”<<Y;

cout<<”x=”<<x<<” y=”<<y<<” z=”<<z<<endl;

Из приведенных примеров видно, что в выходном потоке можно использовать управляющие символы, как и при использовании функции printf(); перед каждым элементом вывода нужно ставить знак операции “<<”. Элемент вывода “endl” является так называемым манипулятором, определяющим перевод курсора на новую строку (действует аналогично управляющему символу ‘\n’).

В процессе потокового ввода-вывода происходит преобразование из формы внешнего символьного представления во внутренний формат и обратно. Тип данных и необходимый формат определяются автоматически. Стандартные форматы задаются специальными флагами форматирования, которые устанавливаются с помощью функции setf().

Математические функции. Для того, чтобы вычислить значение очень часто требуются функции. Все функции в языке СИ/С++ собраны в библиотеки. Математические функции находятся в библиотеке math.h, которая подключается с помощью директивы препроцессора #include <math.h>.

Наиболее часто используемые математические функции приведены в следующей таблице

Обращение Тип аргумента Тип результата Функция
abs(x) int int абсолютное значение целого числа
acos(x) double double арккосинус (радианы)
asin(x) double double арксинус (радианы)
atan(x) double double арктангенс (радианы)
ceil(x) double double ближайшее целое, не меньшее х
cos(x) double double косинус (х в радианах)
exp(x) double double ex – экспонента от х
fabs(x) double double абсолютное значение вещественного х
log(x) double double логарифм натуральный – ln x
log10(x) double double логарифм десятичный – lg x
pow(x,y) double double double x в степени y – xy
sin(x) double double синус (х в радианах)
sinh(x) double double гиперболический синус
sqrt(x) double double корень квадратный (положительное значение)
tan(x) double double тангенс (х в радианах)
tanh(x) double double гиперболический тангенс

Линейные программы.Линейные алгоритмы реализуются с помощью оператора присваивания и ввода/вывода.

Пример 1. Дано: a, b, c – стороны треугольника. Вычислить S - площадь треугольника. По формуле Герона:

как вводить и выводить информацию - student2.ru

где p – полупериметр треугольника.

Вариант 1 с использование форматированного ввода/вывода.

/*подключение бтблиотек*/

#include <stdio.h>

#include<math.h>

void main()//главная функция

{float a,b,c,p,s;

printf(²\na=²); scanf(²%f²,&a);//ввод значения а

printf(²\nb=²); scanf(²%f²,&b);//ввод значения b

printf(²\nc=²); scanf(²%f²,&c);//ввод значения с

p=(a+b+c)/2;

s=sqrt(p*(p-a)*(p-b)*(p-c));//вычисление площади

/*вывод результата на экран*/

printf(²\nПлощадь треугольника=%f²,s);

}

Вариант 2 с использованием потокового ввода/вывода.

#include <iostream.h>

#include<math.h>

void main()

{float a,b,c,p,s;

cout<<²\na=²; cin>>a;

cout<<²\nb=²; cin>>b;

cout<<²\nc=²; cin>>c;

p=(a+b+c)/2;

s=sqrt(p*(p-a)*(p-b)*(p-c));

cout<<²\nПлощадь треугольника=²<<s;

}

Упражнения

1. Приведенная ниже программа решает следующую задачу: идет К-я секунда суток. Определить, сколько целых часов (Н) и целых минут (М) прошло с начала суток. Например, если К=13257=3*36000+40*60+57, то H=3, М=40. Вывести на экран фразу: «Это … часов … минут». Вместо многоточий поставить вычисленные значения Н и М.

#include <stdio.h>

void main()

{long k;

int h,m;

printf(²Введите текущее время в секундах:²);

scanf(²%ld²,&k);

h=k/3600;

m=(k%3600)/60;

printf(²Это %d часов %d минут.\n²,h,m);

}

Разберитесь в данной программе. Перепишите программу с использованием потокового ввода-вывода Си++.

2. Составить программу вычисления объема и площади поверхности куба по данной длине ребра.

Наши рекомендации