Главная страница «Первого сентября»Главная страница журнала «Информатика»Содержание №21/2009


Педагогический университет

Методика преподавания основ алгоритмизации на базе системы "КуМир". Лекция 5

Величины в алгоритмическом языке. Команды ввода/вывода информации. Команда присваивания. Вспомогательные алгоритмы. Алгоритмы  с результатами и алгоритмы-функции

Термин величина, который используется в алгоритмическом языке, ввел Андрей Петрович Ершов, заимствовав его из математики и физики, считая, что так школьникам будет проще для понимания. В производственных языках программирования обычно используется термин переменная, который все чаще вытесняется термином объект. При этом в объектно-ориентированном программировании говорят про объект и состояние объекта. Мы вместо этого используем термины величина и значение величины.

Тут уместно заметить, что многие понятия различных языков программирования являются синонимами, и использование той или иной терминологии часто обусловлено привычкой педагога или разработчика языка программирования, а не потребностями именования новых понятий. Мы в курсе школьной информатики сознательно “не бежим впереди паровоза”, стараясь избегать введения новых понятий и сущностей до того момента, когда без этого уже нельзя будет обойтись.

Отступление об уместности формализации. Математизация и формализация не нужны, если суть дела можно объяснить “на пальцах”, пользуясь бытовой лексикой. Вот фрагмент из учебника по теории языков программирования, в котором объясняется разница между “подсловами” и “подпоследовательностями” некоторого слова:

Определение 1.2.19. Пусть . Тогда через Suf(L) обозначается множество, состоящее из всех суффиксов слов языка L:

Множество Suf(L) называется множеством суффиксов языка L.

№ газеты

Лекция

17/2009

Лекция 1. Основные цели курса. Методика построения курса. Проблемный подход. Теория познается через практику. Система “КуМир” - эффективная поддержка традиционных понятий процедурных языков программирования и традиционных методов отладки. Примеры использования “КуМира” в предпрофессиональных курсах.

18/2009

Лекция 2. Практическое знакомство с системой “КуМир”: исполнитель Робот. Понятие алгоритма. Управление исполнителем Робот с помощью пульта. Линейные алгоритмы. Запись алгоритма. Отступление: Карел-Робот в начальном курсе программирования Стэнфордского университета.

18/2009

Лекция 3. Методы “визуальной” записи алгоритма. Программное управление Роботом. Цикл “n раз”. Использование вспомогательных алгоритмов. Запись алгоритмов на алгоритмическом языке.

Контрольная работа № 1.

20/2009

Лекция 4. Арифметические выражения и правила их записи. Алгоритмы с “обратной связью”. Команда “пока”. Условия в алгоритмическом языке. Команды “если” и “выбор”. Команды контроля. “Визуальное” представление команд. Отступление: правила и форма записи арифметических выражений в Фортране XXI века.

21/2009

Лекция 5. Величины в алгоритмическом языке. Команды ввода/вывода информации. Команда присваивания. Вспомогательные алгоритмы. Алгоритмы с результатами и алгоритмы-функции. Цикл “для”. Табличные величины. Логические, символьные и литерные величины.

22/2009

Лекция 6. Методы алгоритмизации. Рекуррентные соотношения. Метод итерации. Инвариант цикла. Рекурсия.

Контрольная работа № 2.

23/2009

Лекция 7. Физические основы современных компьютеров. Микропроцессор - сердце современного компьютера. Как создать компьютер. 

24/2009

Лекция 8. Виртуальные и реальные исполнители в системе “КуМир”. Исполнитель Чертежник. Лего-Робот - программно управляемый исполнитель “КуМира”. Гипертексты в системе “КуМир”. Подготовка заданий для учащихся и их автоматическая проверка.

Итоговая работа.

Определение 1.2.20. Говорят, что слово хподслово (substring) слова y, если y = uxv для некоторых, возможно пустых, слов u и v.

Определение 1.2.21. Пусть . Тогда через Subw(L) обозначается множество, состоящее из всех подслов слов языка L. Множество Subw(L) называется множеством подслов языка L.

Определение 1.2.22. Слово a1a2an (длины n і 0)называется подпоследовательностью (subsequence) слова y, если существуют такие, возможно пустые, слова u0, u1, …, un, что u0a1u1a2anun = y.

Определение 1.2.23. Все подслова слова y являются также подпоследовательностями слова y.

