Язык Си в примерах/Максимум: различия между версиями
исправил printf ("Введите %d чисел: ", n); на printf ("Введите %d чисел: ", max); так как далее вводят scanf ("%d", &max); |
Ошибка кода - max вместо n в операторе printf. В разборе все правильно. |
||
Строка 12: | Строка 12: | ||
printf ("Введите количество чисел: "); |
printf ("Введите количество чисел: "); |
||
scanf ("%d", &n); |
scanf ("%d", &n); |
||
printf ("Введите %d чисел: ", |
printf ("Введите %d чисел: ", n); |
||
scanf ("%d", &max); |
scanf ("%d", &max); |
||
for(i = 1; i < n ; i++) { |
for(i = 1; i < n ; i++) { |
Версия от 10:27, 26 декабря 2012
- Компиляция программ
- Простейшая программа «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
нужно передавать адреса переменных, куда помещать считываемые данные.