книги / Язык Си
..pdfЛЕКЦИЯ 3. КОНСОЛЬНЫЙ в в о д -в ы в о д
Для работы с функциями консольного ввода-вывода необхо димо подключить директивой #include файл stdio.h.
3.1. Форматированный вывод
Функцией форматированного вывода является printf При ее применении у программы появляется возможность форматировать данные, т.е. влиять на их представление на экране дисплея. Литера / в названии функции указывает на возможность форматирования
(printformatted). Вызов функцииprintfимеет вид
printf("форматная строка ", список аргументов);
Форматная строка ограничена двойными кавычками и мо жет включать произвольный текст, управляющие символы и спе цификаторы формата. Список аргументов может отсутствовать.
printf("Введите два числа: ");
Здесь в форматной строке используется произвольный текст «Введите два числа:» и отсутствуют аргументы. На консоль будет выведено
Введите два числа:
Управляющие символы позволяют влиять на размещение вы водимой информации на экране дисплея. Управляющие последо вательности символов состоят из символа обратного слеша \ и од ного или нескольких символов, следующих за ним без пробелов (табл. 3.1).
Спецификации преобразования данных предназначены для управления формой внешнего представления значений аргументов функции printf. Обобщенный формат спецификации преобразова ния имеет вид
% ширина поля, точность спецификатор формата
|
|
|
|
|
Т а б л и ц а |
3.1 |
|
|
|
Основные управляющие символы |
|
|
|||
|
Символ |
Пример |
|
Результат |
|
||
и его назначение |
|
|
|||||
|
|
Три гудка из системного |
|||||
|
\а - звуковой |
printf("\a\a\a%d", 10); |
|||||
|
динамика и напечатает |
||||||
|
|
сигнал |
|||||
|
|
|
|
|
10 |
|
|
\Ъ- затирание |
|
|
Напечатает |
|
|||
printf("%.4f\b", 4.3567); |
|
|
|||||
символа слева |
|
|
4.356 |
|
|||
\п - |
перевод курсора |
printf("%d\n%d\n", 10, |
Напечатает |
|
|
||
10 |
|
||||||
в новую строку |
20); |
|
|
||||
|
20 |
|
|||||
|
|
|
|
|
|
||
\г - |
возврат курсора |
|
|
Напечатает |
|
|
|
printf("%f%f\r", 4.3564, |
4.356400 8.200000 |
||||||
на начало строки |
8.2); |
|
и вернет курсор в начало |
||||
V - горизонтальная |
|
|
строки |
|
|
||
printf("%d\t%d",10,20); |
Напечатает |
20 |
|
||||
|
табуляция |
|
|
10 |
|
||
|
Среди элементов спецификации преобразования обязательны |
||||||
ми являются только два: % и спецификатор формата (табл. 3.2). |
|
||||||
|
|
|
|
|
Т а б л и ц а |
3 . 2 |
|
|
|
Основные спецификаторы формата |
|
|
|||
Символ |
Тип аргу |
Формат вывода |
|
Пример |
|
||
|
|
мента |
|
|
|
|
|
d |
|
int, char |
целое число |
printf("%d,%d\n", 10,11); //10,11 |
|||
/ |
|
float, double |
вещественное |
printf("%f', 8.34); //8.340000 |
|
||
|
|
|
число |
|
|
|
|
с |
|
int, char |
один символ |
printf(M%c,%c", 'd', 166); //d,ж |
|||
S |
|
char* |
строка символов |
printf("%s", "Hello"); |
//Hello |
|
|
р |
|
любой ука |
печать адреса |
printf("%p", 126); //0000007E |
|||
|
|
затель |
аргумента |
|
|
|
|
Спецификатор формата указывает, какой тип данных имеет аргумент.
Ширина поля - целое положительное число, определяющее длину представления выводимого значения (в позициях курсора на экране).
print f (,,%10d%5d%d" ,642,54,7110) ;
Результат на экране:
642 _____ 547110
Под число 642 при печати мы отвели десять позиций курсора. Само число занимает три позиции, поэтому остальные семь пози ций - это пробелы перед числом (обозначены как _).
Под число 54 мы отвели пять позиций, поэтому лишние три позиции при печати числа на экран опять отобразятся в виде про белов.
Для числа 7110 ширина поля не указана, поэтому оно занима ет все свои четыре позиции курсора. Чтобы последние два числа при печати не сливались, поставьте пробел (или несколько пробе лов) перед спецификатором формата третьего аргумента.
printf("%10d%5d %d", 642,54,7110) ;
Точность - целое положительное число, определяющее коли чество цифр в дробной части внешнего представления веществен ного числа. Задание точности начинается с символа «точка» (.).
printf ("%.2f%10.4f,f,642.328,54.26) ;
Результат на экране:
642.33_____ 54.2600
Вместо числа 642.328 будет напечатано 642.33, поскольку за дано два знака после запятой и произойдет автоматическое округ ление.
Свободные разряды дробной части заполняются нулями, по этому вместо 54.26 будет напечатано 54.2600, так как указано че тыре знака после запятой.
На печать числа 54.26 отведено десять позиций курсора, а за пись числа занимает семь позиций, поэтому три липшие позиции при печати опять отобразятся в виде пробелов.
При отсутствии спецификатора «точность» для веществен ных чисел по умолчанию выводится шесть знаков после запятой.
printf("%15f",642.328);
Результат на экране:
_________ 642.328000
В форматной строке все остальные символы воспринимаются как простой текст
int х=15;
float ааа=8.6;
printf("length=%d_ _ _а=%.3f",х,ааа);
printf("varl=%d%5d\nvar2=%.3f",x,12,aaa);
Результат на экране:
length=15_ _ _ a=8.000
Обращаем внимание, что количество спецификаторов форма та и количество аргументов должно быть одинаковым. Каждому аргументу соответствует свой спецификатор формата.
int х=15;
float ааа=8.
printf("var1
3.2. Форматированный ввод
Функцией форматированного ввода является scanf Использу ется для ввода данных с клавиатуры. Выполняет чтение кодов кла виатуры, преобразует их во внутренний формат и передает про грамме. При этом можно влиять на правила интерпретации вход ных кодов с помощью спецификаций форматной строки.
Вызов функции scanfимеет вид
scanf("форматная строка ", список аргументов);
Форматная строка имеет вид
% ширина поля спецификатор формата
Ширина поля определяет, какое число символов будет считы ваться.
int а;
scanf("%3dn,&а);
При вводе с клавиатуры числа 15472 в переменную а будет считано 154, так как ширина поля равна трем.
Значение спецификаторов формата такое же, как у функции printf{см. табл. 3.2).
В отличие от функции printf аргументами для функции scanf могут быть только адреса объектов программы, в частном случае - адреса ее переменных. Для взятия адреса используется операция амперсанд &.
Пример. Ввод чисел с клавиатуры.
#include<stdio.h>
#include<conio.h>
main() {int n; float a;
printf("Введите два числа:"); scanf("%f%d",&a,&n);
printf("Вы ввели:%f,%d\n",a,n);
getch();
return 0;
}
При вводе нескольких чисел с клавиатуры их можно отделять пробелом, табуляцией, клавишей Enter. Ввод завершается нажати ем клавиши Enter.
Основные ошибки при работе с функцией scanf
1. Спецификаторы формата в функции scanf не должны отд ляться друг от друга запятыми или другими символами, кроме пробела или табуляции:
scanf |
&а, &b) ; |
|
|
ошибка |
|
scanf ( rr%dFTnj%drf,&а, &b) ; |
|
|
|
ошибка |
//правильно |
s c a n f ( "%d%d", &а,&b); |
||
s c a n f ( "%d |
%d", &а,&b); |
//правильно |
2. В форматной строке функции scanf в отличие от функци printfнельзя использовать произвольный текст:
scanf ("Введите число"П*^", &а) ;
ошибка
3. Перед аргументом обязательно наличие амперсанда &:
scanf ("%d%d", B U b ) |
; |
хошибка |
|
scanf("%d%dM, &.Э.f Sch) f |
//правильно |
4. Спецификатор формата должен соответствовать типу дан ных аргумента:
scanf ("%d |
&a, &b) ; |
|
scanf(n%d |
ошибка |
//правильно |
%dM,&a,&b); |
3.3. Другие функции консольного ввода-вывода
Функция getche читает один символ с клавиатуры. Функция ожидает, пока не будет нажата клавиша, и возвращает код, соот ветствующий символу. Одновременно происходит отображение введенного символа на экран. Для использования этой функции необходимо подключить файл conio.h.
char |
а; |
а = |
g e t c h e (); |
p r i n t f ( " \ n % c " , а ) ;
Нажмем клавишу ‘г’. Результат на экране:
z
Z
Первая ‘с’ появляется при нажатии соответствующей клави ши. Вторая ‘г’ печатается функцией printf.
Функция getch читает один символ с клавиатуры, но в отли чие от getche не выводит его на экран. Для использования функции подключить файл conio.h. Функцию getch часто используют для остановки действия программы до нажатия какой-либо клавиши именно потому, что она не выводит символ на экран.
char |
а; |
а = |
g e t c h (); |
p r i n t f ("\n%cM,a) ;
Нажмем клавишу ‘г’. Результат на экране:
z
Вместо первой V будет пустая строка. Далее функция printf напечатает ‘г’ из переменной а.
Функция gethchar производит буферизованный ввод, пока не будет нажата клавиша Enter. Для использования функции подклю чить файл stdio.h.
char а;
а = getchar();
printf("%с",а);
Наберем текст 924 и нажмем Enter. Результат на экране:
9
поскольку функция getchar считывает только первый символ. Функция putchar выводит символ, который является ее аргу
ментом на экран в текущую позицию курсора. Для использования функции подключить файл stdio.h.
char а = 1z 1;
putchar(а); // можно заменить на
// printf("%с",а);
Функции gets и puts осуществляют соответственно ввод и вы вод на экран строки символов. Для использования функций под ключить файл stdio.h.
char str[50];
puts("Введите строку");
gets(str);
puts(str);
Функция puts автоматически переводит курсор в новую стро ку и работает быстрее, чем printf, но значение переменных не вы водит (выводит только текст).
Задача 1. Вычислить площадь поверхности и объем шара, ци линдра, конуса (параметры геометрических фигур вводить с кон соли).
За основу возьмем задачу из лекции 1, добавив к ней ввод данных с консоли.
#include<stdio.h>
#include<conio.h>
#include<math.h> main()
{float R_sph,R_cyl,R_con; float H_cyl,H_con;
float L_con;
float S_sph, S_cyl, S_con; float V_sph, V_cyl, V_con;
//Ввод исходных данных printf("Введите радиус сферы: "); scanf("%f", &R_sph); printf("Введите радиус цилиндра: "); scanf("%f", &R_cyl); printf("Введите высоту цилиндра: "); scanf("%f", &H_cyl);
printf("Введите радиус основания конуса: "); scanf("%f", &R_con);
printf("Введите высоту конуса: "); scanf("%f", &H_con);
//Вычисляем параметры сферы
S_sph = 4*M_PI*R_sph*R_sph;
V_sph = 4./3*M_PI*pow(R_sph,3);
// Вычисляем параметры цилиндра S_cyl - 2*M_PI*R_cyl* (H_cyl+R_cyl) ; V_cyl = M_PI*R_cyl*R_cyl*H_cyl;
//Вычисляем параметры конуса L_con = hypot(H_con,R_con);
S_con = M_PI*R_con*(L_con+R_con); V_con = 1./3*M_PI*R_con*R_con*H_con;
//Печать результатов
puts Г --------------------------------- |
|
| Цилиндр |
| |
Конус |
") ; |
|
puts (1| Сфера |
Iй); |
|||||
puts ("--------------------------------- |
|
|
|
|
|
"); |
printf("| |
s=%f |
I |
s=%f |
| |
s=% f |
|\n", |
S_sph,S_cyl, S_con); |
|
|
|
|
||
printf(n | |
v=%f |
| |
v=%f |
| |
v=%f |
iXn", |
V_sphfV_cyl,V_con); |
|
|
|
|
||
puts ("--------------------------------- |
|
|
|
|
|
"); |
getch(); |
|
|
|
|
|
|
return 0;
}