Урок 4. Вспомогательные алгоритмы
Сегодня ты научишься:
На прошлом уроке Чережик научился строить «домик». А рядом с домом можно вырастить ёлку.
Было бы здорово, если бы программа для Чережника выглядела так:
Но при запуске такой программы система выдаст сообщение об ошибке:
Набери этот программный код и убедись в том, что он не будет выпелнен.
Действительно, Чертежник не умеет выполнять команды «домик» и «ёлка». Но если детализировать алгоритм (то есть, объяснить исполнителю, что означают эти команды), то Чертежник справится с поставленной задачей.
Набери первое уточнение:
Обрати внимание, что команда «домик» в 6-й строке изменила цвет.
Примечание. Закончив рисование домика Чертежник поднял перо и переместил его в начало рисования ёлки (строки 28, 29). После рисования ёлки, будет использован этот же приём. Можно этого не делать, но тогда придется организовать перемещение пера в начало рисования ёлки в основном алгоритме ( между командами «домик» и «ёлка»).
Осталось создать второе уточнение и ещё раз запустить программу на исполнение:
Один и тот же алгоритм может выступать в роли вспомогательного, и в роли основного.
Например, если созданному алгоритму задать имя «домик_ёлка», то можно использовать этот алгоритм в качестве вспомогательного в алгоритме «улица»:
Измени программу рисования ёлки так, как показано на схеме:
Теперь достаточно в качестве аргумента указать в скобках числовой параметр при вызове алгоритма «ёлка» и получить ёлку нужного размера:
Рассмотрим ещё один пример использования вспромогательных алгоритмов для исполнителя Робот.
Пусть требуется написать алгоритм, который переводит Робота из клетки А в клетку Б и закрашивает клетки, отмеченные точками:
Н следующем рисунке показан один из возможных путей перемещения Робота при решении этой задачи:
Видно, что Робот должен закрасить три прямоугольных «блока» размером 3 х 5 клеток, а между блоками два раза обойти стену.
Воспользуемся методом последовательного уточнения. Составим основной алгоритм:
Теперь составим вспомогательные алгоритмы:
Результат работы алгоритма:
Пришло время самостоятельно выполнить задания к уроку 4 из задачника.
Алгоритмические конструкции
Алгоритм на языке КуМир записывается так:
алг квадрат
сместиться на вектор (0,2)
сместиться на вектор (2,0)
сместиться на вектор (0,-2)
сместиться на вектор (-2,0)
Без этой конструкции или за пределами ее программа не может выполнить алгоритм.
Так же на первой строке нужно указать исполнителя для которого вы пишите алгоритм.
использовать ИМЯ_ИСПОЛНИТЕЛЯ (слово использовать с маленькой буквы, имя исполнителя с заглавной буквы).
Правильные конструкции будут с полужирном начертанием, правильные команды будут выделены синим, название исполнителя должно быть зеленым цветом.
Вспомогательный алгоритм — это фрагмент программного кода (подпрограмма), к которому можно обратиться из любого места основной программы. Эта подпрограмма обычно имеет входные и выходные данные.
Роль вспомогательного алгоритма: упростить работу с большим кодом. Задав имя последовательности команд, можно многократно обращаться к этой последовательности, указывая только ее имя.
алг забор | Основной алгоритм
звено | Обращение к вспомогательному алгоритму
алг звено | Вспомогательный алгоритм
Метод последовательной детализации
Использованный нами подход облегчает программирование сложных задач. Задача разбивается на более простые подзадачи. Решение каждой оформляется в виде вспомогательного алгоритма, а основной алгоритм организует связку между ними.
Метод программирования, при котором сначала пишется основная программа, в ней записываются обращения к пока еще не составленным подпрограммам, а потом описываются эти подпрограммы, называется методом последовательной (пошаговой) детализации. Причем количество шагов детализации может быть гораздо большим, чем в нашем примере, поскольку сами подпрограммы могут содержать внутри себя обращения к другим подпрограммам.
Сборочный метод
Возможен и другой подход к построению сложных программ: первоначально составляется множество подпрограмм, которые могут понадобиться при решении задачи, а затем пишется основная программа, содержащая обращения к ним. Подпрограммы могут быть объединены в библиотеку подпрограмм и сохранены в долговременной памяти компьютера. Такую библиотеку можно постепенно пополнять новыми подпрограммами.
Например, если для управления графическим исполнителем создать библиотеку процедур рисования всех букв и цифр, то программа получения любого текста будет состоять из команд обращения к библиотечным процедурам.
Описанный метод называется сборочным программированием.
Часто в литературе по программированию используется такая терминология: метод последовательной детализации называют программированием сверху вниз, а сборочный метод — программированием снизу вверх.
Следование — алгоритмическая конструкция, отображающая естественный, последовательный порядок действий. Алгоритмы, в которых используется только структура «следование», называются линейными алгоритмами.
Графическое представление алгоритмической конструкции «следование» приведено на рисунке справа.
алг закрашивание клетки
Графическое представление и общий вид алгоритмической конструкции «ветвление» приведено на рисунке справа.
Методика преподавания основ алгоритмизации на базе системы «КуМир». Лекция 5
Величины в алгоритмическом языке. Команды ввода/вывода информации. Команда присваивания. Вспомогательные алгоритмы. Алгоритмы с результатами и алгоритмы-функции
Термин величина, который используется в алгоритмическом языке, ввел Андрей Петрович Ершов, заимствовав его из математики и физики, считая, что так школьникам будет проще для понимания. В производственных языках программирования обычно используется термин переменная, который все чаще вытесняется термином объект. При этом в объектно-ориентированном программировании говорят про объект и состояние объекта. Мы вместо этого используем термины величина и значение величины.
Тут уместно заметить, что многие понятия различных языков программирования являются синонимами, и использование той или иной терминологии часто обусловлено привычкой педагога или разработчика языка программирования, а не потребностями именования новых понятий. Мы в курсе школьной информатики сознательно “не бежим впереди паровоза”, стараясь избегать введения новых понятий и сущностей до того момента, когда без этого уже нельзя будет обойтись.
Отступление об уместности формализации. Математизация и формализация не нужны, если суть дела можно объяснить “на пальцах”, пользуясь бытовой лексикой. Вот фрагмент из учебника по теории языков программирования, в котором объясняется разница между “подсловами” и “подпоследовательностями” некоторого слова:
Определение 1.2.19. Пусть . Тогда через Suf(L) обозначается множество, состоящее из всех суффиксов слов языка L:
Множество Suf(L) называется множеством суффиксов языка L.
Лекция 2. Практическое знакомство с системой “КуМир”: исполнитель Робот. Понятие алгоритма. Управление исполнителем Робот с помощью пульта. Линейные алгоритмы. Запись алгоритма. Отступление: Карел-Робот в начальном курсе программирования Стэнфордского университета.
Лекция 3. Методы “визуальной” записи алгоритма. Программное управление Роботом. Цикл “n раз”. Использование вспомогательных алгоритмов. Запись алгоритмов на алгоритмическом языке.
Контрольная работа № 1.
Лекция 4. Арифметические выражения и правила их записи. Алгоритмы с “обратной связью”. Команда “пока”. Условия в алгоритмическом языке. Команды “если” и “выбор”. Команды контроля. “Визуальное” представление команд. Отступление: правила и форма записи арифметических выражений в Фортране XXI века.
Лекция 5. Величины в алгоритмическом языке. Команды ввода/вывода информации. Команда присваивания. Вспомогательные алгоритмы. Алгоритмы с результатами и алгоритмы-функции. Цикл “для”. Табличные величины. Логические, символьные и литерные величины.
Лекция 6. Методы алгоритмизации. Рекуррентные соотношения. Метод итерации. Инвариант цикла. Рекурсия.
Определение 1.2.20. Говорят, что слово х — подслово (substring) слова y, если y = uxv для некоторых, возможно пустых, слов u и v.
Определение 1.2.21. Пусть . Тогда через Subw(L) обозначается множество, состоящее из всех подслов слов языка L. Множество Subw(L) называется множеством подслов языка L.
Определение 1.2.23. Все подслова слова y являются также подпоследовательностями слова y.
Определение 1.2.24. Пусть . Тогда через Subseq(L) обозначается множество, состоящее из всех подпоследовательностей слов языка L. Множество Subseq(L) называется множеством подпоследовательностей языка L.
Подобное изложение необходимо для будущих авторов компиляторов языков программирования, которым нужно овладеть сотнями понятий математической теории формальных языков. Если же нужно объяснить только пару понятий, то полезнее обойтись безо всяких математических обозначений, разобрав суть дела на примерах:
слова “пар”, “ров” и “воз” называют подсловами слова “паровозик”, они состоят из подряд идущих букв слова “паровозик”;
слово “пик” подсловом слова “паровозик” не является, из подряд идущих букв слова “паровозик” его получить нельзя, но можно получить, последовательно, слева направо, выбирая буквы из слова “паровозик”: первую букву “п” берем, следующие 6 букв пропускаем и последние две буквы “ик” берем;
говорят, что слово “пик” является подпоследовательностью слова “паровозик”;
в слове “обозначения” есть одно подслово русского языка и несколько подпоследовательностей;
все подслова данного слова являются также и подпоследовательностями этого слова, так что слова “пар”, “ров” и “воз” являются не только подсловами, но и подпоследовательностями слова “паровозик”.
Итак, следуя академику Ершову, мы не используем принятые в программировании термины переменная или объект, а вводим термин величина.
Как всегда в нашем курсе, для введения нового понятия используется проблемный подход. То есть все начинается с постановки задачи, для решения которой нам понадобятся величины. Приведем ее.
Робот расположен вплотную над горизонтальной стеной неизвестных размеров, расстояние от Робота до краев стены неизвестно, надо провести Робота “сквозь стену” на одну клетку вниз. Поскольку Робот сквозь стены ходить не умеет, т.е. просто скомандовать “вниз” нельзя, то надо заставить Робота эту стену как-то обойти.
При непосредственном управлении школьники запоминают число сделанных “вправо” шагов “в уме” или записывают на бумаге. Если теперь от непосредственного управления Роботом перейти к написанию алгоритма, потребуется как-то записать в алгоритме, что при управлении Роботом ЭВМ (подобно школьнику) должна запоминать число выполненных Роботом команд “вправо” и использовать эту информацию при обратном движении влево.
Что мы делали с прямоугольником в процессе ручного управления:
· рисовали прямоугольник и его имя на доске;
· записывали информацию в прямоугольник, стирая старую информацию;
· читали информацию из прямоугольника.
Те же операции должна будет делать при управлении Роботом и ЭВМ, и в программе мы должны каким-то образом эти операции записать.
Вместо “прямоугольник” будем говорить “величина”. Рисованию прямоугольника и его имени на доске соответствует команда описания имени величины (и ее типа).
Записи информации в прямоугольник со стиранием старой информации соответствует специальная команда — команда присваивания (:=); чтению информации соответствует использование имени величины в выражениях.
У величины есть несколько характеристик. Важнейшее из них имя. Имена величин в одном алгоритме должны быть различны, как говорят, имя должно быть уникально для данного алгоритма.
Отступление. Уникальность имени человека. Уникальны ли имена, которыми мы пользуемся в повседневной жизни? Увы, нет. В классе может быть два Дениса и три Даши, а в одной семье два Вовы. Люди борются с этим, добавляя к имени дополнительную информацию: прозвище, фамилию, отчество, дату и место рождения. В классе различают Дениса Иванова и Дениса Петрова, в семье Сидоровых различают Вову большого и Вову маленького. Однако и это не дает 100%-ную гарантию уникальности. Так, в 90-х годах в Австралии познакомились две дамы, которые родились в один день и у них совпадали фамилия и имя. Познакомились они, когда одной из дам прислали квитанцию штрафа за нарушения правил парковки, которые она не нарушала. Тут-то и выяснилось, что имя, фамилия и дата рождения не могут однозначно идентифицировать человека. Для уточнения приходится добавлять адрес и еще много всевозможных характеристик, которые совместно образуют уникальное Имя конкретного человека (Имя с большой буквы). Проблема уникальности древняя. Все знают имя известного древнегреческого философа Фалеса Милетского, то есть Фалеса из Милета, города, где он проживал. Еще известнее Иисус из Назарета. Читая Ветхий Завет, мы встречаем длинные родословные по мужской линии: в библейские времена такая родословная и была уникальным Именем человека.
Имя бывает у величин, таблиц, алгоритмов и исполнителей. Имя — это последовательность слов, разделенных пробелами. Первое слово имени не должно начинаться с цифры. Ни одно из слов не должно быть ключевым словом.
Слово — это последовательность разрешенных (словарных) символов:
· буквы (кириллические и латинские, прописные и строчные);
· два специальных знака: “@”, “_”
Примеры имен: m, погода на завтра, Ноябрь 7, Седьмое ноября, дом_57б.
Примеры неправильных имен:
· 7е ноября (первое слово начинается с цифры);
· альфа-бета (“-” — недопустимый символ);
· альфа или омега ( или — ключевое слово).
Ключевые слова языка “КуМир” — это: алг нач кон исп кон_исп дано надо арг рез аргрез знач цел вещ лог сим лит таб целтаб вещтаб логтаб симтаб литтаб и или не да нет утв выход ввод вывод нс если то иначе все выбор при нц кц кц_при раз пока для от до шаг true false
Примечание. Ключевое слово не можно вставлять внутрь многословных логических имен.
лог л, завтра будет четверг
л := не завтра будет четверг |Правильно, но не
л := завтра не будет четверг |Правильно,
л := завтра будет не четверг |Правильно,
л := завтра будет четверг не |Неправильно
л := не завтра не будет четверг |Неправильно
Величины в алгоритмическом языке различаются не только по имени, но и по месту, в котором они “живут”: величины из разных алгоритмов могут иметь одинаковые имена. Когда в алгоритме Обойти стену используется величина х, можно представлять себе, что полное имя этой величины звучит как
“х из Обойти стену”: в другом алгоритме возможно использование того же имени х для совершенно другой величины.
Вторая важная характеристика величины — это ее тип.
Тип также говорит о том, какие операции допустимы с величиной.
К величинам числовых и текстовых типов применимы операции сравнения. Так, с вещественными (и целыми) величинами допустимы арифметические операции и операции сравнения. Для литерных — допустимы операции сравнения и т.д.
Величины алгоритмического языка подразделяются на несколько типов:
· цел — принимает целые значения от –2 147 483 647 до 2 147 483 647;
· лог — принимает значения да или нет;
· сим — значением может быть литеральный символ;
· лит — значением может быть строка литеральных символов.
Типы цел и вещ называются числовыми; типы сим и лит — текстовыми.
Каждая величина должна иметь описание, например:
Еще одной характеристикой величины является вид величины: аргумент, результат, промежуточная величина алгоритма, общая величина исполнителя. Вид величины показывает ее информационную роль в алгоритме. Например, аргументы содержат исходную информацию, необходимую для работы алгоритма, а промежуточные величины предназначены для хранения текущей информации, которую обрабатывает алгоритм. Во время выполнения алгоритма в каждый конкретный момент величина либо имеет какое-то значение, либо не определена.
Имя, тип и вид величины можно однозначно определить по тексту алгоритма.
Это статические характеристики величины. Школьники всегда смогут найти их в программе. Напротив, значение величины определяется только во время выполнения. Можно сказать, что это динамическая характеристика.
Имея под рукой такой инструмент, как величины, можно использовать ЭВМ — Электронную Вычислительную Машину — не для управления различными устройствами, а по “прямому назначению” — для вычислений. Начнем с одного относительно простого вычисления — нахождения суммы S первых N нечетных чисел:
В этой сумме N чисел, и если занумеровать их от 1 до N, то число с номером i будет равно 2i–1.
Выполним программу “Сумма” в непрерывном режиме. В начале выполнения в окно ввода-вывода будет выведена строка с информацией о начале выполнения. Далее, при выполнении строки
вывод «Сумма первых «, N, «
нечетных чисел «, нс, «равна «, S
В этой команде предусмотрен вывод нескольких порций информации:
1) строка «Сумма первых «
2) значение целочисленной величины N
3) строка » нечетных чисел «
4) указание по переводу строки нс
6) значение целочисленной величины S
Отступление. Об экспериментальной проверке математических теорем. Запустим программу Сумма несколько раз, задавая число слагаемых 4, 5, 6 и 10. Программа даст нам ответы 16, 25, 36 и 100.
Итак, дано квадратное уравнение вида ax 2 + bx + c = 0
с вещественными (действительными) коэффициентами a, b, c.
Что же надо сделать?
Вы скажете, что надо найти вещественные корни уравнения x1 и x2. Этот ответ в общем-то верный, но не полный. Он нуждается в уточнении, ведь у квадратного уравнения может не быть корней, а при некоторых значениях коэффициентов a, b, c уравнение может иметь один корень, а не два. Реакцию ЭВМ в этих случаях также нужно предусмотреть в алгоритме. Итак, более подробно задание на составление алгоритма выглядит так:
Даны вещественные числа a, b, c, причем а не равно нулю.
Надо найти число n вещественных корней этого уравнения и сами корни (в случае n = 2 найти x1 и x2, a в случае n = 1 найти x1.
Мы уже начали углубляться в математические детали, не решив вопроса о том, как наш алгоритм получит исходную информацию и куда будет “отправлен” результат. На этот раз мы составим алгоритм, который в начале и в конце своего исполнения будет готов “общаться” не с человеком, а с любым другим алгоритмом, получая от него исходную информацию (аргументы) и возвращая результаты.
алг квур (арг вещ a, b, c, рез цел n, вещ x1, x2)
Правила алгоритмического языка позволяют после заголовка алгоритма записать в команде дано условия, которым должны удовлетворять аргументы, и в команде надо условия, которым должны удовлетворять результаты алгоритма. Эти условия могут быть записаны либо формально, в виде логических выражений, и тогда их будет проверять ЭВМ, либо неформально, в виде комментариев для человека. В алгоритме квур мы используем оба подхода:
алг квур (арг вещ a, b, c, рез цел n,
дано а <> 0 |a, b, c – коэффициенты
|уравнения а * x * x + b * x + c = 0
Как решать такую задачу? Для начала надо вычислить дискриминант (D) по формуле D = b 2 – 4ac. Если D 0 — корней два. При этом корни находятся по формуле:
алг квур (арг вещ a, b, c, рез цел n,
дано а <> 0 |a, b, c – коэффициенты
|уравнения а * x * x + b * x + c = 0
Вспомнив, как записываются выражения на алгоритмическом языке, получим следующую программу:
Формат вызова вывод :
Каждое выражение может быть либо арифметическим, логическим или текстовым выражением, либо командой перехода на новую строку (ключевое слово нс ). Значения выражений выводятся последовательно в строку области ввода-вывода и разделяются пробелом. Когда строка полностью заполнена, автоматически происходит переход к началу новой строки. Когда окно ввода-вывода полностью заполнено, последующие команды вывода будут сдвигать содержимое окна вверх, вытесняя верхние строки окна.
Формат вызова ввод :
При выполнении этой команды “КуМир” помещает курсор в окно ввода-вывода и ждет, пока пользователь введет соответствующие значения. По окончании введенные значения присваиваются указанным величинам. В качестве имени величины можно указать имя простой величины или имя элемента таблицы с указанием значений индексов. Признаком конца ввода служит нажатие на клавишу . При вводе нескольких чисел они отделяются друг от друга запятой или пробелом.
В принципе в простых алгоритмах можно было бы обойтись и без команд ввода-вывода. Ввод значений величин с успехом можно заменить на команды присваивания, а вывод результатов работы алгоритма можно наблюдать на полях:
На полях мы видим последнее значение величины S, равное 10 000. Это значение и есть результат вычисления.
Но в некоторых случаях, когда мы хотим полностью автоматизировать решение какой-то задачи, перепоручить ее ЭВМ, разглядывать содержимое полей или окна ввода-вывода, или нажимать на клавиши для ввода чисел просто некому, так как мы как раз и хотим полностью исключить человека из процесса вычисления, проводимого ЭВМ. Конечно, вместо ввода одного-двух исходных значений величин можно вписать в программу команды присваивания, но при этом получится не универсальная программа, работающая при любых значениях параметров, а специализированная, скажем, подсчитывающая сумму первых N нечетных чисел только при N = 100. Ясно, что подобные программы нам не нужны. Другое дело, если в команде ввода можно было бы получить значения величин, запросив их у какого-то исполнителя, а не у человека. Для решения подобной задачи и нужен исполнитель Файлы. Файл — это привычное понятие для школьника, и не придется тратить долгое время на изобретение методики введения понятия “файл”. Немного времени придется потратить на особенности исполнителя Файлы в “КуМире”.
Подобно величинам в алгоритмическом языке, файлы тоже должны как-то называться. Принципы именования файлов слегка отличаются в зависимости от операционной системы, в которой работает “КуМир” (MS Windows, MacOS, Linix и пр.). Имя файла нужно только для команд открытия и создания файлов. Команда открыть (неважно, на запись или на чтение) возвращает целое значение, присваивая ее величине, которую мы называем Ключом. С каждым открытым файлом связан свой уникальный ключ, и в командах ввода-вывода используется не имя файла, а ключ, полученный при открытии файла. Чтобы команды чтения/записи в файл отличались от обычных команд ввода-вывода, их названия начинаются с буквы ф (см. таблицу).
Система команд исполнителя Файлы включает:
· 5 команд-приказов (создание/закрытие файла, открытие на чтение/запись, начало повторного чтения);
· 2 команды проверки условий (существования файла и достижения конца файла);
· 2 оператора ввода-вывода.
· создать файл (арг лит имяФайла)
Создает новый пустой файл в текущем каталоге ввода-вывода.
· открыть на чтение (арг лит имяФайла, рез цел Ключ)
Открывает файл на чтение и присваивает ему идентификатор.
· открыть на запись (арг лит имяФайла, рез цел Ключ)
Открывает файл на запись и присваивает ему идентификатор.
· начать чтение(арг цел Ключ)
Начинает чтение элементов файла с начала
· лог конец файла (арг цел Ключ)
Проверяет, достигнут ли конец файла.
· закрыть (арг цел Ключ)
Закрывает файл после того, как он был открыт на чтение или на запись.
· лог существует файл (арг лит имяФайла)
Проверяет, существует ли файл в текущем каталоге ввода-вывода.
В последнем примере с файлами у нас встречается новая команда из исполнителя Файлы:
открыть на чтение (арг лит имяФайла,
При этом это не просто новая Команда нового исполнителя. Для нас это новый стиль во взаимоотношениях с вспомогательными алгоритмами. Тут мы не только передаем в алгоритм аргумент (которым служит имяФайла ) или только получаем результат — обратную связь с исполнителем. Тут оба этих явления объединены в одном вызове. При этом, говорим ли мы о командах исполнителя (например, Файлы) или о нами написанном вспомогательном алгоритме — механизм взаимодействия остается неизменным. Если раньше с помощью аргументов мы передавали информацию из основного алгоритма во вспомогательный, то теперь, используя результаты, мы можем передать в основной алгоритм информацию из вспомогательного.
Как будет работать ЭВМ, выполняя алгоритмы с аргументами и результатами, поясним на примере алгоритма, который по значениям катетов прямоугольного треугольника вычисляет длину гипотенузы.
При вызове вспомогательного алгоритма происходит следующее таинство: вспомогательный алгоритм начинает “жить”, отводит в своей памяти место для параметров (будь то аргументы или результаты), далее происходит копирование значений аргументов, которые ему передали из основного алгоритма при вызове, в созданные во вспомогательном алгоритме величины. Далее следует выполнение самого вспомогательного алгоритма. Перед окончанием результаты вспомогательного алгоритма копируются внутрь величин, указанных в вызове. А затем вспомогательный алгоритм прекращает свое существование, удаляется из памяти ЭВМ вместе со всеми своими величинами.
При этом желательно, чтобы школьники не только овладели понятием вспомогательного алгоритма с результатами, но и научились самостоятельно выделять эти вспомогательные алгоритмы в задачах, придумывать их аргументы и результаты, кратко описывать в дано и надо назначение и условия работы алгоритма.
алг вещ abs(вещ x ) Абсолютная величина вещественного числа x (|x |).
алг цел sign(вещ x ) Знак числа x (–1, 0 или 1):
алг вещ sin(вещ x ) Синус x
алг вещ cos(вещ x ) Косинус x
алг вещ tg(вещ x ) Тангенс x
Таким же образом устроены команды обратной связи исполнителей, например, команда “сверху свободно” Робота. Форма записи таких вспомогательных алгоритмов-функций немного отличается от вспомогательных алгоритмов с результатами.
Вот как выглядит модифицированный алгоритм вычисления гипотенузы по двум катетам, с использованием вспомогательного алгоритма-функции:
Алгоритмы-процедуры и алгоритмы-функции
Алгоритм-функция после выполнения возвращает значение-результат. Правила описания алгоритмов-процедур и алгоритмов-функций имеют два отличия.
Алгоритмы-функции и алгоритмы-процедуры отличаются также по способу вызова.
Любой алгоритм, использующий вспомогательный алгоритм-функцию, всегда можно записать и без алгоритмов-функций, заменив их вспомогательными алгоритмами с результатами (это видно из предыдущего примера, правда, мы сделали все наоборот). Вместо команды присваивания a := f(x), где f — алгоритм-функция, можно писать вызов F(x, a), где x — аргумент, а a — результат.
Конечно, функции в ряде случаев удобнее. Если сравнить два алгоритма вычисления гипотенузы по катетам, можно обратить внимание, что в главном алгоритме при использовании вспомогательных алгоритмов-функций вообще не потребовалась “лишняя” величина С. Алгоритмы-функции удобны тем, что мы можем сразу записать их в выражение и за счет этого упростить запись. При этом никакой фундаментальной сущности в алгоритмах-функциях нет. Это только особая форма записи вспомогательного алгоритма с результатом.
При использовании алгоритмов-функций и алгоритмов с результатами происходит одно и то же: из основного алгоритма вспомогательному передаются аргументы, обратно передается результат. Сущность у алгоритмов с результатами и алгоритмов-функций совпадает. Только по окончании выполнения алгоритма-функции значение величины знач подставляется в выражение вместо вызова алгоритма-функции. Слово знач является сокращением от слов “значение функции” и, как и вся остальная терминология школьного курса информатики и алгоритмического языка (алгоритм, аргумент, результат, величина, значение и пр.), было введено академиком Андреем Петровичем Ершовым путем заимствования из математики.
1 Здесь можно обратить внимание школьников на то, что эта задача не эквивалентна задаче Мальчика-с-пальчик Шарля Перро, который в известной сказке хотел вернуться с братьями домой: “. Мальчик-с-пальчик шел последним. Он то и дело вынимал из кармана белые камешки и бросал их позади себя на дорогу”. Задача Мальчика-с-пальчик решается закрашиванием клеток, по которым прошел Робот (предполагается изначально, что закрашенных клеток на поле нет). При этом число шагов запоминать не придется. (Перро Ш. Мальчик-с-пальчик. Красная Шапочка. Синяя Борода и др. М.: Изд-во “ХАРВЕСТ ООО”.)
2 Не все алгоритмы, которые изучаются в школе, легко объяснить ЭВМ. Попробуйте, например, составить алгоритм умножения в столбик многозначных (не более 6 знаков) десятичных чисел, который манипулирует только с символьной информацией для представления цифр от 0 до 9. Это вовсе не такой простой алгоритм, как решение квадратного уравнения.
3 Важное замечание: необходимо отметить, что на время выполнения вспомогательного алгоритма выполнение основного приостанавливается.