Рекомендации по проведению занятий 10

Вид материалаКонтрольные вопросы

Содержание


Языки и методы программирования
Структурно-ориентированного программирования
184 :: Содержание
Цикл с параметром
Интервальный тип
table = array ['A'..'Z',1..5] of integer;var
Значением указателя
Основные процедуры модуля Graph
Таблица 3.2 Значения первого аргумента процедуры setlinestyle(a,b,t)
193 :: Содержание
Подобный материал:
1   ...   13   14   15   16   17   18   19   20   21
Глава 3

^ ЯЗЫКИ И МЕТОДЫ ПРОГРАММИРОВАНИЯ

В данном разделе практикума приведены материалы для проведения занятий по программированию на различных языках высокого уровня. Не исключено, что, наряду с данным практикумом, в учебном процессе по этому разделу могут использоваться сборники задач по программированию, которых (по крайней мере, по традиционным методологиям программирования) имеется большое число.

Хотя основу практикума по этому разделу составляют лабораторные работы, на которых студенты самостоятельно разрабатывают и реализуют (пользуясь консультациями преподавателей) программы на компьютере, это не исключает проведения семинарских занятий, на которых отрабатываются навыки решения типовых задач. Опыт показывает, что для многих студентов занятия по принципам алгоритмизации и программирования в аудитории, без компьютера, полезны и даже необходимы. Заметим в связи с этим, что в название раздела включено слово "методы" (а не просто "языки программирования"). Этим подчеркивается важность освоения именно методов разработки алгоритмов и программ, а не только кодирования на том или ином языке.

Основу практикума составляет программирование на трех языках: Паскаль, Си и Пролог. Наиболее полно отражен Паскаль, что соответствует его реальной роли в подготовке учителей информатики и ряду других специальностей. На базе Паскаля предполагается отработка навыков по объектно-ориентированному программированию. На уровне получения начальных практических навыков реализован практикум по Си и Прологу. В то же время, в практикум не включены разделы по программированию на языках Бейсик и ЛИСП, описанных в базовом учебном пособии.

Вопрос о целесообразности проведения практикума по языку Бейсик, формам и объему этого практикума следует рассматривать в контексте постановки изучения программирования в конкретном вузе. Роль Бейсика в профессиональном программировании в настоящее время невелика (достаточно популярный объектно-ориентированный Visual Basic, по существу, есть иной язык). Чаще всего на Бейсик отпускается лишь немного времени для ознакомления (либо эта тема полностью исключается или переносится на самостоятельное изучение). Учитывая, что языки Бейсик (в его современных версиях типа QBasic) и Паскаль нацелены на решение достаточно схожего круга прикладных задач, весьма объемный практикум по Бейсику с решением задач и выполнением лабораторных работ может быть при желании организован с помощью заданий, приведенных в разделе по Паскалю.

Язык ЛИСП, реализующий принципиально иную, нежели Паскаль, парадигму программирования, в принципе заслуживает ознакомления, что и имели в виду авторы базового учебного пособия, включив в него соответствующую главу. Однако на практическое освоение этого языка при подготовке студентов той

183

категории, которой адресован практикум, обычно не остается времени. Соответствующих требований нет и в государственных образовательных стандартах.

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

184

183 :: 184 :: ссылка скрыта

184 :: ссылка скрыта

§ 1. ПАСКАЛЬ КАК ЯЗЫК
^ СТРУКТУРНО-ОРИЕНТИРОВАННОГО ПРОГРАММИРОВАНИЯ


Рекомендации по проведению занятий

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

Это обусловливает и организацию занятий. Они включают практические (групповые) семинарские занятия, на которых отрабатываются навыки реализации типовых алгоритмов; для этой деятельности и для домашних заданий необходимо некоторое число традиционных задач. Не все эти задачи становятся объектом отладки на компьютере, поскольку это требует немалого времени.

По отдельным темам обычно проводятся контрольные работы, для которых также нужны задания. Следует отметить, что указанные оценки продолжительности выполнения контрольных работ, приведенные ниже, весьма условны. Они исходят из полного выполнения всех приведенных заданий и отладки программ на ЭВМ; и то, и другое необязательно, и реальный состав задания определяется преподавателем. Часть этих заданий может быть использована на лабораторных работах.

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

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

184

^ 184 :: ссылка скрыта

184 :: 185 :: 186 :: 187 :: 188 :: 189 :: 190 :: 191 :: 192 :: 193 :: ссылка скрыта

Краткие сведения

