3 Введение Настоящие методические указания (МУ) призваны помочь студентам, обучающимся по специальности 060800 − “Эконом...
10 downloads
77 Views
310KB 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
3 Введение Настоящие методические указания (МУ) призваны помочь студентам, обучающимся по специальности 060800 − “Экономика и управление на предприятиях лесного комплекса”, в выработке навыков работы в интегрированной среде Турбо-Паскаль (версия 6.0) и в овладении приемами программирования на языке Паскаль. Двенадцать лабораторных работ, представленные в МУ, включают краткий справочно-теоретический материал и информацию практического характера и рассчитаны на использование во втором из четырех семестров, отведенных студентам специальности 060800 для изучения дисциплины “Информатика”. При подготовке к лабораторным работам рекомендуется использовать материал, представленный в [1]. Лабораторная работа № 1 (4 часа) Тема занятия: Знакомство и приемы работы в интегрированной среде языка Турбо-Паскаль 6.0. Элементы интегрированной среды и работа с ними Интегрированная среда разработки (Integrated Development Environment, IDE) языка Турбо-Паскаль 6.0 − это сложная программа, содержащая в своем составе многооконный редактор текстов, компилятор языка Турбо-Паскаль, редактор связей, диалоговый символьный отладчик, подсистему работы с файлами и справочную подсистему. Другими словами, интегрированная среда позволяет выполнить полный цикл разработки программы (ввод текста программы на языке Паскаль, компиляцию программы на Паскале в объектный код, редактирование связей объектной программы, диалоговую отладку программы), не прибегая к помощи других программ. При работе в интегрированной среде языка Турбо-Паскаль 6.0 на экране монитора ПК могут формироваться следующие видимые компоненты среды: меню, окна, диалоговые окна и строка состояния. Меню называется прямоугольный участок экрана, содержащий ряд ключевых слов и предназначенный для выбора одного из предлагаемых вариантов работы. Содержащиеся в меню ключевые слова обозначают возможные альтернативы, называемые в дальнейшем опциями (option - выбор). Интегрированная среда Турбо-Паскаля обеспечивает иерархическую систему меню. Первичным в иерархии меню является главное меню, которое всегда присутствует в верхней строке экрана (за исключением случая, когда просматривается содержимое так называемого экрана пользователя −User Screen).
4 Для перехода в главное меню используется клавиша F10, для возврата в редактор − клавиша Esc. Для перехода к нужной опции используются клавиши управления курсором, а для ее выбора − клавиша Enter. Выбрать нужную опцию можно и другим − более быстрым − способом. В ключевом слове опции цветом выделяется одна из букв. Для выбора опции необходимо нажать клавишу с нужной буквой, если выбирается опция из дополнительного меню, или комбинацию клавиш Alt-<буква> , если выбирается опция из главного меню. Если справа от опции стоит многоточие, эта опция связана с развертыванием диалогового окна, если стоит значок в виде черного треугольника, вызывается дополнительное меню. Окно в Турбо-Паскале также представляет собой прямоугольный участок экрана и предназначено для обмена информацией между пользователем и средой (например, в окно редактора пользователь вводит текст программы, в справочном окне появляются справочные сообщения и т.д.). Одновременно на экране может присутствовать сразу несколько окон, однако только одно из них активно в каждый момент. Активное окно очерчивается двойной рамкой, неактивное − одинарной. Окно можно перемещать, изменять его размеры, перекрывать, закрывать и открывать. Для последовательной смены окон используется клавиша F6, нажатие на эту клавишу делает активным очередное окно, если это окно было закрыто другими окнами, оно накладывается поверх них. Нажатие клавиши F5 распахивает окно или возвращает окну обычный размер, комбинация клавиш Alt-F3 закрывает окно (удаляет его с экрана). Закрытое окно удаляется из системы окон Турбо-Паскаля и его уже нельзя вызвать с помощью клавиши F6. Положение и размеры активного окна можно изменять, используя комбинацию клавиш CtrlF5. При этом изменяется цвет и линии рамки: таким образом среда сигнализирует о переходе к режиму настройки. Используя клавиши управления курсором, можно перемещать окно по экрану и этими же клавишами, нажатыми в сочетании с клавишей Shift, можно изменять размеры окна. После того, как положение и размеры окна установлены нужным образом, следует нажать клавишу Enter. Диалоговое окно разворачивается на экране по мере надобности. С помощью диалогового окна пользователь уточняет выбранное действие. Внутри диалогового окна может быть несколько полей: поле ввода (input box), поле выбора (radio button), поле проверки (check box), окно списка (list box), кнопки управления (action button). Сразу после развертывания диалогового окна активизируется то или иное поле, которое выделяется цветом. В активных полях, кроме того, виден мигающий курсор. При работе с диалоговым окном используются следующие правила: • для перехода от одного поля к другому предназначена клавиша Tab; • для перехода внутри поля используются клавиши управления курсором;
5 • для закрытия диалогового окна используется клавиша Esc (в этом случае не происходит никаких действий, связанных с окном) или клавиша Enter (в этом случае выполняются все указанные в окне установки или выбирается указанный файл). При вводе текста используются правила редактирования, принятые в редакторе Турбо-Паскаля: ошибочно введенный символ можно стереть клавишами ← (Забой) или Del, причем этот символ может быть в любом месте строки (используйте клавиши управления курсором), ввод текста может происходить как в режиме раздвижки текста, так и в режиме замены (переключается клавишей Ins). Некоторые диалоговые окна содержат переключаемые опции, которые позволяют выбрать нужную настройку среды. Слева от таких опций имеется небольшое поле выбора, выделенное квадратными скобками; включенная опция отмечается символом Х в этом поле [X], если поле пустое [ ], то соответствующая опция не включена. Если переключаемая опция задает выбор из нескольких вариантов, слева от указателя каждого варианта имеется поле выбора, выделенное двумя круглыми скобками, причем выбранный вариант отмечается точкой (.). Чтобы изменить состояние переключаемого параметра или выбрать другой его вариант, нужно клавишами управления курсора подвести указатель к соответствующей опции и нажать клавишу "Пробел". В диалоговом поле обязательно имеется несколько кнопок управления (например, ОК − выполнить, CANCEL − отменить), которые располагаются в правой или нижней части окна и выделяются цветом. С каждым таким полем связана некоторая команда. Эту команду можно выполнить, если активизировать поле клавишей табуляции и нажать Enter. Вызов Турбо-Паскаля Полный формат команды DOS, осуществляющей вызов Турбо-Паскаля, имеет вид: [путь]turbo имя_файла здесь путь − путь к каталогу, где находится файл TURBO.EXE, содержащий интегрированную среду Турбо-Паскаля; имя_файла − имя файла, содержащего текст программы на языке Паскаль. Система меню Все управление средой Турбо-Паскаля осуществляется в основном с помощью системы последовательно разворачивающихся меню. Лишь одно из них − главное меню (the menu bar) − постоянно присутствует на экране, остальные разворачиваются по мере выбора. Главное меню имеет следующий вид:
6 ≡ File Edit Search Run Compile Debug Options Window Help В каждом из разворачивающихся меню (pull-down menu) сгруппированы близкие по своему роду действия, условное название которых и служит кодовым словом соответствующей опции главного меню: • ≡ − вспомогательные действия (информация о версии Турбо-Паскаля, восстановление содержимого экрана или его очистка); • File (файл) − действия с файлами и выход из системы; • Edit (редактировать) − восстановление удаленной/измененной строки и операции с внутренним буфером редактора; • Search (искать) − поиск текста, процедуры, функции или места ошибки; • Run (запуск программы) − прогон программы; • Compile (компилировать) − компиляция программы; • Debug (отладка) − отладка программы; • Options (варианты) − установка параметров среды; • Window (окно) − работа с окнами; • Help (помощь) − обращение к справочной информации. В нижней части экрана присутствует так называемая строка состояния (the status line), в которой отражено назначение "горячих" клавиш: F1−Help, F2−Save, F3−Open, Alt-F9−Compile, F9−Make, F10−Menu Меню ≡ About. Дает информацию о версии Турбо-Паскаля. Refresh display. Восстанавливает содержимое экрана, испорченное в результате прогона программы с установленной опцией Options/Debugger/Display Swapping/ None. Clear desktope. Очищает экран (закрывает все окна). Если какое-либо окно редактора содержит несохраненный на диске текст, система развернет диалоговое окно, в котором предложит сохранить этот текст в файле (см. опцию File/Save). About... Refresh display Clear desktop
Меню File Open. Открывает новое окно редактора и помещает в него указанный файл. При обращении к этой опции открывается диалоговое окно, в поле ввода которого можно написать нужное имя файла. Если в имени опущено расширение, среда добавит стандартное расширение .PAS. Имени файла может предшествовать путь. Нужный файл можно также выбрать из
7 поля выбора, предварительно активизировав это поле клавишей Tab. Можно получить доступ к протоколу использования этой опции и выбрать в этом протоколе одF2 но из ранее использованных имен. Для этого при активном поле ввода необходимо нажать клавишу ↓. В открывшемся окне протокола подвести указатель к нужной строчке и нажать Enter. Кнопка OPEN (открыть) исChange dir... пользуется для вывода файла в новое окно редактироваPrint ния, кнопка REPLACE (заменить) − для замены сущестGet info... вующего в активном окне редактирования текста на Dos shell текст, считанный из файла. Опция Open вызывается неExit Alt-X посредственно из редактора нажатием клавиши F3. New. Открывает новое окно редактирования и связывает его с именем NONAME00.PAS. Save. Записывает содержимое активного окна в файл. Если это окно связано с именем NONAME00.PAS, среда запросит новое имя файла (см. опцию Save as). Опция вызывается непосредственно из редактора нажатием клавиши F2. Save as. Записывает содержимое активного окна в файл под другим именем. В поле ввода диалогового окна этой опции необходимо ввести имя файла, в который будет переписано содержимое активного окна. В качестве такого файла можно выбрать уже существующий файл из поля выбора или из протокола опции. В этом случае в зависимости от настройки среды старое содержимое файла будет либо уничтожено, либо сохранено в виде файла-копии с расширением .BAK (настройку среды см. в опции Options/Environment). Save all. Записывает содержимое всех окон редактирования в соответствующие файлы. Change Dir. Позволяет изменить текущий каталог пользователя. В поле выбора диалогового окна этой опции приводится дерево каталогов текущего диска. Перемещаясь по этому дереву, можно указать на нужный каталог, после чего с помощью поля CHDIR сменить текущий каталог. Если выбран указатель Drives, можно изменить также текущий диск. Поле REVERT позволит восстановить прежний текущий каталог, если по каким-либо причинам нужно отказаться от сделанного изменения (эта команда действует до момента закрытия окна). Print. Выводит содержимое активного окна на принтер. Get info. Дает информацию о текущем состоянии программы и используемой памяти. DOS shell. Обеспечивает временный выход в DOS. Турбо-Паскаль остается резидентным в оперативной памяти и занимает ее значительную часть. Чтобы увеличить объем свободной памяти для DOS, необходимо перед обращением к этой опции сбросить режим отладки клавишами Ctrl -F2. Для возврата в Open... New Save Save as... Save all
F3
8 Турбо-Паскаль нужно в ответ на приглашение (подсказку) DOS напечатать слово EXIT и нажать Enter. Exit. Завершает работу с Турбо-Паскалем. Опция вызывается непосредственно из редактора комбинацией клавиш Alt-X. Меню Edit Restore line Cut Shift-Del Copy Ctrl-Ins Paste Shift-Ins Copy example Show clipboard Clear
Ctrl-Del
Restore line. В активном окне редактора восстанавливает только что уничтоженную ко мандой Ctrl-Y или измененную строку. Cut. Удаляет выделенный блок из окна редактора и переносит его во внутренний буфер. Опция вызывается непосредственно из ре дактора комбинацией клавиш Shift-Del. Copy. Копирует выделенный блок из окна редактора во внутренний буфер. Опция вызывается непосредственно из редактора комбинацией
клавиш Ctrl-Ins. Paste. Копирует содержимое внутреннего буфера в окно редактора. Содержимое буфера остается без изменения и может использоваться повторно. Опция вызывается непосредственно из редактора комбинацией клавиш ShiftIns. Copy example. Копирует пример программы из окна справочной подсистемы во внутренний буфер редактора. Show clipboard. Открывает внутренний буфер редактора, в котором хранится текст, удаленный и/или скопированный из других окон редактора. Этот текст добавляется в конец внутреннего буфера. Когда используется опция Paste, Турбо-Паскаль копирует текст из внутреннего буфера в окно редактора. Текст, хранящийся во внутреннем буфере, можно отредактировать. Clear. Удаляет из окна редактора выделенный блок, но не помещает его в буфер. Удаленный фрагмент безвозвратно теряется. Опция вызывается непосредственно из редактора комбинацией клавиш Ctrl-Del. Более полная информация об интегрированной среде разработки ТурбоПаскаль 6.0 приводится в [2]. Упражнения для самопроверки Выполните следующие упражнения, которые помогут определить, насколько прочно Вы овладели материалом данного лабораторного занятия:
9 1. Включите ПК, выберите в качестве текущего диск D: и перейдите в каталог, созданный для работы Вашей группы; 2. Запустите Турбо-Паскаль, набрав в командной строке turbo; 3. На экране будет отображена интегрированная среда разработки языка ТурбоПаскаль 6.0 с присущими ей элементами (какими ?). 4. Откройте новое окно редактирования, выбрав в меню "File" опцию "New". 5. На экране появится новое окно редактирования, которое становится активным и с ним будет связано имя NONAME00.PAS. 6. Наберите следующий текст: program first; begin writeln; writeln(' Я учусь программировать на Паскале '); writeln; end. 7. Сохраните набранный текст, выбрав в меню "File" опцию "Save" (или нажав клавишу F2). Среда запросит новое имя файла. В ответ введите FIRST и нажмите Enter . 8. Теперь с активным окном будет связано имя FIRST.PAS. Чтобы компилятор смог правильно построить программу, необходимо, чтобы в актив-ном окне находилась основная программа или было задано имя основного файла (выберите в меню "Compile" опцию "Primary file" и введите FIRST). 9. Откомпилируйте программу, выбрав в меню "Compile" опцию "Compile" (или нажав комбинацию клавиш Alt-F9). 10. В случае, если были допущены синтаксические ошибки, исправьте их и вновь повторите команду. 11. Только после того, как процесс компиляции завершится успешно, запустите программу на выполнение, выбрав в меню "Run" опцию "Run" (или нажав комбинацию клавиш Ctrl-F9). 12. Программа выполнится, и на экране вновь появится интегрированная среда. Чтобы посмотреть результаты, нажмите клавиши Alt-F5. 13. Для получения распечатки (листинга программы) выберите в меню "File" опцию "Print" (к этому моменту печатающее устройство должно быть включено). Содержимое активного окна будет выведено на принтер. 14. Внесите изменение в текст программы, чтобы на экране появился следующий текст “Петров учится программировать на Паскале” (укажите свою фамилию и имя). Измененный текст программы сохраните под другим именем (выбрав в меню "File" опцию "Save as..."). 15. Вновь откомпилируйте программу (т.е. вернитесь к пункту 8) и запустите ее на выполнение.
10 Лабораторная работа N 2 (2 часа) Тема занятия: Общая структура программы на языке Турбо-Паскаль. Оператор присваивания. Выражения. Стандартные функции. Ввод и вывод данных. Составной оператор. Общая структура Паскаль − программы Общая структура программы на языке Турбо-Паскаль схематично представлена на рис. 1.
Заголовок программы
Н еобязателен
Раздел определений и описаний
Н еобязателен
Раздел операторов
Обязателен
Рис. 1. Общая структура программы Заголовок программы: program имя_программы; Раздел определений и описаний: • label − для описания меток, использующихся в операторах goto; • const − для определения имен констант; • type − для определения типов данных, которые задаются пользователем; • var − для описания переменных всех типов; • procedure и function − для описания подпрограмм, представленных процедурами и функциями. Программа может не содержать каких-либо из перечисленных разделов (или даже всех). Раздел операторов обязателен, но может быть пустым, т.е. содержать только служебные слова begin и end. Задача. Вычислить площадь треугольника по трем сторонам (а, b и с) в предположении, что такой треугольник существует. program square;
11 { Программа вычисления площади треугольника по формуле Герона } var a, b, c, p, s: real; begin writeln('Введите значения сторон треугольника: '); read(a,b,c); p:=0.5∗(a+b+c); s:=sqrt(p∗(p-a)∗(p-b)∗(p-c)); write('Площадь треугольника равна ',s:6:2) end. Заголовок программы включает в себя служебное слово program (оно должно быть первым), за ним следует имя программы − square. Имя программы обычно выбирается программистом с расчетом, чтобы оно отражало главную задачу, выполняемую программой. Строка под заголовком является комментарием. Раздел определений и описаний представлен только разделом описания переменных (все переменные, которые используются в программе, должны быть описаны!). Он начинается служебным словом var, за которым следует список имен (идентификаторов) переменных. Имена переменных (a, b, c, p, s ) разделяются запятыми. Список заканчивается двоеточием, после которого указывается тип перечисленных переменных (в данном примере это real − вещественный). Раздел операторов начинается служебным словом begin. Операторы программы отделяются друг от друга точкой с запятой. Операторы целесообразно располагать так, чтобы сделать запись программы более наглядной и понятной. Раздел операторов заканчивается служебным словом end, за которым следует точка. Оператор присваивания Общий вид оператора присваивания: имя_ переменной := выражение где имя_ переменной − представляет переменную, которой необходимо присвоить значение, а выражение − выражение, значение которого присваивается переменной (тип значения выражения должен соответствовать типу переменной). Выражения Выражения определяют последовательность вычисления значения. Выражения могут включать в себя константы, переменные, вызовы функций, которые разделяются скобками и знаками операций.
12 Порядок вычисления выражения определяется скобками, а при их отсутствии − в соответствии со старшинством операций: • операции отрицания (NOT); • мультипликативные операции: ∗ (умножение) , / (деление), DIV (целочисленное деление), MOD (остаток от целочисленного деления), AND (логическое И); • аддитивные операции: + (сложение), − (вычитание), OR (логическое ИЛИ), XOR (логическое исключающее ИЛИ); • операции отношения: > (больше), < (меньше), < = (меньше или равно), > = (больше или равно), = (равно), <> (не равно) , IN (содер-жится в). Тип результата выражения зависит от типов операндов, участвующих в операции. Тип результата операций "+", "−", "∗" является integer, если оба операнда имеют тип integer, и real − в противном случае. Результатом операции "/" всегда является тип real, а результат операций DIV и MOD всегда имеет тип integer, так как операнды могут быть только типа integer. Результат выполнения логических операций NOT, OR, AND всегда имеет тип boolean. Операнды операций отношения могут иметь любой тип данных, а результат всегда имеет тип boolean. Примеры записи выражений: SQR(A) - SQRT(X∗Y∗Z) соответствует a2 − xyz A∗X∗X + LN(X − A) соответствует ax2 +ln(x − a). Стандартные функции Часто используемые стандартные функции приведены в табл. 1. Вызов или обращение к функции представляется именем функции, за которым в скобках указывается аргумент. Примеры обращений к стандартным функциям и возвращаемые ими результаты: ABS(-5.5)=5.5, ABS(65)=65, SQRT(16)=4, SQR(1.3)=1.69, PRED(5)=4, SUCC(5)=6, PRED(‘N’)= ‘M’, SUCC(‘S’)=’T’, TRUNC(5.8)=5, ROUND(5.8)=6, CHR(68)=’D’, CHR(ORD(‘C’))=’C’, ORD(CHR(‘I’))=’I’, ORD(‘R’)=82, ODD(2)=FALSE, ODD(5)=TRUE. Примечание. Для возведения модуля вещественного числа Х, отличного от 0, в вещественную степень Р необходимо применять выражение EXP(P*LN(ABS(X))). Например, (a−b)1/3 =EXP(1/3∗LN(ABS(a−b))) дает абсолютную величину искомого результата. Требуемый знак получаем, умножив выражение на дробь (a−b)/ABS(a−b).
13 Таблица 1 Часто используемые стандартные функции языка Турбо-Паскаль 6.0 Назначение функции Абсолютное значение числа Квадрат числа Квадратный корень из числа Экспонента ex Натуральный логарифм Выделение дробной части аргумента Выделение целой части аргумента Значение числа π − 3.141592653589793 Синус Косинус Арктангенс числа Функции преобразования типов
Порядковые функции
Определение нечетности числа Генератор случайных чисел
Имя функции ABS(X) SQR(X) SQRT(X) EXP(X) LN(X) FRAC(X) INT(X) PI SIN(X) COS(X) ARCTAN(X) ORD(X) CHR(X) TRUNC(X) ROUND(X) PRED(X) SUCC(X) DEC(X) INC(X) ODD(X) RANDOM(X) где 0<x≤65536
Тип аргумента INTEGER, REAL INTEGER, REAL INTEGER, REAL REAL REAL REAL REAL INTEGER, REAL
Тип результата INTEGER, REAL REAL REAL REAL REAL REAL REAL REAL REAL
CHAR, BOOLEAN INTEGER REAL REAL INTEGER,CHAR, BOOLEAN
INTEGER CHAR INTEGER INTEGER INTEGER,CHAR, BOOLEAN
INTEGER INTEGER
BOOLEAN INTEGER
14 Пример. Программа вывода трех различных псевдослучайных чисел в диапазоне от 0 до 100. begin randomize; {Инициализация генератора псевдослучайных чисел} writeln(random(100),’ ‘,random(100),’ ‘,random(100)) {оператор вывода} end. Ввод и вывод данных Для ввода данных используются операторы: READ(b1,b2,...,bn); READLN(b1,b2,...,bn); READLN; где b1,b2,...,bn − имена переменных, значения которых вводятся. Суффикс “ln” (line new − новая строка) предполагает переход к новой строке после выполнения оператора. Для вывода данных используются операторы: WRITE(b1,b2,...,bn); WRITELN(b1,b2,...,bn); WRITELN; где b1,b2,...,bn − имена переменных, значения которых выводятся. Общий вид операторов для вывода значений целого типа: WRITE(b:m); WRITELN(b:m); а для вывода значений вещественного типа: WRITE(b:m:n); WRITELN(b:m:n); где b − имя выводимой переменной; m − поле, отводимое под значение и задаваемое константой или выражением целого типа; n − часть поля, отводимого под дробную часть числа. Например, оператор вывода WRITE(KOL:8, NOM:4); выделяет на строке под значения переменных целого типа KOL и NOM соответственно 8 и 4 позиции. Оператор вывода WRITE(SUM:10:5); выделяет под значение SUM десять позиций, из которых 5 позиций отводится под дробную часть числа. Составной оператор Составной оператор − объединение нескольких операторов в одну группу, рассматриваемую как единый оператор. Форма записи данного оператора: begin
15 оператор1; оператор2; ... операторN end; В этой конструкции служебные слова begin (начало) и end (конец) называются операторными скобками. Любой из операторов, входящих в составной оператор, в свою очередь, может быть составным. Упражнения для самопроверки 1. Используя значения для площади треугольника и его сторон (см. задачу, приведенную выше), вычислить высоты треугольника к соответствующим сторонам по формулам: ha = 2s/a, hb = 2s/b, hc = 2s/c. 2. Зная радиус, вычислить длину окружности, площадь круга и объем шара по формулам: l = 2πr, s = πr2, v = (4/3)πr3. 3. Вычислить площадь и периметр прямоугольника со сторонами a и b по формулам: s = a∗b, p = 2 (a+b). 4. Вычислить площадь трапеции со сторонами основания a и b и высотой h по формуле: s = c∗h, где с − средняя линия трапеции c = (a+b)/2. 5. Поменять значения двух переменных a и b: 1) используя третью переменную с, 2) не используя третью переменную. 6. Написать программу для вычисления количества прожитых Вами лет. 7. Написать программу, которая запрашивает имя пользователя, а затем приветствует его (например “Здравствуйте, Иван Иванович!”). 8. Написать программу, которая по введенному пользователем символу определяла бы его код и наоборот. 9. Написать программу, которая по введенному пользователем целому числу (символу) определяла бы предшествующее и следующее за ним число (символ). Лабораторная работа N3 (4 часа) Тема занятия: Оператор перехода (goto). Условный оператор (if-thenelse). Оператор выбора (case-of). Примеры программ. Оператор перехода Оператор перехода изменяет последовательность выполнения операторов в программе. Он имеет вид: goto метка;
16 где метка − целое число без знака в диапазоне 1−9999 или имя метки, указанное в разделе описания меток − label. Объявление метки имеет вид: label метка; Допускается объявлять список меток: label метка1, метка2, ... , меткаN; Метка записывается перед помечаемым оператором и отделяется от него двоеточием. Условный оператор Условный оператор предназначен для организации ветвления в программах. Он имеет вид: if условие then оператор1 else оператор2; где оператор1, оператор2 − любой оператор языка Паскаль (в том числе и составной оператор), условие − булевское выражение. При выполнении условного оператора сначала вычисляется значение логического выражения. Если это условие − true, то выполняется оператор, следующий за служебным словом then. В противном случае выполняется оператор, следующий за служебным словом else. Например: if x > 0 then x:=x+1 else x:=x-1; значение переменной х будет увеличено на 1, если логическое выражение x>0 имеет значение true, либо уменьшено на 1, если значение логического выражения x>0 есть false. Можно использовать сокращенную форму условного оператора, имеющую вид: if условие then оператор; В условном операторе за служебным словом then и else могут следовать любые операторы языка Паскаль, в том числе и условные, поэтому возможны вложенные условные операторы, например: if x > y then x:=x-y else if x=y then x:=0 else y:=y-x; Пример программы, использующей условный оператор и оператор перехода program calculator; {Программа работает как калькулятор: выполняет операции − сложение, вычитание, деление, умножение} label
17 10; var a, b, res : real; {операнды и результат} oper: char; {знак операции} begin writeln('**************************************’); writeln('******* Программа калькулятор *******'); writeln ('∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗'); writeln; 10: write ('Введите операнды '); readln(a,b); write ('Введите знак операции '); readln(oper); if (oper='+') then res:=a+b {сложение} else if (oper='-') then res:=a-b {вычитание} else if (oper='∗') or (oper='x') then res:=a∗ b {умножение} else if ((oper='/') or (oper=':')) and (b<>0) then res:=a/b {деление} else begin writeln('*** Ошибка! ***'); {недопустимый знак операции или деление на 0} goto 10 end; writeln(‘Результат: ’,res:6:2) end. Оператор выбора Оператор выбора (варианта) предназначен для организации ветвления в программе в случае, когда необходимо выполнить один из нескольких операторов в зависимости от значения какого-либо выражения. Он имеет вид: case выражение of константа1: оператор1; константа2: оператор2; ... константаN: операторN else оператор {необязательный вариант} end; Оператор выбора действует следующим образом: если значение выражения равно одной из констант, то выполняется соответствующий ей оператор; затем управление передается за пределы оператора выбора. Если значение выражения не совпадает ни с одной константой, то управление передается либо за пределы оператора выбора, либо на вариант else (если этот вариант присутствует). Выражение может иметь любой стандартный тип, за исключением вещественного.
18 Пример программы, использующей оператор выбора program week; {Программа по введенному номеру определяет день недели} label 10; var n:1..7; {номер дня недели} begin 10: write('Введите номер дня недели: '); readln(n); case n of 1: writeln('понедельник'); 5: writeln('пятница'); 2: writeln('вторник'); 6: writeln('суббота'); 3: writeln('среда'); 7: writeln('воскресенье'); 4: writeln('четверг') else begin writeln(‘введен несуществующий день недели’); goto 10 end; end {case} end. Упражнения для самопроверки 1. Написать программу для нахождения максимального (мини-мального) числа среди трех введенных пользователем чисел. 2. Используя оператор выбора, написать программу, которая работала бы как калькулятор (сложение, вычитание, умножение и деление). 3. Используя условный оператор, написать программу, которая выводила бы на экран название времени года в ответ на введенный пользователем номер месяца. 4. Используя оператор выбора, написать программу, которая в ответ на введенный пользователем номер дня недели выводила бы на экран, рабочий это день или выходной. 5. Используя условный оператор, написать программу, которая по введенному пользователем количеству лет определяла бы, к какому периоду жизни человека они относятся: 1) от 0 до 10 (включительно) − детство, 2) от 10 до 14 (включительно) − отрочество, 3) от 14 до 18 (включительно) − юность, 4) от 18 до 30 (включительно) − молодость, 5) от 30 до 100 (включительно) − зрелость.
19 6. Используя условный оператор, написать программу, которая по результатам, полученным студентом на четырех экзаменах, определяла бы следующее: 1) хотя бы одна 2 − отчислить, 2) есть хотя бы одна 3 − студент не получает стипендию, 3) нет 3 − студент получает стипендию, 4) все 5 − студент получает повышенную стипендию. 7. Используя условный оператор, написать программу, которая определяла бы, принадлежит ли точка с координатами (x,y) прямоугольнику, где (x1,y1) и (x2,y2) − соответственно координаты левого нижнего и правого верхнего угла прямоугольника. 8. Используя условный оператор, написать программу, которая определяла бы, попадает ли в круг с радиусом r и центром в начале координат точка с координатами (x,y). Лабораторная работа N4 (4 часа) Тема занятия: Организация циклических процессов (операторы цик-ла). Пример программы. В языке Паскаль существует три типа операторов цикла: 1) оператор цикла с предусловием; 2) оператор цикла с постусловием; 3) оператор цикла с параметром. Оператор цикла с предварительным условием Оператор с предусловием используется в тех случаях, когда заранее неизвестно число повторений цикла. Он имеет вид: while условие do оператор; где оператор − любой оператор языка Паскаль (в том числе и составной), называемый телом цикла; условие − булевское выражение. Оператор цикла с предусловием выполняется следующим образом. Вначале вычисляется значение булевского выражения. Если его значение − true, выполняется оператор, следующий за do. Затем происходит возврат на начало цикла. Когда значение булевского выражения станет false, выполняется выход за пределы цикла. Например, a:=1; n:=1; while 2∗ a <= 3∗ n+1 do begin a:= a+2; n:= n+1
20 end; Тело цикла выполнилось три раза. При а=7 и n=4 булевское выражение принимает значение false и управление передается за пределы цикла. Оператор цикла с последующим условием Оператор цикла с постусловием используется, когда заранее неизвестно число повторений цикла. Он имеет вид: repeat оператор until условие; где оператор − любой оператор языка Паскаль (в том числе и составной), называемый телом цикла; условие − булевское выражение. Оператор цикла с постусловием выполняется следующим образом. Вначале выполняется оператор, следующий за repeat. Затем вычисляется значение булевского выражения. Если это значение − false, выполняется возврат на начало цикла. Когда значение булевского выражения станет true, выполняется выход за пределы цикла. Например, фрагмент программы для вычисления значения функции y= 2 x при х= 8, 6, 4 и 2. x:= 8; repeat y:= sqr(x); writeln('x = ',x:2,' y= ',y:3); x:= x-2 until x= 0; Тело цикла выполняется до тех пор (четыре раза), пока булевское выражение х=0 не примет значение true. Оператор цикла с параметром Оператор цикла с параметром используется, когда заранее известно число повторений цикла. Он имеет вид: for имя_переменной := выражение1 to выражение2 do оператор; где оператор − любой оператор языка Паскаль (в том числе и составной), называемый телом цикла; имя_переменной − идентификатор переменной, называемой параметром цикла; выражение1 и выражение2 − начальное и конечное значение параметра цикла. Чаще всего в качестве параметра цикла используется переменная целого типа, а шаг его изменения равен +1 или -1. Если шаг равен -1, в операторе цикла вместо служебного слова to записывается downto. Выполнение тела цикла
21 повторяется для каждого значения параметра цикла от его начального значения до конечного значения включительно. Например: program abcd; { Печать букв латинского алфавита } var c: char; begin writeln('∗∗∗∗ Латинский алфавит ∗∗∗∗'); writeln; for c:='a' to 'z' do write(' ',c); writeln; end. Упражнения для самопроверки 1. Написать программу для вычисления факториала:
1, если n = 0 n! = n∗ ( n − 1)!, если n ≥ 1
2. Написать программу для вычисления суммы N целых чисел.
S = 1 + 2 + 3+L+ N
3. Написать программу для вычисления суммы ряда:
1 1 1 S = 1 + + +L+ 2 3 N
4. Написать программу для вычисления суммы ряда:
S = 12 + 2 2 + 32 +L+ N 2
5. Написать программу для вывода таблицы кодов ASCII в 4 колонки (код, символ). 6. Написать программу для нахождения максимального (минимально-го) числа среди N целых чисел, вводимых с клавиатуры. 7. Написать программу, которая выводила бы на экран простые числа из диапазона от 1 до 100. Простое число − число, которое делится на едини-цу и само на себя. Лабораторная работа № 5 (4 часа) Тема занятия: Регулярные типы данных (массивы). Строковые типы данных (строки символов). Примеры программ. Массивы
22 Массив – это группа переменных одного типа, которые используют один идентификатор. Каждая переменная в массиве называется элементом массива. Ссылка на элемент массива осуществляется с помощью идентификатора, определенного для массива, и одного или более индексов. Индексы не обязательно должны быть целыми; они могут быть значениями любого скалярного типа, за исключением вещественного типа. Массивы, имеющие более одного индекса, называются многомерными. Массив указывается в разделе описания переменных, при этом описание массива включает описание типа массива и типа индексов. Например, одномерный массив vector, элементами которого являются вещественные числа, может быть описан следующим образом: var vector: array [1..50] of real; Элементы этого массива будут иметь обозначения: vector[1], vector[2], ..., vector[50]. Для обозначения типа индекса в этом описании использован ограниченный тип данных. Если элементы массива имеют более одного индекса (двумерный, трехмерный массив и т.д.), то в описании должен быть описан тип каждого индекса. Например, var matrix: array [1..10, 1..15] of integer; Это описание определяет двумерный массив matrix с целочисленными элементами, причем первый индекс этого массива (номер строки матрицы) принимает значения из диапазона 1..10, а второй (номер столбца) – из диапазона 1..15. Элементы массива могут иметь обозначения: matrix[1,5], matrix[8,8], matrix[i,j] и т.п. Примеры программ, использующих массивы Задача 1. Ввести с клавиатуры 10 целых чисел, записав их в одномерный массив vector. Вывести на экран максимальный элемент массива и его индекс. program vec_mx; const N=10; var vector: array[1..N] of integer; {целочисленный одномерный массив} i, i_max: 1..N; {индекс массива и индекс макс. элемента} vec_max: integer; {для хранения максимального элемента} begin for i:=1 to N do {цикл для заполнения массива} begin write(‘vector[’,i,’]= ’); readln(vector[i])
23 end; vec_max:=vector[1]; {в кач-ве макс.эл-та выбираем 1-й эл-т массива} i_max:=1; {в перем. i_max запоминаем его индекс} for i:=2 to N do {поиск максимального элемента} if vector[i]>vec_max then begin vec_max:=vector[i]; { макс. элемент найден} i_max:=i {индекс макс. элемента} end; writeln(‘максимальный элемент массива = ’, vec_max); writeln(‘его индекс = ’, i_max) end. Задача 2. Объявить в программе двумерный целочисленный массив matrix, состоящий из 6 строк и 4 столбцов. Заполнить его значениями, введенными с клавиатуры, и вывести в виде прямоугольной матрицы. program matrix_6x4; const N=6; {кол-во строк} M=4; {кол-во столбцов} var matrix: array[1..N,1..M] of integer;{целочисл. двумерный массив} i: 1..N; {индекс строки} j: 1..M; {индекс столбца} begin for i:= 1 to N do {ввод элементов массива} for j:= 1 to M do begin write(‘matrix[’, i:1, ’,’, j:1, ‘]= ‘); readln(matrix[i,j]) end; for i:=1 to N do {вывод элементов массива “в виде матрицы”} begin for j:= 1 to M do write(matrix[i,j]: 5); writeln; end end. Строковый тип Строковый тип данных обобщает понятие символьных массивов (array [1..N] of char) за счет обеспечения возможности динамического изменения длины символьной строки. В определении строкового типа данных использует-
24 ся служебное слова string, за которым в квадратных скобках указывается максимальная длина строки. Например: var line: string[80]; Строковая переменная line может иметь в качестве своего значения любую последовательность символов, длина которой лежит в диапазоне от 0 до 80 символов. Нулевой байт строки содержит значение текущей длины строки. Для вычисления этого значения необходимо использовать стандартную функцию length(line). Максимальная дина символьной строки, определенная в ТурбоПаскале, равна 255 символам (и используется по умолчанию). Доступ к отдельным элементам строки производится аналогично доступу к элементам одномерного символьного массива. Задача 4. Определить переменную строкового типа st, присвоить этой переменной или ввести с клавиатуры следующий текст “Студенты факультета ТДО”. Посчитать сколько раз в тексте встречаются буквы “д” и “т”. program count; var st: string[80]; {строковая переменная} i, count_t, count_d: byte; {параметр цикла, счетчики букв} begin writeln(‘введите текст: ’); readln(st); count_d:=0; count_t:=0; for i:=1 to length(st) do if (st[i]=‘Д’) or (st[i]=‘д’) then count_d:=count_d+1 else if (st[i]=‘Т’) or (st[i]=‘т’) then count_t:=count_t+1; writeln(‘букв − д ‘, count_d:2); writeln(‘букв − т ‘, count_t:2) end. Упражнения для самопроверки 1. Ввести с клавиатуры 10 целых чисел, записав их в одномерный массив v. Вывести на экран минимальный элемент массива и его индекс. 2. Объявить в программе двумерный целочисленный массив m, состоящий из 3 строк и 4 столбцов. Заполнить его значениями, введенными с клавиатуры. Отыскать и распечатать минимальный (максимальный) элемент массива, его индексы. Вывести массив в виде прямоугольной матрицы. 3. Объявить в программе двумерный массив t, состоящий из 4 строк и 4 столбцов. Заполнить его значениями, введенными с клавиатуры. Элементам главной диагонали присвоить нулевые значения. Вывести результирующий массив в виде матрицы.
25 4. Объявить в программе двумерный массив t, состоящий из 3 строк и 3 столбцов. Заполнить его значениями, введенными с клавиатуры. Вычислить сумму элементов дополнительной диагонали. Вывести массив в виде матрицы. 5. Объявить в программе двумерный массив r, состоящий из 3 строк и 4 столбцов. Заполнить его значениями, введенными с клавиатуры. Заменить знаки на противоположные у элементов 4 столбца и вывести результат на экран. 6. Определить переменную строкового типа st, присвоить этой переменной или ввести с клавиатуры следующий текст “Паскаль − алгоритмический язык”. Посчитать сколько раз в тексте встречаются буквы “а”, “л”, “и” и “к”. 7. Написать программу, которая выполняла бы перевод целого числа (0 ≥ n ≤ 255), вводимого с клавиатуры, в двоичный (или восьмиричный) код. 8. В предложении, где слова разделяются пробелами, найти самое длинное слово (для ввода использовать строковый тип) . Вывести на экран длину и порядковый номер длинного слова. Лабораторная работа N 6 (2 часа) Тема занятия: Комбинированные типы (записи). Фиксированные записи. Пример программы, использующей запись. Объединение компонент, принадлежащих к различным типам, в один составной тип, называется комбинированным типом или записью. Существует две разновидности записей − фиксированные записи и записи с вариантной частью. Фиксированные записи Фиксированная запись − это структура данных, состоящая из постоянного числа компонент, называемых полями, которые могут иметь различный тип данных. В определении записи для каждой из ее компонент указывается тип данных и имя (имя поля), обозначающее эту компоненту. Ее формат: type имя_записи = record имя_поля_1: тип_данных_1; имя_поля_2: тип_данных_2; ... ... ... ... имя_поля_N: тип_данных_N; end; где record и end − служебные слова, имя_записи − имя комбинированного типа (записи), имя_поля_1, имя_поля_2, ..., имя_поля_N − имена полей (компонент) записи, тип_ данных_1, тип_ данных_2, ..., тип_ данных_N, − типы данных для
26 соответствующих полей записи. Для обращения к компоненте (полю) записи используют следующее обозначение: имя_переменной_типа_запись.имя_поля_записи Пример 1. Тип Date соответствует понятию “дата”, каждое значение этого типа объединяет в себе три значения, а именно: число, месяц, год. type Date = record day: 1.. 31; {день} month:(jan,feb,mar,apr,may,jun,jul,aug,sep,oct,nov,dec);{месяц} year: 1900 .. 2000 {год} end; var D: Date; {переменная типа “дата”} Запись состоит из трех компонент (три поля: day, month, year): первая − day и третья − year принадлежат к ограниченному типу данных, а вторая − month принадлежит к перечислимому типу данных. Пример 2. Тип Person предназначен для создания “банка данных”, содержащих информацию о какой-либо группе людей (например, студентах). Компоненты FullName и Birthday сами являются записями (т.е. имеют место вложенные записи). type Name = record first, second, last : string[15] {фамилия, имя, отчество} end; Person = record FullName: Name; Birthday: Date; {см. выше определение типа Date} Sex: (male, female); {пол: мужской, женский} Height: 150 .. 200; {рост} Ball: 2 .. 5 {оценка} end; var Student: Person; {переменная типа Person} Для переменной Student, имеющей тип Person, могут иметь место следующие присваивания: Student.FullName.first := ‘Петров’; Student.FullName.second := ‘Петр’; Student.FullName.last := ‘Петрович’; Student.Birthday.day := 1; Student.Birthday.month := jan;
27 Student.Birthday.year := 1978; Student.Sex := male; Student.Height := 170; Student.Ball := 5; Используя оператор with-do (который позволяет определить область действия, где имена полей могут использоваться как обычные, не составные, имена), эту группу операторов можно записать более компактно. with Student,FullName,Birthday do begin First := ‘Петров’; Second := ‘Петр’; Last := ‘Петрович’; day := 1; month := jan; year := 1978; Sex := male; Height := 170; Ball := 5; end; Задача. Посчитать общую стоимость покупки: книга, ручка и тетрадь. Цена (cost) задается общим количеством рублей (rouble) и копеек (copeck). При расчете суммарной стоимости необходимо осуществить перевод количества копеек в рубли. Определить запись, состоящую из полей: предмет (строковый тип) и цена (запись, состоящая из полей − рубль и копейка). program bank; type Cost = record {цена} rouble, {рубль} copeck: integer; {копейка} end; Thing = record {товар} name: string[15]; {наименование товара} cena : cost {цена товара} end; var t: array[1..3] of Thing; {массив, состоящий из записей типа Thing} i, sum_r, sum_c : byte; begin sum_r:=0; sum_c:=0; for i:=1 to 3 do with t[i], cena do begin write(‘ наименование товара’); readln(name);
28 writeln(‘ цена товара’); write(‘ руб= ’); readln(rouble); write(‘ коп= ’); readln(copeck); sum_r:= sum_r + rouble; sum_c:=sum_c+copeck; end; writeln(‘**** общая стоимость покупки ****’); wriyeln(sum_r+sum_c div 100,’ руб. ‘,sum_c mod 100,’ коп.’) end. Упражнения для самопроверки 1. Сформировать массив, элементами которого являются записи типа Person (см. пример 2). Заполнить его информацией о студентах Вашей группы. Вывести информацию на экран в виде: ------------- Студенты группы 711 ----------Фамилия Имя Отчество дд.мм.гг рост (в см) оценка -------------------------------------и т.д. Подсчитать количество студентов (в процентном отношении), получивших оценку 2, 3, 4 и 5. 2. Продолжить задачу и посчитать количество студентов, рожденных летом, зимой, весной и осенью. 3. Продолжить задачу и посчитать количество студентов-юношей, имеющих рост выше 170 см. 4. Вычислить сумму трех комплексных чисел и результат вывести на экран. Определить запись, состоящую из полей: действительная часть числа (целый тип) и мнимая часть числа (целый тип). 5. Подсчитать средний бал из оценок, полученных на трех экзаменах. Определить запись, состоящую из полей: имя студента (строковый тип) и оценки (одномерный массив). Вывести информацию на экран в виде: Студент ------ Ср. бал. 6. Подсчитать количество домов, расположенных на четной (нечетной) стороне улиц и вывести их адреса (улица, дом) на экран. Определить адрес в виде записи, состоящей из полей: улица (строковый тип) и номер дома (целый тип). Лабораторная работа N 7 (2 часа) Тема занятия: Комбинированные типы (записи). Записи с вариантами. Пример программы, использующей запись с вариантами.
29
Записи с вариантами Для включения в запись информации, зависящей от другой уже включенной в эту же запись информации, в Паскале используются записи с вариантной частью. Для описания вариантной части применяется конструкция case. Каждый вариант характеризуется списком описаний присущих ему компонент, заключенным в круглые скобки. Перед списком находится одна или более меток. В задаче, приводимой ниже, в записи Person в зависимости от пола будут заполняться разные поля: Height(рост) и Weight(вес) (у юношей) или Eyes(глаза) и Hair(волосы) (у девушек). Полем признака является поле S (общее для всех вариантов), имеющее перечислимый тип Sex. Задача. Сформировать массив, у которого элементами являются записи с вариантной частью типа Person. Заполнить его информацией о студентах Вашей группы. Вывести эту информацию на экран в виде: ------------- Студенты группы 711 ----------Фамилия Имя Отчество год рождения для юношей для девушек рост (в см) цвет глаз вес (в кг) цвет волос ------------------------------------------------------и т.д. Подсчитать количество студентов с избыточным весом. {Программа формирования банка данных (БД) о студентах ВГЛТА} program FormStBank; uses Crt; type color1=(blue,green,gray,brown); {голубые, зеленые, серые, карие} color2=(blond,brunet,red); {блондинка, брюнетка, шатенка} sex=(male,female); Name= record First, Second, Last : string[15] {фамилия, имя, отчество} end; Person = record Fullname: Name; Year: 1900..2000; {год рождения}; case S: Sex of male: (Height: 150 .. 200; Weight: real);
30 female: (Eyes: color1; Hair: color2); end; var DataBase: array[1..100] of Person;{массив, сост. из записей типа Person} i, ind: 1..100; temp: char; number,count: byte; cycle: boolean; begin ClrScr; {очистка экрана} cycle:=true; ind:=1; writeln(‘ *** Студенты группы 711 *** ’); repeat with DataBase[ind], FullName do {заполнение БД} begin writeln(‘***** Ввод Ф.И.О. *****’); write(‘Фамилия? ’); readln(First); write(‘Имя? ’); readln(Second); write(‘Отчество? ’); readln(Last); write(‘Год рождения? ’); readln(Year); writeln(‘***** Введите признак пола ******’); write(‘Пол (М/Ж)? ‘);readln(temp); case temp of ‘М’,’м’ : begin S:= male; write(‘Рост (в см)? ’);readln(Height); write(‘Вес (в кг)? ’);readln(Weight) end; ‘Ж’,’ж’: begin S:= female; write(‘Цвет глаз (г,з,с,к)? ’);readln(temp); case temp of ‘г’: eyes:=blue; ‘з’: eyes:=green; ‘с’: eyes:=gray; ‘к’: eyes:=brown end; write(‘Цвет волос (б,р,ш)? ’);readln(temp); case temp of ‘б’: hair:=blond; ‘р’: hair:=brunet; ‘ш’: hair:=red;
31 end; end; {begin} end; {case} end; {with} writeln; write(‘Продолжить (д/н)? ’);readln(temp); writeln; if (temp=‘Н’) or (temp=‘н’) then cycle:=false else ind:=ind+1; until not cycle; {Вывод БД на экран} count:=0; writeln(‘------------- Студенты группы 711 -----------’); for i:=1 to ind do with DataBase[i],FullName do begin writeln(First,‘ ’,Second,’ ’,Last); writeln(’год рождения: ’,Year); if S=male then begin {юноши} writeln(Height,’ см’); writeln(Weight:5:1,’ кг’); if weight>(Height - 100) then count:=count+1; end else begin {девушки} case eyes of blue : writeln(‘глаза голубые’); green: writeln(‘глаза зеленые’); gray : writeln(‘глаза серые’); brown: writeln(‘глаза карие’) end; case hair of blond : writeln(‘блондинка’); brunet: writeln(‘брюнетка’); red : writeln(‘шатенка’) end; end; writeln(‘--------------------------------------------------’); end; writeln(‘Кол−во студентов с избыточным весом = ’,count:2) end. Упражнения для самопроверки 1. Продолжить задачу и посчитать количество студентов, имеющих голубые, зеленые, серые и карие глаза.
32 2. Продолжить задачу и посчитать количество блондинок, брюнеток и шатенок. 3. Продолжить задачу и посчитать количество студентов-юношей, имеющих средний рост (до 170 см), и количество высоких студентов (выше 170 см). Лабораторная работа N 8 (2 часа) Тема занятия: Файловый тип данных. Операции над файлами. Примеры программ. В языке Паскаль файл обозначает информационный объект, образованный последовательностью компонент одного и того же типа. Количество компонент, называемое длиной файла, в определении файлового типа не фиксируется. Если файл не имеет компонент, его называют пустым. Файловый тип данных Определение файлового типа данных в общем виде: type файловый_тип = file of тип_компотенты_файла; Описание файловой переменной может быть представлено как: var имя_файловой _переменной : файловый_тип; Определение файлового типа и описание файловой переменной может быть объединено в одном описании: var имя_файловой_переменной : file of тип_компоненты_файла Примеры описания файловых переменных: var InFile: file of integer; {компонентами файла являются целые числа} DataBase:file of Person;{компонентами файла являются записи типа Person, см. лаб. № 7} Для каждой файловой переменной автоматически вводится указатель текущей позиции в файле, при выполнении операций ввода-вывода этот указатель перемещается по файлу. Îïåðàöèè íàä ôàéëàìè • начальные и завершающие операции ввода-вывода (assign, reset, rewrite, flush, close); • операции ввода-вывода (read, write);
33 • операции перемещения по файлу (seek, truncate, filesize, filepos, eof); • специальные операции ввода-вывода (erase, rename, chdir, mkdir, rmdir). Процедура assign(имя_файл_пер, имя_файла) предназначена для установления связи между файловой переменной и конкретным физическим файлом, находящимся на магнитном носителе. В дальнейшем все обращения к файлу выполняются через файловую переменную. Процедура reset(имя_файл_пер) предназначена для открытия уже существующего файла. Если файла с таким именем нет на внешнем носителе, то возникает ошибка. Процедура rewrite(имя_файл_пер) допускает, что открываемый файл может не существовать, в этом случае она создает его. Если же файл уже существует, то данная процедура очищает его. Процедура flush(имя_файл_пер) предназначена для завершения обмена информацией с файлом без его закрытия. Процедура close(имя_файл_пер) предназначена для завершения действий с файлом (для закрытия файла). Процедура read(имя_файл_пер, список_ввода) предназначена для чтения значений из файла в переменные программы. Список_ввода − перечень имен переменных, в которые заносятся значения, считанные из файла. Тип переменных должен совпадать с базовым типом файловой переменной, указанной в качестве первого параметра. Процедура write(имя_файл_пер, список_вывода) предназначена для записи информации из программы в файл. Список_вывода − перечень выражений, значения которых записываются в файл. Процедура seek(имя_файл_пер, ном_поз) перемещает указатель фай-ла, заданного первым параметром, на позицию с номером, указанным вторым параметром. Процедура truncate(имя_файл_пер) предназначена для отсечения хвостовой части файла, заданного в качестве параметра этой процедуры. Функция filesize(имя_файл_пер) возвращает общее количество элементов в файле, заданного в качестве параметра. Функция filepos(имя_файл_пер) возвращает номер элемента, на который установлен текущий указатель. Функция eof(имя_файл_пер):boolean возвращает логическое значе-ние true, если в ходе перемещения по файлу был достигнут конец файла, и false − в противном случае. Задача 1. Создать БД с записью в файл (использовать в качесте базового типа − тип Person). Заполнить ее информацией о студентах Вашей группы. {Формирование банка данных (БД) о студентах ВГЛТА с записью в файл} program FormStBank;
34 uses Crt, System; type ... ... ... {описание типов см. в лаб № 7} ... ... ... var DataBase: file of Person; {БД будет записываться в файл} Student: Person; temp: char; number: byte; cycle: boolean; begin ClrScr; {очистка экрана} assign(DataBase,’d:\gr711 \db711.dat’); {связывает файл.переменную DataBase с конкретным файлом на диске} rewrite(DataBase); {открывает файл} writeln(‘∗∗∗∗∗ Студенты группы 711 ∗∗∗∗∗ ’); repeat with Student, FullName do begin ... ... ... {текст программы см. лаб. № 7} ... ... ... end; {with} write(DataBase, Student); {запись в файл БД} writeln; write(‘Продолжить (д/н)? ’);readln(temp); writeln; until (temp=‘Д’) or (temp=‘д’); close(DataBase) {закрывает файл, содержащий БД} end. Задача 2. Записать в файл простые числа из диапазона от 1 до 100. Простое число − число, которое делится на единицу и само на себя. Вывести содержимое файла на экран. program num; const N=100; {диапазон целых чисел} var file_name: string[15]; {хранится имя файла} out_file: file of integer; {файл простых чисел} a, i, j: integer; c: 0..1; {признак числа: 0 - простое число; 1 - непростое}
35
begin write(‘имя файла? ’); readln(file_name); assign(out_file, file_name); {устанавливает связь между файловой переменной out_file и физическим файлом, имя которого хранится в file_name} rewrite(out_file); {открытие файла} for i:=1 to N do begin с:=0; for j:= 2 to i-1 do if i mod j = 0 then c:=1; {число i кратно j} if c=0 then write (out_file, i) {запись простого числа в файл} end; seek(out_file,0); {устанавливает указатель на начало файла} writeln(‘∗∗∗∗∗ Простые числа ∗∗∗∗∗ ’); while not eof (out_file) do begin {пока файл не пуст, считываем из него число} read(out_file, a); write(a:4) {вывод числа на экран} end; close(out_file) {закрытие файла} end. Упражнения для самопроверки 1. Продолжить задачу 1 и написать программу, которая выполняла бы вывод содержимого БД на экран. 2. Продолжить задачу 1 и написать программу, которая пополняла бы уже существующую БД новыми студентами. 3. Продолжить задачу 1 и написать программу, которая бы уже существующую БД разбила на две (в первой находились бы юноши, во второй − девушки) с записью в два разных файла. 4. Среди 10 введенных целых чисел отобрать четные числа, записав их в файл с именем even.dat, и нечетные, записав их в файл с именем odd.dat. Вывести содержимое обоих файлов на экран. 5. Среди 10 введенных целых чисел отобрать кратные 5, записав их в файл с именем f5_num.dat. Вывести содержимое файла на экран. Лабораторная работа № 9 (2 часа)
36 Тема занятия: Текстовые файлы. Процедуры и функции для работы с текстовыми файлами. Пример программы. В Паскале существует предопределенный файловый тип text, называемый текстовым, который предназначен для описания файлов, компонентами которого являются символьные строки переменной длины. Признак конца строки образован парой символов CR (возврат каретки, ВК) и LF (перевод строки, ПС) − эти символы имеют десятичные коды 13 и 10 соответственно. Текстовые файлы заканчиваются специальным признаком (маркером) конца файла (символ CTR-Z, имеющий код 2610). Описание файловой текстовой переменной имеет следующий вид: var имя-файловой-переменной : text; где text – предопределенный тип, предназначенный для описания текстовых файлов. Например: var MyFile : text; begin assign (MyFile, 'd:\gr711\proba.txt');{ MyFile - имя файл.переменной, {d:\gr711\proba.txt - текстовый файл, находящ.на диске d: в каталоге gr711} ... ... ... end. Процедуры и функции для работы с текстовыми файлами Процедура assign (имя_файл_перем, имя_файла) связывает файловую текстовую переменную с конкретным файлом на диске. В дальнейшем все обращения к файлу выполняются через файловую текстовую переменную. Процедура rewrite (имя_файл_перем) открывает новый текстовый файл для записи (указатель файла при этом устанавливается на начало файла). Если файл с таким именем существует на диске в указанном каталоге, то он будет удален. Процедура reset(имя_файл_перем) открывает существующий файл для чтения (указатель файла при этом устанавливается на начало файла, т.е. на первый элемент первой строки файла). Если файл на диске отсутствует, то возникает ошибка ввода-вывода. Процедура append(имя_файл_перем) открывает существующий файл для добавления в него символьных строк (указатель файла при этом устанавливается на конец файла). Если файл на диске отсутствует, то возникает ошибка ввода-вывода.
37 Примечание. После открытия текстового файла одним из указанных выше способов, можно либо только производить запись в него, либо только выполнять чтение из него. Если необходимо изменить характер работы с текстовым файлом, его приходится закрывать, а затем заново открывать, используя соответствующую процедуру. Процедура read (имя_файл_перем, список_ввода) считывает информацию из текстового файла, связанного с файловой текстовой переменной, заданной первым параметром, в переменные списка ввода. Поскольку текстовый файл по определению содержит символьную информацию, при чтении файла очередная часть текущей строки будет пониматься как символьное представление значения, тип которого определяется типом очередной переменной из списка ввода процедуры read. В данном случае разделителями символьных представлений значений служат символы “пробел” и/или “табуляция”. Процедура write (имя_файл_перем, список_вывода) записывает информацию в текстовый файл, связанный с файловой текстовой переменной, заданной первым параметром. Каждое выражение, указанное в списке вывода, вычисляется и записывается в текстовый файл. Если тип вычисленного значения отличается от символьного, то выражение преобразуется в символьное представление, а затем записывается в очередную строку текстового файла. Имеются две модификации процедур read и write – процедуры readLn и writeLn. Эти процедуры выполняют те же действия, что и соответствующие процедуры read и write, но после операций чтения и записи производят переход к следующей строке текстового файла. Следует отметить, что операция read автоматически переходит к следующей строке только в случае исчерпания текущей строки; процедура readLn позволяет совершить этот переход, не дожидаясь окончания строки. Процедура close (имя_файл_перем) закрывает открытый ранее тексто-вый файл. При чтении информации из текстового файла возникает необходимость в контроле за достижением конца строки и конца файла. Функция eoln (имя_файл_перем) возвращаeт значение true, если достигнут конец строки, и false – в противном случае. Функция eof(имя_файл_перем) возвращает значение true, если достигнут конец файла, и false – в противном случае. Функция seekeoln(имя_файл_перем) производит поиск конца текущей строки. Она пропускает все символы-разделители (пробелы и табуляции) в строке, устанавливает текущий указатель файла на конце строки и возвращает значение true. Если конец строки не найден, то seekeoln устанавливает указатель на первом значащем символе строки (т.е. на символе, отличном от пробела или табуляции) и возвращает к значение false . Функция seekeof(имя_файл_перем) осуществляет поиск конца файла и действует аналогично функции seekeoln, пропуская символы-разделители; од-
38 нако, кроме пробелов и табуляций, она пропускает также символы конца строки (т.е. переходит со строки на строку) в поисках конца файла. Если конец файла найден, то функция seekeof возвращает значение true; в противном случае – она возвращает значение и устанавливает указатель на первом значащем символе в файле. Задача. Написать программу, которая выводила бы символы ASCII (коды от 32 до 127) в текстовый файл в четыре колонки (код --- символ). program cod; uses Crt; var outfile : text; { ôайловая текстовая переменная} filename : string[20]; i,k,l,m: integer; begin ClrScr; {очистка экрана} write('Имя выходного файла: '); readln(filename); assign(outfile, filename); rewrite (outfile); {открыть файл } for i:=32 to 55 do begin k:=i+24; l:=k+24; m:=l+24; writeln(outfile,i,’ ‘,chr(i),’ ‘,k,’ ‘,chr(k),’ ‘,l,’ ‘,chr(l),’ m,’ ‘,chr(m)) { вывод в файл} end; close(outfile) { закрыть файл } end.
‘,
Упражнения для самопроверки 1. Продолжить задачу и посчитать количество строк в полученном текстовом файле. 2. Написать программу подсчета слов в небольшом текстовом файле. 3. Написать программу для подсчета количества строк и символов в небольшом текстовом файле. Лабораторная работа № 10 (2 часа) Тема занятия: Графические средства Турбо-Паскаля. Переход в графический режим и выход из него. Проверка ошибок инициализации. Работа с пикселами графического экрана. Пример программы.
39 Графические возможности Турбо-Паскаля Графические возможности языка Турбо-Паскаля версии 6.0 реализованы с помощью ряда графических подпрограмм (их более 50), содержащихся в модуле Graph (файл GRAPH.TPU). Кроме того, существует ряд графических драйверов (BGI-файлов), обеспечивающих работу программы с тем или иным видеоадаптером. Переход в графический режим и выход из него Для работы в графическом режиме программа должна выполнить переход в графический режим, т.е. осуществить его инициализацию с помощью вызова процедуры InitGraph. После окончания работы программы в графическом режиме необходимо использовать процедуру CloseGraph, которая осуществляет выход из графического режима и освобождает память, занятую при инициализации. При инициализации графического режима возможно возникновение ошибочных ситуаций. Для идентификации таких случаев после вызова процедуры InitGraph следует использовать функцию GraphResult : integer, которая возвращает одно из следующих значений (перечислены наиболее важные коды возврата): 0 (grOk) – инициализация выполнена успешно; -2 (grNotDetected) – видеоконтроллер не поддерживает работу в графическом режиме; -3 (grFileNotFound) – не найден файл графического драйвера; -4 (grInvalidDriver) – неверный графический драйвер; -5 (grNoLoadMem) – для инициализации заданного графического режима недостаточно памяти. Справочную информацию об ошибках инициализации графического режима можно получить, выбрав пункты Help{Index{CONSTANTS (GRAPHICSMODE)}} соответствующих меню интерактивной cреды раз-работчика (ИСР) Турбо-Паскаль 6.0. Наиболее простой способ инициализации графического режима, предполагающий автоматический поиск необходимого драйвера и установки соответствующего режима, приводится ниже: uses Graph; label 10; const PathToDriver = ‘c:\tp\bgi’; { Маршрут к BGI-файлам} var Gd, Gm , ErrorCode : integer; begin
40 ... ... ... { Работа в текстовом режиме } ... ... ... Gd :=Detect; { Автоматическое определение драйвера } InitGraph(Gd, Gm, PathToDriver); { Инициализация графики } { Проверка выполнения инициализации графического режима } ErrorCode := GraphResult; if ErrorCode <> grOk then begin writeln(‘ Ошибка инициализации графики: ‘, ErrorCode); goto 10; end; ... ... ... { Работа в графическом режиме } ... ... ... CloseGraph; { Выход из графического режима } 10: ... ... ... { Работа в текстовом режиме } ... ... ... end. Графический экран Графический экран рассматривается как прямоугольная матрица пикселов. Верхний левый угол графического экрана имеет координаты (0,0). Значение координаты x увеличивается слева направо, а значение координаты y – сверху вниз. Функции GetMaxX: integer и GetMaxY: integer возвращают максимальную координату X и максимальную координату Y соответственно. Таким образом, координаты правого верхнего угла графического экрана будут (GetMaxX,0), левого нижнего угла – (0,GetMaxY), правого нижнего угла – (GetMaxX, GetMaxY). Очевидно, что пиксел, расположенный в центре экрана, имеет координаты (GetMaxX div 2, GetMaxY div 2). Функции GetX: integer и GetY: integer возвращают текущую координату X и текущую координату Y соответственно. Работа с пикселами графического экрана Процедура PutPixel(X, Y: integer; Color: word) выводит пиксел с цветом, определяемым параметром Color, в области графического экрана с координата-
41 ми, определяемыми параметрами X и Y. Например, вызов процедуры PutPixel(GetMaxX div 2, GetMaxY div 2, Red) приводит к выводу пиксела красного цвета в центре экрана. Справочную информацию о символических константах для кодов цвета можно получить, если выбрать пункты Help {Index {CONSTANTS (COLOR, SETTINGS)}} соответствующих меню ИСР ТурбоПаскаль 6.0. Функция GetPixel(X, Y: integer): word возвращает код цвета пиксела, расположенного в области графического экрана с координатами, определяемыми координатами X и Y. Задача. Вывести на экран квадратную рамку белого цвета со сторонами, равны-ми 300×300, и диагоналями желтого цвета. program quad; uses Crt, Graph; const Lim=300; PathToDriver = ‘c:\tp\bgi’; { Маршрут к BGI-файлам} var Gd, Gm : integer; {Код графических драйвера и режима} ErrorCode, i : integer; {Код ошибки и переменная цикла} begin Gd :=Detect; { Автоматическое определение драйвера } InitGraph(Gd,Gm,PathToDriver); {Инициализация графики } {Проверка выполнения инициализации графического режима } ErrorCode := GraphResult; if ErrorCode <> grOk then begin writeln(‘ Ошибка инициализации графики: ‘, ErrorCode); exit end; for i := 0 to Lim do begin { стороны квадрата: } PutPixel(i, 0, White); {верхняя горизонтальная,} PutPixel(Lim, i, White); {правая вертикальная,} PutPixel(i, Lim, White); {нижняя горизонтальная,} PutPixel(0, i, White); {левая вертикальная} PutPixel(i, i, Yellow); {диагонали: с лев. верх. − в прав.ниж.} PutPixel(Lim-i, i, Yellow); {с прав.верх. − в лев.ниж.} end; repeat until KeyPressed; { Ждать нажатия любой клавиши } CloseGraph; { Выход из графического режима } end.
42
Упражнения для самопроверки 1. Написать программу для вывода на экран прямоугольника красного цвета со сторонами, равными размеру графического экрана, и обеспечивающую вывод диагоналей прямоугольника желтым цветом. 2. Написать программу, которая рисовала бы линию. 3. Написать программу, которая рисовала бы пересекающиеся линии (систему координат). 4. Написать программу, которая позволяла бы заполнить квадрат произвольной величины зеленым цветом. 5. Написать программу, которая рисовала бы шахматную доску. Лабораторная работа № 11 (2 часа) Тема занятия: Отображение линейных объектов: прямолинейного отрезка, прямоугольника, окружности, дуг окружности и эллипса. Отображение сплошных объектов: заполненного прямоугольника, заполненного эллипса, заполненного сектора, параллелепипеда. Примеры программ. Отображение линейных объектов При отображении линейных объектов основным инструментом является “перо”. Перо имеет следующие характеристики: цвет (по умолчанию белый); толщина (по умолчанию 1); шаблон (по умолчанию сплошной). Для задания характеристик пера используются процедуры: • SetColor(Color: word) – устанавливает текущий цвет рисования. Например: SetColor(Red); • SetLineStyle(LineStyle:word; Pattern:word; Thickness:word) – устанавливает атрибуты линии. LineStyle определяет вид линии: Solid_Ln(0) − сплошная линия, Dotted_Ln(1) − пунктирная линия, Center_Ln(2) − штрих-пунктирная линия, Dashed_Ln(3) − штриховая линия, UserBit_Ln(4) − тип линии, заданный пользователем). Значение UserBit_Ln означает, что шаблон задается вторым параметром (Pattern). Шаблон определяется 16 битами, где единичное значение бита означает, что в соответствующем месте будет выведена точка, а нулевое значение означает, что точка выводиться не будет. Третий параметр (Thickness) задает толщину линии в пикселах. Возможные значения параметра – Norm_Width (1) и Thick_Width (3). Процедура SetBkColor(Color : word) используется для установки текущего цвета фона. Например: SetBkColor(Blue).
43 Для вывода прямолинейного отрезка используется процедура Line (x1, y1, x2, y2 : integer). Например: Line(0,0,GetMaxX,0). Для вывода прямоугольника используется процедура Rectangle(x1, y1, x2, y2 : integer), где (x1,y1) – координаты левого верхнего угла прямоугольника, a (x2,y2) – координаты нижнего правого угла прямоугольника. Например: Rectangle(0,0,GetMaxX,GetMaxY). Для вывода окружности используется процедура Circle(X,Y: integer; Radius: word), где (X,Y) – координаты центра окружности с радиусом Radius. Например: Circle(GetMaxX div 2, GetMaxY div 2, 50). Для вывода дуги окружности используется процедура Arc(X,Y: integer; StartAngle, EndAngle, Radius: word), где (X,Y) – центр окружности, StartAngle и EndAngle – начальный и конечный угол соответственно. Углы задаются в градусах, отсчитываемых в направлении против хода часовой стрелки. Для вывода дуги эллипса используется процедура Ellipse(X,Y : integer; StartAngle, EndAngle : word; XRadius, YRadius : word), где (X,Y) – координаты центра эллипса, StartAngle и EndAngle начальный и конечный угол, XRadius и YRadius – горизонтальная и вертикальная полуоси эллипса соответственно. Например: Ellipse(GetMaxX div 2, GetMaxY div 2, 0, 90, 100, 50). Задача. Вывести на голубом фоне квадрат со сторонами 300×300 белого цвета и диагоналями желтого цвета, используя процедуру рисования линии. program quad; uses Crt, Graph; const Lim=300; var Gd, Gm , ErrorCode : integer; begin Gd := Detect; InitGraph(Gd,Gm, ‘c:\tp\bgi’); ErrorCode := GraphResult; if ErrorCode <> grOk then begin writeln(‘Ошибка инициализации графики: ‘, ErrorCode); exit end; SetBkColor(Blue); {цвет фона : голубой} SetLinelStyle(Solid_Ln,0,1); {хар-ки линии: сплошая, тонкая} SetColor(White); {цвет линии: белый} Line(0,0,Lim,0); Line(0,Lim,Lim,Lim); {стороны горизонтальные} Line(0,0,0,Lim); Line(Lim,0,Lim,Lim); {стороны вертикальные}
44 SetColor(Yellow); {цвет линии:желтый} Line(0,0,Lim,Lim); Line(Lim,0,0,Lim); {диагонали квадрата} repeat until KeyPressed; {ждать нажатия клавиши} CloseGraph {выход из граф. режима} end. Отображение сплошных объектов Под сплошным объектом понимается закрашенный объект. С закрашиванием связано понятие “кисти”. Кисть определяется цветом и шаблоном – матрицей 8×8 бит (точек), где бит, равный 1, означает, что нужно ставить точку цвета кисти, а 0 – точку черного цвета. Для задания характеристик кисти используются следующие процедуры: • SetFillStyle(Pattern : word, Color : word) – позволяет установить текущий цвет (цвет кисти) и текущий стиль (шаблон кисти) заполнения. Шаблон кисти (Pattern) может принимать следующие значения: EmptyFill(0) − заполнение цветом фона, SolidFill(1) − сплошное заполнение заданным цветом, LineFill(2) − заполнение жирными горизонтальными линиями, LtSlashFill(3) − заполнение тонкими наклонными линиями, SlashFill(4) − заполнение жирными наклонными линиями, BkSlashFill(5) − заполнение жирными обратными наклонными линиями, LtBkSlashFill(6) − заполнение тонкими обратными наклонными линиями, HatchFill(7) − заполнение клеткой, XHatchFill (8) − заполнение косой клеткой, InterLeaveFill(9) − заполнение частой наклонной штриховкой, WideDotFill(10) − заполнение редкими точками, CloseDotFill(11) − заполнение частыми точками, UserFill(12) − штриховка, определенная пользователем. • SetFillPattern(Pattern:FillPatternType;Color:word) – позволяет устано-вить пользовательскую структуру заполнения, которая затем может быть использована процедурой SetFillStyle. Процедура GetFillSettings(var FillInfo: FillSettingsType) – позволяет получить информацию об используемых цвете и шаблоне заполнения. Процедура GetFillPattern(var Pattern: FillPatternType) позволяет получить шаблон заполнения, спроектированный пользователем. Если до вызова процедуры GetFillPattern не была выполнена процедура SetFillPattern, то каждому элементу массива Pattern будет присвоено значение $FF. Процедура Bar(x1, y1, x2, y2 : integer) выводит прямоугольник с левым верхним углом (x1,y1) и правым нижним углом (x2,y2) и заполняет его, используя цвет и шаблон кисти.
45 Процедура FillEllipse(X, Y : integer; XRadius, YRadius : word) выводит эллипс с центром в точке (X,Y) с горизонтальной полуосью XRadius и вертикальной полуосью YRadius. Например: FillEllipse (GetMaxX div 2, GetMaxY div 2, 100, 200). Процедура Sector(X, Y : integer; StAngle, EndAngle : word; XRadius, YRadius : word) выводит эллиптический сектор с центром в точке (X,Y) от угла StAngle до EndAngle. Например: Sector (GetMaxX div 2, GetMaxY div 2, 0, 90, 200, 100). Процедура Bar3D(x1,y1,x2,y2 : integer; Depth : word; Top : boolean) выводит параллелепипед, используя текущие цвет и шаблон заполнения. Переменная Depth определяет глубину параллелепипеда. Переменная Top указывает на наличие верхней и правой граней (значение True) или их отсутствие (значение False). Например: Bar3D (100,100, 150,300,True). Ниже приведен пример программы, использующей процедуры GetFillPattern и SetFillPattern для получения текущего шаблона заполнения и установки пользовательского шаблона соответственно, для вывода квадрата со сторонами 100×100. program UserFillPattern; uses Graph; const PathToDriver=‘с:\tp\bgi’; NewPattern : FillPatternType = ($F0, $F0, $F0,$F0, $0F, $0F, $0F, $0F);{“шахматы”} var Gd, Gm, ErrorCode : Integer; OldPattern : FillPatternType; begin Gd := Detect; InitGraph(Gd, Gm,PathToDriver); ErrorCode := GraphResult; if ErrorCode <> grOk then begin writeln('Ошибка инициализации графики' ErrorCode); exit end; GetFillPattern(OldPattern); {запоминаем старый шаблон заполнения} SetFillPattern(NewPattern, Yellow); {уст-ка новых характер.“кисти”} { Рисуем квадрат, используя новый шаблон заполнения } Bar(0, 0, 100, 100); ReadLn;
46 SetFillPattern(OldPattern,White); {Рисуем квадрат, используя старый шаблон заполнения} Bar(0, 0, 100, 100); ReadLn; CloseGraph end. Упражнения для самопроверки 1. Нарисовать эмблему всемирных олимпийских игр – пять переплетенных колец, каждое из которых имеет свой цвет и представляет один из континентов. 2. Нарисовать изображение земного шара в виде эллипса голубого цвета с тремя меридианами и тремя параллелями желтого цвета. 3. Разделите экран на четыре прямоугольные части, заполнив их разными цветами, и в каждом из четырех прямоугольников отобразите любой из линейных объектов и любой из сплошных оъектов, используя разные цвета рисования. 4. Нарисовать домик, в окне которого то загорался бы, то потухал свет. Лабораторная работа № 12 Тема занятия: Вывод текста в графическом режиме. Пример программы. Вывод текста в графическом режиме В графическом режиме для вывода текста можно использовать несколько различных шрифтов: – растровый, т.е. задается матрицей точек (указывается с помощью константы DefaultFont(0) − этот шрифт позволяет осуществлять вывод текста на русском языке) и векторные, т.е. представляются рядом отрезков (векторов), образующих символ. Векторные шрифты представляются следующими константами: TriplexFont(1), SmallFont(2), SansSerifFont(3) и GothicFont(4). Файлы шрифтов имеют расширение .CHR и хранятся либо в каталоге с BGI-файлами, либо в текущем каталоге. Для выбора и масштабирования шрифта, а также указания направления вывода текста используется процедура SetTextStyle(Font, Direction, Size : word). Размер шрифта не может превышать 10. Для растрового шрифта нормальный размер символов достигается при размере, равном 1, а для векторных – при размере, равном 4. Направление вывода текста задается с помощью второго параметра – Direction, который может принимать следующие два значения: HorizDir(0) − вывод текста по горизонтали (слева направо) и VertDir(1) − вывод текста по вертикали (снизу вверх).
47
Для вывода текста в графическом режиме используются процедуры OutText(TextString : string) − выводит заданный текст с текущей позиции и OutTextXY(X,Y: integer; TextString: string) − выводит текст, начиная с точки с координатами (X,Y). Процедура SetTextJustify(Horiz,Vert: word) используется для выравнивания выводимой строки. Параметр Horiz определяет выравнивание по горизонтали: LeftText(0) – для выравнивания слева, СenterText(1) – для выравнивания по центру и RightText(2) – для выравнивания справа. Параметр Vert определяет выравнивание по вертикали: BottomText(0) − для выравнивания снизу, CenterText(1) – для выравнивания по центру и TopText(2) – для выравнивания сверху. Задача. Программа выводит одну и ту же строку текста ‘TURBO PASCAL’ несколько раз с небольшим смещением и различными цветами. program Graf_Text; uses Crt, Graph; const PathToDriver = ‘c:\tp\bgi’; text=‘TURBO PASCAL’; var Gd, Gm, ErrorCode : integer; begin Gd := Detect; { Автоматическое определение драйвера } InitGraph(Gd, Gm, PathToDriver); ErrorCode := GraphResult; if ErrorCode <> grOk then begin writeln(‘Ошибка инициализации графики: ‘, ErrorCode); exit end; SetTextJustify(CenterText, CenterText); SetTextStyle(TriplexFont, HorizDir, 8); SetColor(White); OutTextXY(GetMaxX div 2, GetMaxY div 2,text); SetColor(LightBlue); OutTextXY(GetMaxX div 2 + 2, GetMaxY div 2, text); SetColor(LightRed); OutTextXY(GetMaxX div 2 + 3, GetMaxY div 2, text); SetColor(Yellow); OutTextXY(GetMaxX div 2 + 4, GetMaxY div 2,text); SetColor(White); repeat until keypressed;
48 CloseGraph end. Упражнения для самопроверки 1. Нарисовать российский флаг (горизонтальные полосы белого, голубого и красного цветов) и на голубом фоне вывести слово “Россия”. 2. Нарисовать французский флаг (вертикальные полосы голубого, белого и красного цветов) и на белом фоне вывести слово “France”. 3. Разбить экран на 4 прямоугольника, заполнив каждый своим цветом, и в каждом указать соответствующее название цвета. Библиографический список 1. Стариков А.В. ИНФОРМАТИКА. Основы программирования на языке Паскаль: Тексты лекций в 3-х частях. Воронеж, 1999. − 135 с. 2. Фаронов В.В. Турбо-Паскаль: В 3-х кн. − М.: Учебно-инженерный центр "МВТУ−ФЕСТО ДИДАК-ТИК", 1992. Книга 1: Основы Турбо-Паскаля. − 304 с. Содержание Введение Лабораторная работа № 1. Знакомство и приемы работы в интегрированной среде языка Турбо-Паскаль 6.0. Лабораторная работа № 2. Общая структура программы на языке ТурбоПаскаль. Оператор присваивания. Выражения. Стандартные функции. Ввод и вывод данных. Составной оператор. Лабораторная работа № 3. Оператор перехода (goto). Условный оператор (if-then-else). Оператор выбора (case-of). Примеры программ. Лабораторная работа № 4. Организация циклических процессов (операторы цикла). Пример программы. Лабораторная работа № 5. Регулярные типы данных (массивы). Строковые типы данных (строки символов). Примеры программ. Лабораторная работа № 6. Кoмбинированные типы (записи). Фиксированные записи. Пример программы, использующей запись. Лабораторная работа № 7. Комбинированные типы (записи). Записи с вариантами. Пример программы, использующей запись с вариантами. Лабораторная работа № 8. Файловый тип данных. Операции над файлами. Примеры программ. Лабораторная работа № 9. Текстовые файлы. Процедуры и функции для работы с текстовыми файлами. Пример программы.
3
10 15 19 21 25 28 31 35
49 Лабораторная работа № 10. Графические средства Турбо-Паскаля. Переход в графический режим и выход из него. Проверка ошибок инициализации. Работа с пикселами графического экрана. Пример программы. 38 Лабораторная работа № 11. Отображение линейных объектов. Отображение сплошных объектов. Примеры программ. Лабораторная работа № 12. Вывод текста в графическом режиме. Пример программы. Библиографический список
41 45 47
Стариков Александр Вениаминович Кулешова Галина Викторовна Информатика: Методические указания к лабораторным занятиям для студентов специальности 060800 − “Экономика и управление на предприятиях лесного комплекса”. Программирование на языке Турбо-Паскаль 6.0. Редактор Н.В. Гусятникова Подписано в печать Формат 60 × 84 1/ 16. Заказ № . Объем 3,06 п.л. Усл. п.л. 2,84 . Уч.-изд. л. 3,12 . Тираж 100 экз. РИО ВГЛТА. 394613, г. Воронеж, ул. Тимирязева, 8. Типография ЦНТИ. 394030, г. Воронеж, пр-т Революции, 30.