Как вводить и выводить информацию
Операции ввода/вывода в языке Си организованы посредством библиотечных функций (их довольно много). Описания заголовков библиотечных функций стандартного ввода/вывода находятся в заголовочном файле 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 - площадь треугольника. По формуле Герона:
где 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. Составить программу вычисления объема и площади поверхности куба по данной длине ребра.