Приведем примеры заданий для начального этапа разработки программ с процедурами.
Задание 1. Вычислить периметр треугольника по координатам его вершин.
Процедура — вычисление длины отрезка (стороны треугольника) по координатам концевых точек. В ней совершенно отчетливо видны четыре параметра-значения (указанные координаты) и один параметр-переменная (результат, т. е. длина отрезка). Вызывающая программа три раза обратится к этой процедуре. Пример вполне элементарен.
Задание 2. Найти наибольший общий делитель (НОД) 100 натуральных чисел по алгоритму Евклида.
Процедура — НОД двух чисел. В заголовке — три переменные. Две из них — параметры-значения, третья — переменная (результат).
После выполнения такого уровня заданий перейдите к более сложным ситуациям. Разберите какой-нибудь пример, специально сконструированный для иллюстрации различий между параметрами-значениями и параметрами-переменными. Один из них выглядит так:
program parametr;
var k: integer;
procedure plusl (n: integer);
begin n:=n+10
end;
procudure plas2 (var n: integer);
begin n:=n+20
end;
begin
k:=10; plusl(k); writeln(k);
k:=10; plus2(k); writeln(k)
end.
Объясните, почему в первой печати результат оказался равен 20, а во второй — 30.
В обучении использованию процедур можно пойти и по другому пути. Поскольку существуют и процедуры без параметров, то можно на одном примере показать все этапы: процедура без параметров, процедура с параметрами-значениями, процедура с параметрами-значениями и параметрами-переменными, отметить все плюсы и минусы каждого подхода. Тут же, по мере появления, можно ввести понятие о локальных и глобальных, формальных и фактических переменных.
После решения простейших задач можно переходить к более сложным, с точки зрения организации процедур. Разберите детальнее вопрос об области действия описаний. Сформулируйте простое правило: в Паскале любая переменная должна быть описана перед своим употреблением. Это правило относится и к процедурам. Полезно привести возможную схему взаимного расположения описаний процедур в некоторой условной программе и по ней разобрать вопрос об области действия описаний подпрограмм. Одна из таких схем изображена на рис. 15.4.

Рис. 15.4. Взаимное расположение описаний процедур
Объясните, почему из основной программы можно обратиться к подпрограммам А и В, из А1 — к А2, но не наоборот, из В1 можно обратиться к А, но нельзя к А1 и т. д.
После разбора подобной схемы составляют программы с использованием глобальных переменных и отрабатывают понимание того, что если одно и то же имя описано во внешнем блоке (т. е. глобально) и во внутреннем блоке (локально), то локальное описание в пределах блока доминирует.
Если понимание вопросов, связанных с процедурами, достигнуто, то изучение функций как частного случая процедур, несколько иначе оформленных, не вызывает затруднений. Ответ на вопрос о том, когда целесообразно оформлять процедуру как функцию, очень прост: когда вспомогательный алгоритм Должен возвращать лишь одно скалярное (т. е. не структурированное) значение. Обращение к функции привычнее и удобнее, чем к процедуре. В списке аргументов функции можно практически всегда ограничиваться параметрами-значениями (хотя не запрещены и параметры-переменные). Естественно, первые примеры на программирование с использованием функций приведите те же, что использовались при отработке процедур (см. выше задания 1 и 2).
Рекурсивные процедуры — материал повышенной трудности. В теоретическом отношении организация рекурсий — принципиально важный прием программирования; на практике он по ряду причин не слишком популярен. Обычным примером при отработке понятия «рекурсивный алгоритм» является вычисление факториала натурального числа. Если учащиеся проявили понимание и заинтересованность, то после этого можно разобрать классическую задачу «Ханойская башня», приведенную во многих руководствах по Паскалю в разделах, посвященных рекурсиям.
Тема «Структурированные типы данных»
В начале изучения темы учащиеся должны осознать факт, что при обработке больших объемов данных без их организации (структурирования) не обойтись. На примерах использования таблиц покажите, сколь удобно иметь величину с одним именем и многими значениями (основной признак структурирования). Далее, покажите, что таблицами с однородными данными часто обойтись невозможно, поскольку приходится работать с таблицами, в колонках которых разнородные данные (различные кадровые анкеты). Наконец, не всегда число элементов в структуре можно заранее предвидеть; более того, оно может меняться «на ходу». Примеры: численность студенческой группы в процессе обучения, любая очередь (в магазине) и т. д. Соответственно, чем больше вариантов организации данных предлагает язык, тем он совершеннее. В этом смысле Паскаль устроен весьма удачно.
Целесообразно предварить изучение отдельных структур данных их совокупным описанием. Дело в том, что о массивах учащиеся скорее всего имеют представление из базового курса и простое повторение может быть неинтересным.
Рассмотрим схему типов данных Турбо Паскаля, позаимствованную из одного из приведенных в списке литературы руководств (рис. 15.5). Эта схема может служить определяющей при формировании порядка прохождения темы.
На схеме не отражено, что в Турбо Паскале «вещественный» и «целый» — это группы типов; разговор о них должен состояться отдельно. Также надо заметить, что такие распространенные в приложениях динамические структуры данных, как очередь и стек, не являются стандартными типами Паскаля, но могут быть реализованы с помощью указателей.