Паскаль-программа является текстовым файлом с собственным именем и с расширением .pas. Схематически программа представляется в виде последовательности восьми разделов:

  1. Заголовок программы.
  2. Описание внешних модулей, процедур и функций.
  3. Описание меток.

184

  1. Описание констант.
  2. Описание типов переменных.
  3. Описание переменных.
  4. Описание функций и процедур.
  5. Раздел операторов.

185

Основные операторы языка

Реализация последовательности действий (структуры следования) выполняется с помощью составного оператора:

begin <последовательность операторов> end;

Для реализации развилки в Паскале предусмотрены два оператора: условный оператор и оператор варианта (выбора). Первый выглядит так:

if <логическое выражение> then <оператор1> else ; или

if <логическое выражение> then ; .

Оператор варианта имеет следующую форму:

case <выражение> of
  • <список констант 1>: <оператор 1>;
  • <список констант 2>: <оператор 2>;
  • ................................................
  • <список константN>: <оператор N>

end; .

Для реализации циклов в Паскале имеются три оператора.

Цикл с предусловием:

while <логическое выражение> do <оператор>;.

Действие: вычисляется значение логического выражения. Если оно равно true, то выполняется оператор, после чего снова вычисляется значение логического выражения, в противном случае действие заканчивается.

Цикл с постусловием:
  • repeat
  • <последовательность операторов>
  • until <логическое выражение>;

Действие: выполняется последовательность операторов. Далее вычисляется значение логического выражения. Если оно равно true, то действие заканчивается, иначе снова выполняется последовательность операторов и т.д.

^ Цикл с параметром:

for <параметр>:= <выражение 1> to <выражение 2> do <оператор>

Параметр, выражение 1, выражение 2 должны быть одного ординального типа. Параметр в этом цикле возрастает.

for <параметр>:=<выражение 1> downto <выражение 2> do <оператор>.

Параметр в этом цикле убывает.

186

Структуры данных

Простые типы

К ним относятся:
  • real - вещественный;
  • integer - целый;
  • boolean - логический;
  • byte - байтовый;
  • char - символьный.

Перечисляемые и интервальные типы данных задаются с помощью простых типов. Описание перечисляемого типа выполняется в разделе типов по схеме:

type <имя типа> = <список имен>

Примеры:

type operator=(plus,minus,multi,divide);
color=(white,red,blue,yellow,purple,green);

^ Интервальный тип - это подмножество другого уже определенного простого типа, называемого базовым. Пример:

type days = (mon,tue,wed,thu,fri,sat,sun);
workdays = mon..fri;
index = 1..30;
letter = 'a' ..'z ' ;

Можно задать интервал и в разделе переменных:

var a:l..100; b: -25..25; .

Составные типы

Массив - это последовательность, состоящая из фиксированного числа однотипных элементов:

type <имя типа> = array <список типов индексов> of <тип элементов>.

Число типов индексов называется размерностью массива. После описания типа массива конкретные массивы можно задать в разделе описания переменных, например:

type vector = array [1..10] of real;
^ table = array ['A'..'Z',1..5] of integer;
var
a,b: vector;
с: table;

Описание массива-типа можно совместить с описанием соответствующих переменных:

var a,b: array [1..10] of real;
d: array
[byte] of char; .

Строковый тип определяется в разделе описания типов, переменные этого типа - в разделе описания переменных:

type word: string[20];
var a,b,c: word;

или

187

var a,b,c: string[20];
d: string[30];

Для строковых величин определены четыре стандартные функции:

  1. Функция соединения - concat (s 1, s 2, . . ., s k).
  2. Функция выделения - copy(s, i, k). Из строки s выделяется k символов, начиная с i-гo символа.
  3. Функция определения длины строки - length (s).
  4. Функция определения позиции - pos(s,t). Вычисляется номер позиции, начиная с которой строка s входит первый раз в строку t; результат равен 0, если строка 5 не входит в t.

Также определены четыре стандартные процедуры для обработки строковых величин:

  1. Процедура удаления - delete (s, i, k). Из строки s удаляется k символов, начиная с i-гo символа.
  2. Процедура вставки - insert(s, t, i). Строка s вставляется в строку t, начиная с позиции i.
  3. Процедура преобразования числа в строку символов - str(k, s).
  4. Процедура преобразования строки из цифр в число - val(s, k, i).

Множественный тип можно определить в разделе описания типов по схеме:

type <имя> = set of <тип элементов>. Например:
type t = set of byte;
var а: t;

или