Определение 1.2.24. Пусть . Тогда через Subseq(L) обозначается множество, состоящее из всех подпоследовательностей слов языка L. Множество Subseq(L) называется множеством подпоследовательностей языка L.

Подобное изложение необходимо для будущих авторов компиляторов языков программирования, которым нужно овладеть сотнями понятий математической теории формальных языков. Если же нужно объяснить только пару понятий, то полезнее обойтись безо всяких математических обозначений, разобрав суть дела на примерах:

слова “пар”, “ров” и “воз” называют подсловами слова “паровозик”, они состоят из подряд идущих букв слова “паровозик”;

слово “пик” подсловом слова “паровозик” не является, из подряд идущих букв слова “паровозик” его получить нельзя, но можно получить, последовательно, слева направо, выбирая буквы из слова “паровозик”: первую букву “п” берем, следующие 6 букв пропускаем и последние две буквы “ик” берем;

говорят, что слово “пик” является подпоследовательностью слова “паровозик”;

в слове “обозначения” есть одно подслово русского языка и несколько подпоследовательностей;

все подслова данного слова являются также и подпоследовательностями этого слова, так что слова “пар”, “ров” и “воз” являются не только подсловами, но и подпоследовательностями слова “паровозик”.

Итак, следуя академику Ершову, мы не используем принятые в программировании термины переменная или объект, а вводим термин величина.

Как всегда в нашем курсе, для введения нового понятия используется проблемный подход. То есть все начинается с постановки задачи, для решения которой нам понадобятся величины. Приведем ее.

Робот расположен вплотную над горизонтальной стеной неизвестных размеров, расстояние от Робота до краев стены неизвестно, надо провести Робота “сквозь стену” на одну клетку вниз. Поскольку Робот сквозь стены ходить не умеет, т.е. просто скомандовать “вниз” нельзя, то надо заставить Робота эту стену как-то обойти.

Как всегда, основным методическим приемом на старте выступает противопоставление схемы программного управления схеме непосредственного управления Роботом “вручную”. Если предложить решать задачу, используя пульт и не видя поля Робота, то достаточно быстро учащиеся сообразят, что нужно идти к одному из краев стены, например, вправо, по дороге все время спрашивая “снизу стена?” и считая число сделанных шагов. А когда стена кончится, скомандовать “вниз” и сделать “влево” столько шагов, сколько перед этим сделано шагов “вправо”1.

При непосредственном управлении школьники запоминают число сделанных “вправо” шагов “в уме” или записывают на бумаге. Если теперь от непосредственного управления Роботом перейти к написанию алгоритма, потребуется как-то записать в алгоритме, что при управлении Роботом ЭВМ (подобно школьнику) должна запоминать число выполненных Роботом команд “вправо” и использовать эту информацию при обратном движении влево.

Если задача непосредственного управления решается в диалоге учителя с классом, то учителю удобно нарисовать на доске мелом небольшой прямоугольник и по мере получения команд “вправо” вместе со школьниками вписывать в этот прямоугольник число шагов, сделанных Роботом: перед началом вписали “0”. Сделали первый шаг вправо — стерли “0” и вписали в прямоугольник на доске “1”, сделали еще шаг — “1” стерли и написали “2” и т.д. Выше прямоугольника учитель может без объяснений написать название прямоугольника в виде цел х.

Что мы делали с прямоугольником в процессе ручного управления:

· рисовали прямоугольник и его имя на доске;

· записывали информацию в прямоугольник, стирая старую информацию;

· читали информацию из прямоугольника.

Те же операции должна будет делать при управлении Роботом и ЭВМ, и в программе мы должны каким-то образом эти операции записать.

Вместо “прямоугольник” будем говорить “величина”. Рисованию прямоугольника и его имени на доске соответствует команда описания имени величины (и ее типа).

Записи информации в прямоугольник со стиранием старой информации соответствует специальная команда — команда присваивания (:=); чтению информации соответствует использование имени величины в выражениях.

У величины есть несколько характеристик. Важнейшее из них имя. Имена величин в одном алгоритме должны быть различны, как говорят, имя должно быть уникально для данного алгоритма.