Рис. 15.5. Типы данных Турбо Паскаля
Массивы
Изучение структурированных типов начните с наиболее традиционного — массива. Подчеркните его групповые свойства: упорядоченная однородная статическая структура прямого доступа; приведите обоснование этих свойств.
Способ, который принят для выделения элементов массива, — индексация — заслуживает отдельного разговора. Индексация не является единственно возможным способом выделения элементов структурированной величины и неразрывно связана с указанными свойствами. Неочевидно для учащихся, что границы изменения индексов назначаются произвольно, что тип индексов — интервальный — не обязательно базируется на типе integer (хотя чаще всего это так). Наконец, полезно соотнести представление о линейном (одномерном) массиве с цепочкой ячеек памяти ЭВМ, в которых хранятся элементы массива.
Трактовка многомерного массива как одномерного массива, элементами которого являются массивы, верна и полезна для понимания возможности своего рода суперпозиции структур данных. Впоследствии этот взгляд обогатится рассмотрением массива записей и т. п. Однако при описании двумерных массивов (а именно ими практически данный курс в этой части ограничится) следует остановиться на более простом способе. Например:
Var A: array [1980..2000,1.. 15] of real
вместо альтернативного, явно отражающего фразу «массив массивов»:
Var A: array [1980 .. 2000] of array [1 .. 15] of real
Далее, на первом этапе изучения языка вносит путаницу наличие еще одной альтернативы — описание массива, сочетая type и var. На том же примере это выглядит так:
Туре В = array [1980 .. 2000,1 .. 15] of real
Var А:В
Подобная многовариантность украшает язык, но методически на первых порах неприемлема.
Особо следует остановиться на том, что в Паскале массив не может быть динамической структурой. Учащиеся часто встают в тупик при необходимости, скажем, удалить элемент из массива. То, что между понятиями «удалить» и «вставить нуль» большая разница, понять легко. Удаление элемента со сдвигом остальных влево — операция технически несложная, но тогда получается «дырка» на правом конце массива. Убрать ее «на ходу» невозможно по самой природе массива, и если это действительно необходимо, то надо пользоваться иной структурой.
Навыки использования массивов закрепляются с помощью решения типовых задач. К ним относятся: организация поэлементного ввода и вывод линейного массива (простой цикл), подсчет числа положительных элементов линейного числового массива, нахождение наибольшего элемента линейного числового массива (цикл с вложенной развилкой) и т. д. Затем переходят к задачам посложнее, требующим организации структур типа «цикл в цикле», и более сложным: упорядочить линейный числовой массив по возрастанию или по убыванию, найти наибольший элемент в двумерном массиве и т. д.
Не следует ограничиваться задачами, в которых массивы имеют числовую природу. Примером задачи на использование символьного массива может служить следующая: на схеме кинозала звездочками помечены места, на которые билеты на сеанс показа проданы, черточками — не проданы. Подсчитать число проданных билетов.
Примером более сложной задачи, решать которую целесообразно в классе с помощью учителя, служит известная задача о нахождении простых чисел при заданной верхней границе поиска — алгоритм Эрастофена. Ее можно решить несколькими способами. Весьма изящное решение связано с организацией булевского массива, который изначально заполнен элементами true, а по ходу чисел, не являющихся простыми, элементы с соответствующими номерами заменяются на false. Это решение можно найти в ряде пособий.
Строки
Очень полезный тип данных, которого не было в базовой версии Паскаля.
Вначале напомните учащимся, что в приложениях современной информатики обработка текстов является самым распространенным видом деятельности. Если вся задача состоит из обработки текста, то для этого существуют мощные специализированные программные средства — текстовые процессоры. Однако встречаются ситуации, когда обработка текста — часть задачи, решаемой алгоритмически, путем традиционного программирования. В этом случае нужны специальные структуры данных и средства их обработки. Покажите учащимся способ задания типа string. Нетривиально то, что хотя при задании строки ее максимальная длина часто указывается, величина является квазидинамической, т. е. ее реальный размер определяется текущим значением (хотя память все же резервируется по максимуму). Покажите автоматическую нумерацию элементов строки; подчеркните, что в нулевом элементе всегда находится число — автоматически определяемая длина строки. Введите немногие операции, возможные над строками, и особенно детально опишите нетривиальные операции сравнения строк (больше, меньше и т. д.). Важное преимущество строк над другими структурированными данными — возможность ввода-вывода полностью с помощью процедур writeln, readln. В принципе обсуждение этой возможности можно увязать с текстовыми файлами, но это загромождает основной материал.
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 |


