МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ Московский государственный ин...
232 downloads
208 Views
449KB Size
Report
This content was uploaded by our users and we assume good faith they have the permission to share this book. If you own the copyright to this book and it is wrongfully on our website, we offer a simple DMCA procedure to remove your content from our site. Start by pressing the button below!
Report copyright / DMCA form
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ Московский государственный институт электроники и математики (Технический университет)
Кафедра Управления и информатики в технических системах
ПРОГРАММИРОВАНИЕ Методические указания к лабораторным работам
Москва 2009 г. 1
Составитель ст. преп. В.Г. Кулаков
Программирование. Метод, указания к лабораторным работам / Моск. гос. ин-т электроники и математики; Сост. В.Г. Кулаков. М., 2009, 24 с. Ил. 1. Библиогр.: 3 назв.
Методические указания к лабораторным работам по дисциплине «Программирование» предназначены для студентов первого курса дневного отделения. Основной целью лабораторных работ является освоение студентами правил программирования на языке Паскаль. Методические указания составлены в соответствии с программой и планом для специальности «Управление и информатика в технических системах» - 210100.
ISBN ???
2
Содержание
Стр.
1. Лабораторная работа №1. Знакомство с интегрированной средой Borland Паскаль 1.1. Цель лабораторной работы 1.2. Как начать работу с Турбо Паскалем 1.3. Функциональные клавиши 1.4. Текстовый редактор 1.5. Прогон и отладка программы 1.6. Справочная служба Турбо Паскаля 1.7. Структура программы на языке Паскаль 1.8. Операторы языка Паскаль 1.9. Упражнения 2. Лабораторная работа №2. Основы программирования на языке Паскаль 2.1. Цель лабораторной работы 2.2. Массивы 2.3. Строки 2.4. Процедуры и функции 2.5. Упражнения 3. Лабораторная работа №3. Работа с файлами 3.1. Цель лабораторной работы 3.2. Записи 3.3. Общие операции с файлами 3.4. Текстовые файлы 3.5. Компонентные файлы 3.6. Бестиповые файлы 3.7. Последовательный и прямой доступ 3.8. Упражнения 4. Лабораторная работа №4. Процедуры и функции для работы в графическом режиме и генерации случайных чисел 4.1. Цель лабораторной работы 4.2. Подпрограммы для работы в графическом режиме 4.3. Генератор случайных чисел 4.4. Упражнения Библиографический список
4 4 4 5 5 6 6 7 7 9 10 10 10 10 11 13 14 14 14 14 16 17 17 18 19 20 20 20 22 22 23
3
1. Лабораторная работа №1 Знакомство с интегрированной средой Borland Паскаль 1.1. Цель лабораторной работы Целью работы является изучение основ программирования на языке Паскаль и освоение интегрированной среды Турбо Паскаля. 1.2. Как начать работу с Турбо Паскалем Система Турбо Паскаль поставляется на нескольких дистрибутивных дискетах и устанавливается на жесткий диск. При развертывании системы на диске создается каталог с именем ТР или BP, в который помещаются все файлы с дискет. Для вызова Паскаля необходимо отыскать в древовидной структуре каталогов на диске этот каталог и в нем файл TURBO.EXE. Этот файл содержит готовую к работе диалоговую систему программирования, в которую входят самые необходимые части Турбо Паскаля (текстовый редактор, компилятор, компоновщик, загрузчик). Пусть перечисленные файлы располагаются в каталоге ТР на диске C. Тогда для вызова Турбо Паскаля следует дать команду: C:\TP\TURBO
Не рекомендуется работать с системой, назначив в качестве текущего системный каталог, так как можно ошибочно стереть какой-либо из файлов системы и нарушить ее работоспособность. После успешного вызова системы экран ПК приобретает вид, показанный на рис. 1.1.
Рис. 1.1. Вид экрана после вызова Турбо Паскаля Верхняя строка содержит меню возможных режимов работы Турбо Паскаля, нижняя – краткую справку о назначении основных функциональных клавиш. Вся остальная часть экрана принадлежит окну редактора, очерченному двойной рамкой и предназначенному для ввода и коррекции текстов программ. В его верхней строке приводятся имя того дискового файла, откуда был прочитан текст программы (новому файлу присваивается имя NONAME00.PAS), два специальных поля, используемых при работе с мышью, и цифра 1 – номер окна. В Турбо Паскале можно работать одновременно с несколькими программами, каждая из которых располагается в отдельном окне. Кроме окна редактора в Турбо Паскале используются также окна отладочного режима, вывода результатов работы программы, справочной службы, стека и регистров. 4
1.3. Функциональные клавиши Функциональные клавиши используются для управления средой Турбо Паскаля. Они обозначаются F1, F2, ..., F12 и располагаются в верхнем ряду клавиатуры. С каждой из этих клавиш связывается некоторая команда меню. Действие функциональных клавиш можно модифицировать клавишами Alt, Ctrl и Shift – нужно нажать на одну из них и затем, не отпуская ее, нажать функциональную клавишу. В дальнейшем такое совместное нажатие двух клавиш будем обозначать чертой. Например, Alt-F3 означает, что вместе с клавишей Alt необходимо нажать клавишу F3. Ниже приводятся команды, которые передаются среде Турбо Паскаля функциональными клавишами: Fl – обратиться за справкой к справочной службе; F2 – записать редактируемый текст в дисковый файл; F3 – прочитать текст из файла в окно редактора; F4 – продолжить исполнение программы до строки, на которой стоит курсор; F5 – распахнуть активное окно на весь экран; F6 – сделать активным следующее окно; F7 – выполнить следующую строку программы; F8 – выполнить следующую строку, не отслеживая обращения к процедурам; F9 – компилировать программу, но не выполнять ее; F10 – перейти к выбору режима работы с помощью главного меню; Ctrl-F9 – выполнить прогон программы; Alt-F5 – сменить окно редактора на окно вывода результатов работы. 1.4. Текстовый редактор Текстовый редактор Турбо Паскаля предоставляет пользователю удобные средства создания и редактирования текстов программ. Признаком того, что среда находится в состоянии редактирования, является наличие в окне редактора курсора. Режим редактирования автоматически устанавливается сразу после загрузки Турбо Паскаля. Из режима редактирования можно перейти к любому другому режиму работы с помощью функциональных клавиш или выбора нужного режима из главного меню. Если среда находится в состоянии выбора режима, курсор исчезает, а в строке меню появляется цветной прямоугольник, выделяющий одну из опций. Для выхода из меню в режим редактирования нужно нажать клавишу Esc. Рассмотрим основные приемы работы с текстовым редактором. Для создания программы нужно ввести текст с помощью клавиатуры в окне редактора. Редактор имитирует работу с листом бумаги. Размеры листа ограничены: обще число символов не более 64535, длина строки не более 126 символов. Клавишами перевода курсора его можно смещать по экрану. Окно можно смещать относительно листа с помощью следующих клавиш: Page Up – на страницу вверх; Page Down – на страницу вниз; Ноте – в начало текущей строки; End – в конец текущей строки; Ctrl-Page Up – в начало текста; Ctrl-Page Down – в конец текста. Если Вы ошиблись при вводе очередного символа, его можно стереть с помощью клавиши Backspace. Клавиша Delete стирает символ, на который в данный момент указывает курсор, а команда Ctrl-Y – всю строку, на которой расположен курсор. Нормальный режим работы редактора – режим вставки. Редактор может также работать в режиме замещения: в этом режиме новый символ заменяет собой тот символ, на который указывает курсор. Для перехода к режиму замещения нужно нажать клавишу Insert, а если нажать эту клавишу еще раз, вновь устанавливается режим вставки. Признаком того, в каком режиме
5
работает редактор, является форма курсора: в режиме вставки он похож на мигающий символ подчеркивания, а в режиме замещения он представляет собой мигающий прямоугольник. После завершения работы с Турбо Паскалем можно сохранить текст программы в дисковом файле. Для обмена данными между файлами и редактором предназначены клавиши F2 (запись в файл) и F3 (чтение из файла). Если Вы создаете новую программу, среда присваивает ей имя NONAME00.PAS, которое можно изменить перед началом записи в файл. Для выхода из Турбо Паскаля следует нажать комбинацию клавиш Alt-X. 1.5. Прогон и отладка программы После подготовки текста программы можно попытаться исполнить ее, т.е. откомпилировать программу, связать ее с библиотекой стандартных процедур и функций, загрузить в оперативную память и передать ей управление. Вся эта последовательность действий называется прогоном программы и реализуется командой Ctrl-F9. Если в программе нет синтаксических ошибок, то все действия выполняются последовательно одно за другим, при этом в небольшом окне сообщается о количестве откомпилированных строк и объеме доступной оперативной памяти. Перед запуском программы среда выводит на экран окно прогона программы, а после завершения программы вновь восстанавливает окно редактора. Если на каком-либо этапе среда обнаружит ошибку, она прекращает дальнейшие действия и помещает курсор на строку программы, в которой обнаружена ошибка. При этом в верхней строке редактора появляется диагностическое сообщение о причине ошибки. Если ошибка возникла на этапе прогона программы, простое указание того места, где она обнаружена, может не дать нужной информации, так как ошибка может быть следствием неправильной подготовки данных в предыдущих операторах программы. В таком случае обычно прибегают к пошаговому исполнению программы с помощью клавиш F4, F7 и F8. Пока не накоплен достаточный опыт отладки, можно пользоваться одной клавишей F7, после нажатия на которую среда осуществит компиляцию, компоновку и загрузку программы, а затем остановит прогон перед исполнением первого оператора. Строка программы, содержащая этот оператор, будет выделена на экране указателем (цветом). Теперь каждое новое нажатие F7 будет вызывать исполнение всех операций, запрограммированных в текущей строке, и смещение указателя к следующей строке программы. В подозрительном месте программы можно просмотреть текущее значение переменной или выражения. Для этого нужно установить курсор в то место строки, где находится имя переменной, и нажать Ctrl-F4. На экране появится диалоговое окно, состоящее из трех полей (в верхнем поле будет стоять имя переменной, два других будут пустыми). Нажмите Enter, чтобы в среднем поле получить текущее значение переменной. 1.6. Справочная служба Турбо Паскаля Неотъемлемой частью среды является встроенная справочная служба: в затруднительной ситуации достаточно нажать F1 и на экране появится необходимая справка. Эта справка зависит от текущего состояния среды, поэтому справочную службу называют контекстно-чувствительной. Например, если нажать F1 в момент, когда среда обнаружила ошибку в программе, в справке будут сообщены дополнительные сведения о причинах ошибки и даны рекомендации по ее устранению. Доступ к справочной службе можно получить с помощью следующих клавиш: F1 – получение справки; Shift-F1 – выбор справки из списка сообщений; Ctrl-F1 – получение справки о стандартной функции, константе или переменной. По команде Shift-F1 на экране появится окно, содержащее упорядоченный по алфавиту список стандартных процедур, функций, типов, констант и переменных, для которых можно получить справочную информацию. Если подвести курсор к имеющемуся в тексте стандартному имени и нажать Ctrl-F1, среда выделит имя и даст нужную справку. 6
1.7. Структура программы на языке Паскаль Программа на языке Паскаль состоит из заголовка, разделов описаний и раздела операторов. Заголовок программы содержит имя программы, например: Program PRIM;
Описания могут включать в себя раздел подключаемых библиотек (модулей), раздел описания меток, раздел описания констант, раздел описания типов, раздел описания переменных, раздел описания процедур и функций. Раздел описания констант начинается с служебного слова const. Описание позволяет использовать имена как синонимы констант. Пример: const K= 1024; MAX= 16384;
Раздел описания переменных начинается с служебного слова var. В разделе описания переменных необходимо определить тип всех переменных, используемых в программе. Пример: var P,Q,R: Integer; A,B: Char;
Раздел операторов представляет собой составной оператор, который содержит между служебными словами begin и end последовательность операторов. Операторы отделяются друг от друга точкой с запятой. Текст программы заканчивается точкой. Кроме описаний и операторов программа может содержать комментарии, которые представляют собой произвольную последовательность символов, расположенную между открывающей фигурной скобкой и закрывающей фигурной скобкой. В простейшем случае программа содержит заголовок, раздел описания переменных и раздел операторов. Пример программы, вычисляющей сумму чисел A, B и C: Program SUM_ABC; var A, B, C, S: Real; begin Read(A,B,C); S:=A+B+C; WriteLn('S=',S) end.
1.8. Операторы языка Паскаль Оператор присваивания состоит из двоеточия и знака равенства: :=
Справа от оператора записывают выражение, слева указывают имя переменной, которой присваивается значение выражения: имя переменной := выражение;
Для ввода и вывода данных используются процедуры Read и Write, оперирующие стандартными последовательными файлами INPUT и OUTPUT. Для ввода исходных данных используются операторы процедур ввода: Read(A1, A2, … AK); ReadLn(A1, A2, … AK); ReadLn;
Первый из них реализует чтение К значений исходных данных и присваивание этих значений переменным А1, А2, …, АК. Второй оператор выполняет чтение К значений исходных данных, пропуск остальных значений до начала следующей строки, присваивание считанных значений переменным А1, А2, …, АК. Третий оператор выполняет пропуск строки данных. Пример записи операторов ввода: var V, S: Real; W, J: Integer; ... Read(V, S, W, J);
Для вывода результатов работы программы на экран используются операторы: 7
Write(A1, A2,… AK); WriteLn(A1, A2,… AK); WriteLn;
Первый из этих операторов реализует вывод значений переменных А1, А2, …, АК в строку экрана. Второй оператор выполняет вывод значений переменных А1, А2, …, АК и переход к началу следующей строки. Третий оператор выполняет пропуск строки и переход к началу следующей строки. Вывод каждого значения в строку экрана происходит в соответствии с шириной поля вывода. Оператор вывода позволяет задать ширину поля для каждого элемента списка вывода. В этом случае элемент списка имеет вид А:К, где А – выражение, К – ширина поля. Для величин действительного типа элемент списка может иметь вид А:К:М, где А – выражение, К – ширина поля, М – число цифр дробной части. Пример записи операторов вывода: var A, B: Real; P, Q: Integer; ... WriteLn(A, B:10:2); WriteLn(P, Q:8);
Условный оператор включает в себя операторы, которые выполняются или не выполняются в зависимости от записанного в операторе условия. Оператор имеет вид: If условие Then оператор1 Else оператор2;
Условие – выражение логического типа. Оператор1 выполняется, если условие истинно; оператор2 – если условие ложно. Блок Else может отсутствовать, т. е. оператор может иметь вид: If условие Then оператор;
Поскольку операции сравнения имеют низший приоритет, то при проверке нескольких условий эти условия заключаются в скобки. Пример: If (a>90) or (b>90) or (c>90) then writeln('Треугольник - тупоугольный');
Оператор цикла с параметром применяется при выполнении расчетов или других действий, повторяющихся определенное количество раз. Оператор для цикла с инкрементом параметра имеет вид: For i:= N1 To N2 Do оператор;
Оператор для цикла с декрементом имеет вид: For i:= N1 DownTo N2 Do оператор;
Здесь i – параметр цикла, N1– начальное значение параметра, N2 – конечное значение. N1 и N2 могут быть константами, переменными или выражениями. Цикл с инкрементом выполняется при условии N1<=N2; значение параметра возрастает с шагом 1 от N1 до N2. Цикл с декрементом выполняется при условии N1>=N2; значение параметра убывает с шагом 1 от N1 до N2. В операторе цикла не разрешается присваивать параметру цикла какое-либо значение. Пример вычисления суммы квадратов чисел от 1 до N: PROGRAM SUM_N; var a, S, i, N: word; begin write('Введите N:'); readln(N); S:= 0; For i:= 1 to N do S:= S + i*i; writeln('Cумма S=', S); end.
В Паскале применяются два оператора цикла с условием. Цикл с предусловием выполняет проверку условия перед каждым выполнением оператора: While условие Do оператор;
Цикл с постусловием выполняет проверку условия после каждого выполнения оператора: Repeat операторы Until условие;
8
Условие – это выражение логического типа. В цикле While оператор выполняется если условие верно, т. е. цикл повторяется пока выполняется условие. Цикл Repeat повторяется, если условие ложно, т. е. до выполнения условия. Циклы с условием обычно используются, если количество повторений блока операторов заранее не известно, например, при расчете суммы членов бесконечного ряда с заданной погрешностью. Приведем пример расчета значения функции y=sin(x) с использованием представления функции в виде ряда: x3 x5 x7 sin x x ... 3! 5! 7! Таким образом, y = x – x3/3! + … + (–1)(N+1) * x(2*N+1)/(2*N+1)! + … Каждый член ряда аN при N>0 можно получить умножением предыдущего члена ряда aN-1 на коэффициент k: a0=x, aN=k*aN-1, k=(–x2)/(2*N*(2*N+1)), N=0, 1, 2, … Приближенное значение функции находится как частичная сумма N членов ряда. Погрешность вычисления значения функции зависит от количества членов ряда и значения х, поэтому расчет заканчивается при |aN| < eps, где eps – допустимая погрешность. Пример: PROGRAM SIN_R; Var y, x, eps, a, k: real; n: Word; Begin Write('Введите значение x='); readln(x); Write('Введите погрешность еps='); readln(eps); Writeln; n:= 0; a:= x; {a - первый член ряда} y:= a; {y - первая частичная сумма ряда} While abs(a)>eps do begin n:= n+1; k:= -x*x/(2*n*(2*n+1)); a:= a*k; y:= y+a; Writeln('Приближенное значение функции y=',y:11:8,' при n=',n) end; Writeln('Нажмите Enter'); readln; End.
1) 2) 3)
4) 5)
1.9. Упражнения Требуется составить программы, которые будут выполнять следующие действия: Ввести целое число n. Вывести на экран таблицу квадратов и кубов чисел от 1 до n. Ввести n. Вычислить и вывести на экран n!. Ввести целые числа n и m. Вычислить и вывести на экран количество сочетаний из n элементов по m, используя формулу: n! . C nm m!(n m)! Ввести целое число n. Найти все делители числа n методом простого последовательного перебора и вывести их на экран. Если число n простое, выдать соответствующее сообщение. Ввести x и значение погрешности eps. Вычислить значение e-x при помощи разложения в ряд Тейлора с заданной точностью. При вычислении e-x используется ряд следующего вида: x2 x3 x4 x e 1 x ... 2! 3! 4!
9
2. Лабораторная работа №2
Основы программирования на языке Паскаль 2.1. Цель лабораторной работы Целью данной работы является продолжение изучения основ программирования на языке Паскаль. Отчет о работе не оформляется. Прием задания производится непосредственно на компьютере по предъявлению работающей, полностью отлаженной программы. 2.2. Массивы Массивы представляют собой упорядоченную совокупность однотипных величин. Каждая отдельная величина называется компонентой массива. Тип компонент называется базовым типом. В качестве индекса может быть использовано выражение. Тип индексов может быть только интервальным или перечисляемым. Индексы интервального типа, для которого базовым является целый тип, могут принимать отрицательные, нулевое и положительные значения. Чтобы использовать массив в программе на Паскале, требуется определить параметры массива и описать переменную-массив. Описание типа массива задается следующим образом: имя типа = array [список типов] of тип;
Тип индекса в определении типа заключается в квадратные скобки после служебного слова array, а тип компонента задается после служебного слова of. Пример: type wordtype = array[1..12] of char; var Name: wordtype;
Второй способ описания массива – упрощенный: тип массива определяется неявно вместе с описанием переменной. Пример: var Name: array[1..12] of char;
Двумерные массивы хранятся в памяти ЭВМ по строкам. Первый индекс определяет номер строки, второй – номер столбца. Пример описания матрицы целых чисел, состоящей из 5 строк и 10 столбцов: var Matrix: array[1..5, 1..10] of integer;
Инициализация массивов выполняется с помощью типизированных констант, например: type Dim10 = Array[1..10] of Real; const M10: Dim10 = (0, 2.1, 4, 5.65, 6.1, 6.7, 7.2, 8, 8.7, 9.3);
При инициализации двумерных массивов значения компонент каждого из входящих в него одномерных массивов записывается в скобках: type Dim3x2 = Array[1..3,1..2] of Integer; const M3x2: Dim3x2 = ((1,2)(3,4)(5,6));
2.3. Строки Стандартный Паскаль допускает два способа хранения символьных массивов в памяти ЭВМ: распакованный и упакованный. Распакованные массивы символов хранятся в памяти ЭВМ по одному символу в машинном слове, упакованные – по одному символу в байте. При описании упакованного массива символов используют служебное слово packed, например: var Mas: Packed Array[1..20] of Char;
Описание распакованного массива символов имеет вид: var M: Array[1..20] of Char;
Для преобразования символьного массива из распакованной формы в упакованную и наоборот, из упакованной в распакованную используются стандартные функции Pack и UnPack. Упакованный массив образует символьную строку. Символьная строка может быть либо константой, либо переменной. Строковая константа представляет собой совокупность символов, заключенную в апострофы. Строковые константы могут входить в состав выражений. Как и числовые константы, они могут быть описаны в разделе описания констант.
10
Строковые переменные – это одномерные упакованные массивы символов, для описания которых введен тип String. Например, если строка содержит до 30 символов, ее тип будет определен как type s= String[30];
В Турбо Паскале определено понятие строки переменной длины, в этом случае ее описание задается как type s= String;
Особенностью строковых переменных является то, что к ним можно обращаться как к скалярным переменным, так и к массивам. Во втором случае применяется конструкция «переменная с индексом», что обеспечивает доступ к отдельным символам строки. При этом нижняя граница индекса равна 1. Отдельный символ строки совместим с типом Char. В памяти ЭВМ строка занимает количество байтов, на единицу большее ее длины. Нулевой байт строки содержит ее длину. Максимальная длина строки – 255 символов. Для строк определены операции присваивания, слияния и сравнения. Для сравнения строк применяются все операции отношения. Сравнение строк происходит посимвольно, начиная с первого символа. Строки равны, если имеют одинаковую длину и посимвольно эквивалентны. Строки могут быть элементами списка ввода-вывода, при этом записывается имя строки без индекса. Количество вводимых символов может быть меньше, чем длина строки (в этом случае оставшиеся байты заполняются пробелами). Если количество вводимых символов превышает длину строки, лишние символы отбрасываются. Инициализация строк может производиться с помощью типизированных констант: const sName: String[9]= 'IBM PC/AT';
2.4. Процедуры и функции Подпрограмма – это именованная последовательность описаний и операторов. В языке Паскаль существуют два типа подпрограмм – процедуры и функции. Различие между процедурами и функциями заключается в том, что процедура просто выполняет некоторую последовательность действий, а функция, кроме того, возвращает в точку вызова некоторое значение. Тексты процедур и функций помещаются в раздел описаний подпрограмм. Подпрограмма может содержать разделы описаний модулей, меток, констант, типов, переменных и подпрограмм. Константы, типы и переменные, объявленные таким образом, доступны только внутри подпрограммы. Передача данных в подпрограмму выполняется с помощью параметров. Параметры, определенные в заголовке подпрограммы, называются формальными. Выражения, задающие конкретные значения при обращении к подпрограмме, называются фактическими параметрами. При обращении к подпрограмме формальные параметры замещаются фактическими. В списке формальных параметров при объявлении подпрограммы должны быть указаны их имена и типы. Имя параметра отделяется от типа двоеточием, а параметры друг от друга – точкой с запятой. Имена параметров одного типа могут объединяться в подсписки, в которых имена отделяются друг от друга запятой. Параметры, передаваемые по значению, используются для передачи данных в процедуру или функцию: в подпрограмму передается копия каждого формального параметра, даже если в их роли выступают переменные или константы. Параметры, передаваемые по ссылке, используются для хранения результатов выполнения процедуры или функции. Они перечисляются после слова var с обязательным указанием типа. Каждому такому параметру может соответствовать только фактический параметр в виде переменной. При вызове подпрограммы ей передается ссылка на переменную. Стандартные подпрограммы являются частью языка программирования. Все стандартные процедуры и функции реализованы в специальных библиотечных модулях, которые подключаются сразу после заголовка программы с помощью оператора uses.
11
В лабораторной работе мы будем использовать стандартную функцию Length, которая получает в качестве аргумента строку (значение типа String), а возвращает длину строки (значение типа Integer). Пример использования функции Length: PROGRAM SLEN; {определение длины строки} var s: string; k: integer; begin Writeln(’Введите строку:’); Readln(s); k:= length(s); Writeln(’Длина строки = ’, k, ’ символов’) end.
Пользовательские подпрограммы создаются пользователем и объявляются после объявления переменных перед первым оператором begin программы. Если процедура объявлена в отдельном модуле, для обращения к ней необходимо дать ссылку на модуль в разделе uses. Для объявления процедуры используется следующая конструкция: procedure имя(параметры); const объявления констант; type объявления типов; var объявления переменных; begin операторы end;
Для вызова процедуры необходимо указать ее имя, а затем – перечень фактических параметров в круглых скобках. Например, если объявлена процедура procedure ShowMessage(s: string, len: integer); begin Writeln(s:len); {len – ширина поля вывода} end;
то для ее вызова должен использоваться оператор следующего вида: ShowMessage(’Hello’, 10);
Если процедура объявлена без списка параметров, то она вызывается только по имени, без использования скобок. Например, если объявлена процедура procedure ShowHello; begin Writeln(’Hello’); end;
для ее вызова должен использоваться оператор: ShowHello;
Для объявления функции используется конструкция: function имя(параметры): тип результата; const объявления констант; type объявления типов; var объявления переменных; begin операторы end;
В теле функции должен быть как минимум один оператор, в котором имени функции присваивается возвращаемое значение. В точку вызова функции возвращается результат последнего присваивания. Вызов функции может быть частью выражения, так как функция возвращает некоторое значение. Для вызова необходимо указать имя функции и перечень параметров в круглых скобках. Для завершения работы программ, процедур и функций без предварительного перехода по меткам к закрывающему end введены процедуры Exit и Halt.
12
Вызов Exit завершает работу программного блока. Если Exit выполняется в подпрограмме, то выполнение подпрограммы прекращается и управление передается вызывающей программе. Если Exit выполняется в основной программе, ее работа завершается. Вызов процедуры Halt, где бы она не находилась, завершает работу программы и передает управление операционной системе. Процедура Halt имеет структуру Halt(n), где n – код возврата, который может быть проанализирован операционной системой. Значение n=0 соответствует нормальному завершению работы программы. Вызов процедуры Halt без параметра эквивалентен вызову Halt(0).
1) 2) 3) 4) 5)
6)
7)
2.5. Упражнения Требуется составить программы, которые будут выполнять следующие действия: Ввести массив из 8 элементов типа Real, вычислить сумму значений и вывести результат. Ввести массив из 10 элементов типа Integer, найти максимальный элемент, вывести номер и значение элемента. Ввести строку с клавиатуры. Используя цикл For, заменить все пробелы на символы подчеркивания и вывести результат на экран. Сформировать единичную матрицу чисел типа Real размером 1010 и вывести результат на экран. Ввести матрицу A типа Integer размером 55. Сформировать транспонированную матрицу AT так, чтобы она заменила собой матрицу A в оперативной памяти. Вывести результаты на экран. Ввести с клавиатуры матрицы A и B типа Integer размером 33. Вычислить сумму, разность и произведение матриц A и B, оформив каждую из операций в воде отдельной подпрограммы. Вывести результаты на экран. Ввести n и вычислить n!, используя рекурсивный вызов функции. Результат вывести на экран.
13
3. Лабораторная работа №3 Работа с файлами 3.1. Цель лабораторной работы Целью данной лабораторной работы является освоение правил работы с файлами в языке Паскаль. Отчет о работе не оформляется. Прием задания производится непосредственно на компьютере по предъявлению работающей, полностью отлаженной программы. 3.2. Записи Запись представляет собой совокупность логически связанных компонент, принадлежащих к разным типам. Компоненты записи называются полями, каждое из которых определяется именем. Поле записи содержит имя поля, вслед за которым через двоеточие указывается тип этого поля. Описание записи осуществляется с помощью служебного слова RECORD, вслед за которым описываются компоненты записи. Завершается описание служебным словом END. Например, записная книжка содержит фамилии, инициалы и номера телефона, поэтому отдельную строку в книжке удобно представить в виде следующей записи: type Row=Record FIO: String[20]; TEL: String[7] end; var str: Row;
Описание записей возможно и без использования имени типа, например: var str: Record FIO: String[20]; TEL: String[7] end;
Обращение к записи в целом допускается только в операторах присваивания, где слева и справа от знака присваивания используются имена записей одинакового типа. Во всех остальных случаях оперируют отдельными полями записей. Чтобы обратиться к отдельной компоненте записи, необходимо задать имя записи и через точку указать имя нужного поля, например str.FIO или str.TEL. Такое имя называется составным. Компонентой записи может быть запись, в таком случае составное имя будет содержать не два, а большее количество имен. Инициализация записей осуществляется с помощью типизированных констант: type RecType= Record x,y: Word; dim: Array[1..3] of Byte end; const Rec: RecType= (x: 127; y: 255; dim: (2, 4, 8));
3.3. Общие операции с файлами Файловый тип данных (файл) определяет упорядоченную совокупность произвольного числа однотипных компонент. Общее свойство массива, множества и записи заключается в том, что количество их компонент определено на этапе написания программы, тогда как количество компонент файла в тексте программы не определяется и может быть произвольным. При работе с файлами выполняются операции ввода-вывода. Операция ввода означает копирование данных с внешнего устройства в оперативную память ЭВМ, операция вывода – это пересылка данных из оперативной памяти на внешнее устройство. Файлы на внешних устройствах часто называют физическими файлами. Их имена определяются операционной системой. В программах на языке Паскаль имена файлов задаются с помощью строк. Например, имя файла может иметь вид 'C:\ABC150\LAB1.DAT' или 'lab3.pas'.
14
Понятие файла достаточно широко. Это может быть не только файл на диске, но и коммуникационный порт, устройство печати, клавиатура или другие устройства. В Турбо Паскале могут использоваться имена устройств и портов, определенные в MS-DOS, например: 'CON', 'LPT1', 'PRN', 'COM1'. Ввод и вывод данных осуществляется через буфер. Буфер – это область в памяти, которая выделяется для каждого файла. При записи в файл вся информация сначала направляется в буфер и накапливается до тех пор, пока весь объем буфера не будет заполнен. Только после этого или после специальной команды сброса происходит передача данных на внешнее устройство. При чтении из файла данные вначале считываются в буфер, причем данных считывается не столько, сколько запрашивается, а сколько поместится в буфер. Механизм буферизации позволяет более быстро и эффективно обмениваться информацией с внешними устройствами. Для работы с файлами в программе необходимо определить файловую переменную. Паскаль поддерживает три типа файлов: текстовые, компонентные, бестиповые. Описание файлов текстового типа производится с помощью служебного слова Text, например: var tStory: Text;
Описание компонентных файлов имеет вид: var fComp: File of T;
где T – тип компоненты. Пример описания файла компонентного типа: var f1: File of Real;
Бестиповые файлы описываются с помощью служебного слова File: var f: File;
Файловые переменные, которые описаны в программе, называют логическими файлами. Подпрограммы, обеспечивающие ввод-вывод данных, работают с логическими файлами. Физический файл должен быть связан с логическим до выполнения процедур открытия файлов. Турбо Паскаль вводит ряд процедур и функций, применимых для любых типов файлов: Assign, Reset, Rewrite, Close, Rename, Erase, Eof, IOResult. Процедура Assign(var f; FileName: String) связывает логический файл f с физическим файлом, полное имя которого задано в строке FileName. Процедура Reset(var f) открывает для доступа существующий на диске файл f (если файл отсутствует, это приводит к ошибке в программе). Обычно Reset используют, когда файл открывают для чтения или записи дополнительных данных. Процедура Rewrite(var f) создает и открывает новый файл f (если файл уже существует на диске, все ранее записанные данные из файла будут удалены). Обычно Rewrite используют, когда файл открывают для записи данных. Процедура Close(var f ) закрывает логический файл. Вызов процедуры Close необходим при завершении работы с выходным файлом. Если по какой-то причине процедура Close не будет выполнена, файл будет создан на внешнем устройстве, но содержимое последнего буфера в него не будет перенесено. Для входных файлов использование оператора Close необязательно. Логическая функция EOF(var f): Boolean возвращает значение TRUE, когда при чтении достигнут конец файла. Процедура Rename(var f; NewName: String) позволяет переименовать физический файл, связанный с логическим файлом f. Переименование возможно после закрытия файла. Процедура Erase(var f) уничтожает физический файл, который был связан с переменной f. Файл к моменту вызова процедуры Erase должен быть закрыт. Функция IOResult: Integer возвращает целое число, соответствующее коду последней ошибки ввода-вывода (при нормальном завершении операции функция вернет 0). Функция часто используется совместно с Reset для проверки результата открытия файла, однако в этом случае требуется временно отключить стандартную обработку ошибок. Рассмотрим в качестве примера программу, которая проверяет наличие указанного файла:
15
Program FindFile; var s: string; f: file; begin write('Введите имя файла: '); readln(s); assign(f, s); {$I-} reset(f); {$I+} if ioresult=0 then writeln(’Файл присутствует.’) else writeln(’Файл отсутствует.’) end.
Ключ {$I-} отключает стандартную обработку ошибок перед вызовом Reset, а ключ {$I+} восстанавливает обработку ошибок. 3.4. Текстовые файлы Особое место в языке Паскаль занимают текстовые файлы, компоненты которых имеют символьный тип. Для описания текстовых файлов используется тип Тext: var TF1,TF2: Text;
Текстовые файлы представляют собой последовательность строк, а строки – последовательность символов. Строки имеют переменную длину, каждая строка завершается признаком конца строки. С признаком конца строки связана функция EOLn(var T:Text): Boolean, где Т – имя текстового файла. Эта функция принимает значение TRUE, если достигнут конец строки, и значение FALSE, если конец строки не достигнут. Для операций над текстовыми файлами определен также оператор ReadLn(T), который пропускает строку до начала следующей, и WriteLn(T), который завершает строку файла признаком конца строки. Пример программы, которая вводит строку с клавиатуры и сохраняет в текстовом файле: Program SaveStr; var s: string; outf: Text; begin assign(outf,'text.txt'); rewrite(outf); writeln('Введите строку:'); readln(s); writeln(outf,s) close(outf) end.
Для работы с текстовыми файлами введена расширенная форма операторов ввода и вывода. Оператор Read(T, X1, X2, … XK) эквивалентен группе операторов begin Read(T,X1); ........... Read(T,XK) end;
Здесь Т – текстовый файл, а Х1, … ХК могут быть переменными целого, действительного, символьного типа или строкой. Оператор Write(T, X1, X2, … XK) эквивалентен группе операторов begin Write(T,X1); ........... Write(T,XK) end;
16
Здесь Т – текстовый файл, а переменные Х1, … ХК могут быть целого, действительного, символьного, логического типа или строкой. К текстовым файлам относятся стандартные файлы INPUT и OUTPUT, работа с которыми имеет следующие особенности: - имена этих файлов в списках ввода-вывода не указываются; - применение процедур Reset, Rewrite и Close запрещено; - для работы с INPUT и OUTPUT используется функция EOLn без параметров. Турбо Паскаль вводит дополнительные процедуры и функции, применимые только к текстовым файлам: SetTextBuf, Append, Flush, SeekEOLn, SeekEOF. Процедура SetTextBuf(var f: Text; var Buf; BufSize: Word) служит для увеличения или уменьшения буфера ввода-вывода файла f (размер буфера по умолчанию 128 байт). Увеличение размера буфера сокращает количество обращений к диску. Рекомендуется изменять размер буфера до открытия файла. Размер буфера задается в необязательном параметре BufSize, а если этот параметр отсутствует, размер определяется длиной переменной Buf. Процедура Append(var f: Text) открывает уже существующий файл для дозаписи в конец файла. Процедура Flush(var f: Text) принудительно записывает данные из буфера в файл. Функция SeekEOLn(var f: Text): Boolean возвращает значение True, если до конца строки остались только пробелы. Функция SeekEOF(var f: Text): Boolean возвращает значение True, если до конца файла остались строки, заполненные пробелами. 3.5. Компонентные файлы Компонентный или типизированный файл – это файл с объявленным типом его компонент. Компонентные файлы состоят из машинных представлений значений переменных, они хранят данные в том же виде, что и память ЭВМ. Описание величин файлового типа имеет вид: type M= File Of T;
где М – имя файлового типа, Т – тип компоненты. Например: type FIO= String[20]; SPISOK=File of FIO; var STUD, PREP: SPISOK;
Здесь STUD, PREP – имена файлов, компонентами которых являются строки. Описание файлов можно задавать в разделе описания переменных: var fsimv: File of Char;
Компонентами файла могут быть все скалярные типы, а из структурированных – массивы, множества, записи. Операции над компонентными файлами производятся с помощью процедур Reset, Rewrite, Read, Write и Close. Для ввода-вывода используются процедуры Read(f, X) и Write(f, X), где f – имя логического файла, Х – переменная, массив, строка, множество или запись. Процедура Read(f, X) читает одну компоненту файла и записывает ее в X; процедура Write(f, X) записывает X в файл как одну из компонент. Имеется также расширенная форма операторов ввода и вывода Read(f, X1, X2 … XK) и Write(f, X1, X2, … XK), где f – файл, а переменные Х1, … ХК должны иметь тип компонент файла f. 3.6. Бестиповые файлы Бестиповые файлы позволяют записывать на диск произвольные участки памяти ЭВМ и считывать их с диска в память. Операции обмена с бестиповыми файлами осуществляется с помощью процедур BlokRead и BlockWrite. Кроме того, вводится расширенная форма процедур Reset и Rewrite.
17
Перед использованием логический файл var f: File;
должен быть связан с физическим с помощью процедуры Assign. Далее файл должен быть открыт процедурой Reset или Rewrite, а после окончания работы закрыт процедурой Close. При открытии файла длина буфера устанавливается в 128 байт. Турбо Паскаль позволяет изменить размер буфера, для чего следует открывать файл расширенной записью процедур Reset(var f: File; BufSize:Word) или Rewrite(var f: File; BufSize: Word). Параметр BufSize задает число байтов, считываемых из файла или записываемых в него за одно обращение (минимальное значение – 1 байт, максимальное – 64К байт). Чтение данных осуществляется процедурой BlockRead(var f: File; var X; Count: Word; var QuantBlock: Word). Эта процедура читает в переменную X блоки данных, количество которых заданно параметром Count. Размер блока равен размеру буфера. За одно обращение нельзя прочесть больше, чем 64К байт. Необязательный параметр QuantBlock возвращает число блоков, прочитанных текущей операцией BlockRead. В случае успешного завершения операции чтения QuantBlock = Count, в случае аварийной ситуации параметр QuantBlock будет содержать число успешно прочитанных блоков. Запись данных выполняется процедурой BlockWrite(var f: File; var X; Count: Word; var QuantBlock: Word), которая записывает из переменной X в файл количество блоков, заданное параметром Count. Размер блока равен размеру буфера. Необязательный параметр QuantBlock возвращает число блоков, записанных текущей операцией BlockWrite. 3.7. Последовательный и прямой доступ Смысл последовательного доступа заключается в том, что в каждый момент времени доступна лишь одна компонента из всей последовательности. Для того, чтобы обратиться к компоненте с номером К, необходимо просмотреть от начала файла К-1 предшествующих компонент. После обращения к компоненте с номером К можно обращаться к компоненте с номером К+1. Отсюда следует, что процессы записи и чтения компонент файла не могут произвольно чередоваться. Таким образом, файл вначале строится при помощи последовательного добавления компонент, а затем может последовательно просматриваться от начала до конца. Рассмотренные ранее средства работы с файлами обеспечивают последовательный доступ. Турбо Паскаль позволяет применять способ прямого доступа к компонентным и бестиповым файлам,. Прямой доступ означает возможность заранее определить в файле блок, к которому будет применена операция ввода-вывода. В случае бестиповых файлов блок равен размеру буфера, для компонентных файлов блок – это одна компонента файла. Прямой доступ предполагает, что файл представляет собой последовательность блоков. Если файл содержит n блоков, то они нумеруются от 1 до n. Кроме того, вводится понятие условной границы между блоками, при этом условная граница с номером 0 расположена перед блоком с номером 1, граница с номером 1 расположена перед блоком с номером 2 и, наконец, условная граница с номером n находится после блока с номером n. Реализация прямого доступа осуществляется с помощью подпрограмм FileSize, FilePos, Seek и Truncate. Функция FileSize(var f): Longint возвращает количество блоков в файле f. Функция FilePos(var f): Longint возвращает текущую позицию в файле f. Позиция в файле – это номер условной границы. Для только что открытого файла текущей позицией будет граница с номером 0. Это значит, что можно записать или прочесть блок с номером 1. После чтения или записи первого блока текущая позиция переместится на границу с номером 1, и можно будет обращаться к блоку с номером 2. После прочтения последней записи значение FilePos равно значению FileSize.
18
Процедура Seek(var f; N: Longint) устанавливает текущую позицию в файле. В параметре N должен быть задан номер условной границы, предшествующей блоку, к которому будет производиться обращение. Процедура Truncate(var f) устанавливает в текущей позиции признак конца файла и удаляет все последующие блоки. Пример. Пусть на диске имеется текстовый файл ID.DAT, который содержит числовые значения действительного типа по два числа в каждой строке – значения аргумента и функции соответственно. Количество пар чисел не более 200. Программа, которая читает файл, значения аргумента и функции записывает в одномерные массивы, подсчитывает их количество, выводит на экран дисплея и записывает в файл компонентного типа RD.DAT, выглядит следующим образом: Program F; var rArg, rF: Array[1..200] of Real; inf: Text; outf: File of Real; n, l: Integer; begin Assign(inf,'ID.DAT'); Assign(outf,'RD.DAT'); Reset(inf); Rewrite(outf); n:=0; while not EOF(inf) do begin n:=n+1; ReadLn(inf,rArg[n],rF[n]) end; for l:=1 to n do begin WriteLn(l:2,rArg[l]:8:2,rF[l]:8:2); Write(outf,rArg[l], rF[l]); end; close(outf) end.
1) 2) 3) 4) 5)
6) 7)
8)
3.8. Упражнения Требуется составить программы, которые будут выполнять следующие действия: Ввести текст с клавиатуры, сохраняя каждую введенную строку в файле text.txt. Работа продолжается, пока не будет введена пустая строка. Вывести на экран текст из файла text.txt. Определить размер файла text.txt в байтах (открыть файл как компонентный с типом byte и использовать функцию FileSize) и вывести полученное значение на экран. Сформировать массив из 20 элементов типа integer, содержащий значения от 1 до 20, и сохранить его в текстовом файле numbers.txt. Каждое число размещается в отдельной строке. Ввести с клавиатуры значение N типа integer. Сформировать массив из N элементов типа integer, содержащий значения от 1 до N, и сохранить его в двоичном (бестиповом) файле numbers.bin (вначале в файл записывается значение N, а затем – элементы массива). Прочитать и вывести на экран массив чисел из двоичного файла numbers.bin (вначале считывается количество элементов N, а затем производится считывание элементов массива). Добавить новую запись в файл group.dat, содержащий список студентов (если файл отсутствует, создать его). Каждая запись хранит фамилию, имя, отчество, телефон (в текстовом формате) и дату рождения студента (день, месяц и год в числовом формате). Ввести номер года, найти в списке group.dat всех студентов, родившихся в указанном году и вывести на экран их фамилии и телефоны.
19
4. Лабораторная работа №4 Процедуры и функции для работы в графическом режиме и генерации случайных чисел 4.1. Цель лабораторной работы Целью данной лабораторной работы является освоение правил использования графических функций и функций генерации случайных чисел языка Паскаль. Отчет о работе не оформляется. Прием задания производится непосредственно на компьютере по предъявлению работающей, полностью отлаженной программы. 4.2. Подпрограммы для работы в графическом режиме Для того, чтобы можно было использовать в программе графические процедуры и функции, необходимо подключить модуль Graph в разделе описания модулей. Раздел описания модулей определяется служебным словом USES. Модуль Graph содержит около 80 процедур и функций, предназначенных для работы с экраном дисплея в графическом режиме. Рассмотрим некоторые часто используемые процедуры: Bar(X1,Y1,X2,Y2: Integer) – рисует прямоугольник с координатами противоположных вершин (X1,Y1) и (X2,Y2), используя текущий стиль и цвет. Circle(X,Y: Integer; Radius: Word) – рисует окружность радиуса Radius с центром в точке (X,Y). ClearDevice – очищает экран, устанавливая текущей точку (0,0). CloseGraph – закрывает графический режим. DrawPoly(NumPoints: Word; var PolyPoints) – рисует ломанную линию или контур многоугольника с числом вершин NumPoints и координатами вершин, указанными в массиве PolyPoints. Ellipse(X,Y: Integer; StartAngle,EndAngle, XRadius,YRadius: Word) – рисует эллиптическую дугу от начального угла к конечному с центром в точке (X,Y), горизонтальным радиусом Xradius и вертикальным радиусом YRadius. FillEllipse(X,Y: Integer; XRadius,YRadius: Word) – рисует закрашенный эллипс с центром в точке (X,Y), горизонтальным радиусом Xradius и вертикальным радиусом YRadius. FillPoly(NumPoints: Word; var PolyPoints) – рисует закрашенный многоугольник с числом вершин NumPoints и координатами вершин, указанными в массиве PolyPoints. InitGraph(var GrDriver, GrMode: Integer; Path: String) – инициализирует графический режим. Line(X1,Y1,X2,Y2: Integer) – рисует прямую линию от точки (X1,Y1) до точки (X2,Y2). LineRel(dX,dY: Integer) – рисует прямую линию от текущей точки (X,Y) до точки (X+dX,Y+dY). LineTo(X,Y: Integer) – рисует прямую линию от текущей точки до точки (X,Y). MoveRel(dX,dY: Integer) – передвигает указатель из текущей точки (X,Y) в точку (X+dX,Y+dY). MoveTo(X,Y: Integer) – передвигает указатель из текущей точки в точку (X,Y). OutText(TextString: String) – выводит текст на экран, начиная с того места, где находится указатель. OutTextXY(X,Y: Integer; TextString: String) – выводит текст на экран, начиная с точки с координатами (X,Y). PutPixel(X,Y: Integer; ColorPixel: Word) – выводит точку с координатами (X,Y) и цветом ColorPixel. Rectangle(X1,Y1,X2,Y2: Integer) – рисует рамку с координатами противоположных вершин (X1,Y1) и (X2,Y2). SetBkColor(Color: Word) – устанавливает цвет фона. SetColor(Color: Word) – устанавливает основной цвет для рисования.
20
SetFillPattern(Pattern: FillPatternType; Color: Word) – устанавливает определенный пользователем шаблон заполнения. SetFillStyle(Pattern, Color: Word) – устанавливает тип и цвет заполнения. SetLineStyle(LineStyle, Pattern, Thickness: Word) – устанавливает стиль, образец и толщину линий. Часто используются также следующие функции: GetX: Integer – возвращает текущую координату X. GetY: Integer – возвращает текущую координату Y. GetMaxX: Integer – возвращает максимальную горизонтальную координату X. GetMaxY: Integer – возвращает максимальную вертикальную координату Y. Начало системы координат расположено в левом верхнем углу экрана, ось Y направлена сверху вниз. Для работы с графикой программы на Турбо Паскале используют bgi-драйверы: требуется или скопировать драйвер в рабочий каталог, или указать путь к драйверу. Современные ATсовместимые компьютеры по умолчанию используют драйвер egavga.bgi, который работает в режиме 640480 точек, 16 цветов. Соответственно, код цвета рисования может принимать значения от 0 до 15. Рассмотрим в качестве примера программу, которая включает графический режим, рисует красную точку в центре экрана, выбирает желтый цвет для рисования, рисует отрезок, прямоугольник, треугольник, окружность, эллипс и строку текста, ожидает нажатия клавиши Enter, а затем восстанавливает текстовый режим и завершает работу:
PROGRAM GTEST; uses Graph; var Drv,Mode: integer; Triangle: array[1..4] of PointType; begin Drv:= Detect; InitGraph(Drv, Mode, ''); PutPixel(320,240,12); {Нарисовать красную точку в центре экрана} SetColor(14); {Установить желтый цвет рисования} Line(10,5,80,30); {Нарисовать линию} Rectangle(5,35,70,60); {Нарисовать прямоугольник} {Задать координаты вершин треугольника} Triangle[1].X:=40; Triangle[1].Y:=70; Triangle[2].X:=20; Triangle[2].Y:=90; Triangle[3].X:=60; Triangle[3].Y:=90; Triangle[4].X:=40; Triangle[4].Y:=70; DrawPoly(4, Triangle); {Нарисовать треугольник} Circle(50,120,20); {Нарисовать окружность} Ellipse(50,160,0,360,30,15); {Нарисовать эллипс} OutTextXY(15,200,’Hello!’); {Вывести текст} readln; CloseGraph end.
Тип PointType предназначен для хранения координат точки. Описание: type PointType = Record X. Y: Integer; end;
Для процедуры FillPoly необходимо указать координаты вершин многоугольника в виде массива точек, а процедура DrawPoly требует на одну точку больше – координаты начальной и конечной точек должны совпадать. Дело в том, что процедура DrawPoly используется не только для рисования многоугольников, но и для вывода ломанных линий. Тип FillPatternType определяет образец закраски. Описание: FillPatternType = array[1..8] of Byte;
21
Приведем в качестве примера программу, которая закрашивает треугольник в красный цвет: PROGRAM REDT; uses Graph; {Использовать шаблон для сплошной заливки} const Pat: FillPatternType = ($FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF); var Drv,Mode: integer; Triangle: array[1..3] of PointType; begin Drv:= Detect; InitGraph(Drv, Mode, ''); SetColor(12); SetFillPattern(Pat, 12); Triangle[1].X:=200; Triangle[1].Y:=100; Triangle[2].X:=100; Triangle[2].Y:=200; Triangle[3].X:=300; Triangle[3].Y:=200; FillPoly(3, Triangle); readln; CloseGraph end.
4.3. Генератор случайных чисел Функция Random(Range: Word) возвращает случайное число. Функция имеет два варианта записи – с параметром и без параметра. Если параметр Range не задан, то результатом будет вещественное число x в диапазоне 0 х < 1. Если параметр задан, он должен представлять собой выражение целого типа, а результатом будет случайное целое число x в диапазоне 0 х < Range. Процедура Randomize инициализирует встроенный генератор случайных чисел. Функция Random и процедура Randomize входят в набор стандартных математических функций языка Паскаль. Для их использования не требуется подключать дополнительные модули. Пример: PROGRAM RNDM; begin Randomize; Writeln(’Случайное число от 0 до 1: ’, Random)); Writeln(’Случайное число от 0 до 100: ’, Random(101)); end.
1)
2) 3) 4) 5) 6) 7)
4.4. Упражнения Требуется составить программы, использующие генератор случайных чисел: Заполнить случайными значениями в диапазоне от 0 до 1 массив из 20 чисел типа Real и вывести результат на экран (по одному числу в строке). Вычислить сумму элементов массива и вывести результат. Заполнить матрицу размером 1010 случайными целыми числами и вывести результат на экран по строкам. Числа могут принимать значения в диапазоне от 0 до 999. Нарисовать 1000 точек с случайными значениями координат и цвета. Нарисовать 100 отрезков с случайными значениями координат вершин и кода цвета. Нарисовать 500 текстовых символов с случайными значениями координат и цвета символа. Нарисовать 50 треугольников с случайными значениями координат вершин и цвета заливки. Нарисовать 200 окружностей с случайными значениями радиуса (максимальное значение 100), координат и цвета.
22
Библиографический список 1. 2. 3.
Вирт Н. Алгоритмы + структуры данных = программы: Пер. с англ. – М: Мир, 1985. – 406 с.: ил. Шпак Ю.А. Turbo Pascal 7.0 на примерах / Под ред. Ю.С. Ковтанюка. – К: Юниор, 2003. – 496 с.: ил. Turbo Pascal / С.А. Немнюгин. – СПб.: Питер, 2000. – 496 с.: ил.
23