Ширина_поля модификатор спецификатор
Среди элементов спецификации преобразования обязательны только % и спецификатор. Для ввода числовых данных используются спецификаторы:
d- для целых десятичных чисел (тип int);
u - для целых десятичных чисел без знака (тип unsigned int);
f -для вещественных чисел (тип float);
е - для вещественных чисел (тип float).
Ширина_поля - целое положительное число, позволяющее определить, какое количество байтов (символов) из входного потока соответствует вводимому значению.
В качестве модификаторов используются символы:
h- для ввода значений типа short int (hd);
l- для ввода значений типа long int (ld)или double (lf, le);
L- для ввода значений типа long double (Lf, Le).
В отличие от функции printf() аргументами для функции scanf() могут быть только адреса объектов программы, в частном случае - адреса ее переменных. Не расшифровывая понятие адреса (адресам и указателям будут рассмотрены позже), напомним, что в языке Си имеется специальная унарная операция & получения адреса объекта:
& имя_обьекта
Выражение для получения адреса переменной будет таким:
& имя_переменной
Итак, для обозначения адреса перед именем переменной записывают символ &. Если name - имя переменной, то &name -ее адрес.
Например, для ввода с клавиатуры значений переменных n, z, х можно записать оператор:
scanf ("%d%f%f",&n,&z,&x);
В данном примере спецификации преобразования в форматной строке не содержат сведений о размерах полей и точностях вводимых значений. Это разрешено и очень удобно при вводе данных, диапазон значений которых определен не строго. Если переменная n описана как целая, z и х - как вещественные типа float,то после чтения с клавиатуры последовательности символов 18 18 -0.431 переменная n получит значение 18, z — значение 18.0, х-значение -0.431.
При чтении входных данных функция scanf() воспринимает в качестве разделителей полей данных "обобщенные пробельные символы" - собственно пробелы, символы табуляции, символы новых строк.
Пример 16: Вычисление объема цилиндра.
/*Вычисление объема прямого цилиндра*/
#include <stdio.h>
void main( )
{
double h, r, v;
const float PI = 3.14159;
/*h - высота цилиндра, r -радиус цилиндра*/
/*v - объем цилиндра, PI - число "пи" */
printf("\n Радиус цилиндра r= ");
scanf("%lf", &r);
printf("Высота цилиндра h= "); ;
scanf("%lf”, &h);
v = h * PI * r * r;
printf("Объем цилиндра: %10.4f" ,v):
}
В тексте программы несколько особенностей. Определена константа PI, т.е. со значением 3.14159 связано имя PI, которое до конца выполнения программы будет именовать только это значение.
Перед каждым вводом помещены вызовы функции printf(), выводящей на экран запрос-подсказку, вслед за которой на экране отображается набираемое на клавиатуре вводимое значение. Функция scanf() считывает только это значение, как только будет нажата клавиша "Ввод" (Enter), что воспринимается как признак конца строки ввода. Поэтому очередной вызов функции printf() выводит данные на следующую строку. Обратите внимание на спецификации преобразования %lf Если бы переменные h и r имели тип float,то в форматных строках функций scanf() нужно было бы применять спецификации %f или %е. Текст на экране при выполнении программы может быть таким:
радиус цилиндра r= 2.0
высота цилиндра h= 4.0
Объем цилиндра: 50.2654
Здесь пользователь ввел 2.0 для г и 4.0 для h. Другой вариант:
радиус цилиндра r= 4.0
высота цилиндра h= 2.0
Объем цилиндра: 100.5309
Еще раз обратите внимание на использование в функции scanf() не имен переменных, а их адресов &r, &h.
Сумма членов ряда Фибоначчи.Ряд Фибоначчи определен, если известны первые два его члена f1, f2, так как очередной член fi =fi-1 + fi-2 для r>2. Необходимо вычислить сумму заданного количества (k) первых членов ряда Фибоначчи, если известны первые два: р = F1 и r = F2. Далее программа решает эту задачу:
/*Вычисление суммы членов ряда Фибоначчи*/
#include <stdio.h>
void main( )
{
int k,i;/*к-число членов; i-номер члена */
float s,p,r,f; /* s - искомая сумма */
/*Члены: р -первый; r - второй; f- i-й*/
Ml: printf("\n Введите число членов ряда k=") ;
scanf ("%d",&k) ;
if( k > 2 ) goto M2;
printf("\n Ошибка! k должно быть > 2 !");
goto Ml;
M2: printf("\n Первый член ряда р=") ;
scanf("%f",&p);
printf("\n Второй член ряда r=");
scanf("%fn,&r);
i = 3;
s = p + r;
M: f = p + r;
s = s + f;
p = r;
r = f ;
i = i + 1;
if ( i <= k ) goto M;
printf("\n Сумма членов ряда: %10.3f", s);
}
Обратите внимание на строки, где выполняется проверка введенного значения k. Программа может правильно работать только при к>2, поэтому только в этом случае выполняется переход к метке М2. В противном случае печатается сообщение об ошибке, и после перехода к метке Ml запрашивается новое значение k.
Особенность и недостаток программы состоят в том, что она никогда не закончит вычислений, если не ввести допустимого значения к>2.
Ход работы
1 Изучить теоретические сведения.
2 Выполнить загрузку интегрированной среды разработки С (IDE) для Borland C, расположенной в каталоге N:\APL\BC\BIN\BC.EXE, из активной директории.
3 Ознакомиться с форматом функций printf()иscanf().
4 Скопировать примеры для функций printf, scanf из встроенной помощи в активное окно и изучить их работу. Изучить синтаксические конструкции, приведенные во встроенной помощи.
5 Выполнить загрузку программ-примеров (N:\APL\TC\LAB\*.CPP),их корректировку с использованием различных возможностей функций printf (), scanf (),сохранение файлов и компиляцию.
6 Написать отчет и сделать выводы по работе.
7 Подготовиться к защите лабораторной работы, изучив вопросы по данной теме, изучив контрольные вопросы по теме.
Задание к лабораторной работе
Составьте программу для вычисления функции b=f(x,y,z), где z=j(x,y). Вид функции и исходные данные приведены в таблице 14.
Таблица 14
Вар. | f(x,y,z) | j(x,y) | x | y |
e|x-y|(tg2z)x | -4,52 | 0,75 | ||
2,87 | 0,84 | |||
1,82 | 18,25 | |||
5,34 | 3,85 | |||
-2,75 | -1,42 | |||
1,54 | -3,26 | |||
1,82 | 18,23 | |||
-0,85 | 1,25 | |||
0,12 | -8,75 | |||
1,58 | 3,42 | |||
0,42 | -0,87 | |||
-15,24 | 4,67 | |||
6,55 | -2,78 | |||
0,84 | 0,65 | |||
1,12 | 0,87 | |||
0,27 | 4,38 | |||
6,35 | 7,32 | |||
0,42 | 1,23 | |||
4,32 | -0,54 | |||
0,83 | 2,38 | |||
-0,93 | -0,25 | |||
3,25 | 4,12 | |||
-0,72 | -1,42 | |||
3,98 | -1,63 | |||
2sin(px+y) | 3,91 | -0,51 | ||
-0,62 | 5,54 | |||
-4,58 | 2,32 | |||
-3,44 | 5,28 | |||
5,48 | 2,25 |
Лабораторная работа №6