Отступление. Уникальность имени человека. Уникальны ли имена, которыми мы пользуемся в повсе­дневной жизни? Увы, нет. В классе может быть два Дениса и три Даши, а в одной семье два Вовы. Люди борются с этим, добавляя к имени дополнительную информацию: прозвище, фамилию, отчество, дату и место рождения. В классе различают Дениса Иванова и Дениса Петрова, в семье Сидоровых различают Вову большого и Вову маленького. Однако и это не дает 100%-ную гарантию уникальности. Так, в 90-х годах в Австралии познакомились две дамы, которые родились в один день и у них совпадали фамилия и имя. Познакомились они, когда одной из дам прислали квитанцию штрафа за нарушения правил парковки, которые она не нарушала. Тут-то и выяснилось, что имя, фамилия и дата рождения не могут однозначно идентифицировать человека. Для уточнения приходится добавлять адрес и еще много всевозможных характеристик, которые совместно образуют уникальное Имя конкретного человека (Имя с большой буквы). Проблема уникальности древняя. Все знают имя известного древнегреческого философа Фалеса Милетского, то есть Фалеса из Милета, города, где он проживал. Еще известнее Иисус из Назарета. Читая Ветхий Завет, мы встречаем длинные родословные по мужской линии: в библейские времена такая родословная и была уникальным Именем человека.

Имена

Имя бывает у величин, таблиц, алгоритмов и исполнителей. Имя — это последовательность слов, разделенных пробелами. Первое слово имени не должно начинаться с цифры. Ни одно из слов не должно быть ключевым словом.

Слово — это последовательность разрешенных (словарных) символов:

· буквы (кириллические и латинские, прописные и строчные);

· цифры;

· два специальных знака: “@”, “_”

Примеры имен: m, погода на завтра, Ноябрь 7, Седьмое ноября, дом_57б.

Примеры неправильных имен:

· 7е ноября (первое слово начинается с цифры);

· альфа-бета (“-” — недопустимый символ);

· альфа или омега (или — ключевое слово).

Ключевые слова языка “КуМир” — это: алг нач кон исп кон_исп дано надо арг рез аргрез знач цел вещ лог сим лит таб целтаб вещтаб логтаб симтаб литтаб и или не да нет утв выход ввод вывод нс если то иначе все выбор при нц кц кц_при раз пока для от до шаг true false

Примечание. Ключевое слово не можно вставлять внутрь многословных логических имен.

Пример:

лог л, завтра будет четверг

л := не завтра будет четверг |Правильно, но не

|рекомендуется

л := завтра не будет четверг |Правильно,

|рекомендуется

л := завтра будет не четверг |Правильно,

|рекомендуется

л := завтра будет четверг не |Неправильно

л := не завтра не будет четверг |Неправильно

Величины в алгоритмическом языке различаются не только по имени, но и по месту, в котором они “живут”: величины из разных алгоритмов могут иметь одинаковые имена. Когда в алгоритме Обойти стену используется величина х, можно представлять себе, что полное имя этой величины звучит как
“х из Обойти стену”: в другом алгоритме возможно использование того же имени х для совершенно другой величины.

Вторая важная характеристика величины — это ее тип.

В алгоритмическом языке 5 типов величин: числовые типы цел и вещ, текстовые типы лит и сим и логический тип лог. Зная тип, можно многое сказать о величине. Во-первых, какие она может принимать значения. Так, целая величина (цел) может хранить целое число, но не может хранить вещественное, а для вещественных величин есть отдельный тип (вещ). Текстовая величина может хранить последовательность символов, в том числе и пустую, логическая величина хранит одно из двух значений да/нет.

Тип также говорит о том, какие операции допустимы с величиной.

К величинам числовых и текстовых типов применимы операции сравнения; к величинам числовых типов применимы арифметические операции и вычисление различных функций. К величинам логического типа применимы логические операции и, или, не.

Особняком стоит операция, обозначаемая “+” . Она может применяться к числовым типам и в этой ситуации означает сложение. Также она может применяться к текстовым типам и означает “склеивание” двух строк или символов:

5-0.gif (20052 bytes)

К величинам числовых и текстовых типов применимы операции сравнения. Так, с вещественными (и целыми) величинами допустимы арифметические операции и операции сравнения. Для литерных — допустимы операции сравнения и т.д.

Типы величин

Величины алгоритмического языка подразделяются на несколько типов:

· цел — принимает целые значения от –2 147 483 647 до 2 147 483 647;

· вещ — принимает вещественные значения между ?21023 и 21023;

· лог — принимает значения да или нет;

· сим — значением может быть литеральный символ;

· лит — значением может быть строка литеральных символов.

Типы цел и вещ называются числовыми; типы сим и лит — текстовыми.

Каждая величина должна иметь описание, например:

