День 05 · Контрольная точка 1: как решать задачу · страница 1 из 5

Как решать задачу

Новых конструкций языка сегодня не будет. За четыре дня собрано всё, из чего пишутся программы блока: переменные, арифметика, строки, готовые функции, вывод. Сегодня — как дойти от условия задачи до работающей программы. В конце дня — контрольная точка: восемь задач по всему блоку.


Где на самом деле трудно

Получив задачу, новичок обычно делает одно из двух. Либо сидит над пустым файлом и не знает, с какой строки начать. Либо пишет программу целиком, запускает, получает шесть ошибок компилятора, а когда их починит — число, которое «вроде похоже».

Дело не в синтаксисе. В исследовании Маккракена и соавторов (2001) студентам четырёх университетов после первого года программирования дали задачу, рассчитанную на полтора часа. Средний балл — 22,9 из 110. Хуже всего дался последний шаг: убедиться, что решение верное.

Ниже — порядок действий из пяти шагов. Он одинаков для задачи на десять строк и для тикета в рабочем сервисе.


Пять шагов

Шаг Что делаете Что получается
1. Прочитать условие выписываете, что дано, что напечатать и в каком виде список данных и образец вывода
2. Выписать примеры для двух-трёх наборов данных считаете ответ на бумаге; один набор — «неудобный» таблица «дано → должно получиться»
3. Разбить на подцели называете промежуточные значения, из которых складывается ответ список переменных; каждая считается одной-двумя строками
4. Писать кусками одна подцель — пара строк — go run . — сверка с таблицей программа растёт, и каждый кусок уже проверен
5. Сверить прогоняете все примеры, gofmt -l ., go vet . уверенность вместо «вроде похоже»

Примеры — до кода. Ответ, посчитанный на бумаге, — единственное, с чем можно сравнить вывод программы. Без него любое правдоподобное число кажется верным. Не получается посчитать на бумаге — значит, задача ещё не понята, и код здесь не поможет.

«Неудобный» пример — тот, на котором формулы обычно ломаются: делится без остатка, ноль, ровно одна штука, ровно граница. На удобных данных программа часто выходит правильной с первого раза; ошибки видны на неудобных.

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

Попробуйте сейчас: условие разминки на бумаге.

Цель: шаги 1 и 2 для разминки сделаны на бумаге, без кода.

Откройте условие разминки — её сверит проверка дня:

▶ Выполните
cat ~/gocourse/day05/warmup/TASK.txt

Сделайте шаги 1 и 2 на бумаге: что дано, что напечатать и в каком виде; ответ для примера из условия и для ваших данных. Код пока не пишите — он будет на следующей странице.

Готово, когда: на бумаге записаны данные и вид вывода, ответ, посчитанный для примера, совпал с выводом в разделе «ПРИМЕР» условия, и для ваших данных тоже посчитаны четыре строки.


Разбор: упаковка заказа

Пройдём все пять шагов на одной задаче. На этой странице — шаги 1–3, на следующей — код.

Условие. Заказ — items штук одного товара. В коробку входит perBox штук. Упаковка одной коробки стоит boxPrice копеек. Программа печатает, сколько штук в заказе, сколько нужно коробок, сколько штук окажется в последней коробке и сколько стоит упаковка в рублях. Образец вывода для items — 50, perBox — 12, boxPrice — 90:

Вывод · это печатает программа, набирать не нужно
Штук в заказе: 50
Коробок: 5
В последней коробке: 2 шт.
Упаковка: 4.50 руб.

Шаг 1. Прочитать условие

Что Здесь
Дано items — штук в заказе, perBox — штук в коробке, boxPrice — копеек за коробку; все целые
Напечатать четыре строки: штук, коробок, штук в последней, стоимость
В каком виде как в образце: двоеточие и пробел, «шт.» только в третьей строке, рубли через точку и ровно две цифры копеек

Вид вывода — часть условия. Упаковка: 4.5 руб. вместо 4.50 — другой ответ: проверка курса сравнивает вывод буква в букву.

Шаг 2. Примеры

Считаем на бумаге три набора. Первый — из образца. Второй — неудобный: товар раскладывается по коробкам без остатка. Третий — тоже неудобный: весь заказ меньше одной коробки.

items perBox boxPrice Коробок В последней Упаковка
50 12 90 5 2 4.50
48 12 90 4 12 3.60
7 12 90 1 7 0.90

Как посчитана первая строка: четыре полные коробки — это 48 штук, остаются 2, им нужна пятая коробка. Пять коробок по 90 копеек — 450 копеек, то есть 4 рубля 50 копеек. Во второй строке 48 штук ровно на четыре коробки, и последняя из них полная — в ней 12. В третьей — одна неполная коробка на 7 штук.

Шаг 3. Подцели

Какие промежуточные числа нужны, чтобы напечатать ответ:

  1. boxes — сколько коробок.
  2. last — сколько штук в последней коробке; для неё нужна boxes.
  3. cost — стоимость упаковки в копейках; тоже нужна boxes.
  4. Рубли и копейки для печати — из cost через / и %, как в день 03.

Порядок следует из зависимостей: last и cost считаются из boxes, значит, boxes — первой. Каждую подцель можно проверить отдельно — по своей колонке таблицы примеров.


Что может пойти не так

Что видите Что это значит Что делать
пример не получается посчитать на бумаге условие не понято перечитать; выписать, что дано и что печатать; посчитать самый простой случай
программа печатает правдоподобное число, сравнить не с чем пропущен шаг 2 посчитать пример на бумаге до запуска
все примеры удобные: делятся с остатком, штук много ошибка на границе останется незамеченной добавить пример без остатка и пример меньше одной коробки
подцель не укладывается в одну-две строки шаг слишком крупный разбить на промежуточные значения поменьше
в условии непонятно, как округлять условие неполное искать правило в условии; в задачах курса оно всегда записано явно

Попробуйте сейчас: четвёртый пример на бумаге.

Цель: посчитать ещё одну строку таблицы примеров без готовых формул.

Не заглядывая на следующую страницу, посчитайте на бумаге четвёртую строку таблицы примеров: items — 25, perBox — 12, boxPrice — 90. Сколько коробок, сколько штук в последней, сколько стоит упаковка?

Запишите ответ. На следующей странице будут готовые формулы — сверьте ответ по ним.

Готово, когда: на бумаге записаны три числа — коробок, штук в последней коробке и стоимость упаковки в рублях.


Дальше: пишем программу по кусочкам — course next