Изучение структурированных типов начните с наиболее традиционного — массива. Подчеркните его групповые свойства: упорядоченная однородная статическая структура прямого доступа; приведите обоснование этих свойств.
Способ, который принят для выделения элементов массива, — индексация — заслуживает отдельного разговора. Индексация не является единственно возможным способом выделения элементов структурированной величины и неразрывно связана с указанными свойствами. Неочевидно для учащихся, что границы изменения индексов назначаются произвольно, что тип индексов — интервальный — не обязательно базируется на типе 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. В принципе обсуждение этой возможности можно увязать с текстовыми файлами, но это загромождает основной материал.
Введите функции Турбо Паскаля, ориентированные на работу со строками (length, concat, copy, delete, insert, pos), и полезные процедуры преобразования типов (str, val) и можно переходить к решению задач для закрепления навыков работы со строками. Типичные задачи, с которых целесообразно начать эту деятельность, таковы.
1. Определить, сколько раз в данном тексте встречается заданный символ.
2. Заменить в некотором тексте один фрагмент на другой ('Саша' на Маша').
Эту задачу можно решить, как минимум, двумя способами:
а) с использованием функции сору и операции слияния строк;
б) с использованием функций copy, delete и insert.
3. Определить, есть ли в некотором тексте одновременно два заданных слова.