MathCAD

d7c8102a

Задача о рыбаках и рыбке: «беспрограммное» решение в среде 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 Поделили = "да" ’ Конец цикла

Print

"Ответ "; Ответ; “рыб”



Содержание раздела