цел j, k, n

вещ длина, ширина

лит мой текст

Еще одной характеристикой величины является вид величины: аргумент, результат, промежуточная величина алгоритма, общая величина исполнителя. Вид величины показывает ее информационную роль в алгоритме. Например, аргументы содержат исходную информацию, необходимую для работы алгоритма, а промежуточные величины предназначены для хранения текущей информации, которую обрабатывает алгоритм. Во время выполнения алгоритма в каждый конкретный момент величина либо имеет какое-то значение, либо не определена.

Имя, тип и вид величины можно однозначно определить по тексту алгоритма.

Это статические характеристики величины. Школьники всегда смогут найти их в программе. Напротив, значение величины определяется только во время выполнения. Можно сказать, что это динамическая характеристика.

Имея под рукой такой инструмент, как величины, можно использовать ЭВМ — Электронную Вычислительную Машину — не для управления различными устройствами, а по “прямому назначению” — для вычислений. Начнем с одного относительно простого вычисления — нахождения суммы S первых N нечетных чисел:

S = 1 + 3 + 5 + 7 + ... + 2N–1

В этой сумме N чисел, и если занумеровать их от 1 до N, то число с номером i будет равно 2i–1.

Вычислительная программа, которую мы собираемся составить, должна, как и любая другая программа, откуда-то получить исходную информацию и куда-то “отправить” результат вычисления. Мы будем составлять диалоговую программу. Она будет получать исходную информацию от человека, набирающего на клавиатуре требуемое число членов суммы N. Результат наша программа также будет “сообщать” человеку, выводя на экран значение подсчитанной суммы S. Для хранения информации в процессе вычисления будем использовать две целочисленные величины — N и S. Для хранения номера очередного слагаемого суммы будем использовать целочисленную величину i. Для ввода и вывода информации мы будем использовать команды ввод и вывод, а для перебора членов суммы будем использовать цикл пока. Программа будет выглядеть так:

5-1.gif (13979 bytes)

Здесь новы для нас команды ввод и вывод, использующие третье окно — окно ввода-вывода системы “КуМир”. До настоящего момента мы фактически использовали в системе “КуМир” только два окна из трех. В третье окно выводились сообщения типа “выполнение начато” и “выполнение завершено”, да временами сообщения об ошибках. Теперь это окно будет использовано “по прямому назначению” — для ввода и вывода значений величин. Как это будет происходить?

При выполнении команды ввод N ЭВМ выведет мигающий курсор в окно вывода, приглашая ученика ввести число с клавиатуры. Если ученик наберет на клавиатуре какое-нибудь число, например число 3, и завершит ввод нажатием клавиши , то ЭВМ произведет в точности те же действия, что и при выполнении команды присваивания N := 3. То есть число 3 станет значением величины N (будет записано внутрь “прямоугольника” величины N).

В отличие от Бейсика и Паскаля новый вызов команды вывод в школьном алгоритмическом языке сам по cебе не приводит к переходу на новую строку в окне ввода-вывода. Если мы хотим указать ЭВМ, что следующая порция информации должна выводиться с новой строки, то надо явно написать слово нс (сокращение от “новая строка”) в команде вывод. Мы в программе так и сделали. Если же мы слово нс не пишем, то никакого неявного перехода на новую строку не осуществляется и разные вызовы команды вывод будут выводить информацию друг за дружкой в одну строку. Ввод информации обычно заканчивают нажатием на клавишу , т.е. переходом на новую строку. Поэтому обычно при чередовании команды вывода с командами ввода, как правило, никаких нс писать не надо. Если же мы хотим, как в программе “Сумма”, вывести информацию в две строки, то мы должны написать в нужном месте команды вывод слово нс.

Выполним программу “Сумма” в непрерывном режиме. В начале выполнения в окно ввода-вывода будет выведена строка с информацией о начале выполнения. Далее, при выполнении строки

нач цел N, S, i

в памяти алгоритма “Сумма” выделяется место для хранения целочисленных величин N, S, i. Сначала эти три величины не определены (в их “прямоугольники” не вписаны какие-либо значения). Величина N получит нужное значение при выполнении команды

ввод N

