Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Функции форматного ввода, вывода данных






Экран монитора и клавиатура образуют консоль – устройство оперативного вывода и ввода информации в ЭВМ. Изначально консоль представляла собой электронную печатающую машинку типа «CONSUL-260» («Консул-260»). На ее клавиатуре набирались команды или текст, которые распечатывались на бумаге и параллельно передавались в ЭВМ (ввод данных). Данные, полученные в результате выполнения программы, передавались от ЭВМ обратно на «Консул-260» и распечатывались на бумаге (вывод данных). Для удобства регистрации данных использовалась рулонная бумага. По распечатке осуществлялся контроль входных и анализ выходных данных. Впоследствии клавиатура стала самостоятельным устройством, а для регистрации данных стал применяться монитор.

 

 

Операции ввода/вывода в языке Си организованы посредством библиотечных функций (причем их довольно много). Функции printf() и scanf(), включенные в библиотеку stdio обеспечивают вывод в стандартный поток данных и ввод из стандартного потока данных различных типов.

Функция printf() (прототип содержится в файле stdio.h)записывает в стандартный поток stdout (стандартный выходной поток данных) значения аргументов из заданного списка вывода (2-й параметр) в соответствии со строкой форматирования, адресуемой параметром format (1-й параметр). Функция возвращает для контроля (если это требуется) количество выведенных символов, а в случае ошибки значение -1 (системная константа EOF=-1).

int printf(const char *format, < список вывода>);

Строка форматирования состоит из элементов двух типов. К элементам первого типа относятся символы, которые выводятся на экран.

Элементы второго типа содержат ESC-последовательности и спецификации формата, определяющие способ отображения аргументов. Количество спецификаций формата должно совпадать с количеством элементов в списке вывода. Спецификация формата начинается символом процента %, за которым следует код формата.

На спецификации могут воздействовать модификаторы, задающие ширину поля, точность и признак выравнивания по левому краю. Целое значение, расположенное между % и командой форматирования, играет роль спецификации минимальной ширины поля. Наличие этого спецификатора приводит к тому, что результат будет заполнен пробелами или нулями, чтобы выводимое значение занимало поле, ширина которого не меньше заданной минимальной ширины. По умолчанию в качестве заполнителя используются пробелы. Для заполнения нулями перед спецификацией ширины поля нужно поместить нуль. Например, спецификация формата %05d дополнит нулями выводимое целое число, в котором менее пяти цифр, чтобы общая длина равнялась пяти символам. Если количество цифр больше заданного значения, поле автоматически расширяется.

Действие модификатора точности зависит от кода формата, к которому он применяется. Чтобы добавить этот модификатор, следует поставить за спецификатором ширины поля десятичную точку, а после – требуемое значение точности. Применительно к целым числам модификатор точности задает минимальное количество выводимых цифр. При необходимости перед целым числом будут добавлены нули. Например:

int k=15;

printf(" \nk=%d \nk=%7d \nk=%7.3d\nk=%07d \nk=%07.3d", k, k, k, k, k);

\n - управляющая ESC-последовательность для печати последующей информации с новой строки. На экране монитора будет распечатано:

k=15

k= 15

k= 015

k=0000015

k= 015

Если данный модификатор применяется к строкам, то число, следующее за точкой, задает максимальную длину поля. Например, спецификация %5.7s выведет строку длиной не менее пяти, но не более семи символов. Если выводимая строка окажется длиннее максимальной длины поля, конечные символы будут отсечены.

Для вещественного типа числа модификатор точности задает р, количество знаков после десятичной точки. Десятичная точка тоже учитывается при расчете длины поля (она занимает 1 знакоместо, также как и цифра, и знак + или -). По умолчанию все выводимые значения выравниваются по правому краю: если ширина поля больше выводимого значения, то оно будет выровнено по правому краю поля. Чтобы установить выравнивание по левому краю, нужно поставить знак «минус» () сразу после знака процента. Например, спецификация формата %–10.4f обеспечит выравнивание вещественного числа с четырьмя десятичными знаками по левому краю в 10-символьном поле. Пример:

float k=156.324;

printf(" \nk=%f |\nk=%6.4f |\nk=%10.4f |\nk=%-10.4f |", k, k, k, k);