var code: set of 0..7;
digits: set of '0'..'9' ;

Для данных множественного типа определены операции объединения, пересечения и дополнения множеств, обозначаемые соответственно знаками +, * и -, а также отношения равенства множеств (A = B), неравенства (A<>B), включения (A <= В, А >= В). Логическая операция принадлежности: x in А принимает значение true, если элемент x принадлежит множеству A и false в противном случае.

Запись - это последовательность, состоящая из фиксированного числа величин разных типов, называемых полями или компонентами записи:

type имя типа записи = record
имя поля 1: тип;
имя поля 2: тип;
. . . . . . . . . . . .
имя поля N: тип
end;

Например, адресные данные (индекс, город, улица, номер дома, квартиры) можно представить как запись:

type address = record
index: string[6];
city: string[20];
street: string[20];
haus,flat: integer
end;

188

Подпрограммы

В Паскале подпрограммы называются процедурами и функциями.

Процедура имеет такую же структуру, как и программа, но с двумя отличиями:

1) заголовок процедуры имеет другой синтаксис:

procedure <имя> (<список описаний формальных параметров>)

2) описание процедуры заканчивается точкой с запятой (а не точкой). Оператор вызова процедуры имеет вид

<имя процедуры> (<список выражений>);

Функция - это подпрограмма, определяющая единственное скалярное, вещественное или строковое значение. Отличия подпрограммы-функции от процедуры:

1) заголовок функции начинается со служебного слова function и заканчивается указанием типа значения функции:

function <имя> (): <тип>;

2) раздел операторов функции должен содержать хотя бы один оператор присваивания имени функции;

3) обращение к функции ~ не оператор, а выражение. Функции и процедуры могут быть рекурсивными.

В Паскале имеются две встроенные процедуры ввода:
  • 1) read <список переменных>;
  • 2) readln <список переменных>.

Имеются две процедуры вывода на экран дисплея:
  • 1) write <список выражений>;
  • 2) writeln <список выражений>.

Модули

Модуль - это набор констант, типов данных, переменных, процедур и функций. Используется для создания библиотек и разделения больших программ на логически связанные не зависимые друг от друга составные части. В состав модуля входят следующие разделы: заголовок, интерфейс, реализация, инициализация. Заголовок необходим для ссылок на модуль. Интерфейс содержит объявления, включая процедуры и функции, представленные списком заголовков и доступные пользователям в теле основной программы. Раздел <реализация> содержит тела процедур и функций, перечисленных в интерфейсной части модуля. Раздел <инициализация> содержит операторы, необходимые для инициализации модуля.

Каждый модуль компилируется отдельно; результат компиляции - файл с расширением .tpu (TurboPascalUnit). Каждый элемент модуля можно использовать в программе пользователя без дополнительного объявления, для чего достаточно записать'имя используемого модуля в директиве Uses в начале программы после его заголовка: uses <имя модуля>

Файлы

Для связи Паскаль-программы с внешними устройствами используют файловые переменные. Связь осуществляется оператором языка Паскаль:

assign (<имя файловой переменной>,'<имя устройства>').

189

Например:

assign (f, 'primer.dat')

Здесь f - имя файловой переменной, primer.dat - имя файла данных на внешнем носителе.

Если внешним устройством является принтер, то связь осуществляется оператором assign(f, 'lst:'). Здесь lst - логическое имя печатающего устройства.

Ниже приведены логические имена внешних устройств ввода-вывода:
  • con: консоль; trm: терминал;
  • kbd: клавиатура; 1st: принтер;
  • aux: буферсети; usr: драйвер пользователя.

После осуществления связи файловая переменная/отождествляется с соответствующим файлом.

Для работы с файлом его необходимо открыть, по окончании работы - закрыть. Файл открывается для чтения оператором reset(f), для записи - оператором rewrite(f). Чтение и записьданных осуществляется известными процедурами read/write, только в начале списка помещается имя файловой переменной:

read (f, <список ввода>); readln (f, <список ввода>);
write(f, <список вывода>); writeln(f, <список вывода>).

Закрытие файла осуществляется командой close (f). Команда reset(f) устанавливает указатель маркера файла на нулевое состояние.

В системе Турбо-Паскаль предусмотрены встроенные функции по работе с файлами:
  • filesize (f) - возвращает текущее число компонент открытого файла;
  • filepos (f) - возвращает номер текущей позиции маркера;
  • rename (f, имя) - переименование файла, связанного с /;
  • erase (f) - уничтожение файла;
  • execute (f) - выполнение СОМ-файла;
  • chain(f) - выполнение СНN-файла;
  • seek (f, N) - устанавливает маркер на позицию N;
  • eof(f) - возвращает TRUE, если найден конец файла;
  • ealn(f) - возвращает TRUE, если найден конец строки.

