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

Содержимое удалено Содержимое добавлено
→‎Вариант «дробный»: Исправлена ошибка при написании кода.
м <source> -> <syntaxhighlight> (phab:T237267)
Строка 18:
 
{{Якорь |plus.c}}
<sourcesyntaxhighlight lang="c">
#include <assert.h>
#include <stdio.h>
Строка 30:
return 0;
}
</syntaxhighlight>
</source>
 
{{Якорь |printf}}
Рассмотрим выполнение этой программы почти с ее завершения — вызова функции <code >printf</code>.<ref name="fprintf" /> Данная функция выведет целое число в десятичной форме (согласно ''указателю преобразования'' <code >%d</code>), завершая вывод [[w:Перевод строки |переводом строки]] (<code >\n</code>).
 
Число, которое будет выведено, является результатом вычисления выражения <sourcesyntaxhighlight lang="c" enclose="none" >a + b</sourcesyntaxhighlight> — или же, проще говоря, — суммой значений переменных <var >a</var> и <var >b</var>.
 
{{Якорь |scanf}}
Вводимые пользователем числа помещаются в эти переменные функцией <code >scanf</code>, вызываемой в коде выше как <sourcesyntaxhighlight lang="c" enclose="none" >scanf ("%d%d", &a, &b)</sourcesyntaxhighlight>.<ref name="fscanf" /> Здесь, как и в <code >printf</code>, используется указатель преобразования <code >%d</code>, означающий на этот раз ''считывание'' числа в десятичной форме (возможно — предваряемого пробелами). Поскольку указатель повторен дважды, два числа будут считаны и помещены в упомянутые в аргументах две переменные <var >a</var> и <var >b</var>. (Необходимый здесь унарный оператор [[#& |<code >&</code>]] оставим пока без внимания.)
 
Как и <code >printf</code>, функция <code >scanf</code> ''объявлена'' в ''заголовке'' (англ. {{lang |en|header}}) <code >stdio.h</code>.<ref name="stdio.h" />
Строка 45:
 
{{Якорь |assert}}
Для проверки соответствия ввода пользователя требованиям программы мы ''сохраняем'' (<code >=</code>) результат выполнения <code >scanf</code> — количество успешно измененных переменных — в целочисленной переменной с именем <var >r</var> (<sourcesyntaxhighlight lang="c" enclose="none" >int r</sourcesyntaxhighlight>), после чего ''требуем'' равенства ее значения двум (<sourcesyntaxhighlight lang="c" enclose="none" >assert (r == 2);</sourcesyntaxhighlight>.)
 
<small >Действие ''макроподстановки'' <code >assert</code> заключается в ''вычислении'' выражения, переданного ей первым (и единственным) аргументом и ''аварийном завершении'' программы в случае, если полученное значение — ноль («логическая ложь».)<ref name="assert" /></small>
Строка 57:
 
{{Якорь |plus-fp.c}}
<sourcesyntaxhighlight lang="c">
#include <assert.h>
#include <stdio.h>
Строка 70:
return 0;
}
</syntaxhighlight>
</source>
 
Как видно, в этом случае изменяются лишь тип переменных <var >a</var>, <var >b</var> (<code >int</code> → <code >double</code>) и указатели преобразований (<code >%d</code> → <code >%lg</code>.)
Строка 90:
 
{{Якорь |*}}
Для обращения к ячейке памяти по ссылке используется унарный оператор <code >*</code>. Так, выражение <sourcesyntaxhighlight lang="c" enclose="none" >*(&a) = 1</sourcesyntaxhighlight> полностью равнозначно <sourcesyntaxhighlight lang="c" enclose="none" >a = 1</sourcesyntaxhighlight>.
 
== Вариант «произвольный» ==
Строка 100:
Код имеет следующие отличия от [[#plus.c |исходного]] варианта:
# ввод-вывод чисел произвольной разрядности выполняется функциями <code >gmp_scanf</code> и <code >gmp_printf</code> — ''определенными'' GNU MP и ''объявленными'' в <code >gmp.h</code>; заголовок <code >stdio.h</code> не требуется;
# вместо оператора сложения <code >+</code> используется вызов функции <sourcesyntaxhighlight lang="c" enclose="none" >mpz_add (a, a, b)</sourcesyntaxhighlight>; в такой форме, действие функции подобно действию выражения <sourcesyntaxhighlight lang="c" enclose="none" >a += b</sourcesyntaxhighlight> для переменных «встроенных» целочисленных типов;
# переменные GNU MP требуют обязательной инициализации, которая в примере выполнена функцией <code >mpz_inits ()</code>;
# тип используемых для вычисления переменных — <code >mpz_t</code>.
 
{{Якорь |plus-imp.c}}
<sourcesyntaxhighlight lang="c">
#include <assert.h>
#include <gmp.h>
Строка 122:
return 0;
}
</syntaxhighlight>
</source>
 
== Вариант «арифметический» ==
Строка 129:
 
{{Якорь |arith-if.c}}
<sourcesyntaxhighlight lang="c">
#include <assert.h>
#include <stdio.h>
Строка 154:
return 0;
}
</syntaxhighlight>
</source>
 
{{Якорь |if}}
Строка 179:
 
{{Якорь |arith.c}}
<sourcesyntaxhighlight lang="c">
#include <assert.h>
#include <stdio.h>
Строка 202:
return 0;
}
</syntaxhighlight>
</source>
 
В этом варианте, код вновь содержит те же самые строковые константы, что и в предыдущем, однако используется лишь один вызов функции <code>printf</code> — первым аргументом которой (в зависимости от значения переменной <code>b</code>) окажется одна из этих констант.