На экране монитора будет распечатано:

k=156.324005 |

k=156.3240 |

k= 156.3240 |

k=156.3240 |

 

Существуют два модификатора формата, позволяющие функции printf() отображать короткие и длинные целые числа. Модификатор l (латинская буква «эль») уведомляет функцию printf() о длинном типе значения. Модификатор h сообщает функции printf(), что нужно вывести число короткого целого типа. Кроме того, модификатор l можно поставить перед командами форматирования вещественных чисел, в этом случае он уведомит о выводе значения типа long double. Для выводы чисел типа long long int применяется сдвоенный модификатор ll, например, %16lld.

Спецификаторы формата для функции printf() перечислены в таблице.

 

Код Формат
%c %d %i %e   %E   %f   %F   %g %G %o %s %u %x %X %p %% Символ Десятичное целое число со знаком Десятичное целое число со знаком Экспоненциальное представление числа (в виде мантиссы и порядка, е — на нижнем регистре) Экспоненциальное представление числа (в виде мантиссы и порядка, Е — на верхнем регистре) Десятичное число с плавающей точкой   Десятичное число с плавающей точкой (только стандарт С99; если приме-няется к бесконечности или нечисловому значению, то выдает надписи INF, INFINITY(бесконечность) или NAN(not a number) на верхнем регистре. Спецификатор %f выводит их эквиваленты на нижнем регистре)   Использует более короткий из форматов %eили %f Использует более короткий из форматов %Eили %F Восьмеричное число без знака Символьная строка Десятичное целое число без знака Шестнадцатеричное без знака (строчные буквы) Шестнадцатеричное без знака (прописные буквы) Выводит указатель Выводит знак процента

 

Форматирование вывода применяется для удобства восприятия информации на экране монитора.

Пример 1. Вывод данных в таблице. Пусть будут заданы 4 переменные:

short int a=5, b=1526, c=-3, d=10251;

При выводе на экран переменных без спецификации минимальной ширины поля:

printf(" \n | %d | %d |", a, b);

printf(" \n | %d | %d |", c, d);

получим:

| 5 | 1526 |

| -3 | 10251 |

Диапазон значений типа short int -32769 … 32767. Если специфицировать минимальную ширину поля шестью знаками (с учетом 5-и цифр и знака -):

printf(" \n | %6d | %6d |", a, b);

printf(" \n | %6d | %6d |", c, d);

получим:

| 5 | 1526 |

| -3 | 10251 |

Пример 2. Вывод данных в таблице. Пусть будут заданы 4 переменные:

float a=5., b=1526.1212, c=-3.345, d=10.251;

При выводе на экран переменных без спецификации минимальной ширины поля:

printf(" \n | %f | %f |", a, b);

printf(" \n | %f | %f |", c, d);

получим:

| 5.000000 | 1526.121216 |

| -3.345000 | 10.251000 |

Для заданных значений требуется специфицировать минимальную ширину поля десятью знаками (с учетом 8-и цифр, десятичной точки и знака -):

printf(" \n | %10.4f | %10.4f |", a, b);

printf(" \n | %10.4f | %10.4f |", c, d);

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

| 5.0000 | 1526.1212 |

| -3.3450 | 10.2510 |

Пример 3. Вывод даты. Пусть будут заданы переменные day, month и year, определяющие день, месяц и год:

short int day=1, month=2, year=2014;

При выводе на экран переменных без спецификации минимальной ширины поля:

printf(" Текущая дата = %d.%d.%d\n", day, month, year);

printf(" Текущая дата = %hd.%hd.%hd\n", day, month, year);

получим:

Текущая дата = 1.2.2014

Текущая дата = 1.2.2014

Для вывода даты в соответствии с национальным форматом задаются спецификации ширины поля с заполнением старших отсутствующих цифр нулями. Год печатается тоже двумя цифрами, для чего определяется остаток от деления номера года на 100:

printf(" Текущая дата = %02d.%2.2d.%2d\n", day, month, year%100);

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

Текущая дата = 01.02.14

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

int scanf(const char *format, < список ввода>);

