Как решать задачу
Новых конструкций языка сегодня не будет. За четыре дня собрано всё, из чего пишутся программы блока: переменные, арифметика, строки, готовые функции, вывод. Сегодня — как дойти от условия задачи до работающей программы. В конце дня — контрольная точка: восемь задач по всему блоку.
Где на самом деле трудно
Получив задачу, новичок обычно делает одно из двух. Либо сидит над пустым файлом и не знает, с какой строки начать. Либо пишет программу целиком, запускает, получает шесть ошибок компилятора, а когда их починит — число, которое «вроде похоже».
Дело не в синтаксисе. В исследовании Маккракена и соавторов (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. Подцели
Какие промежуточные числа нужны, чтобы напечатать ответ:
boxes— сколько коробок.last— сколько штук в последней коробке; для неё нужнаboxes.cost— стоимость упаковки в копейках; тоже нужнаboxes.- Рубли и копейки для печати — из
costчерез/и%, как в день 03.
Порядок следует из зависимостей: last и cost считаются из boxes, значит, boxes — первой. Каждую подцель можно проверить отдельно — по своей колонке таблицы примеров.
Что может пойти не так
| Что видите | Что это значит | Что делать |
|---|---|---|
| пример не получается посчитать на бумаге | условие не понято | перечитать; выписать, что дано и что печатать; посчитать самый простой случай |
| программа печатает правдоподобное число, сравнить не с чем | пропущен шаг 2 | посчитать пример на бумаге до запуска |
| все примеры удобные: делятся с остатком, штук много | ошибка на границе останется незамеченной | добавить пример без остатка и пример меньше одной коробки |
| подцель не укладывается в одну-две строки | шаг слишком крупный | разбить на промежуточные значения поменьше |
| в условии непонятно, как округлять | условие неполное | искать правило в условии; в задачах курса оно всегда записано явно |
Попробуйте сейчас: четвёртый пример на бумаге.
Цель: посчитать ещё одну строку таблицы примеров без готовых формул.
Не заглядывая на следующую страницу, посчитайте на бумаге четвёртую строку таблицы примеров:
items— 25,perBox— 12,boxPrice— 90. Сколько коробок, сколько штук в последней, сколько стоит упаковка?Запишите ответ. На следующей странице будут готовые формулы — сверьте ответ по ним.
Готово, когда: на бумаге записаны три числа — коробок, штук в последней коробке и стоимость упаковки в рублях.
Дальше: пишем программу по кусочкам — course next