Файловый тип данных в программе задается по следующему правилу:

type <имя файлового типа> = file of <тип компонентов>.

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

type intfile = file of integer;

Динамические переменные и указатели

Переменные ссылочного типа (указатели) вводятся в употребление обычным путем с помощью их описания в разделе переменных.

^ Значением указателя является адрес ячейки, начиная с которой будет размещена в памяти соответствующая динамическая величина.

Задание ссылочного типа выполняется по схеме:

type <имя ссылочного типа> = ^ <имя типа динамической величины> (значок ^ указывает на то, что величина является динамической).

190

Например:

type p = ^integer;
q = ^record
x: integer;
y: string [20]
end;

В некоторых случаях возникает необходимость в качестве значения указателя принять "пустую" ссылку nil, которая не связывает с указателем никакого объекта и принадлежит любому ссылочному типу.

Для порождения динамического объекта, на который указывает ссылочная переменная i, служит стандартная процедура new(i). Имя ссылочной переменной с последующим символом ^ называют "переменной с указателем". Именно она синтаксически выполняет роль динамической переменной и может быть использована в любых конструкциях языка, где допустимо использование переменных того типа, что и тип динамической переменной.

Процедура dispose(i) уничтожает порожденные динамические объекты.

Графика

Графические возможности реализованы с помощью стандартного модуля Graph.tpu. Подключение модуля к программе выполняется директивой uses graph. Процедура инициализации графического режима имеет три аргумента:

Initgraph(<драйвер>, <режим>, '<путь к драйверу>')

и может быть выполнена так:

uses graph;
var gd, gm: integer;
{переменные gd и gm определяют драйвер и режим}
begin
gd:=vga; gm:=vgahi;
initgraph(gd, gm, 'd:\tp55');

Первые две команды можно заменить одной: gd:=detect с целью автоматического распознавания драйвера и установления режима максимального разрешения для данной машины.

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

Для обнаружения ошибок в графике применяются функции graphresult и grapherrormsg (код ошибки). Инициализация графического режима с проверкой ошибок может быть выполнена в программе следующим образом:

uses graph; var gd, gm, errorcod: integer;
begin
gd:=detect; initgraph(gd, gm, ''); errorcod:=graphresult;
if errorcod <> grok then
begin
writeln('ошибка графики');
writeln(grapherrormsg(errorcod));
halt
end;


191

Процедура halt останавливает выполнение программы и возвращает управление операционной системе.

Параметр "цвет" в процедурах работы с палитрой является выражением целого типа со значением из интервала 0..15, в частности, может быть константой из приведенного списка:

Black

= 0 (черный)

Darkgray

= 8 (темно-серый)

Blue

= 1 (синий)

Lightblue

= 9 (светло-синий)

Green

= 2 (зеленый)

Lightgreen

= 10 (светло-зеленый)

Cyan

= 3 (голубой)

Lightcyan

= 11 (светло-голубой)

Red

= 4 (красный)

Lightred

= 12 (светло-красный)

Magenta

= 5 (малиновый)

Lightmagenta

= 13 (светло-малиновый)

Brown

= 6 (коричневый)

Yellow

= 14 (желтый)

Lightgray

= 7 (светло-серый)

White

= 15 (белый).

Процедуры setcolor(<цвет>) и setbkcolor(<цвет>) устанавливают текущий цвет рисунка и цвет фона. При инициализации графики по умолчанию устанавливается черный фон и белый цвет рисунка.

Таблица 3.1

^ Основные процедуры модуля Graph

Заголовок процедуры

Геометрический смысл

putpixel (x, у, с)

Построить точку (х,у) цветом с

setlinestyle (a,b, t)

Установить стиль, образец и толщину линий

line (x1, y1, x2, y2)

Соединить две точки отрезком

rectangle (xl, yl, x2, y2)

Прямоугольник с заданными концами диагонали и сторонами, параллельными осям координат

circle (х, у, r )

Построить окружность с центром (х,у) и радиусом R

arc (х, y, a, b, r)

Построить дугу окружности: a, b - начальный и конечный углы в градусах

ellipse (х, у, a, b, rx, ry)

Построить эллиптическую дугу: rх, rу- полуоси эллипса

