Билет 14

advertisement
Форматированный ввод
Форматированный ввод осуществляется функцией scanf, по своей
структуре аналогичной функции printf:
scanf(“формат”, аргументы);
Формат содержит спецификации вводимых переменных, имена которых
являются аргументами этой функции (списком ввода). Перед именем каждой переменной
в списке ввода (кроме имен массивов и строк) ставится знак амперсанда &.
Спецификации ввода полностью совпадают с аналогичными спецификациями вывода:
int age, rost;
float weight;
char name[10];
printf(“\nВаше имя: ”);
scanf(“%s”, name);
printf(“\nВаш
возраст: ”);
scanf(“%d”, &age);
printf(“\nВаш
рост: ”);
scanf(“%d”, &rost);
printf(“\nВаш
вес: ”);
scanf(“%f”, &weight);
После запуска программы на экран будет выведено:
Ваше имя:
и программа будет ожидать ввода строки символов. После того, как будет
напечатано имя и пользователь нажмет на клавишу ввода, программа заработает дальше:
Ваше имя: Петр
Ваш
возраст: 17
Ваш
рост: 178
Ваш
вес: 67.5
Значения переменных можно вводить одной строкой, разделяя их
пробелами, при этом между спецификациями ввода в формате никаких знаков не
ставится:
printf(“\nВаше имя, возраст, рост и вес: ”);
scanf(“%s%d%d%f”, name, &age, &rost, &weight);
При выполнении этой программы появляется сообщение, после которого
можно вводить через пробелы значения соответствующих переменных:
Ваше имя, возраст, рост и вес: Петр 17 178 67.5
При этом переменным name, age, rost, weight будут присвоены
введенные значения.
В формат ввода, помимо спецификаций, могут входить и другие символы,
причем:

пробелы, символы табуляции \t и перехода на новую строку \n
игнорируются,