Управляющая строка форматирования содержит спецификации преобразования и используется для установления количества и типов аргументов. Если в строке форматирования встретится разделитель, то функция scanf() пропустит один или несколько разделителей во входном потоке. Под разделителем, или пробельным символом, подразумевают пробел, символ табуляции \t или разделитель строк \n. Все переменные (аргументы списка ввода scanf()) должны передаваться посредством своих адресов, например с помощью символа &, и соответствовать типам, заданным в строке форматирования. Управляющая строка, задаваемая параметром format, состоит из символов трех категорий: спецификаторов формата; пробельных символов; символов, отличных от пробельных. Спецификация формата начинается знаком % и сообщает функции scanf() тип данного, которое будет прочитано.

 

Код Формат
%c %d %i   %u %hd %e %E %f %lf %F %g %G %o %x %X %s %p %n   %[ ] %% Читает один символ Читает десятичное целое число Читает целое число в любом формате (десятичное, восьмеричное или шест-надцатеричное) Читает беззнаковое целое десятичное число Читает десятичное целое число типа short int Читает число с плавающей точкой (и в экспоненциальной форме) Аналогично коду %e Читает число с плавающей точкой Читает десятичное число с плавающей точкой типа double Аналогично коду %f (для стандарта С99) Читает число с плавающей точкой. Аналогично коду %g Читает восьмеричное число Читает шестнадцатеричное число Аналогично коду %x Читает строку Читает указатель Принимает целое значение, равное количеству прочитанных до сих пор символов Просматривает набор символов Читает знак процента

Строка форматирования читается слева направо, и спецификации формата сопоставляются с аргументом в порядке их перечисления в списке аргументов. Символ *, стоящий после знака % и перед кодом формата, прочитает переменные заданного типа, но запретит их присваивание. Команды форматирования могут содержать модификатор максимальной длины поля. Он представляет собой целое число, располагаемое между знаком % и кодом формата, которое ограничивает количество читаемых для всех полей символов. Если входной поток содержит больше заданного количества символов, то при последующем обращении к операции ввода чтение начнется с того места, в котором «остановился» предыдущий вызов функции scanf(). Если разделитель (например, пробел) встретится раньше, чем достигнута максимальная ширина поля, то ввод данных завершится. В этом случае функция scanf() переходит к чтению следующего поля. При чтении одиночных символов символы табуляции и разделители строк читаются подобно любому другому символу.

Перед некоторыми символами преобразования могут записываться следующие модификаторы:

F - изменяет указатель, заданный по умолчанию, на указатель типа far;
N - изменяет указатель, заданный по умолчанию, на указатель типа near;
h - преобразует аргумент к типу short int (может записываться перед символами d, i, о, u, х);
l - преобразует аргумент к типу long int (может записываться перед символами d, i, o, u, x);
L - преобразует аргумент к типу long double (может записываться перед символами е, f, g).

Для вводы чисел типа long long int применяется сдвоенный модификатор ll, например, %lld.

Пример. Ввести данные в переменные разного типа. Определены 3 переменные:

double a; int b; long long int c;

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

printf(" \n Введите double a, int b, long long int c \n");

scanf(" %lf%d%lld", & a, & b, & c);

При работе функции scanf() выполнение программы приостанавливается. Открывается консольное окно и ожидается ввод данных с клавиатуры. Пользователь на клавиатуре может набрать 3 требуемых числа, отделив их одно от друга пробелами.

134.2670982 -10000 2341926252342

После набора нажимается < Enter>. Функция scanf() считывает данные, преобразует их к заданному формату и сохраняет в указанных переменных. Данные можно вводить по одному числу, завершая ввод нажатием клавиши < Enter>. После ввода, преобразования и сохранения очередного числа выполнение программы не продолжится, будет ожидаться ввод следующего числа. Выполнение программы продолжится только после ввода всех данных, указанных в списке.

Если ввод данных задать в двух функциях:

scanf(" %lf%d", & a, & b);

scanf(" %lld", & c);,

а с клавиатуры ввести такую же строку из трех чисел, то первая функция ввода прочтет 2 числа из входного потока и запишет их значения в переменные a и b. После этого выполнение программы продолжится. Начнется работа второй функции scanf(). Чтение данных из входного потока продолжается с того места, где закончила ввод предыдущая функция. Таким образом, будет введено третье число.

 






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.