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

→‎Вариант «арифметический»: Пример с «while» заменен на пример с «if».
(→‎Вариант «арифметический»: Пример с «while» заменен на пример с «if».)
Желающим изучить использование других числовых типов в этой задаче предлагается обратиться к разделу [[Язык Си в примерах/Скалярные типы#Числовые типы|Числовые типы]] приложения.
 
== Вариант «полныйарифметический» ==
 
В программе ниже мы также вычислим разность и произведение двух чисел, а также, если второе число отлично не ноль, — частное от деления первого на второе.
Ниже приведена программа, которая считывает два действительных числа и
выводит результат четырех арифметических операций: сложения, вычитания, умножения и деления.
Причём, программа выводит результаты вычислений два раза — сначала
в обычном виде, а потом со специальным форматированием.
Формат <code>"%10.3lf"</code> соответствует выводу числа типа <code>double</code>,
при котором под запись числа выделяется ровно 10 позиций (если это возможно),
а после запятой пишется ровно три знака. Равнение происходит по правому краю.
 
<source lang="c">
#include <assert.h>
#include <stdio.h>
 
{
double a, b;
int r
while (scanf ("%lf%lf", &a, &b) == 2) {
printf= scanf ("%lf lg%lflg", %lf&a, %lf\n",&b);
assert (r == 2);
a + b, a - b, a * b, a / b);
printfif (("a + b != %10.3lf\n"0) {
printf (("a -+ b = %10.3lflg\n"
"a *- b = %10.3lflg\n"
"a /* b = %10.3lflg\n"),
"a / b = %lg\n"),
a + b, a - b, a * b, a / b);
} else {
printf (("a + b = %lg\n"
"a - b = %lg\n"
"a * b = %lg\n"),
a + b, a - b, a * b, a / b);
}
return 0;
</source>
 
В этой программе нам потребовался ''условный оператор контекста утверждения'' (англ. {{lang|en|if statement}}) — один из четырех (наряду с <code>&&</code>, <code>||</code> и <code>? :</code>) условных операторов языка. Его синтаксис:<ref name="if" >[http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf#page=166 WG14 N1570 Committee Draft — April 12, 2011] 6.8.4.1 ''The if statement''</ref>
В этой программе мы встречаемся с оператором <code>while</code>. Конструкция
<code>if (</code>⟨''выражение''⟩<code>)</code>
<source lang="c">
⟨''тело-если-истинно''⟩
while ( A ) B;
<!-- -->
</source>
<code>if (</code>⟨''выражение''⟩<code>)</code>
 
⟨''тело-если-истинно''⟩
означает буквально следующее:
<code>else</code>
 
⟨''тело-если-ложно''⟩
: Пока выполнено условие <code>A</code> делать <code>B</code>.
 
или, другими словами,
 
: Выполнять в цикле <code>B</code>, проверяя перед каждой итерацией, что выполнено условие <code>A</code>.
 
В нашем случае <code>A</code> есть
<source lang="c">
scanf ("%lf%lf", &a, &b) == 2
</source>
 
Что соответствует логическому выражению:
: пользователь ввёл два действительных числа, и они удачно считаны в переменные a и b.
 
Где ⟨''тело-если-истинно''⟩ и ⟨''тело-если-ложно''⟩ могут быть (каждый) единственным утверждением (завершаемым <code>;</code>), или же, как в примере выше, — <code>{ }</code>-блоком.
Таким образом, эта программа будет считывать пары чисел и выводить результаты
арифметических операций, пока пользователь не введёт что-нибудь непохожее на число.
 
В случае, если результат вычисления ''выражения'' — истина (другими словами — отличен от 0), выполняется ⟨''тело-если-истинно''⟩; в противном случае (и если используется <code>else</code>) — ⟨''тело-если-ложно''⟩.
Цикл <code>while</code> закончится тогда, когда функция <code>scanf</code> не сможет успешно считать два числа.
 
Заметьте, что послекаждое каждойпростое команды''утверждение'' стоит(англ. точка{{lang|en|statement}}) завершается точкой с запятой.
Одна из самых популярных синтаксических ошибок начинающих программистов — это не ставить точку c запятой в концепосле командыутверждений.
 
==Примечания==
3890

правок