Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курс ПЯВУ 2 сем / Лекции 2 сем / Л№33 ФорматировВвод / Лекция № 31. Форматированный Ввод вывод .odt
Скачиваний:
16
Добавлен:
17.04.2015
Размер:
50.53 Кб
Скачать

3. Форматирование ввода-вывода средствами языка с

Начнем наше изучение функций printf() и scanf() с того, что определим для чего они нам нужны. Функции printf() и scanf() используются для ввода и вывода информации. Точнее, функция printf() заведует выводом, а функция scanf() - вводом. Эти две функции очень похожи между собой, поэтому рассмотрим сначала функцию printf(), а после перейдем к изучению scanf().

Кстати, чтобы работать с этими функциями без проблем, не забывайте подключать в своих приложениях библиотеку stdio.h

4. Функция printf()

Как уже упоминалась ранее, функция printf() является функцией вывода. Рассмотрим прототип данной функции:

int printf(const char *control-str[, argument1 [, argument2 [, ... ]]]);

Начнем с того, что же эта функция возвращает. А возвращает она при удачном стечении обстоятельств количество выведенных символов, в противном случае вернет код ошибки.

Параметр control-str (управляющая строка) - это строка в двойных кавычках. Данный параметр может быть единственным в функции. Например:

строка кода

printf("Нello, everybody! \nIt's me again.");

выведет на экран

Hello, everybody!

It's me again.

Параметры argument1, argument2 и т.д. - это те элементы, которые необходимо вывести на экран. Они могут быть переменными или константами либо даже выражениями, значение которых вычисляется при выводе на печать.

Если в функции есть хотя-бы один параметр argument, управляющая строка должна содержать спецификатор преобразования для него. Для каждого параметра argument необходим спецификатор преобразования. Сами спецификаторы перечислены в таблице.

Спецификатор

преобразования Результат

%c одиночный символ

%d десятичное целое число

%e число с плавающей точкой, экспоненциальное представление (e-представление)

%E число с плавающей точкой, экспоненциальное представление (E-представление)

%f число с плавающей точкой, десятичное представление

%g использует %f или %e, в зависимости от значения. %e используется, если показатель

экспоненты меньше чем -4 или больще либо равен заданной точности

%G использует %f или %E, в зависимости от значения. %E используется, если показатель

экспоненты меньше чем -4 или больше либо равен заданной точности

%i десятичное целое число со знаком

%o восьмеричное целое число без знаков

%p указатель

%s строка символов

%u десятичное целое число без знака

%x шеснадцатиричное целое число без знака, использование шеснадцатиричных цифр от

0 до f

%X шеснадцатиричное целое число без знака, использование шеснадцатиричных цифр от

0 до F

%% печать знака процента

Элементы, которые необходимо вывести на экран, нужно расположить в функции в таком порядке, в каком в управляющей строке расположены для них спецификаторы преобразования. Это связано с работой функции printf(). Функция выводит без изменений все символы управляющей строки за исключением спецификаторов преобразования. Когда функция находит в управляющей строке первый спецификатор преобразования, она подставляет значение второго параметра (т.е. argument1)на место спецификатора, предварительно преобразовав это значение в соответствии с данным спецификатором. Далее, найдя следующий спецификатор, функция подставляет на его место третий параметр и так далее. Рассмотрим примеры:

int numPages = 273;

printf("The book has %d pages.", numPages);

выведет на экран

The book has 273 pages.

float nQuantity = 100;

printf("They have eaten only %f%% from %d kilograms of food\n", \nQuantity/3 , 25);

выведет на экран

They have eaten only 33.333333% from 25 kilograms of food.

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

%[flags] [width] [.precision] [{h | l | L}]type

В данном прототипе type - это как раз те буквы, которые мы рассмотрели ранее. До этого момента мы использовали, так скажем, упрощенные спецификаторы преобразования, то есть в нашем случае прототип выглядел бы так:

%type

Что тоже является правильным, правда, не всегда удобным. Чтобы понять, зачем нужны спецификатору преобразования необязательные параметры, рассмотрим их по порядку. И начнем наше рассмотрение с первого необязательного параметра - flags. Все существующие флаги приведены в таблице. Сразу необходимо отметить, что в спецификаторе могут применяться сразу несколько флагов.

