Контрольная точка 3
Восемь задач по блоку 3: свои функции, несколько результатов, error, разбиение задачи, тесты. По ним видно, какие темы осели. Блок 4 — срезы и карты — строится поверх функций: значения там начинают ходить между функциями пачками, и незасчитанная задача показывает, что повторить до него.
Задачи
Условие — в TASK.txt папки задачи, числа у каждого стажёра свои.
| № | Папка | Что сделать | Где перечитать |
|---|---|---|---|
| 1 | kt1 |
тариф и цена одной функцией с двумя результатами | день 12; памятка, «Несколько результатов» |
| 2 | kt2 |
разбор числа: error как результат и код возврата 1 |
день 12; памятка, «error» |
| 3 | kt3 |
разобрать простыню на функции, вывод прежний | день 13; страница 1 |
| 4 | kt4 |
свой тест на готовую функцию | день 14; страница 1 |
| 5 | kt5 |
табличный тест на четыре случая и больше | день 14; памятка, «Табличный тест» |
| 6 | kt6 |
починить программу по упавшему тесту | день 14; страница 1 |
| 7 | kt7 |
таблица трассировки вызовов | день 11; правила — в kt7/TASK.txt |
| 8 | kt8 |
что выведет: копия аргумента и затенение | дни 11 и 12; памятка |
stagiaire@lab:~$ cd ~/gocourse/day15/kt1
stagiaire@lab:~/gocourse/day15/kt1$ cat TASK.txt
Контрольная точка 3. Задача 1 — тариф и цена одной функцией.
Программа читает вес посылок в граммах, по строке на посылку. Пустые
строки и строки из одних пробелов пропускаются, пробелы по краям числа
не мешают. Не чисел во вводе не бывает, отрицательных весов тоже.Дальше в TASK.txt — что должна делать программа, главное требование задачи, примеры с вашими числами и как задача проверяется.
Как сдаётся
Всё проверяет course check 15. Отдельно сдаётся только ответ на задачу 8 — два числа через пробел вместо слова ЧИСЛА; отправить заново можно:
stagiaire@lab:~/gocourse/day15/kt8$ course answer day15.kt8 40 12
Принято: day15.kt8 = 40 12Вместо 40 12 — два своих числа.
Программы с вводом (задачи 1–3) проверка запускает на наборе вводов. Первые случаи — примеры из TASK.txt, на них при расхождении видно и то, что было нужно. Остальные скрыты: видно только ввод и то, что напечатала программа.
✘ Задача 1 — тариф и цена функцией с двумя результатами
Условие: cat ~/gocourse/day15/kt1/TASK.txt — проверьте границы тарифов.
следующий уровень подсказки: course hint 15 kt1
случай 4 из 11, ввод: 900
строка 1, программа напечатала: «Посылка 1: средний, 230 руб.»Нужный ответ решаете вы по правилам из TASK.txt. Проверка останавливается на первом неверном случае — после починки может всплыть следующий. В задаче 2 обычный вывод, поток ошибок и код возврата сверяются отдельно, и проверка называет, что именно не совпало.
Задачи 1 и 2 дополнительно смотрят на устройство программы, а не только на вывод: функция, про которую задача, должна быть не только объявлена, но и вызвана, и её результаты приняты в переменные. В задаче 2 проверяется ещё, что ошибка именно возвращается: os.Exit и печать в поток ошибок — в main, а не внутри функции разбора. Мёртвая функция-заглушка рядом с расчётом в main зачёта не даёт.
Задача 3 дополнительно считает свои функции и строки тел: в main не больше 32 строк, своих функций не меньше трёх, и ни одна функция не длиннее 20 строк. Пустые func x() {} и функции, которых никто не вызывает, за свои не считаются, а весь main, переложенный в одну функцию, — это та же простыня. Вывод при этом обязан остаться прежним — это и есть смысл задачи. Эти числа — не правило «функция не длиннее N строк», которого в курсе нет (день 13, страница 1): это порог, которым проверка отличает разрезанную программу от переложенной. Внутри порога длина не оценивается.
Ваши тесты (задачи 4 и 5) проверяются подменой. Сначала go test запускается на вашей работе — он обязан пройти. Потом проверка берёт копию каталога, подменяет в ней реализацию заведомо неверной и запускает ваш тест ещё раз — теперь он обязан упасть. Ваши файлы при этом не трогаются.
✘ Задача 4 — свой тест на orderCost ловит подмену
Тест проходит и на заведомо неверной программе — значит, он ничего не проверяет. Добавьте случай, на котором ошибка видна, и сравнивайте результат с ожидаемым.
следующий уровень подсказки: course hint 15 kt4Вторая подмена — другая запись той же логики: функция считает ровно то же самое, но другими строками. На ней ваш тест обязан пройти. Тест, который вместо результата вызова разглядывает текст cost.go или fee.go, на такой подмене падает и зачёта не получает.
✘ Задача 5 — табличный тест на packFee ловит подмену на границе
Тест падает на другой записи той же логики: он проверяет не поведение функции, а её текст или окружение. Сравнивайте результат вызова с ожидаемым.
следующий уровень подсказки: course hint 15 kt5В задаче 5 подмена отличается от верной функции ровно на границе бесплатной упаковки: таблица без случая «ровно на границе» её не заметит. Реализации (cost.go, fee.go, limits.go) менять не нужно — проверка сверяет их с оригиналом.
Задача 6 проверяется скрытым авторским тестом: в нём другие числа, чем в stock_test.go. Файл stock_test.go менять нельзя, в stock.go можно изменить не больше двух строк — чинят программу, а не тест.
Таблица в kt7 сверяется целиком: одна неверная клетка — задача не засчитана, и какая именно, проверка не говорит. Правила таблицы — те же, что весь курс: новых правил контрольная не вводит, действуют правила 1–24. Все двадцать четыре собраны списком в памятке блока 3 — course page 15 2, раздел «Трассировка: правила 1–24»; держите его открытым рядом. Для вызовов главные — 16–20, и самое забываемое из них — правило 18: строка заголовка функции тоже шаг.
kt7/main.go и kt8/main.go менять не нужно: номера строк в таблице и ответ на задачу 8 считаются по тем файлам, какие положил стенд, — проверка сверяет их с оригиналом. Отладочная печать — в копии в scratch.
Коммиты
Работа дня должна лежать в репозитории ~/gocourse/day15: не меньше восьми коммитов — начальные плюс по одному на задачу. Это отдельный пункт дня, в контрольную точку он не входит, но на порог дня влияет.
✘ Работа дня лежит в репозитории ~/gocourse/day15 (коммитов: 3, нужно от 8)Порог и пересдача
Задача засчитана целиком или не засчитана. Порог — 6 задач из 8. Итог по точке на пустом стенде:
--- контрольная точка 3 ---
Задач сдано: 0 из 8. Порог — 6. Пересдача — доделайте задачи и повторите course check 15.День закрывается при трёх условиях: сдано 10 пунктов из 13 — ритуал перед коммитом и задачи вместе; точка взята; сданы контрольные вопросы. Без точки день не закроется при любом числе пунктов:
Контрольная точка не взята: 5 из 8 при пороге 6.
День не закрыт: пункты контрольной обязательны.Когда пункты и точка сданы, проверка отправит к course quiz 15; после вопросов — ещё раз course check 15.
Пересдача — повторный course check 15, попыток сколько угодно. Между проверками — не меньше 15 секунд, каждая попытка пишется в ~/.course/checks. Свой прогон — go test . и примеры из TASK.txt — быстрее паузы.
Подсказки и время
course hint 15 kt3 работает и на контрольной. Третий уровень — готовое решение, он попадает в отчёт: задача засчитается, но тему, которая не осела, уже не покажет. Застряли — по порядку: перечитать TASK.txt; прогнать примеры или написать тест на спорный случай; памятка; двадцать минут своей отладки; только потом первый уровень подсказки.
На контрольную заложите около трёх часов. Первые десять минут прочитайте все восемь TASK.txt. Начните с задач, в которых уверены. Получас на задачу — это не норма, а сигнал: просидели над одной полчаса без движения — отложите её и берите следующую, вернётесь потом. course check 15 — после каждой решённой задачи, и коммит.
Что может пойти не так
| Что видите | Что это значит | Что делать |
|---|---|---|
в kt1 нет файлов .go |
main.go не создан или лежит в другой папке |
~/gocourse/day15/kt1/main.go |
в программе нет функции с двумя результатами |
тариф и цена считаются прямо в main |
вынести в функцию (string, int) |
её никто не вызывает так, чтобы оба результата пригодились |
функция объявлена, но расчёт остался в main |
позвать её: name, price := tariff(weight) |
в теле main стоит число тарифа (900) |
границы или цены переехали не полностью | все числа тарифов — внутри функции |
в программе нет функции с результатом error |
ошибка печатается внутри функции разбора | вернуть её вторым результатом |
функция parseNumber печатает ошибку или сама вызывает os.Exit |
функция решает за вызывающего | return 0, errors.New(…), а печать и os.Exit(1) — в main |
своих функций в задаче: 1, нужно не меньше трёх |
простыня осталась простынёй | выносить по одному куску, после каждого — прогон и коммит |
в функции doEverything строк: 41 — ни одна функция не должна быть длиннее 20 |
main целиком переехал в одну функцию |
резать по швам: разбор строки, расчёт, печать |
строк в теле main: 34, можно не больше 32 |
вынесена только печать | вынести ещё разбор строки или расчёт |
файл cost.go изменён, а менять его в этой задаче не нужно |
правили функцию вместо того, чтобы писать тест | cp ~/.course/orig/day15/kt4/cost.go ~/gocourse/day15/kt4/cost.go |
Нет файла с тестом в каталоге задания: он называется на _test.go |
тест назван иначе или лежит не там | kt4/cost_test.go, kt5/fee_test.go |
Сначала добейтесь, чтобы go test проходил на вашей программе |
ваш тест падает уже на верной функции | ожидаемое число посчитано неверно — пересчитайте по условию |
Тест проходит и на заведомо неверной программе |
тест ничего не сравнивает или пропустил границу | добавить случай, на котором ошибка видна |
строк с полем want в таблице случаев: 2, нужно не меньше четырёх |
случаев мало, или want стоит в комментарии, а не в строке таблицы |
дописать строки самой таблицы, форма — памятка |
в тесте нет цикла по таблице |
случаи расписаны по одному, без таблицы | for _, c := range cases |
в stock.go изменено строк: 6, можно не больше 2 |
функция переписана целиком | cp оригинала и точечная правка |
файл stock_test.go изменён |
починили тест вместо программы | вернуть тест из ~/.course/orig/day15/kt6 |
В таблице осталось знаков ?: 42 |
таблица не заполнена | заменить каждый ? |
Строк с шагами в таблице 11, а нужно 12 |
строка таблицы удалена | вернуть число строк заготовки |
файл main.go изменён, а менять его в этой задаче не нужно |
в kt7 или kt8 добавлена отладочная печать |
cp оригинала, опыты — в scratch |
программа работала дольше 5 секунд и была остановлена |
цикл не кончается или программа ждёт ввода | проверить условие цикла |
Материал дня закончен. Задания — course lab 15, дополнительное чтение — course extra 15