ЯЗЫКИ И МЕТОДЫ ПРОГРАММИРОВАНИЯ
В данном разделе практикума приведены материалы для проведения занятий по программированию на различных языках высокого уровня. Не исключено, что, наряду с данным практикумом, в учебном процессе по этому разделу могут использоваться сборники задач по программированию, которых (по крайней мере, по традиционным методологиям программирования) имеется большое число. Хотя основу практикума по этому разделу составляют лабораторные работы, на которых студенты самостоятельно разрабатывают и реализуют (пользуясь консультациями преподавателей) программы на компьютере, это не исключает проведения семинарских занятий, на которых отрабатываются навыки решения типовых задач. Опыт показывает, что для многих студентов занятия по принципам алгоритмизации и программирования в аудитории, без компьютера, полезны и даже необходимы. Заметим в связи с этим, что в название раздела включено слово «методы» (а не просто «языки программирования»). Этим подчеркивается важность освоения именно методов разработки алгоритмов и программ, а не только кодирования на том или ином языке. Основу практикума составляет программирование на трех языках: Паскаль, Си и Пролог. Наиболее полно отражен Паскаль, что соответствует его реальной роли в подготовке учителей информатики и ряду других специальностей. На базе Паскаля предполагается отработка навыков по объектно-ориентированному программированию. На уровне получения начальных практических навыков реализован практикум по Си и Прологу. В то же время, в практикум не включены разделы по программированию на языках Бейсик и ЛИСП, описанных в базовом учебном пособии. Вопрос о целесообразности проведения практикума по языку Бейсик, формам и объему этого практикума следует рассматривать в контексте постановки изучения программирования в конкретном вузе. Роль Бейсика в профессиональном программировании в настоящее время невелика (достаточно популярный объектно-ориентированный У18иа1 Вазю, по существу, есть иной язык). Чаще всего на Бейсик отпускается лишь немного времени для ознакомления (либо эта тема полностью исключается или переносится на самостоятельное изучение). Учитывая, что языки Бейсик (в его современных версиях типа (^Вазю) и Паскаль нацелены на решение достаточно схожего круга прикладных задач, весьма объемный практикум по Бейсику с решением задач и выполнением лабораторных работ может быть при желании организован с помощью заданий, приведенных в разделе по Паскалю. Язык ЛИСП, реализующий принципиально иную, нежели Паскаль, парадигму программирования, в принципе заслуживает ознакомления, что и имели в виду авторы базового учебного пособия, включив в него соответствующую главу. Однако на практическое освоение этого языка при подготовке студентов той категории, которой адресован практикум, обычно не остается времени. Соответствующих требований нет и в государственных образовательных стандартах. Важную роль в данном разделе практикума играет тема «Методы и искусство программирования». Именно на классических задачах поиска и сортировки и построения рекурсивных алгоритмов традиционно оттачиваются практические навыки будущего программиста в сфере алгоритмизации и программирования. Вопрос о том, на каких языках реализовывать соответствующие программы, вторичен. В данном случае это могут быть и Паскаль, и Си, и Бейсик. § 1. ПАСКАЛЬ КАК ЯЗЫК СТРУКТУРНО-ОРИЕНТИРОВАННОГО ПРОГРАММИРОВАНИЯ Рекомендации по проведению занятий Паскаль чаще всего является основным языком, изучаемым в ходе подготовки учителей информатики. Это обусловливает особую роль в проведении лаборатор- но-практических занятий по программированию на Паскале. Если в отношении других языков ставятся в основном ознакомительные цели, то при освоении Паскаля требуется выработка устойчивых практических навыков программирования. Это обусловливает и организацию занятий. Они включают практические (групповые) семинарские занятия, на которых отрабатываются навыки реализации типовых алгоритмов; для этой деятельности и для домашних заданий необходимо некоторое число традиционных задач. Не все эти задачи становятся объектом отладки на компьютере, поскольку это требует немалого времени. По отдельным темам обычно проводятся контрольные работы, для которых также нужны задания. Следует отметить, что указанные оценки продолжительности выполнения контрольных работ, приведенные ниже, весьма условны. Они исходят из полного выполнения всех приведенных заданий и отладки программ на ЭВМ; и то, и другое необязательно, и реальный состав задания определяется преподавателем. Часть этих заданий может быть использована на лабораторных работах. Практически полностью самостоятельная работа студентов, во время которой преподавателю отводится роль консультанта, реализуется в ходе выполнения лабораторных работ. Для этих работ необходимы наборы индивидуальных заданий, предусматривающих разработку типовых алгоритмов и программирование, с отладкой (и, в случае целесообразности, тестированием) программ, проведением по ним расчетов. Такие задания даются ниже по основным темам. Практикум тесно привязан к базовому учебнику. В силу этого, иногда при разборе упражнений практикуются ссылки на программы, приведенные в учебнике. Краткие сведения Паскаль-программа является текстовым файлом с собственным именем и с расширением.раз. Схематически программа представляется в виде последовательности восьми разделов: 1. Заголовок программы. 2. Описание внешних модулей, процедур и функций. 3. Описание меток. 4. Описание констант. 5. Описание типов переменных. 6. Описание переменных. 7. Описание функций и процедур. 8. Раздел операторов. Основные операторы языка Реализация последовательности действий (структуры следования) выполняется с помощью составного оператора: Ьед±п Споследовательность операторов> епс1; Для реализации развилки в Паскале предусмотрены два оператора: условный оператор и оператор варианта (выбора). Первый выглядит так: Слогическое выражение> " ЬЪеп < оператор1> е1зе < оператор2>; или И Слогическое выражение> " ЬЪеп < оператор>;. Оператор варианта имеет следующую форму: сазе < выражение> о^ < список констант 1>: < оператор 1>; < список констант 2>: < оператор 2>; < список констант N> 1 < оператор епс1;. Для реализации циклов в Паскале имеются три оператора. Цикл с предусловием: угЪИе Слогическое выражение> с1о < оператор>;. Действие: вычисляется значение логического выражения. Если оно равно 1гие, то выполняется оператор, после чего снова вычисляется значение логического выражения, в противном случае действие заканчивается. Цикл с постусловием: гереаЪ < последовательность операторов> ип" Ы1 Слогическое выражение>; Действие: выполняется последовательность операторов. Далее вычисляется значение логического выражения. Если оно равно ггие, то действие заканчивается, иначе снова выполняется последовательность операторов и т.д. Цикл с параметром: ^ог < параметр>: = < выражение 1> " Ьо < выражение 2> с! о < оператор> Параметр, выражение 1, выражение 2 должны быть одного ординального типа. Параметр в этом цикле возрастает. ^ог < параметр>: =< выражение 1> сижп" Ьо < выражение 2> с! о < оператор>. Параметр в этом цикле убывает. Структуры данных Простые типы К ним относятся: геа1 — вещественный; ш1е§ег — целый; Ьоо1еап — логический; Ьу1е — байтовый; сЬаг — символьный. Перечисляемые и интервальные типы данных задаются с помощью простых типов. Описание перечисляемого типа выполняется в разделе типов по схеме: " Ьуре < имя типа> = ссписок имен> Примеры: " Ьуре орегаЬог={р1из, Ш1пиз, ти111, < 3л^л.с1е); со1ог= (мНИе, гес1, Ыие, уе11ом, ригр1е, дгееп); Интервальный тип — это подмножество другого уже определенного простого типа, называемого базовым. Пример: " Ьуре с1ауз = (шоп, Ъие, мес1, Ыпи, ±г±, за!, зип); могМауз = шоп..^г1; 1пс1ех = 1.. 30; 1е-Ыег = 'а'..'г'; Можно задать интервал и в разделе переменных: Vа^ а: 1..100; Ь: -25..25/. Составные типы Массив — это последовательность, состоящая из фиксированного числа однотипных элементов: " Ьуре < имя типа> = аггау ссписок типов индексов> о^ < тип элементов>. Число типов индексов называется размерностью массива. После описания типа массива конкретные массивы можно задать в разделе описания переменных, например: " Ьуре Vес-Ьог = аггау [1..10] о^ геа1; 1: аЫе = аггау ['А1.. 1 2 1, 1..5] о^ л.п1: едег; Vа^ а, Ъ: Vес'Ьо^; с: " ЬаЫе; Описание массива—типа можно совместить с описанием соответствующих переменных: Vа^ а, Ъ: аггау [1..10] о^ геа1; с1: аггау [Ьу1е] о^ сЬаг;. Строковый тип определяется в разделе описания типов, переменные этого типа - в разделе описания переменных: " Ьуре ыогс1: зЪгз.пд [20]; Vа^ а, Ъ, с: ыогй; или Vа^ а, Ъ, с: зЪг±пд[20]; с!: зЪг±пд[30]; Для строковых величин определены четыре стандартные функции: 1. Функция соединения — сопсаЪ (з1, з2,..., зк). 2. Функция выделения — сору (з, ±, к). Из строки $ выделяется к символов, начиная с /-го символа. 3. Функция определения длины строки — 1епдЪЬ (з). 4. Функция определения позиции — роз(з, ь). Вычисляется номер позиции, начиная с которой строка 5 входит первый раз в строку результат равен О, если строка ^ не входит в и Также определены четыре стандартные процедуры для обработки строковых величин: 1. Процедура удаления — йе1еЪе (з, д., к). Из строки я удаляется к символов, начиная с /-го символа. 2. Процедура вставки — ±пзегЪ(з, ^ 1) • Строка я вставляется в строку начиная с позиции /. 3. Процедура преобразования числа в строку символов — зЪг (к, з). 4. Процедура преобразования строки из цифр в число — Vа1 (з, к, ±). Множественный тип можно определить в разделе описания типов по схеме: Ьуре < имя> = зе" Ь о^ < тип элементов>. Например: Ьуре Ь = зеЪ о^ ЪуЪе; уаг а: Ь; или Vа^ сос1е: зе" Ь о^ 0..7; сИдз-Ьз: зеЪ о^ ' 0 1.. ' 9 1; Для данных множественного типа определены операции объединения, пересечения и дополнения множеств, обозначаемые соответственно знаками +, * и —, а также отношения равенства множеств (А = В), неравенства (АО В), включения (А< = В, А > = В). Логическая операция принадлежности: хтА принимает значение 1гие, если элемент х принадлежит множеству А и /аке в противном случае. Запись — это последовательность, состоящая из фиксированного числа величин разных типов, называемых полями или компонентами записи: Ьуре имя типа записи = гесогс! имя поля 1: тип; имя поля 2: тип; имя поля N: тип епс1; Например, адресные данные (индекс, город, улица, номер дома, квартиры) можно представить как запись: Ьуре аск! гезз = гесогс! 1пс1ех: з1г±пд [ б ]; зЪг±пд[2 0]; з!: гее1:: з1г±пд[20]; Ъаиз, 1: 1а1:: л.п" Ьедег епй; Подпрограммы В Паскале подпрограммы называются процедурами и функциями. Процедура имеет такую же структуру, как и программа, но с двумя отличиями: 1) заголовок процедуры имеет другой синтаксис: ргосес! иге < имя> (ссписок описаний формальных параметров>) 2) описание процедуры заканчивается точкой с запятой (а не точкой). Оператор вызова процедуры имеет вид < имя процедуры> (Ссписок выражений>); Функция — это подпрограмма, определяющая единственное скалярное, вещественное или строковое значение. Отличия подпрограммы-функции от процедуры: 1) заголовок функции начинается со служебного слова ГипсИоп и заканчивается указанием типа значения функции: ^ипсЫоп < имя> (< список описаний формальных параметров>): < тип>; 2) раздел операторов функции должен содержать хотя бы один оператор присваивания имени функции; 3) обращение к функции — не оператор, а выражение. Функции и процедуры могут быть рекурсивными. В Паскале имеются две встроенные процедуры ввода: 1)геас! < список переменных>; 2) геасИп < список переменных>. Имеются две процедуры вывода на экран дисплея: 1)кг±-Ье < список выражений>; 2) ъг±Ъе1п Ссписок выражений>. Модули Модуль — это набор констант, типов данных, переменных, процедур и функций. Используется для создания библиотек и разделения больших программ на логически связанные не зависимые друг от друга составные части. В состав модуля входят следующие разделы: заголовок, интерфейс, реализация, инициализация. Заголовок необходим для ссылок на модуль. Интерфейс содержит объявления, включая процедуры и функции, представленные списком заголовков и доступные пользователям в теле основной программы. Раздел < реализация> содержит тела процедур и функций, перечисленных в интерфейсной части модуля. Раздел Инициализация > содержит операторы, необходимые для инициализации модуля. Каждый модуль компилируется отдельно; результат компиляции — файл с расширением Лри (ТигЪоРазсаШпИ). Каждый элемент модуля можно использовать в программе пользователя без дополнительного объявления, для чего достаточно записать имя используемого модуля в директиве Цзез в начале программы после его заголовка: и§е§ < имя модуля> Файлы Для связи Паскаль-программы с внешними устройствами используют файловые переменные. Связь осуществляется оператором языка Паскаль: а88±дп (< имя файловой переменной>, 1< имя устройства> 1). Например: азз1дп {Т., 1 ргл_тег. с1а1: 1) Здесь / — имя файловой переменной, рг1тег.(За! — имя файла данных на внешнем носителе. Если внешним устройством является принтер, то связь осуществляется оператором аззхдп 11з1:: 1). Здесь 1з1: — логическое имя печатающего устройства. Ниже приведены логические имена внешних устройств ввода-вывода: соп: консоль; Ьгт: терминал; кЪс!: клавиатура; 1з-ь: принтер; аих: буфер сети; изг: драйвер пользователя. После осуществления связи файловая переменная / отождествляется с соответствующим файлом. Для работы с файлом его необходимо открыть, по окончании работы — закрыть. Файл открывается для чтения оператором гезеЪ(: Е), для записи — оператором ге*гл.1: е (. Чтение и запись данных осуществляется известными процедурами геас! / *г1Ье, только в начале списка помещается имя файловой переменной: геас! < список ввода>); геасИп (Е, < список ввода>); ^г < список вывода>); \*гл." Ье1п (, < список вывода>). Закрытие файла осуществляется командой с1озе {?). Команда гезеЬ. (I) устанавливает указатель маркера файла на нулевое состояние. В системе Турбо-Паскаль предусмотрены встроенные функции по работе с файлами: ^Иезхге (±) — возвращает текущее число компонент открытого файла; ЁИероз — возвращает номер текущей позиции маркера; гепате (^, имя) — переименование файла, связанного с /; егазе(^) — уничтожение файла; ехесиЪе (±) — выполнение СОМ-файла; сЪал.п (^) — выполнение СНК-файла; зеек(: Е, Ы) — устанавливает маркер на позицию Тч[; ео^(^) — возвращает ТБШЕ, если найден конец файла; еа1п(Г) — возвращает ТК11Е, если найден конец строки. Файловый тип данных в программе задается по следующему правилу: Ьуре < имя файлового типа> = ^Ие о^ < тип компонентов>. В качестве типа компонент файла разрешается использовать любой тип данных, кроме файлового. Например: Ьуре = ^Ие о^ 1П" Ьедег; Динамические переменные и указатели Переменные ссылочного типа (указатели) вводятся в употребление обычным путем с помощью их описания в разделе переменных. Значением указателя является адрес ячейки, начиная с которой будет размещена в памяти соответствующая динамическая величина. Задание ссылочного типа выполняется по схеме: Ьуре < имя ссылочного типа> = А < имя типа динамической величины> (значок А указывает на то, что величина является динамической). Например: " Ьуре р = А±п" Ьедег; д = Агесогс1 х: ±п" Ьедег; у: зЪг±пд [20] епс1; В некоторых случаях возникает необходимость в качестве значения указателя принять «пустую» ссылку п±1, которая не связывает с указателем никакого объекта и принадлежит любому ссылочному типу. Для порождения динамического объекта, на который указывает ссылочная переменная л., служит стандартная процедура пек (л.). Имя ссылочной переменной с последующим символом А называют «переменной с указателем». Именно она синтаксически выполняет роль динамической переменной и может быть использована в любых конструкциях языка, где допустимо использование переменных того типа, что и тип динамической переменной. Процедура сИзрозе (л.) уничтожает порожденные динамические объекты. Графика Графические возможности реализованы с помощью стандартного модуля СгарЪ. Ьри. Подключение модуля к программе выполняется директивой изез дгарЬ. Процедура инициализации графического режима имеет три аргумента: 1п±-ЬдгарЪ (< драйвер>, < режим>, 'Спуть к драйверу> ') и может быть выполнена так: изез дгарЬ; Vа^ дс1, дш: ±п-Ьедег; {переменные дс! и дш определяют драйвер и режим} Ьед±п дс1: =^да; дт: =^даМ; ±п±" ЬдгарЬ (дс1, дт, ' с1: \1: р55 '); Первые две команды можно заменить одной: дй: =< 1еЪесЪ с целью автоматического распознавания драйвера и установления режима максимального разрешения для данной машины. Процедура с1озедгарЪ освобождает память от драйвера и устанавливает режим работы экрана, который был до инициализации графики. Для обнаружения ошибок в графике применяются функции дгарЪгезиИ: и дгарЬеггогшзд (код ошибки). Инициализация графического режима с проверкой ошибок может быть выполнена в программе следующим образом: изез дгарЬ; Vа^ дс1, дт, еггогсос!: ±п-Ьедег; Ьед±п дс!: =с1е1: ес1:; л.пл.'ЬдгарЪ (дс!, дт, ' '); еггогсос!: =дгарЪгези11:; еггогсос! о дгок " ЬЬеп Ьед±п кг±-Ье1п (' ошибка графики'); кг±-Ье1п (дгарЬеггогтзд (еггогсос!)); Ьа1 Ь епс!; Процедура Ьа1Ъ останавливает выполнение программы и возвращает управление операционной системе. Параметр «цвет» в процедурах работы с палитрой является выражением целого типа со значением из интервала 0..15, в частности, может быть константой из приведенного списка:
0 (черный) 1 (синий) 2 (зеленый) 3 (голубой) 4 (красный) 5 (малиновый) 6 (коричневый)
7 (светло-серый) Иагк& гау = ЬщМЫие = ЬщЫ^гееп = ЪщЫсуап = ЬщЫгей = Ы§Ыта§еп1а = Уе11ош тие 8 (темно-серый) 9 (светло-синий) 10 (светло-зеленый) 11 (светло-голубой) 12 (светло-красный) 13 (светло-малиновый) 14 (желтый) 15 (белый).
Процедуры зе'ЬсоЛ.ог (< цвет>) и зеЪЬксо1ог (< цвет>) устанавливают текущий цвет рисунка и цвет фона. При инициализации графики по умолчанию устанавливается черный фон и белый цвет рисунка. Та б л и ца 3.1
Второй параметр Ь, «образец», имеет значение 4, если а = 4, в остальных случаях Ь = 0. Третий параметр толщина линии, может иметь значение 1 (нормальная толщина) или 3 (жирная линия). Первый аргумент процедуры зе1: ^111з1: у.1е(1: /с) — тип закраски/—принимает значения из интервала 0..12. Наиболее употребителен тип / = 1 — заполнение фигуры текущим цветом. Для вывода текста на графический экран сначала выполняется процедура зе" Ы: ех1: з1: у1е (^, п, с!), устанавливающая шрифт/, направление вывода п и размер символов (параметр с1). При/= 0 используется стандартный точечный шрифт, встроенный в систему Турбо-Паскаль. Контрольные вопросы 1. Из каких разделов состоит программа на Паскале? 2. В каких случаях используют циклы с параметром, с предусловием и с постусловием? Приведите примеры. 3. В чем различия и сходство данных типа скаг и Мпп§? 4. В чем различия и сходство данных типа массив и множество? 5. В чем различия и сходство данных типа массив и запись? 6. В чем принципиальные отличия подпрограммы-процедуры от подпрограммы- функции? 7. Для каких целей служат модули? 8. Какую роль в программе играет файловая переменная? 9. Для чего вводят динамические структуры? В чем их принципиальное отличие от статических типов данных? 10. Каким образом в Паскаль-программе инициализируется графический режим?
|