Флаг Значение

  • элемент со значением выравнивания по левому краю; т. е. содержимое будет

    напечатано, начиная с левого края

    значения со знаком "плюс", если они положительны, и со знаком "минус", если они

    отрицательны

Пробел значения со знаком "плюс" печатаются с пробелом (но без знака), если они

положительны, и со знаком "минус", если они отрицательны. Флаг "+"

отменяет появление пробела в начале

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

начале 0 для формы %о и 0x или 0X для форм %x и %X. Для всех форм с плавающей

точкой # гаран

0 для числовых форм заполняет поле по ширине нулями вместо пробелов. Этот флаг

игнорируется, если прсутствует флаг "-" или если указана точность для целочислен-

ной формы

Рассмотрим несколько примеров с использованием флагов:

int books = 10;

printf("In my library %+d booksn", books);

выведет на экран

In my library +10 books

int count = 923;

printf( "Decimal %d as:ntHex: %X hex: %x Octal: %on",

count, count, count, count );

printf( "Decimal % d as:ntHex: %#X hex: %#x Octal: %#on",

count, count, count, count );

выведет на экран

Decimal 923 as:

Hex: 39B hex: 39b Octal: 1633

Decimal 923 as:

Hex: 0X39B hex: 0x39b Octal: 01633

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

int num = 345;

printf("'%d'n", num);

printf("'%2d'n", num);

printf("'%8d'n", num);

printf("'%-8d'n", num);

выведет на экран

'345'

'345'

' 345'

'345 '

.precision - точность. Для преобразований %e, %E и %f задается количество цифр, которые будут выведены справа от десятичного числа. Для преобразований %g и %G задается максимальное число значащих цифр. Для преобразования %s задается максимальное число символов, которое будет напечатано. Для преобразований целого числа задается минимальное число цифр, которые должны появиться; если целое число содержит меньше цифр, чем задано, то в начало числа добавляются нули. При использовании точки (.) подразумевается следующий далее нуль, так что %.f - тот же спецификатор, что и %.0f. Приведем пример:

float nQuantity = 100;

printf("They have eaten only %.1f%% from %d kilograms of food\n",

\nQuantity/3 , 25);

printf("They have eaten only %03.f%% from %.4d kilograms of food\n",

\nQuantity/3 , 25);

выведет на экран

They have eaten only 33.3% from 25 kilograms of food

They have eaten only 033% from 0025 kilograms of food

Если вместо числа в модификаторе width поставить звездочку (*), то для данного спецификатора не будет задана фиксированная ширина поля, а ширину будет регулировать переменная (целое число). То же самое касается точности - если вместо числа в модификаторе precision поставить *, то за количество знаков после запятой будет отвечать переменная. Пример:

float num = 12.5;

int width = 7; //отвечает за ширину поля

int precision = 3;//отвечает за точность

printf("%0*.*f", width, precision, num);

выведет на экран

012.500

h | l | L -необязательные префиксы, приставляемые к типу спецификатора модификации. Они уточняют размер параметра argument, относящегося к данному спецификатору. h используется при целочисленном преобразовании для кодирования значений short int или unsigned short int. l используется при целочисленном преобразовании для кодирования значений long int или unsigned long int. L используется для преобразований с плавающей точкой для кодирования значений long double.

5. Оператор printf - вывод значений типа int

Функция printf поддерживает спецификаторы формата, обеспечивающие ее информацией о типах параметров (таких как int, char и т.д.). Для отображения с помощью printf значений типа int следует использовать спецификатор формата %d. В следующей программе INTOUT.C для значений типа int используется спецификатор формата %d:

#include <stdio.h>

void main()

{

int age = 41;

int height =73;

int weight = 165;

printf(Возраст пользователя: %d вес: %d рост: %d\n ", age,weight, height);

printf ("%d плюс %d равно %d\n ", 1, 2, 1+2);

}

После компиляции и выполнения программы на экран будет выведено:

Возраст пользователя: 41 вес: 165 рост: 73

1 плюс 2 равно 3

Примечание: Многие Си-компиляторы рассматривают спецификатор формата %i как идентичный °/od. Однако при написании новой программы рекомендуется использовать спецификатор %d.