другие символы, если они имеются, должны совпадать с очередными
непустыми символами, вводимыми с клавиатуры (символами входного потока), то есть
они образуют шаблон, с которым должны совпадать вводимые данные:
scanf(“Возраст=%d, рост=%d, вес=%g, имя:%s”, &age,
&rost, &weight, name);
входной поток имеет вид:
Возраст=17, рост=178, вес=67.5, имя:Петр
В этом случае переменные age, rost, weight, name примут
соответствующие введенные значения.
Если перед спецификатором ввода стоит звездочка *, то поле, относящееся
к данному спецификатору в списке ввода, пропускается, и вводимое значение
игнорируется. Такая ситуация возникает тогда, когда вводятся значения из файла или с
клавиатуры, но одной строкой (при этом они должны разделяться пробелами):
printf(“\nВаше имя, возраст, рост и вес: ”);
scanf(“%s%d%*d%*f”, name, &age, &rost, &weight);
Входной поток имеет вид:
Петр 17 178 67.5
В этом случае переменным будут присвоены следующие значения:
name=”Петр” age=17 rost=0 weight=0.000000
Внимание! Если переменная не инициализирована, то ее значение обнуляется.
Для ввода строк могут быть использованы две дополнительные
спецификации:
%[символы]
- вводимая строка должна содержать только символы,
перечисленные в квадратных скобках без разделительных знаков. При появлении во
вводимой строке неуказанного символа ввод строки заканчивается:
printf(“\nВведите строку:”);
scanf(“%[abceg]”, name);
Если вводимая строка имеет вид:
abcdefg
то переменная name
примет значение abc
%[^символы] - вводимая строка ограничивается только символами,
указанными в квадратных скобках:
printf(“\nВведите строку:”);
scanf(“%[^aed]”, name);
Если вводимая строка имеет вид:
abcdefg
то переменная name
примет значение ae
Любая функция в Си возвращает какое-то значение. Поэтому функция
scanf, помимо выполнения форматированного ввода, возвращает количество
опознанных и присвоенных элементам списка ввода данных:
printf(“\nВаше имя, возраст, рост и вес: ”);
i=scanf(“%s%d%d%f”, name, &age, &rost, &weight);
Входной поток имеет вид:
Петр 17 178 67.5
При этом переменные name, age, rost, weight
получат свои
значения, и переменной i будет присвоено значение 4.
Внимание! Использование функции scanf для ввода строк имеет свои
особенности.
Если вводимая строка состоит из нескольких слов, разделенных пробелами,
то вводится только первое слово (до первого пробела):
char name[20];
printf(“\nВведите ваше имя и фамилию: ”);
scanf(“%s”, name);
Если входной поток имеет вид:
Vasja Pupkin
то переменная name примет значение Vasja.
В таком случае для ввода строки лучше использовать функцию gets:
char name[20];
printf(“\nВведите ваше имя и фамилию: ”);
gets(name);
Если входной поток имеет вид:
Vasja Pupkin
то переменная name примет значение Vasja Pupkin.
Ввод и вывод данных
Программы на алгоритмических языках обычно составляются таким образом,
чтобы они могли быть использованы при различных наборах входных данных. При этом
входные данные не задаются в программе именованными константами или операторами
присваивания, а помещаются отдельно от программы, например, в виде файла на внешнем
носителе или входного потока с клавиатуры. В самой же программе предусматривается
возможность ввода требуемых значений с устройств ввода (клавиатуры, магнитного
диска) в оперативную память компьютера и вывода результатов вычислений из памяти на
внешние носители информации (экран терминала, магнитный диск, принтер).
Под вводом данных понимаются операции передачи данных с внешних устройств
ввода в оперативную память компьютера, а под выводом – из оперативной памяти на
внешние устройства хранения информации.
Операции ввода и вывода данных в Си выполняются функциями стандартной
библиотеки ввода-вывода, вызываемой директивой препроцессора:
#include <stdio.h>
Программист может использовать функции, входящие в эту библиотеку, или
разработать собственные средства ввода-вывода и включить их в библиотеку. Благодаря
такому подходу, разработчики компиляторов с языка Си могут делать их достаточно
малыми и не зависящими от особенностей конкретных устройств ввода-вывода или
приложений языка, поскольку учет этих особенностей возлагается на эти функции.
Поэтому каждый компилятор Си снабжается пакетом таких функций, называемым
стандартной библиотекой ввода-вывода.
В дальнейшем будем рассматривать функции ввода-вывода, входящие в любой
компилятор Си. Эти функции можно разбить на два больших класса. К первому относится
небольшое число примитивных функций ввода-вывода, называемых функциями
системного уровня. На их основе строятся функции более высокого уровня, называемого
стандартным или файловым уровнем.
Стандартный ввод-вывод
Функции ввода-вывода стандартного уровня считывают данные со стандартного
устройства ввода – клавиатуры и выводят данные на стандартное устройство вывода –
экран терминала.
Стандартный ввод-вывод может быть посимвольным, строковым и
форматированным.
Посимвольный ввод-вывод
Стандартный посимвольный ввод предназначен для чтения очередного введенного
с клавиатуры символа и осуществляется функцией getch() (get character – получить
символ). Эта функция не имеет аргументов, однако скобки обязательны:
char d;
d=getch();
Этот оператор присваивает переменной символьного типа d значение очередного
символа, введенного с клавиатуры. При выполнении функции getch() компьютер
приостанавливает выполнение программы и ожидает ввода символа. После ввода символа
(нажатия на одну из символьных клавиш) его значение присваивается в данном случае
переменной d, и программа продолжает работу, при этом сам символ на экране не
появляется.
Таким образом, функция getch() в Си полностью соответствует функции
readkey в Паскале.
Стандартный посимвольный вывод предназначен для вывода на экран терминала
одного символа и осуществляется функцией putch(аргумент) (put character –
выдать символ). Эта функция имеет только один аргумент – переменную символьного
типа или символьную константу, которую необходимо вывести на экран:
char d;
d=’*’;
putch(d);
putch(‘*’);
На экран будут выведены два символа подряд:
**
Ввод-вывод строк
Стандартный ввод строк осуществляется функцией gets(аргумент) (get
string – получить строку), имеющей один аргумент – имя строки:
char name[10];
gets(name);
При выполнении этой функции компьютер приостанавливает выполнение
программы и ожидает ввода строки. После ввода строки (она вводится без открывающих и
закрывающих кавычек и может состоять из нескольких слов, разделенных пробелами) и
нажатия на клавишу ввода ее значение присваивается в данном случае переменной name
и в нее автоматически добавляется нулевой символ ‘/0’ , завершающий строку. При
этом вводимая строка высвечивается на экране.
Стандартный вывод строк осуществляется функцией puts(аргумент) (put
string – выдать строку), аргументом которой является имя выводимой строки или
строковая константа:
char name[10];
name=“Vasja”;
puts(name);
puts(“Pupkin”);
На экран будет выведено:
Vasja
Pupkin
Таким образом, после вывода строки осуществляется автоматический перевод
курсора на новую строку экрана.
Форматированный вывод
Функции форматированного вывода предназначены для вывода символов, строк,
целых и вещественных чисел.
Форматированный вывод осуществляется функцией printf (print format –
форматная печать), которая выводит данные на экран терминала в соответствии с
заданным форматом их представления:
printf(“формат”, аргументы);
где
аргументы – список вывода – имена переменных, значения которых
выводятся,
формат – представляет собой строку, содержащую сообщения, которые
должны быть выведены на экран, управляющие символы (ESC-последовательности) и
спецификации преобразований выводимых данных (аргументов):
printf(“\nСи – современный язык
программирования\n”);
При выполнении этой функции курсор на экране перейдет на новую строку
(\n), будет выведено сообщение:
Си – современный язык программирования
и курсор снова перейдет на новую строку. Как видно, ESC-последовательности
включаются в строку, но сами на экран не выводятся.
Спецификации преобразований задают вид выводимых данных. Они состоят из
символа % и спецификаторов:
d
- для данных целого типа в десятичной системе счисления,
x
- для данных целого типа в шестнадцатеричной системе счисления,
f
- для данных вещественного типа в форме с фиксированной запятой,
e
- для данных вещественного типа в форме с плавающей запятой,
g
- наиболее короткое представление из f и e,
с
- для данных символьного типа,
s
- для строк.
Очередная спецификация в формате относится к очередному аргументу в списке
вывода. Спецификации могут быть разделены пробелами, запятыми или идти подряд:
char c=’A’;
int i=-123;
float x=123.456;
char str[10] =”student”;
printf(“\n%c
printf(“\n%f,
%d”, c, c);
%e,
%g”, x, x, x);
printf(“\n%s”, str);
printf(“\n%d
%f
%c”, i, x, c);
На экран будет выведено:
A
65
123.456000,
1.234560e+002,
123.456
student
-123
123.456000
A
Таким образом, при выводе положительных чисел знак + не печатается.
Если вещественное число выводится в форме f , то в его дробной части записывается
шесть цифр, а если в форме e – то в его целой части остается одна цифра, все остальные
записываются в дробную часть. Показатель степени (после буквы e) – три цифры.
В спецификациях после символа % можно указать общее количество
позиций, отводимых для вывода данного числа (строки) – длину поля вывода. Если длина
выводимого числа (строки) меньше поля вывода, то оно прижимается к правому краю:
printf(“\n%10c”, c);
printf(“\n%10s”, str);
printf(“\n%10d”, i);
На экран будет выведено:
A
student
-123
При выводе данных вещественного типа можно указывать как длину поля вывода,
так и количество цифр его дробной части (точность вывода). При этом число
округляется до заданной точности, а избыточные позиции слева заполняются нулями. В
любом случае определяющей является точность вывода, при этом общую длину поля
вывода можно даже не задавать:
printf(“\n%7.2f”, x);
printf(“\n%.1f”, x);
printf(“\n%.4e”, x);
printf(“\n%15.3f”, x);
На экран будет выведено:
123.46
123.5
1.2346e+002
123.456
При выводе строк можно указывать как общую длину поля вывода, так и
количество выводимых символов строки:
printf(“\n%10.3s”, str);
На экран будет выведено:
stud
Для удобства вывода в строковую константу функции printf можно включать
как текст, так и спецификации:
int age=17, rost=178;
float weight=67.5;
char name[10]=”Petr”;
printf(“\nМеня зовут %s, мне %d лет.”, name, age);
printf(“\nМой рост %d см, мой вес %f
кг.”, rost,
weight);
На экран будет выведено:
Меня зовут Petr, мне 17 лет.
Мой рост 178 см, мой вес 67.500000 кг.
Таким образом, очередная спецификация в формате относится к очередной
переменной в списке вывода.
Количество отступаемых от начала строки позиций или пробелов,
разделяющих выводимые значения, можно задать спецификацией %кс, где к – целое
число. Этой спецификации в списке вывода должен соответствовать символ пробела:
printf(“\n%10сМеня зовут %s,%5с мне %d лет.”,‘ ‘,
name,‘ ‘, age);
На экран будет выведено:
Меня зовут Petr,
мне 17 лет.
Ширину поля вывода и количество выводимых знаков (символов) можно
задавать в спецификациях не только константами (числами), но и переменными,
включенными в список вывода. Для этого используется спецификатор * , причем
очередному символу * в формате соответствует очередная переменная в списке вывода:
int n=10, m=4;
char str[10]=”student”;
printf(“\n%*.*s”, n, m, str);
На экран будет выведено:
stud
Download