Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

книги / Язык Си

..pdf
Скачиваний:
6
Добавлен:
20.11.2023
Размер:
7.64 Mб
Скачать

ЛЕКЦИЯ 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;

}