Увидев внутри окна ввода-вывода мигающий курсор и на нижней границе окна сообщение “Ожидается ввод: цел”, пользователь вводит целое число, нажимает клавишу , и значение величины N становится равным этому числу. Заметим, что в процессе дальнейшего выполнения программы это число меняться не будет. После ввода числа N в программе проводится подготовка к суммированию: величине S присваивается начальное значение суммы, то есть 0, а величине i присваивается номер первого члена суммы, то есть 1. Далее начнет выполняться цикл “пока”. В процессе выполнения цикла величины S и i будут согласованно меняться: после k выполнений цикла S будет равно сумме первых k суммируемых чисел, а i будет равно номеру очередного, еще не просуммированного числа, то есть k + 1. Цикл завершится, когда i станет равно N + 1. После завершения цикла будет выполняться команда

вывод "Сумма первых ", N, "

нечетных чисел ", нс, "равна ", S

В этой команде предусмотрен вывод нескольких порций информации:

1) строка "Сумма первых "

2) значение целочисленной величины N

3) строка " нечетных чисел "

4) указание по переводу строки нс

5) строка "равна "

6) значение целочисленной величины S

Поскольку в команде вывод встретилось слово нс, вывод будет произведен в две строки.

Последней будет выполняться строка кон. При выполнении этой строки в окно ввода-вывода будет выведено сообщение о завершении выполнения программы и горизонтальная черта.

Отступление. Об экспериментальной проверке математических теорем. Запустим программу Сумма несколько раз, задавая число слагаемых 4, 5, 6 и 10. Программа даст нам ответы 16, 25, 36 и 100.

Похоже, что сумма первых N нечетных чисел всегда равна N2 ! Эта математическая гипотеза действительно верна, формулу

1 + 3 + 5 + 7 + ... + 2N–1 = N2

можно строго доказать математически, однако если бы это нам не удалось, мы могли продолжать исследовать гипотезу экспериментально, написать программу, которая вычисляет суммы первых 7, 8, 9, 10, 11, ..., 99, 100 нечетных чисел и проверяет, действительно ли такая сумма всегда равна квадрату количества суммируемых чисел. Ученые-математики именно так используют компьютер для экспериментальной проверки еще недоказанных теорем. Конец отступления.

Одно из самых знаменитых вычислений, часто встречающееся в средней школе, — это вычисление корней квадратного уравнения. Такое вычисление умеет проводить значительная часть выпускников средней школы России, что выгодно отличает их от зарубежных сверстников. Более того, любой школьник, научившийся вычислять корни квадратного уравнения, может объяснить другому школьнику, как такое вычисление проводить2. А значит, этот алгоритм нетрудно будет “объяснить” и ЭВМ.

Итак, дано квадратное уравнение вида ax2 + 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, вещ x1, x2)

Правила алгоритмического языка позволяют после заголовка алгоритма записать в команде дано условия, которым должны удовлетворять аргументы, и в команде надо условия, которым должны удовлетворять результаты алгоритма. Эти условия могут быть записаны либо формально, в виде логических выражений, и тогда их будет проверять ЭВМ, либо неформально, в виде комментариев для человека. В алгоритме квур мы используем оба подхода:

алг квур (арг вещ a, b, c, рез цел n,

вещ x1, x2)

дано а <> 0 |a, b, c – коэффициенты

|уравнения а * x * x + b * x + c = 0

надо 0 <= n <= 2 |при n = 2, x1 и x2

|корни уравнения, при n = 1, x1

|единственный корень уравнения,

|при n = 0, уравнение корней не имеет

Как решать такую задачу? Для начала надо вычислить дискриминант (D) по формуле D = b2 – 4ac. Если D < 0, то корней у уравнения нет, при D = 0корень один (иногда говорят, что корни совпадают). В случае D > 0 — корней два. При этом корни находятся по формуле:

Число D не является аргументом нашего алгоритма, в условие задачи оно не входит; не является D и результатом, так как в условии задачи требуется найти число корней и сами корни, но не дискриминант; D является промежуточным результатом нашего вычисления, и для хранения этого числа мы опишем в алгоритме квур вещественную промежуточную величину вещ D. Промежуточные величины алгоритма обычно описываются в строке нач или сразу после нее:

алг квур (арг вещ a, b, c, рез цел n,

вещ x1, x2)

дано а <> 0 |a, b, c – коэффициенты

|уравнения а * x * x + b * x + c = 0

надо 0 <= n <= 2

|при n = 2, корни уравнения равны x1 и x2;

|при n = 1, единственный корень равен x1;

|при n = 0, уравнение корней не имеет;

нач вещ D; D := b * b – 4 * a * c

