Язык Си в примерах/Учимся складывать: различия между версиями

Исправления.
(→‎Числовые типы: Новый раздел.)
(Исправления.)
В отличие от рассмотренной ранее [[../Простейшая программа «Hello World»|простейшей программы]], в данной задаче нам потребуются [[w:Переменная (программирование)|переменные]] — ячейки памяти, в которые функция ввода сохранит введенные пользователем числа, подлежащие сложению.
 
Как и функциив случае функций (в том числе <code>main</code>), объявление переменных в Си предполагает указание их типов. Основные числовые типы языка — <code>int</code> ([[w:Целое число|целыецелое числачисло]] фиксированной разрядности) и <code>double</code> ([[w:Число с плавающей запятой|числачисло с плавающей запятой]].) Поскольку мы уже использовали тип <code>int</code> в описании функции <code>main</code>, применим его же в данной задаче.
 
<source lang="c">
Число, которое будет выведено, является результатом вычисления выражения <code>a + b</code> — или же, проще говоря, — суммой значений переменных <code>a</code> и <code>b</code>.
 
Вводимые пользователем числа помещаются в эти переменные функцией <code>scanf</code>, вызываемой в коде выше как <code>scanf ("%d%d", &a, &b)</code>.<ref name="fscanf" >[http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf#page=335 WG14 N1570 Committee Draft — April 12, 2011] 7.21.6.2 ''The fscanf function''</ref> Здесь, как и в <code>printf</code>, используется указатель преобразования <code>%d</code>, означающий на этот раз ''считывание'' числа в десятичной форме (возможно — предваряемого пробелами). Поскольку указатель повторен дважды, будет считано два числа, которые будут считаны и помещены в упомянутые в аргументах две переменные <code>a</code> и <code>b</code>. (Необходимый здесь унарный оператор <code>&</code> оставим пока без внимания.)
 
Как и <code>printf</code>, функция <code>scanf</code> ''объявлена'' в ''заголовке'' (англ. {{lang|en|header}}) <code>stdio.h</code>.<ref name="stdio.h" >[http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf#page=314 WG14 N1570 Committee Draft — April 12, 2011] 7.21 ''Input/output <code>stdio.h</code>''</ref>
Для проверки соответствия ввода пользователя требованиям программы мы ''сохраняем'' (<code>=</code>) результат выполнения <code>scanf</code> — количество успешно измененных переменных — в целочисленной переменной с именем <code>r</code> (<code>int r</code>), после чего ''требуем'' равенства ее значения двум (<code>assert (r == 2);</code>.)
 
<small>Действие ''макроподстановки'' <code>assert</code> заключается в сравнении результата вычисления''вычислении'' выражения, переданного ей первым (и единственным) аргументом и ''аварийном завершении'' программы в случае, если полученное значение — ноль («логическая ложь».)<ref name="assert" >[http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf#page=204 WG14 N1570 Committee Draft — April 12, 2011] 7.2.1.1 ''The assert macro''</ref></small>
 
Наконец, в самом начале функции <code>main</code> ''определены'' (помимо упомянутой уже <code>r</code>) целочисленные переменные <code>a</code> и <code>b</code>. Их значение в начале выполнения функции <code>main</code> может быть произвольным,<ref name="init" >[http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf#page=157 WG14 N1570 Committee Draft — April 12, 2011] 6.7.9 ''Initialization''</ref> но после успешного (что проверяется вызовом <code>assert</code>) завершения <code>scanf</code> они будут содержать два числа, которые удалось последовательно считать со [[w:Стандартные потоки#Стандартный ввод|стандартного ввода]].
* [[w:Число с плавающей запятой|с плавающей запятой]]:
** <code>float</code> — диапазон: не хуже 10⁻³⁷ … 10⁺³⁷, [[w:Число с плавающей запятой#Машинная эпсилон|''ε''<sub>маш</sub>]] < 10⁻⁵;
** <code>double</code>, <code>long double</code> — диапазон: не хуже 10⁻³⁷ … 10⁺³⁷, ''ε''<sub>маш</sub> < 10⁻9 10⁻⁹;
* [[w:Комплексное число|комплексные]]: <code>float _Complex</code>, <code>double _Complex</code>, <code>long double _Complex</code> — диапазон и ''ε''<sub>маш</sub> действительной и мнимой частей совпадают с таковыми для соответствующих чисел с плавающей запятой.
 
:; Числа с плавающей запятой
::* <code>f</code> — десятичная запись (1000000.000000);
::* <code>e</code>, <code>E</code> — десятичная [[w:Экспоненциальная запись#Компьютерный способ экспоненциальной записи|E-запись]] (1.000000e+06, 1.000000E+06);
::* <code>g</code> — «автоматический» выбор между <code>e</code> и <code>f</code>;
::* <code>a</code>, <code>A</code> — шестнадцатеричная запись (0xf.4240p4, 0XF.4240P4).
3890

правок