Язык Си в примерах/Максимум: различия между версиями
Ошибка кода - max вместо n в операторе printf. В разборе все правильно. |
ISbot (обсуждение | вклад) м Замена <tt /> на <code />; избыточные <big /> и <font /> вокруг <source />; {{SUBPAGENAME}}; пробелы. |
||
Строка 5: | Строка 5: | ||
Вот решение этой задачи: |
Вот решение этой задачи: |
||
<source lang="c"> |
|||
/* Программа max.c "Максимум чисел" */ |
/* Программа max.c "Максимум чисел" */ |
||
#include <stdio.h> |
#include <stdio.h> |
||
Строка 22: | Строка 22: | ||
return 0; |
return 0; |
||
} |
} |
||
</source |
</source> |
||
Числа вы можете вводить, разделяя их пробелом <code>SPACE</code>, символом табуляции <code>TAB</code>, или нажимая после каждого введенного числа <code>ENTER</code>. Символы <code>SPACE</code>, <code>TAB</code>, <code>ENTER</code> называются пробельными символами (white space). Функция <code>scanf</code> считывает объекты, разделенные любым числом пробельных символов. |
Числа вы можете вводить, разделяя их пробелом <code>SPACE</code>, символом табуляции <code>TAB</code>, или нажимая после каждого введенного числа <code>ENTER</code>. Символы <code>SPACE</code>, <code>TAB</code>, <code>ENTER</code> называются пробельными символами (white space). Функция <code>scanf</code> считывает объекты, разделенные любым числом пробельных символов. |
||
Строка 28: | Строка 28: | ||
Обратите внимание на второй <code>printf</code> — он имеет два аргумента: |
Обратите внимание на второй <code>printf</code> — он имеет два аргумента: |
||
<source lang="c"> |
|||
printf ("Введите %d чисел: ", n); |
printf ("Введите %d чисел: ", n); |
||
</source |
</source> |
||
Первый аргумент — это строчка <code>"Введите %d чисел: "</code>, которая задает формат того, что будет печататься. В этой строчке встречается выражение <code>%d</code>, которое соответствует формату «десятичная запись целого числа». |
Первый аргумент — это строчка <code>"Введите %d чисел: "</code>, которая задает формат того, что будет печататься. В этой строчке встречается выражение <code>%d</code>, которое соответствует формату «десятичная запись целого числа». |
||
Строка 40: | Строка 40: | ||
Оператор условного перехода записывается так: |
Оператор условного перехода записывается так: |
||
<source lang="c"> |
|||
if(A) B; |
if(A) B; |
||
</source |
</source> |
||
Он соответствует предложению |
Он соответствует предложению |
||
: Если выполнено условие <code>A</code>, то сделать <code>B</code>. |
: Если выполнено условие <code>A</code>, то сделать <code>B</code>. |
||
Строка 50: | Строка 50: | ||
Оператор <code>for</code> устроен следующим образом: |
Оператор <code>for</code> устроен следующим образом: |
||
<source lang="c"> |
|||
for(A; B; C ) D; |
for(A; B; C ) D; |
||
</source |
</source> |
||
Элемент <code>D</code> может быть как одной командой, так и произвольным набором команд, заключенных в ''блок''. |
Элемент <code>D</code> может быть как одной командой, так и произвольным набором команд, заключенных в ''блок''. |
||
Строка 58: | Строка 58: | ||
Команды объединяются в блок с помощью заключения их в фигурные скобки. В нашем случае <code>D</code> это |
Команды объединяются в блок с помощью заключения их в фигурные скобки. В нашем случае <code>D</code> это |
||
<source lang="c"> |
|||
scanf ("%d", &a); |
scanf ("%d", &a); |
||
if(a > max) |
if(a > max) |
||
max = a; |
max = a; |
||
</source |
</source> |
||
Элемент <code>D</code> называется телом цикла — это то, что будет выполнятся несколько раз. Сколько именно? Это зависит от <code>B</code> — тело <code>D</code> будет выполнятся, пока выполнено условие <code>B</code>. |
Элемент <code>D</code> называется телом цикла — это то, что будет выполнятся несколько раз. Сколько именно? Это зависит от <code>B</code> — тело <code>D</code> будет выполнятся, пока выполнено условие <code>B</code>. |
||
Строка 68: | Строка 68: | ||
Например, строчка |
Например, строчка |
||
<source lang="c"> |
|||
for(i = 0 ; i < 10 ; i++) { printf ("Hi!"); } |
for(i = 0 ; i < 10 ; i++) { printf ("Hi!"); } |
||
</source |
</source> |
||
означает 10 раз напечатать слово <code>Hi!</code>. Более подробно: |
означает 10 раз напечатать слово <code>Hi!</code>. Более подробно: |
||
Строка 103: | Строка 103: | ||
Функции <code>scanf</code> нужно знать не текущее значение переменной, а её адрес, чтобы положить туда результат считывания. Функции <code>printf</code> нужно знать значения переменных, чтобы их печатать. Функции <code>scanf</code> нужно передавать адреса переменных, куда помещать считываемые данные. |
Функции <code>scanf</code> нужно знать не текущее значение переменной, а её адрес, чтобы положить туда результат считывания. Функции <code>printf</code> нужно знать значения переменных, чтобы их печатать. Функции <code>scanf</code> нужно передавать адреса переменных, куда помещать считываемые данные. |
||
[[Категория:Язык Си в примерах| |
[[Категория:Язык Си в примерах|{{SUBPAGENAME}}]] |
Версия от 21:58, 29 января 2014
- Компиляция программ
- Простейшая программа «Hello World»
- Учимся складывать
- Максимум
- Таблица умножения
- ASCII-коды символов
- Верхний регистр
- Скобочки
- Факториал
- Степень числа
- Треугольник Паскаля
- Корень уравнения
- Система счисления
- Сортировка
- Библиотека complex
- Сортировка на основе qsort
- RPN-калькулятор
- RPN-калькулятор на Bison
- Простая грамматика
- Задача «Расчёт сопротивления схемы»
- Простая реализация конечного автомата
- Использование аргументов командной строки
- Чтение и печать без использования stdio
- Декодирование звукозаписи в формате ADX
- Другие примеры
Задача: написать программу, которая находит максимум из введенных целых чисел. На ввод поступает количество чисел, а затем сами числа.
Вот решение этой задачи:
/* Программа max.c "Максимум чисел" */
#include <stdio.h>
int main () {
int i, n, a, max;
printf ("Введите количество чисел: ");
scanf ("%d", &n);
printf ("Введите %d чисел: ", n);
scanf ("%d", &max);
for(i = 1; i < n ; i++) {
scanf ("%d", &a);
if(a > max)
max = a;
}
printf ("%d", max);
return 0;
}
Числа вы можете вводить, разделяя их пробелом SPACE
, символом табуляции TAB
, или нажимая после каждого введенного числа ENTER
. Символы SPACE
, TAB
, ENTER
называются пробельными символами (white space). Функция scanf
считывает объекты, разделенные любым числом пробельных символов.
Обратите внимание на второй printf
— он имеет два аргумента:
printf ("Введите %d чисел: ", n);
Первый аргумент — это строчка "Введите %d чисел: "
, которая задает формат того, что будет печататься. В этой строчке встречается выражение %d
, которое соответствует формату «десятичная запись целого числа».
На месте этого выражения будет напечатано на экране компьютера значение второго аргумента, то есть значение переменной n
.
В программе max.c
мы впервые встречаемся с условным оператором if
и оператором цикла for
.
Оператор условного перехода записывается так:
if(A) B;
Он соответствует предложению
- Если выполнено условие
A
, то сделатьB
.
Оператор for
устроен следующим образом:
for(A; B; C ) D;
Элемент D
может быть как одной командой, так и произвольным набором команд, заключенных в блок.
Команды объединяются в блок с помощью заключения их в фигурные скобки. В нашем случае D
это
scanf ("%d", &a);
if(a > max)
max = a;
Элемент D
называется телом цикла — это то, что будет выполнятся несколько раз. Сколько именно? Это зависит от B
— тело D
будет выполнятся, пока выполнено условие B
.
Например, строчка
for(i = 0 ; i < 10 ; i++) { printf ("Hi!"); }
означает 10 раз напечатать слово Hi!
. Более подробно:
- Положим
i = 0
; - Проверим, что
i < 10
; если условие не выполнено, то перейдем к пункту 5; - Выполним
printf ("Hi!")
; - Выполним
i++
(увеличим переменнуюi
на 1) и перейдем к пункту 2; - Конец цикла;
Логику оператора for
можно изобразить в виде блок-схемы:
Логика нашей программы следующая:
- Объявляем все переменные, которые встретятся в нашей программе:
n
— количество чисел,i
— переменная цикла,max
— переменная для хранения текущего найденного максимума,a
— переменная с очередным числом, в неё мы считываем каждое число.
- Печатаем на экран приглашение ввести число
n
. - Считываем
n
. - Печатаем на экран приглашение «Введите
n
чисел». - Считываем первое из этих
n
чисел в переменнуюmax
. - В цикле
n - 1
раз считываем очередное число, и если оно больше, чем текущий максимум, то обновляем переменнуюmax
. - Выводим значение переменной
max
.
Вы уже наверное заметили, что когда мы в scanf
указываем переменные, в которые нужно поместить считываемые данные, то перед именем переменной ставим знак &
(амперсанд), в то время как в printf
при печати значений переменных амперсанд не ставится.
Операция «амперсанд» — это операция взятия адреса. Если a
есть значение переменной a
, то &a
— это адрес в памяти компьютера, где хранится переменная a
: одно есть само число, другое — место, где это число хранится.
Функции scanf
нужно знать не текущее значение переменной, а её адрес, чтобы положить туда результат считывания. Функции printf
нужно знать значения переменных, чтобы их печатать. Функции scanf
нужно передавать адреса переменных, куда помещать считываемые данные.