Язык Си в примерах/Максимум
Материал из Викиучебника
- Компиляция программ
- Простейшая программа «Hello World»
- Учимся складывать
- Максимум
- Таблица умножения
- ASCII коды символов
- Верхний регистр
- Скобочки
- Факториал
- Степень числа
- Треугольник Паскаля
- Корень уравнения
- Система счисления
- Сортировка
- Библиотека complex
- Сортировка на основе qsort
- RPN калькулятор
- RPN калькулятор на Bison
- Простая грамматика
- Задача «Расчёт сопротивления схемы»
- Простая реализация конечного автомата
- Использование аргументов командной строки
- Чтение и печать без использования stdio
Задача: написать программу, которая находит максимум введенных целых чисел. На вход поступает количество чисел, а затем сами числа.
Вот решение этой задачи:
/* Программа 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 нужно передавать адреса переменных, куда помещать считываемые данные.
