Путь от задачи к коду

Одна задача, разобранная по шагам. Мы не будем торопиться и не будем пропускать этапы. Именно так работает программист: сначала думает, потом пишет.

Исходная задача

В группе из N студентов каждый получил оценку за экзамен (от 2 до 5). Нужно найти средний балл группы и определить, сколько человек сдали экзамен успешно (получили 4 или 5).

Этап 1 · Понять задачу

Прочитать условие и сказать своими словами

На этом этапе мы не думаем ни о языке, ни о синтаксисе. Мы просто объясняем задачу самому себе — как будто рассказываем другу.

Своими словами: «Есть список оценок. Нужно посчитать два числа: среднее арифметическое всех оценок — и сколько из них четвёрки или пятёрки».

Если вы не можете объяснить задачу своими словами — вы её ещё не поняли. Читайте условие снова, разбирайте непонятные слова, придумывайте примеры.

Этап 2 · Формализация

Определить вход, выход и ограничения

Теперь нужно превратить словесное описание в точное. Отвечаем на три вопроса: что на входе, что на выходе, что считать «правильным ответом».

Входные данные
  • N — количество студентов, целое положительное
  • N оценок — целые числа от 2 до 5
Выходные данные
  • avg — средний балл, вещественное число
  • good — количество оценок ≥ 4, целое
Промежуточные
  • sum — сумма всех оценок
  • i — счётчик текущей оценки
Обратите внимание. Мы пока не написали ни строчки кода, но уже знаем, что в программе понадобятся четыре переменные. Это не случайность: правильная формализация сразу подсказывает, какие данные нужно хранить.
Этап 3 · Решить руками

Пройти по конкретному примеру и записать шаги

Прежде чем писать программу, решаем задачу вручную на маленьком примере. Это помогает увидеть алгоритм, спрятанный за формулировкой.

Пример: оценки 5, 3, 4, 5, 2 (N = 5).

Что делаем руками
  1. Смотрим на первую оценку: 5. Сумма пока = 5.
  2. Прибавляем 3. Сумма = 8.
  3. Прибавляем 4. Сумма = 12.
  4. Прибавляем 5. Сумма = 17.
  5. Прибавляем 2. Сумма = 19.
  6. Делим 19 на 5 → средний балл 3.8.
  7. Считаем оценки ≥ 4: их 3 (5, 4, 5).
Что заметили
  • Оценки обрабатываются по одной, слева направо.
  • Каждую оценку нужно прибавить к сумме.
  • И одновременно проверить, не ≥ 4 ли она.
  • Значит, действия повторяются для каждой оценки → это цикл.
Смотрите, что произошло: мы обнаружили цикл. Не «вспомнили, что тут должен быть цикл», а именно увидели его — потому что действия повторяются. Так и работает проектирование алгоритма.
Этап 4 · Декомпозиция

Разбить большую задачу на маленькие шаги

Декомпозиция — главный инструмент программиста. Большая задача разбивается на подзадачи, каждая подзадача — снова на подзадачи, пока не останутся совсем простые шаги, которые понятно, как выполнить.

Верхний уровень (грубо)
  1. Ввести оценки
  2. Обработать их и получить sum и good
  3. Вывести avg и good
Нижний уровень (детально)
  1. Ввести N
  2. Обнулить sum и good
  3. Для каждой из N оценок:
  • прочитать очередную оценку в переменную x;
  • sum += x;
  • если x ≥ 4 — увеличить good на 1.
  1. avg = sum / N
  2. Вывести avg и good

Заметьте: на верхнем уровне мы сказали «обработать» — это ещё не инструкция, а цель. На нижнем уровне цель превратилась в конкретные действия. Именно так задача становится алгоритмом.

Этап 5 · Блок-схема

Наглядно нарисовать поток управления

Блок-схема полезна, когда алгоритм становится чуть сложнее, чем «сделай раз, сделай два». Вот как выглядит наш алгоритм в виде схемы:

Начало Ввод N sum = 0; good = 0 i = 1 i ≤ N ? нет да Ввод x sum = sum + x x ≥ 4 ? да good++ i++ нет

Не пугайтесь сложности — схема читается слева направо и сверху вниз. Ромб — это вопрос, у которого два ответа: «да» и «нет». Тело цикла (ввод оценки, sum += x, проверка x ≥ 4) будет выполнено N раз.

Этап 6 · Псевдокод

Записать алгоритм почти на языке — но без синтаксиса

Псевдокод — это «программа на человеческом языке». Здесь можно писать свободно, главное — чтобы был виден порядок действий.

Псевдокод
ВВЕСТИ N

sum ← 0
good ← 0

ДЛЯ i ОТ 1 ДО N:
    ВВЕСТИ x
    sum ← sum + x
    ЕСЛИ x ≥ 4:
        good ← good + 1

avg ← sum / N

ВЫВЕСТИ avg
ВЫВЕСТИ good
Обратите внимание, что структура здесь точно такая же, как в блок-схеме. Мы просто поменяли форму записи — ромбы и стрелки заменили на ДЛЯ и ЕСЛИ. Это и есть программирование: одна и та же мысль в разных обозначениях.
Этап 7 · Код на C++

Перевести псевдокод в синтаксис языка

Только теперь мы открываем редактор. Каждая строка кода соответствует одной строке псевдокода — никаких сюрпризов.

main.cpp
#include <iostream>
using namespace std;

int main() {
    int N;
    cout << "N = ";
    cin >> N;

    int sum = 0;   // сумма всех оценок
    int good = 0;  // количество оценок ≥ 4

    for (int i = 1; i <= N; i++) {
        int x;
        cout << "Оценка " << i << ": ";
        cin >> x;

        sum = sum + x;
        if (x >= 4) good++;
    }

    double avg = (double)sum / N;

    cout << "Средний балл: " << avg << endl;
    cout << "Успешно сдали: " << good << " чел." << endl;

    return 0;
}
Обратите внимание на (double)sum / N. Если написать просто sum / N, оба числа — целые, и деление произойдёт целочисленно (без дробной части). Это одна из самых частых ошибок новичков. Приведение типа к double заставляет деление стать вещественным.

Что мы сейчас сделали

Порядок действий

  1. Прочитали условие и пересказали своими словами.
  2. Разделили данные на вход, выход и промежуточные.
  3. Прошли пример вручную и заметили повторяющиеся действия.
  4. Разложили задачу на простые шаги (сверху вниз).
  5. Нарисовали блок-схему.
  6. Записали псевдокод.
  7. Перевели псевдокод в C++.

Что это дало

  • Мы ни разу не «застряли». Каждый шаг был очевиден.
  • Не пришлось держать всё в голове — всё записано.
  • Если в коде ошибка — её легко найти: она на одном из семи этапов.
  • Тот же приём работает для любой задачи, а не только для этой.

Практика

Прорешайте одну из задач тем же способом — все семь этапов, ничего не пропуская.

  1. Найти сумму отрицательных чисел в списке.
  2. Определить, является ли число простым.
  3. Найти самое длинное слово в строке (для строки из слов, разделённых пробелами).
  4. Проверить, все ли элементы массива упорядочены по возрастанию.
Совет. Не открывайте редактор, пока не сделали шаги 1–5. Первые три пункта можно делать даже без компьютера — на бумаге. Именно там проходит 70% работы программиста.