Функция форматного вывода
printf (форматная строка, значения)
Форматная строка содержит текст, выводимый на экран без изменений, и спецификаторы формата. Функция возвращает количество выведенных символов. Спецификатор формата
% флаги ширина_поля_вывода . точность модификатор спецификатор_типа
Обязательными являются только знак % (признак начала спецификатора) и спецификатор типа. Основные спецификаторы типа приведены в таблице 1.
Таблица 1
Символ | Тип аргумента; вид печати |
d, i | int; десятичное целое |
u | unsigned int; беззнаковое десятичное целое |
c | char, int; один символ |
f | double; десятичная дробь, количество знаков после точки задается точностью (по умолчанию равно 6) |
e, E | double; вещественное число в экспоненциальной форме записи, количество знаков после точки в мантиссе задается точностью (по умолчанию равно 6) |
g, G | double; использует %e или %E, если порядок меньше, чем -4, или больше или равен точности; в противном случае использует %f. Завершающие нули и завершающая десятичная точка не печатаются |
Функция форматного ввода
scanf (форматная строка, адреса)
Форматная строка содержит, как правило, только спецификаторы формата. Разделителями значений в строке ввода являются символы пробела, табуляции или конца строки. Функция возвращает количество правильно считанных данных. Спецификатор формата
% * ширина_поля_ввода модификатор спецификатор_типа
Обязательными являются только знак % (признак начала спецификатора) и спецификатор типа. Основные спецификаторы типа приведены в таблице 2.
Таблица 2
Символ | Тип вводимого данного |
d | десятичное целое: int |
i | целое: int. Целое может быть восьмеричным (с 0 слева) или шестнадцатеричным (с 0x или 0X слева) |
u | беззнаковое десятичное целое: unsigned int |
c | символы: char. Считывается любой символ, в том числе разделитель |
e, f, g | число с плавающей точкой: float |
Постановка задачи
1. Набрать текст программы, представленный ниже. Проанализировать значения переменных после каждой операции присваивания. Проверить порядок выполнения операций в каждом выражении, содержащем несколько операций присваивания, разделив каждый оператор-выражение на несколько операторов, выполняемых последовательно. В функциях ввода и вывода изменить спецификаторы формата, проанализировать полученные результаты.
#include <stdio.h>
#include <stdlib.h>
int main (void)
{
int a, b = 5, c;
double x, y = -.5, z;
printf("a=");
scanf("%d", &a);
x = c = a;
printf("x = c = a : a=%d c=%d x=%f\n",a, c, x);
a += b;
printf("a += b : a=%d\n", a);
x *= b+a;
printf("x *= b+a : x=%lf\n", x);
b += a--;
printf("b += a-- : a=%d b=%d\n", a, b);
x -= ++c;
printf("x -= ++c : c=%d x=%lf\n", c, x);
c = a/b;
printf("c = a/b : c=%4d\n",c);
c = a%b;
printf("c = a%%b : c=%d\n",c);
y += (a+1)/a++;
printf("y += (a+1)/a++ : a=%d y=%.3lf\ty=%.0lf\n",
a, y, y);
b = 3*(y-=.6)+2*b+1;
printf("b = 3*(y-=.6)+2*b+1 : b=%d y=%.1lf\n",
b, y);
z = a/2;
printf("z = a/2 : z = a/2 : z=%lf\n", z);
z = (double)a/2;
printf("z = (double)a/2 : z=%lf\n", z);
y = (x = 5.7)/2;
printf("y = (x = 5.7)/2 : x=%lf y=%lf\n", x, y);
y = (int)x/2;
printf("y = (int)x/2 : y=%f\n", y);
z = (b-3)/2 - x/5 +(c/=2) + 1/4*z - y++ + ++b/3.;
printf("z = (b-3)/2 - x/5 +(c/=2) + 1/4*z - y++ \
+ ++b/3. :\n\a=%d b=%d c=%d x=%lf y=%lf z=%lf\n",
a,b,c,x,y,z);
system("pause");
return 0;
}
2. Написать программу для вычисления значений следующих выражений:
a=5, c=5
a=a+b-2
c=c+1, d=c-a+d
a=a*c, c=c-1
a=a/10, c=c/2, b=b-1, d=d*(c+b+a)
Выражения, записанные в одной строке, записывать одним оператором-выражением. Переменные c и d объявить как целые, переменные a и b – как вещественные. Значения переменных b и d вводить с клавиатуры. После вычисления каждого выражения выводить на экран значения всех переменных.
3. Набрать текст программы, представленный ниже. Проанализировать выдаваемые программой результаты. Объяснить, почему они именно такие.
#include <stdlib.h>
#include <stdio.h>
#include <limits.h>
#include <float.h>
main()
{
char c;
unsigned char uc;
int i;
unsigned u;
short s;
long l;
float f;
double d;
printf("sizeof(c)=%d\tsizeof(uc)=%d\nsizeof(i)\
=%d\tsizeof(u)=%d\tsizeof(s)=%d\tsizeof(l)=%d\n\
sizeof(f)=%d\tsizeof(d)=%d\n\n", sizeof(c), sizeof(uc), sizeof(i), sizeof(u), sizeof(s), sizeof(l), sizeof(f), sizeof(d));
uc=c=CHAR_MAX;
printf("CHAR_MAX : c=%d uc=%d\n", c, uc);
c++; uc++;
printf("CHAR_MAX+1 : c=%d uc=%d\n", c, uc);
uc=c=CHAR_MIN;
printf("CHAR_MIN : c=%d uc=%d\n", c, uc);
c=uc=UCHAR_MAX;
printf("UCHAR_MAX : c=%d uc=%d\n", c, uc);
c++; uc++;
printf("UCHAR_MAX+1 : c=%d uc=%d\n", c, uc);
uc=c=-5;
printf("-5 : c=%d uc=%d\n", c, uc);
c=-5; uc=5;
printf("char and unsigned char -5>5 : %d\n\n",
c>uc);
c=s=SHRT_MAX;
uc=s;
printf("SHRT_MAX : c=%d uc=%d s=%d\n", c, uc, s);
s++;
printf("SHRT_MAX+1 : s=%d\n", s);
c=s; uc=s;
printf("%d : c=%d uc=%d\n", SHRT_MIN, c, uc);
s=0; c=s; uc=s;
printf("0 : c=%d uc=%d s=%d\n", c, uc, s);
i=INT_MAX;
l=i; u=i;
printf("INT_MAX : i=%d u=%u l=%ld\n", i, u, l);
i++; l++; u++;
printf("INT_MAX+1 : i=%d u=%u l=%ld\n", i, u, l);
i=INT_MIN;
l=i; u=i;
printf("INT_MIN : i=%d u=%u l=%ld\n", i, u, l);
u=UINT_MAX;
i=u; l=u;
printf("UINT_MAX : i=%d u=%u l=%ld\n", i, u, l);
u=i=-5;
printf("-5 : i=%d u=%u\n", i, u);
i=-5; u=5;
printf("int and unsigned int -5>5 : %d\n", i>u);
c=-5; u=5;
printf("char and unsigned int -5>5 : %d\n\n",
c>u);
i=5.1;
printf("i=5.1 : i=%d\n", i);
i=5.9;
printf("i=5.9 : i=%d\n", i);
d=f=FLT_MAX;
printf("FLT_MAX : f=%g d=%g\n", f, d);
d=f=FLT_MIN;
printf("FLT_MIN : f=%g d=%g\n", f, d);
d=f=FLT_EPSILON;
printf("FLT_EPSILON : f=%g d=%g\n", f, d);
f=1e10;
printf("1e10 : f=%f\n", f);
f=1e11;
printf("1e11 : f=%f\n", f);
f=1234567890;
printf("1234567890 : f=%f\n", f);
d=DBL_MAX;
printf("DBL_MAX : d=%g\n", d);
d=DBL_MIN;
printf("DBL_MIN : d=%g\n", d);
d=DBL_EPSILON;
printf("DBL_EPSILON : d=%g\n", d);
d=1e15+1;
printf("1e15+1 : d=%lf\n", d);
d=1e16+1;
printf("1e16+1 : d=%lf\n", d);
f=10000*100000;
f+=1;
f-=4*250000000;
printf("1 : f=%f\n", f);
f=10000*100000+1-4*250000000;
printf("1 : f=%f\n", f);
d=10000*100000+1-4*250000000;
printf("1 : d=%lf\n", d);
d=1e20*1e20+1000-1e22*1e18;
printf("1000 : d=%lf\n", d);
system("pause");
return 0;
}
Контрольные вопросы
1. Какова структура программы на языке Си?
2. Зачем нужна директива #include?
3. Что такое main()?
4. Перечислите скалярные типы данных языка Си.
5. Что определяет тип данного?
6. Что такое void?
7. Что такое явное и неявное приведение типов? Как и когда оно используется?
8. Что такое константа? Найдите константы в набранных вами программах.
9. Что такое переменная?
10. Как проинициализировать переменную?
11. Чем отличается оператор от операции?
12. Чем отличаются унарные операции от бинарных?
13. Какие операции относятся к арифметическим? Каков приоритет каждой из них?
14. Каков порядок выполнения операций в случае их одинакового приоритета?
15. Как выполняется операция деления в случае целочисленных операндов и в случае, когда хотя бы один из операндов вещественный?
16. Что такое выражение?
17. Какое значение вычисляет операция присваивания?
18. В каком порядке выполняются присваивания в случае, если в выражении их несколько?
19. Как и зачем используются дополнительные операции присваивания?
20. Чем отличается префиксная форма операции инкремента или декремента от постфиксной?
21. Какие функции используются для ввода информации? Назовите их отличительные особенности.
22. Какие функции используются для вывода информации? Назовите их отличительные особенности.
23. Почему функции scanf() и printf() называются функциями форматного ввода и вывода? Как они работают?
24. Чем отличается управляющая строка функции scanf() от управляющей строки функции printf()?
25. Что такое спецификатор формата? Зачем он нужен?
26. Какие параметры указываются функции scanf() после управляющей строки? Сколько их должно быть?
27. Каковы последствия несоответствия типа считываемой функцией scanf() переменной спецификатору типа?
28. Какие параметры указываются функции printf() после управляющей строки? Сколько их должно быть?
29. Каковы последствия несоответствия типа выводимого функцией printf() значения спецификатору типа?
30. Что такое управляющие символы? Зачем они нужны? Приведите примеры.
Практическая работа № 2.
Ветвления и циклы
Цель работы – познакомиться с функциями из математической библиотеки, освоить операции отношения и логические операции, научиться грамотно программировать базовые алгоритмические структуры «ветвление» и «цикл».
Управляющие конструкции
Составной оператор (блок)