Задание ширины поля
Помимо того, что функция сама умеет определять границы полей, в спецификации формата можно задавать максимальное количество символов входного потока, относящихся к данному полю. Ширина поля исчисляется в символах и указывается перед спецификатором типа данных:
% [ширина] <тип данных, с модификатором или без него>
ЗАДАНИЕ 5 (учет длины полей при вводе)
1. Написать программу, в которой объявляются две переменные: x — типа float и m — типа int. Для ввода значений этих переменных используется вызов функции scanf с форматной строкой "%6f%d". После этого значения обеих переменных выводятся на экран, причем каждое с новой строки.
2. Объяснить результаты работы программы при вводе следующих последовательностей символов:
а) 987.654
б) -987.654
в) 987.6 54 (между 6 и 5 имеется пробел)
г) -987.65A4
Дополнение (игнорирование полей)
Символ * после знака % подавляет запоминание вводимого поля. Т.е. поле считывается в соответствии с форматом, но преобразованная величина никуда не записывается. При использовании этой спецификации соответствующий ей аргумент в списке не ищется.
Если число аргументов превышает число спецификаций формата, то лишние аргументы игнорируются.
Если спецификаторов формата (не считая спецификации с символом *) больше, чем аргументов в списке, то результат непредсказуем.
Задание
Написать программу, в которой при вводе данных игнорируется поле ввода. Проверить результат по возвращаемому значению scanf.
ЗАДАНИЕ 6 (применение полученных знаний)
Написать программу, вычисляющую длину катета прямоугольного треугольника по заданным гипотенузе и другому катету. В программе предусмотрены следующие действия.
1. Так как для решения задачи потребуется вычислять с помощью функции sqrt значение квадратного корня, то необходимо подключить заголовочный файл математических функций math.h. Прототип функции:
double sqrt (double x);
2.Пользователю предлагается ввести два числа — стороны треугольника:
3. Гипотенуза — большее из этих чисел, поэтому создаются две вспомогательные переменные hyp и cat, в которые с помощью условной операции ?: выбираются соответственно большее и меньшее из введенных чисел.
4. После этого вычисляется и на экран выводится искомая длина второго катета (показывать две цифры после запятой):
Контрольные вопросы к лабораторной работе
1. Почему для получения вводимых значений в функции scanf нужно указывать не переменные, а их адреса?
2. Что может входить в форматную строку функции scanf (3 типа элементов)?
3. Символы преобразования, используемые в форматной строке функции scanf.
4. Понятие поля ввода. Как во входном потоке определяется граница поля ввода?
5. Когда scanf прекращает работу (три случая)?
6. Роль указателя ширины поля в форматной строке функции scanf.
Справочная информация
Символ преобразования |
Тип вводимого значения |
d,u |
десятичное целое, десятичное беззнаковое |
i |
целое, которое может быть восьмеричным (с ведущим нулем) или шестнадцатеричным (с ведущими 0x или 0X) |
o,x |
восьмеричное, шестнадцатеричное |
с |
символ (любой, включая пробельные); |
s |
строка (непробельных) символов |
e,f,g |
число с плавающей точкой |
p |
адрес (указатель) |
n |
записывает в аргумент число прочитанных к этому моменту символов, чтения из потока ввода не выполняется, счетчик введенных значений не увеличивается |