Задача о рыбаках и рыбке: «беспрограммное» решение в среде Mathcad
На рис. 6.22 показано, как задача решается методом последовательных приближений – задается первое приближение к ответу (50 рыб), а затем от этого числа отнимается по единице до тех пор, пока убывающий улов не будет представлять собой целочисленный ряд: было 25 рыб (искомый ответ задачи), первый рыбак выбросил одну, забрал треть и оставил товарищам 16 рыб (по 8 каждому); второй рыбак (не зная, что первый ушел) оставил 10 рыб, а третий – 6. Задача решена, но с применением «ручной» работы, состоящей в наблюдении за значениями переменной Улов и в изменении (уменьшении на единицу) значения переменной Ответ. (Блоки операторов, фиксирующих действие трех рыбаков, можно не дублировать, как это сделано на рис. 6.22. Достаточно уменьшать[38]
значение переменной Ответ и следить за значениями переменной Улов).
Попробуем автоматизировать поиск ответа в задаче о рыбаках и рыбке.
‘ 1. Исходная неструктурированная Basic-программа
Input "Предположение"; Ответ
label: Улов = Ответ
For Рыбак = 1 To 3
Улов = Улов – 1
Улов = Улов - Улов / 3
If Улов > Int(Улов) Then Ответ = Ответ - 1: Goto label
Next
Print "Ответ "; Ответ; “рыб”
‘ 2. Первый шаг структурирования - разбег
Input "Предположение"; Ответ
Ответ = Ответ + 1 ‘ Шаг назад
label: Ответ = Ответ - 1 ‘ Шаг вперед
Улов = Ответ
For
Рыбак = 1 To
3
Улов = Улов – 1
Улов = Улов - Улов / 3
If Улов > Int(Улов) Goto label
Next
Print "Ответ "; Ответ; “рыб”
‘ 3. Второй шаг структурирования – ввод признака
Input "Предположение"; Ответ
Ответ = Ответ + 1
label: Ответ = Ответ – 1
Улов = Ответ
Поделили = "да" ’ Признак дележа улова
For Рыбак = 1 To 3
Улов = Улов – 1
Улов = Улов - Улов / 3
If Улов > Int(Улов) Then
Поделили = “нет”
Next
If Поделили = “нет Goto
label
Print "Ответ "; Ответ; “рыб”
‘ 4. Третий шаг структурирования – отказ от метки
Input "Предположение"; Ответ
Ответ = Ответ + 1
Do ’ Начало цикла с постпроверкой
Ответ = Ответ – 1
Улов = Ответ
Поделили = "да"
For
Рыбак = 1 To
3
Улов = Улов – 1
Улов = Улов - Улов / 3
If
Улов > Int(Улов) Then
Поделили = “нет”
Next
Loop Until Поделили = "да" ’ Конец цикла
"Ответ "; Ответ; “рыб”