Вспомнив, как записываются выражения на алгоритмическом языке, получим следующую программу:

Ввод-вывод

Формат вызова вывод:

вывод выражение1, . . . , выражениеN

Каждое выражение может быть либо арифметическим, логическим или текстовым выражением, либо командой перехода на новую строку (ключевое слово нс). Значения выражений выводятся последовательно в строку области ввода-вывода и разделяются пробелом. Когда строка полностью заполнена, автоматически происходит переход к началу новой строки. Когда окно ввода-вывода полностью заполнено, последующие команды вывода будут сдвигать содержимое окна вверх, вытесняя верхние строки окна.

Формат вызова ввод:

ввод имя1, . . . , имяN

При выполнении этой команды “КуМир” помещает курсор в окно ввода-вывода и ждет, пока пользователь введет соответствующие значения. По окончании введенные значения присваиваются указанным величинам. В качестве имени величины можно указать имя простой величины или имя элемента таблицы с указанием значений индексов. Признаком конца ввода служит нажатие на клавишу . При вводе нескольких чисел они отделяются друг от друга запятой или пробелом.

Исполнитель Файлы

В принципе в простых алгоритмах можно было бы обойтись и без команд ввода-вывода. Ввод значений величин с успехом можно заменить на команды присваи­вания, а вывод результатов работы алгоритма можно наблюдать на полях:

На полях мы видим последнее значение величины S, равное 10 000. Это значение и есть результат вычисления.

Но в некоторых случаях, когда мы хотим полностью автоматизировать решение какой-то задачи, перепоручить ее ЭВМ, разглядывать содержимое полей или окна ввода-вывода, или нажимать на клавиши для ввода чисел просто некому, так как мы как раз и хотим полностью исключить человека из процесса вычисления, проводимого ЭВМ. Конечно, вместо ввода одного-двух исходных значений величин можно вписать в программу команды присваивания, но при этом получится не универсальная программа, работающая при любых значениях параметров, а специализированная, скажем, подсчитывающая сумму первых N нечетных чисел только при N = 100. Ясно, что подобные программы нам не нужны. Другое дело, если в команде ввода можно было бы получить значения величин, запросив их у какого-то исполнителя, а не у человека. Для решения подобной задачи и нужен исполнитель Файлы. Файл — это привычное понятие для школьника, и не придется тратить долгое время на изобретение методики введения понятия “файл”. Немного времени придется потратить на особенности исполнителя Файлы в “КуМире”.

По традиции мы используем последовательный доступ к файлам. Пусть есть файл, в котором записаны три вещественных числа a, b, c, коэффициенты квадратного уравнения. При последовательном доступе мы не сможем прочитать из файла b, не прочитав a, и чтобы добраться до с, надо будет сначала прочитать a и b. Аналогично происходит и запись в файл. Значения величин выводятся в файл по порядку их перечисления в команде вывод и по порядку появления вызовов команд вывод. Исполнитель Файлы может работать с каждым файлом в одном из двух режимов: в режиме чтения или в режиме записи. Работа с файлом в режиме чтения начинается с команды открыть на чтение; работа с файлом в режиме записи начинается с команды открыть на запись. В момент вызова любой из этих двух команд файл должен существовать. Создавать файл, который мы собираемся читать, нет никакого смысла, он окажется пустым. А вот создать пустой файл перед записью в него информации имеет смысл, и это может быть сделано командой создать.

Подобно величинам в алгоритмическом языке, файлы тоже должны как-то называться. Принципы именования файлов слегка отличаются в зависимости от операционной системы, в которой работает “КуМир” (MS Windows, MacOS, Linix и пр.). Имя файла нужно только для команд открытия и создания файлов. Команда открыть (неважно, на запись или на чтение) возвращает целое значение, присваивая ее величине, которую мы называем Ключом. С каждым открытым файлом связан свой уникальный ключ, и в командах ввода-вывода используется не имя файла, а ключ, полученный при открытии файла. Чтобы команды чтения/записи в файл отличались от обычных команд ввода-вывода, их названия начинаются с буквы ф (см. таблицу).

Исполнитель Файлы

Система команд исполнителя Файлы включает:

· 5 команд-приказов (создание/закрытие файла, открытие на чтение/запись, начало повторного чтения);

· 2 команды проверки условий (существования файла и достижения конца файла);

· 2 оператора ввода-вывода.

· создать файл (арг лит имяФайла)

Создает новый пустой файл в текущем каталоге ввода-вывода.

