День 08 · Циклы: for, границы, накопители · страница 4 из 7

Трассировка цикла

В цикле одна строка выполняется много раз, и шаги таблицы уже не идут подряд по программе. Зато ошибка на единицу в ней видна сразу. Правила дней 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 — шаг, строка с одной } — не шаг.

  1. Строка for — шаг каждый раз, когда программа к ней приходит (от } в конце тела — сразу). Значения пишут после начального значения или третьей части и проверки: на шаге 4 у i уже 1.
  2. Последний шаг со строкой for — тот, где условие ложно; он есть всегда, и переменная цикла на нём «за границей»: 3 при i < 3.
  3. После цикла переменной цикла нет — прочерк, как до объявления.
  4. break и continue — шаги, значения в них те же, что строкой выше; после continue идёт строка for, после break — строка за циклом.
  5. Шаги нумеруются подряд, номера строк повторяются. Самопроверка: строка 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.go
package 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
ls

2. Откройте 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