setfillstyle (t, с)

Установить стиль закраски и ее цвет

fillellipse(x, y, rx, ry)

Построить закрашенный эллипс, используя цвет рисунка

floodfill (х, у, cg)

Закрасить фигуру до границы с цветом cg; (х,у) - внутренняя точка фигуры

bar (xl, yl, x2, y2)

Построить столбец, используя тип и цвет закраски

pieslice (x, y, a, b, r)

Построить и закрасить сектор круга: a, b - начальный и конечный углы дуги в градусах

sector(x, y, a, b, rx, ry)

Построить и закрасить эллиптический сектор

settextstyle (f , n, d)

Установить шрифт, направление вывода, размер символов текста

outtextxy(x, y, st)

Вывести строку st, начиная с точки (x,y)

outtext (st)

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

setlinestyle (a, b, t)

Стиль линии

192

^ Таблица 3.2 Значения первого аргумента процедуры setlinestyle(a,b,t)

Значение стиля

Смысл

0 solidln

Непрерывная линия

1 dotteln

Пунктирная линия

2 centerln

Штрихпунктирная линия

3 dashedln

Штриховая линия

4 userbitln

Определенная пользователем

Второй параметр b, "образец", имеет значение 4, если а = 4, в остальных случаях b = 0.

Третий параметр t, толщина линии, может иметь значение 1 (нормальная толщина) или 3 (жирная линия).

Первый аргумент процедуры setfillstyle (t, с) - тип закраски t - принимает значения из интервала 0..12. Наиболее употребителен тип t = 1 - заполнение фигуры текущим цветом.

Для вывода текста на графический экран сначала выполняется процедура settextstyle(f, n, d), устанавливающая шрифт/, направление вывода n и размер символов (параметр d). При f = 0 используется стандартный точечный шрифт, встроенный в систему Турбо-Паскаль.

193

184 :: 185 :: 186 :: 187 :: 188 :: 189 :: 190 :: 191 :: 192 :: 193 :: ссылка скрыта

193 :: ссылка скрыта

Темы семинарских занятий

  1. Основные конструкции языка Паскаль. Структура программы.
  2. Циклы. Типовые задачи реализации циклических вычислительных процессов.
  3. Простые типы данных. Символьный тип. Перечисляемые и интервальные типы.
  4. Процедуры и функции.
  5. Программы с рекурсивными процедурами и функциями.
  6. Файлы.
  7. Структуры данных. Массивы. Типовые задачи обработки массивов.
  8. Множества.
  9. Записи.
  10. Модули.
  11. Динамические информационные структуры.
  12. Графические возможности Турбо-Паскаля.

193

193 :: ссылка скрыта

193 :: ссылка скрыта

Рекомендации по программному обеспечению

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

193

^ 193 :: ссылка скрыта

193 :: 194 :: 195 :: 196 :: 197 :: 198 :: 199 :: 200 :: 201 :: 202 :: 203 :: 204 :: 205 :: 206 :: 207 :: 208 :: 209 :: 210 :: 211 :: 212 :: 213 :: 214 :: 215 :: 216 :: 217 :: 218 :: 219 :: 220 :: ссылка скрыта

Задачи и упражнения

Основные конструкции языка

Упражнение № 1. Первое знакомство с системой программирования
Турбо-Паскаль

  1. Включить компьютер, запустить систему Турбо-Паскаль, познакомиться с текстовым редактором Edit.

Команды редактора Edit:



- перемещение курсора на символ вправо;



- перемещение курсора на символ влево;



- перемещение курсора на строку вверх;



- перемещение курсора на строку вниз;



- перемещение курсора в начало текущей строки;



- перемещение курсора в конец текущей строки;



- перемещение курсора на страницу вверх;



- перемещение курсора на страницу вниз;

193



- перемещение курсора в левый верхний угол;

- перемещение курсора в левый нижний угол;

- включение и выключение режима вставки;

- удаление символа, стоящего в позиции курсора;

- удаление символа, стоящего перед курсором;

- вставка пустой строки над строкой, где находится курсор;

- удаление строки, где находится курсор;

  1. Набрать свою фамилию, имя и отчество. В следующей строке - свой домашний адрес, номер телефона (если он есть).
  2. Набрать предложение: "Шла собака по роялю и сложила песню." В этом предложении заменить все буквы "о" на "е", а после каждой буквы "а" вставить букву "с".
  3. Очистить рабочее поле и набрать текст первой программы на Паскале.

Пример 1.