· открыть на чтение (арг лит имяФайла, рез цел Ключ)

Открывает файл на чтение и присваивает ему идентификатор.

· открыть на запись (арг лит имяФайла, рез цел Ключ)

Открывает файл на запись и присваивает ему идентификатор.

· начать чтение(арг цел Ключ)

Начинает чтение элементов файла с начала

· ф_ввод Ключ, . . .

Оператор. Ввод данных из файла c идентификатором ключ.

· ф_вывод Ключ, . . .

Оператор. Вывод данных в файл с идентификатором ключ.

· лог конец файла (арг цел Ключ)

Проверяет, достигнут ли конец файла.

· закрыть (арг цел Ключ)

Закрывает файл после того, как он был открыт на чтение или на запись.

· лог существует файл (арг лит имяФайла)

Проверяет, существует ли файл в текущем каталоге ввода-вывода.

По окончании работы с файлом мы говорим ему “до свидания” командой закрыть. Аргументом этой команды снова будет значение величины Ключ.

Важно заметить, что одновременно читать и писать в один и тот же файл нельзя. Ниже приведены изменения алгоритма квур, позволяющие читать коэффициенты из открытого на чтение файла с ключом in и записывать результаты в открытый на запись файл с ключом out. Этот алгоритм назовем ф_квур. Приведена также тестирующая программа, которая читает коэффициенты квадратного уравнения из файла “tR.txt”, а результат записывает в файл с именем “tW.txt”, причем, если файл с таким именем не существует, то он создается.

В последнем примере с файлами у нас встречается новая команда из исполнителя Файлы:

открыть на чтение (арг лит имяФайла,

рез цел Ключ)

При этом это не просто новая Команда нового исполнителя. Для нас это новый стиль во взаимоотношениях с вспомогательными алгоритмами. Тут мы не только передаем в алгоритм аргумент (которым служит имяФайла) или только получаем результат — обратную связь с исполнителем. Тут оба этих явления объединены в одном вызове. При этом, говорим ли мы о командах исполнителя (например, Файлы) или о нами написанном вспомогательном алгоритме — механизм взаимодействия остается неизменным. Если раньше с помощью аргументов мы передавали информацию из основного алгоритма во вспомогательный, то теперь, используя результаты, мы можем передать в основной алгоритм информацию из вспомогательного.

Как будет работать ЭВМ, выполняя алгоритмы с аргументами и результатами, поясним на примере алгоритма, который по значениям катетов прямоугольного треугольника вычисляет длину гипотенузы.

При вызове вспомогательного алгоритма происходит следующее таинство: вспомогательный алгоритм начинает “жить”, отводит в своей памяти место для параметров (будь то аргументы или результаты), далее происходит копирование значений аргументов, которые ему передали из основного алгоритма при вызове, в созданные во вспомогательном алгоритме величины. Далее следует выполнение самого вспомогательного алгоритма. Перед окончанием результаты вспомогательного алгоритма копируются внутрь величин, указанных в вызове. А затем вспомогательный алгоритм прекращает свое существование, удаляется из памяти ЭВМ вместе со всеми своими величинами.

Таким образом, если нам нужно передать значения от основного алгоритма к вспомогательному, то мы используем аргументы, если от вспомогательного к основному —
то результаты. Пользуясь аргументами и результатами, мы можем устроить любой обмен информацией между основным и вспомогательным алгоритмами3.

При этом желательно, чтобы школьники не только овладели понятием вспомогательного алгоритма с результатами, но и научились самостоятельно выделять эти вспомогательные алгоритмы в задачах, придумывать их аргументы и результаты, кратко описывать в дано и надо назначение и условия работы алгоритма.

Теперь перейдем к еще одному виду вспомогательных алгоритмов — алгоритм-функция. В приведенных выше примерах — и в нахождении длины гипотенузы, и в решении квадратного уравнения — использовалась встроенная в “КуМир” математическая функция sqrt. Как вы наверняка догадались (или знали), эта функция вычисляет квадратный корень от указанного аргумента, например, sqrt(1.21). Можно предположить, что существует целый класс встроенных в “КуМир” вспомогательных алгоритмов, которые устроены подобным образом. И это истинная правда.

алг вещ 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 Важное замечание: необходимо отметить, что на время выполнения вспомогательного алгоритма выполнение основного приостанавливается.

Ан. Ге. Кушниренко ;
Ал. Ге. Леонов

TopList