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

Содержимое удалено Содержимое добавлено
Нет описания правки
м Оформление, мелкие правки
Строка 1:
{{Содержание «Язык Си в примерах»}}
 
Задача: Напишитенаписать программу, которая находит максимум введенных целых чисел. На вход поступает количество чисел, а затем сами числа.
 
Вот решение этой задачи:
Строка 24:
</source>
 
Числа вы можете вводить, разделяя их пробелом <code>SPACE</code>, символом табуляции <code>TAB</code>, или нажимая после каждого введенного числа <code>ENTER</code>. Символы <code>SPACE</code>, <code>TAB</code>, <code>ENTER</code> называются пробельными символами (white space). Функция <code>scanf</code> считывает объекты, разделенные любым числом пробельных символов.
Символы SPACE, TAB, ENTER называются пробельными символами (white space). Функция <tt>scanf</tt> считывает
объекты, разделенные любым числом пробельных символов.
 
Обратите внимание на второй <ttcode>printf</ttcode> &mdash; он имеет два аргумента:
 
<source lang="c">
Строка 34 ⟶ 32 :
</source>
 
Первый аргумент &mdash; это строчка <ttcode>"Введите %d чисел: "</ttcode> , которая задает формат того, что будет печататься. В этой строчке встречается выражение <code>%d</code>, которое соответствует формату «десятичная запись целого числа».
В этой строчке встречается выражение <tt>%d</tt>, которое соответствует формату "десятичная запись целого числа".
На месте этого выражения будет напечатано на экране компьютера значение второго аргумента, то есть значение переменной <tt>n</tt>.
 
На месте этого выражения будет напечатано на экране компьютера значение второго аргумента, то есть значение переменной <ttcode>n</ttcode>.
В программе <tt>max.c</tt> мы впервые встречаемся с ''условным оператором'' <tt>if</tt> и ''оператором цикла''
 
<tt>for</tt>.
В программе <ttcode>max.c</ttcode> мы впервые встречаемся с ''условным оператором'' <ttcode>if</ttcode> и ''оператором цикла'' <code>for</code>.
 
Оператор условного перехода записывается так:
 
<source lang="c">
if(A) B;
Строка 48 ⟶ 46 :
Он соответствует предложению
 
«: Если выполнено условие <ttcode>A</ttcode>, то сделать <ttcode>B</ttcode>».
 
Оператор <ttcode>for</ttcode> устроен следующим образом:
 
<source lang="c">
Строка 56 ⟶ 54 :
</source>
 
Элемент <ttcode>D</ttcode> может быть как одной командой, так и произвольным набором команд, заключенных в ''блок''.
заключенных в ''блок''.
 
Команды объединяются в блок с помощью заключения их в фигурные скобок. В нашем случае <code>D</code> это
В нашем случае <tt>D</tt> это
 
<source lang="c">
Строка 68 ⟶ 64 :
</source>
 
Элемент <ttcode>D</ttcode> называется телом цикла &mdash; это то, что будет выполнятся несколько раз. Сколько именно? Это зависит от <code>B</code> — тело <code>D</code> будет выполнятся, пока выполнено условие <code>B</code>.
Сколько именно? Это зависит от <tt>B</tt> &mdash; тело <tt>D</tt> будет выполнятся пока выполнено условие <tt>B</tt>.
 
Например, строчка
 
<source lang="c">
for( i = 0 ; i < 10 ; i++ ) { printf ( "Hi!" ); }
</source>
 
«означает 10 раз напечатать слово <ttcode>Hi!</ttcode> ». Более подробно:
 
#положим Положим <ttcode>i = 0</ttcode>;
#проверим Проверим, что <ttcode>i < 10</ttcode>; если условие не выполнено, то перейдем к пункту 5;
#выполним Выполним <ttcode>printf ( "Hi!" )</ttcode>;
#выполним Выполним <ttcode>i++</ttcode> (увеличим переменную <ttcode>i</ttcode> на 1) и перейдем к пункту 2;
#конец Конец цикла;
 
Логику оператора <ttcode>for</ttcode>. можно изобразить в виде блок -схемы:
 
[[Изображение:for.gif]]
Строка 91 ⟶ 86 :
Логика нашей программы следующая:
 
# Объявляем все переменные, которые встретятся встречаются в нашей программе:
:#* <ttcode>n</ttcode> количество чисел,
:#* <ttcode>i</ttcode> переменная цикла,
:#* <ttcode>max</ttcode> переменная для хранения текущего найденного максимума,
:#* <ttcode>a</ttcode> переменная с очередным числом, в неё мы считываем каждое число.
# Печатаем на экран приглашение ввести число <ttcode>n</ttcode>.
# Считываем <ttcode>n</ttcode>.
# Печатаем на экран приглашение «Введите <ttcode>n</ttcode> чисел».
# Считываем первое из этих <ttcode>n</ttcode> чисел в переменную <ttcode>max</ttcode>.
# В цикле <ttcode>n - 1</ttcode> раз считываем очередное число, и если оно больше, чем текущий максимум, то обновляем переменную <ttcode>max</ttcode>.
# Выводим значение переменной <ttcode>max</ttcode> .
 
 
Вы уже наверное заметили, что когда мы в <tt>scanf</tt> указываем переменные,
в которые нужно поместить считываемые данные, то перед именем переменной ставим знак &amp; (амперсанд), в то время как в <tt>printf</tt> при печати значений переменных амперсанд не ставится.
Операция «амперсанд» &mdash; это операция взятия адреса.
Если <tt>a</tt> есть значение переменной <tt>a</tt>, то <tt>&amp;a</tt> &mdash; это адрес в памяти компьютера, где хранится переменная <tt>a</tt>: одно есть само число, другое &mdash; место, где это число хранится.
 
Вы уже наверное заметили, что когда мы в <code>scanf</code> указываем переменные, в которые нужно поместить считываемые данные, то перед именем переменной ставим знак <code>&amp;</code> (амперсанд), в то время как в <ttcode>printf</ttcode> при печати значений переменных амперсанд не ставится.
Функции <tt>scanf</tt> нужно знать не текущее значение переменной, а её адрес, чтобы положить туда результат считывания.
 
Операция «амперсанд» — это операция взятия адреса. Если <ttcode>a</ttcode> есть значение переменной <ttcode>a</ttcode>, то <ttcode>&amp;a</ttcode> &mdash; это адрес в памяти компьютера, где хранится переменная <ttcode>a</ttcode>: одно есть само число, другое &mdash; место, где это число хранится.
Функции <tt>printf</tt> нужно знать значения переменных, чтобы их печатать.
 
Функции <ttcode>scanf</ttcode> нужно знать не текущее значение переменной, а её адрес, чтобы положить туда результат считывания. Функции <code>printf</code> нужно знать значения переменных, чтобы их печатать. Функции <code>scanf</code> нужно передавать адреса переменных, куда помещать считываемые данные.