Трассировка цикла
В цикле одна строка выполняется много раз, и шаги таблицы уже не идут подряд по программе. Зато ошибка на единицу в ней видна сразу. Правила дней 02 и 06 остаются, к ним добавляются пять новых.
Строка for — тоже шаг
Ситуация. Что лежит в sum и i после каждой выполненной строки? Номера строк слева, как в VS Code:
1 package main
2
3 import "fmt"
4
5 func main() {
6 sum := 0
7 for i := 0; i < 3; i++ {
8 sum += i
9 }
10 fmt.Println(sum)
11 }| шаг | строка | что происходит | sum | i |
|---|---|---|---|---|
| 1 | 6 | создать sum |
0 | - |
| 2 | 7 | i := 0, 0 < 3 истина |
0 | 0 |
| 3 | 8 | 0 + 0 | 0 | 0 |
| 4 | 7 | i++, 1 < 3 истина |
0 | 1 |
| 5 | 8 | 0 + 1 | 1 | 1 |
| 6 | 7 | i++, 2 < 3 истина |
1 | 2 |
| 7 | 8 | 1 + 2 | 3 | 2 |
| 8 | 7 | i++, 3 < 3 ложь |
3 | 3 |
| 9 | 10 | печать; i нет |
3 | - |
stagiaire@lab:~/gocourse/day08/scratch$ go run .
3Правила для цикла. Правила 1–6 дня 02 и 7–10 дня 06 в силе: строка if — шаг, строка с одной } — не шаг.
- Строка
for— шаг каждый раз, когда программа к ней приходит (от}в конце тела — сразу). Значения пишут после начального значения или третьей части и проверки: на шаге 4 уiуже 1. - Последний шаг со строкой
for— тот, где условие ложно; он есть всегда, и переменная цикла на нём «за границей»: 3 приi < 3. - После цикла переменной цикла нет — прочерк, как до объявления.
breakиcontinue— шаги, значения в них те же, что строкой выше; послеcontinueидёт строкаfor, послеbreak— строка за циклом.- Шаги нумеруются подряд, номера строк повторяются. Самопроверка: строка
forвстречается на один раз больше, чем выполнилось тело.
Все пятнадцать — списком в памятке блока, course page 10 2.
Попробуйте сейчас: таблица цикла на бумаге.
Цель: таблица «шаг | строка | total | day» без запуска, сверенная с выводом.
1. На бумаге, не запуская, заполните её для программы:
Код для чтения · разбираем, набирать не нужноpackage main import "fmt" func main() { total := 10 for day := 1; day <= 2; day++ { total -= day } fmt.Println(total) }2. Сколько раз встретилась строка 7? Сходится ли с правилом 15?
3. Последнюю строку проверьте запуском — наберите программу в
scratch/main.go:✎ Наберите в файлscratch/main.gopackage main import "fmt" func main() { total := 10 for day := 1; day <= 2; day++ { total -= day } fmt.Println(total) }▶ Выполнитеcd ~/gocourse/day08/scratch go run .Готово, когда: напечатанное число равно
totalв последней строке, а строка 7 встретилась на раз больше, чем строка 8.
Таблица в файле
Задания trace1 и trace2 — в формате дня 02: table.txt рядом с program.go, по строке на каждую выполненную строку main; менять можно только ?. В trace1 номера строк уже стоят, считать нужно значения; в trace2 номера, кроме первых двух и последней, — тоже ?, потому что в программе есть if и continue и путь по строкам решаете вы. Проверка сравнивает номера, значения и порядок; пробелы не важны, а где именно ошибка, она не говорит.
Что может пойти не так
| Что видите | Что это значит | Что делать |
|---|---|---|
В таблице ещё осталось знаков ?: 3 |
заполнено не всё | найти ?: в VS Code Ctrl+F |
Строк с шагами в таблице 11, а нужно 12 |
строку удалили или добавили | переименовать table.txt, потом course lab 08 |
Все ? заполнены, но где-то … не совпали |
ошибка в каком-то шаге | пройти заново по правилам, сверить отладочной печатью |
в строке for у счётчика старое значение |
i++ выполняется на этой строке |
правило 11 |
| после цикла у переменной цикла число | она живёт только внутри | правило 13 |
после continue записана следующая строка тела |
continue возвращает к строке for |
правило 14 |
Попробуйте сейчас: задания trace1 и trace2.
Цель: все
?вtrace1/table.txtиtrace2/table.txtзаполнены без запуска. Числа у каждого свои.1. Откройте первое задание:
▶ Выполнитеcd ~/gocourse/day08/trace1 ls2. Откройте
program.goиtable.txtрядом, заполните все?без запуска, потом запустите: последние значения должны совпасть с последней строкой.▶ Выполнитеgo run .3. То же для
trace2: сначала номера строк, весь путь программы, потом значения.4. Промежуточные значения сверяют в копии:
▶ Выполнитеcp program.go ~/gocourse/day08/scratch/main.go cd ~/gocourse/day08/scratch go run .Готово, когда: в обеих таблицах не осталось
?, а пунктыtrace1иtrace2зелёные.
Дальше: как прочитать все строки ввода, сколько бы их ни было — course next