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

Материал из Викиучебника — открытых книг для открытого мира
Содержимое удалено Содержимое добавлено
Ошибка кода - max вместо n в операторе printf. В разборе все правильно.
м Замена <tt /> на <code />; избыточные <big /> и <font /> вокруг <source />; {{SUBPAGENAME}}; пробелы.
Строка 5: Строка 5:
Вот решение этой задачи:
Вот решение этой задачи:


<big><source lang="c">
<source lang="c">
/* Программа max.c "Максимум чисел" */
/* Программа max.c "Максимум чисел" */
#include <stdio.h>
#include <stdio.h>
Строка 22: Строка 22:
return 0;
return 0;
}
}
</source></big>
</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> — он имеет два аргумента:


<big><source lang="c">
<source lang="c">
printf ("Введите %d чисел: ", n);
printf ("Введите %d чисел: ", n);
</source></big>
</source>


Первый аргумент — это строчка <code>"Введите %d чисел: "</code>, которая задает формат того, что будет печататься. В этой строчке встречается выражение <code>%d</code>, которое соответствует формату «десятичная запись целого числа».
Первый аргумент — это строчка <code>"Введите %d чисел: "</code>, которая задает формат того, что будет печататься. В этой строчке встречается выражение <code>%d</code>, которое соответствует формату «десятичная запись целого числа».
Строка 40: Строка 40:
Оператор условного перехода записывается так:
Оператор условного перехода записывается так:


<big><source lang="c">
<source lang="c">
if(A) B;
if(A) B;
</source></big>
</source>


Он соответствует предложению
Он соответствует предложению


: Если выполнено условие <code>A</code>, то сделать <code>B</code>.
: Если выполнено условие <code>A</code>, то сделать <code>B</code>.
Строка 50: Строка 50:
Оператор <code>for</code> устроен следующим образом:
Оператор <code>for</code> устроен следующим образом:


<big><source lang="c">
<source lang="c">
for(A; B; C ) D;
for(A; B; C ) D;
</source></big>
</source>


Элемент <code>D</code> может быть как одной командой, так и произвольным набором команд, заключенных в ''блок''.
Элемент <code>D</code> может быть как одной командой, так и произвольным набором команд, заключенных в ''блок''.
Строка 58: Строка 58:
Команды объединяются в блок с помощью заключения их в фигурные скобки. В нашем случае <code>D</code> это
Команды объединяются в блок с помощью заключения их в фигурные скобки. В нашем случае <code>D</code> это


<big><source lang="c">
<source lang="c">
scanf ("%d", &a);
scanf ("%d", &a);
if(a > max)
if(a > max)
max = a;
max = a;
</source></big>
</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:
Например, строчка
Например, строчка


<big><source lang="c">
<source lang="c">
for(i = 0 ; i < 10 ; i++) { printf ("Hi!"); }
for(i = 0 ; i < 10 ; i++) { printf ("Hi!"); }
</source></big>
</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

Язык Си в примерах


  1. Компиляция программ
  2. Простейшая программа «Hello World»
  3. Учимся складывать
  4. Максимум
  5. Таблица умножения
  6. ASCII-коды символов
  7. Верхний регистр
  8. Скобочки
  9. Факториал
  10. Степень числа
  11. Треугольник Паскаля
  12. Корень уравнения
  13. Система счисления
  14. Сортировка
  15. Библиотека complex
  16. Сортировка на основе qsort
  17. RPN-калькулятор
  18. RPN-калькулятор на Bison
  19. Простая грамматика
  20. Задача «Расчёт сопротивления схемы»
  21. Простая реализация конечного автомата
  22. Использование аргументов командной строки
  23. Чтение и печать без использования stdio
  24. Декодирование звукозаписи в формате ADX
  25. Другие примеры

Задача: написать программу, которая находит максимум из введенных целых чисел. На ввод поступает количество чисел, а затем сами числа.

Вот решение этой задачи:

 /* Программа 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!. Более подробно:

  1. Положим i = 0;
  2. Проверим, что i < 10; если условие не выполнено, то перейдем к пункту 5;
  3. Выполним printf ("Hi!");
  4. Выполним i++ (увеличим переменную i на 1) и перейдем к пункту 2;
  5. Конец цикла;

Логику оператора for можно изобразить в виде блок-схемы:

Файл:For.gif

Логика нашей программы следующая:

  1. Объявляем все переменные, которые встретятся в нашей программе:
    • n — количество чисел,
    • i — переменная цикла,
    • max — переменная для хранения текущего найденного максимума,
    • a — переменная с очередным числом, в неё мы считываем каждое число.
  2. Печатаем на экран приглашение ввести число n.
  3. Считываем n.
  4. Печатаем на экран приглашение «Введите n чисел».
  5. Считываем первое из этих n чисел в переменную max.
  6. В цикле n - 1 раз считываем очередное число, и если оно больше, чем текущий максимум, то обновляем переменную max.
  7. Выводим значение переменной max .

Вы уже наверное заметили, что когда мы в scanf указываем переменные, в которые нужно поместить считываемые данные, то перед именем переменной ставим знак & (амперсанд), в то время как в printf при печати значений переменных амперсанд не ставится.

Операция «амперсанд» — это операция взятия адреса. Если a есть значение переменной a, то &a — это адрес в памяти компьютера, где хранится переменная a: одно есть само число, другое — место, где это число хранится.

Функции scanf нужно знать не текущее значение переменной, а её адрес, чтобы положить туда результат считывания. Функции printf нужно знать значения переменных, чтобы их печатать. Функции scanf нужно передавать адреса переменных, куда помещать считываемые данные.