pascal_ochniki_118.ppt
- Количество слайдов: 118
Pascal
ПОНЯТИЕ АЛГОРИТМА И ПРОГРАММЫ Основной причиной широкого внедрения алгоритмизации различных процессов является появление нечисловых задач, сейчас по сравнению с числовыми задачами они имеют гораздо больший удельный вес. Точного, строгого понятия алгоритма дать нельзя. Слова "указание", "инструкция", "предписание" и т. д. это синонимы. (Аналогия с понятием множества в математике). Алгоритм - это фундаментальное понятие информатики, понимаемое интуитивно, о вычислении некоторой функции.
ОСНОВНЫЕ СВОЙСТВА АЛГОРИТМА 1) СВОЙСТВО МАССОВОСТИ АЛГОРИТМА Алгоритм имеет некоторое число входных величин - аргументов и некоторое число выходных величин – результатов и он может и должен применяться для решения целого класса однотипных задач 2) СВОЙСТВО ПОНЯТНОСТИ АЛГОРИТМА Алгоритм должен быть понятен исполнителю. 3) СВОЙСТВО ДИСКРЕТНОСТИ АЛГОРИТМА Алгоритм имеет дискретную структуру - выполняется шаг за шагом. 4) СВОЙСТВО КОНЕЧНОСТИ АЛГОРИТМА Алгоритм должен выполняться за конечное число шагов. 5) СВОЙСТВО ОПРЕДЕЛЕННОСТИ АЛГОРИТМА Каждый шаг алгоритма должен быть строго определен. 6) СВОЙСТВО ЭФФЕКТИВНОСТИ АЛГОРИТМА Алгоритм должен быть выполнен за конечное (разумное) время.
Центральным понятием информатики является понятие программы. Программа это описание алгоритма на некотором языке программирования, она фиксирует язык и форму алгоритма для компьютера. Кроме алгоритма программа описывает и структуры данных задачи на языке программирования: Программа = Алгоритм + Структуры данных это модели реальных объектов с их связями, которые и обрабатывает алгоритм (константы, переменные, массивы, очереди, стеки, записи, файлы и т. д. ).
Каждой программе соответствует единственный алгоритм, который вычисляет функцию данной программы. Обратное не верно, алгоритм может представляться различными программами. Программа это частный случай отображения: Множество данных Программа ----> Множество результатов Программирование это способ преставления функций на компьютере. Программа представляется текстом: последовательностью символов, кодирующей данные и действия над ними.
Программирование это способ представления функций (в широком смысле) на компьютере. Программа представляется текстом, последовательностью символов, кодирующих данные и действия над ними. Программа является семиотической системой, состоящей из трех компонентов: 1) Прагматика - устанавливает цель программы. 2) Семантика - вскрывает функцию программы, смысл ее текста. 3) Синтаксис - форма существования текста программы. Семиотика - это наука о знаковых системах.
ЯЗЫКИ ПРОГРАММИРОВАНИЯ Язык программирования - средство представления множества всевозможных текстов программ, которое ограничено синтаксическими правилами построения текстов программ. При построении программы необходимо следить за корректностью ее семантики и синтаксиса. Синтаксически корректные тексты включают в себя семантически корректные тексты. Построить язык программирования с только семантически корректными текстами нельзя поскольку это неалгоритмическая задача.
Все языки программирования можно условно разделить на два класса: I. Языки программирования низкого уровня - машинные языки. Эти языки представляют собой систему команд и адреса ячеек памяти компьютера. При этом выполняются два фундаментальных принципа фон Неймана: 1) принцип произвольного доступа к основной памяти (в любой момент процессору доступна любая ячейка). 2) принцип хранимой программы (программа хранится в памяти компьютера вместе с данными). Достоинством такого рода языков является эффективность исполнения написанных на них программ. Недостаток заключается в громоздкости и неудобочитаемости программ, трудно тиражировать пакеты программ.
II. Языки программирования высокого уровня - проблемно ориентированные языки. Это языки ориентированные на решение определенного типа задач (Фортран, Алгол, Кобол, PL/1, Pascal, d. Base, Clipper, Clarion и т. д. ). Эти языки называют еще трансляторы - они переводят понятные, близкие к естественным языкам тексты программ на машинные языки. Существуют еще промежуточные – машинно-ориентированные языки, в которых наряду с высокой организацией структуры сохраняется адрес ячейки (Ассемблер, Си и т. д. ).
Любой язык программирования включает в себя: 1) типы данных; 2) структуры данных; 3) переменные; 4) выражения; 5) операторы. Все эти компоненты вместе образуют так называемое программное управление.
СТРУКТУРА ПРОГРАММЫ Программа как текст обладает синтаксической структурой, под которой понимается упорядоченная совокупность объектов иерархической природы (предложение, слово, слоги, знаки и т. д. ). Примером структуры является следование объектов, вложение объектов и т. д. Чем развитее структура синтаксиса тем выше уровень языка программирования. Именно поэтому программирование является трудной семантической проблемой, сложность программирования это отношение числа выполняемых операторов программой к числу операторов записанных в тексте. Даже для простых программ это отношение больше 1010. Это возникает за счет циклов и подпрограмм.
ЭЛЕМЕНТЫ СТРУКТУРЫ ЯЗЫКА ПРОГРАММИРОВАНИЯ I. АЛФАВИТ Алфавит языка программирования это конечный набор символов (буквы, цифры, специальные знаки, ключевые слова и т. д. ). Алфавит является базисом для построения всех остальных конструкций языка. Программа составляется сцеплением символов алфавита в соответствии с системой синтаксических правил. Наличие ключевых слов (begin, end, if, then, else, . . . ) есть важная особенность алфавита, это позволяет улучшить понимание языка и приблизить его к естественному.
II. ОСНОВНЫЕ ОБЪЕКТЫ ЯЗЫКА ПРОГРАММИРОВАНИЯ Основными объектами языка программирования являются имена, выражения, операторы, описания и т. д. Их принято разделять на три большие категории: 1) ИНОРФМАЦИОННЫЕ СТРУКТУРЫ - это обрабатываемые данные, которые выступают объектами вычислений (константы, переменные, их свойства. . . ). Для обработки разнородных данных используется понятие типов данных. Тип данных это множество значений и набор операций над ними. Типы данных проводят различие между разнородными данными, предотвращают бессмысленные операции (например, сложение чисел и строк). Базовая фундаментальная роль есть у двух типов данных: целые - integer и логические (булевские) - boolean. Для удобства пользователей есть и другие (вещественные, литерные, строковые, ссылочные. . . ), но все они выражаются через два базовых типа.
Необходимо различать типы данных и структуры данных! Типы данных это абстракции, некоторые характерные свойства не связанные с представлением значений. Структуры данных связаны с конкретным представлением множества значения некоторого типа. Один и тот же тип данных может быть реализован разными структурами данных (например, двоичные числа, двоично-десятичные числа). К информационным структурам относится понятие имени. Оно вводится для оперирования со значениями, означает константу или переменную. Это аналог адреса в структуре данных. Его можно приписать функции, оператору, подпрограмме и т. д.
2) УПРАВЛЯЮЩИЕ СТРУКТУРЫ - представляют алгоритм вычислений. Их элементами являются операции, действия, которые вырабатывают значения. Существует два типа операций. Базисные операции +, -, *, not, and, =, >, <, <=, =>, <>, деление сюда не входит, оно не всегда выполняется. Дополнительные операции (встроенные) exp, ln, sqrt, sqr, sin, cos, . . Операции образуют выражения - аналог формулы вычисления, например: a*x-sin(x-y)*(x)
Выражение это объект программы способный вырабатывать значения, оно может содержать константы, переменные, специальные знаки, скобки т. е. средства операционной композиции. Каждому выражению приписывается некоторых тип, который вычисляет выражение. Таким образом выражение является суперпозицией операций. Однако суперпозиция недостаточна для алгоритмирования. Для того. чтобы закончить действие (куда-то деть полученное значение) нужен оператор. Оператор это конструкция языка программирования, представляющая законченное действие. Оператор не вырабатывает явно значения, а связывает значение выражения с другими объектами программы. Один оператор может изменить значения нескольких выражений.
Существует два типа операторов: Базисные операторы: 1) Оператор присваивания 2) Операторы ввода/вывода 3) Операторы вызова процедур 4) Оператор останова, пустой оператор Составные операторы: 1) Последовательность операторов 2) Оператор выбора (условного перехода) 3) Оператор цикла 4) Оператор рекурсии 5) Оператор безусловного перехода Существуют управляющие структуры более высокого уровня сложности, например подпрограммы, субпрограммы и т. д.
3) КОНТРОЛИРУЮЩИЕ СТРУКТУРЫ Это специальный класс структур языка программирования, который характеризует свойство данной структуры. Контролирующие структуры создают метаинформацию (информацию об информации для контроля ошибок на разных стадиях работы программы). Они осуществляют контроль за ходом выполнения программы.
Существует два вида контролирующих структур: - структура для характеризации данных (объявление данных, комментарий, избыточная информация об информационных структурах и т. д. ); - структура для характеризации вычислений. Для контроля вычислений могут вводиться логические выражения с булевскими результатами, проверяющие истину в нужной точке программы. Введение логических инвариантов в любую точку программы есть новый шаг в методологию программирования, поскольку программист использует два языка: язык программирования и некоторый логический язык (лексикон программирования). Это очень удобно для отладки и верификации программ. Получается аннотированная программа - специальный вид логической формулы.
Основные конструкции алгоритмического языка Turbo-Pascal для структурного программирования Введение Первоначально алгоритмический язык программирования Pascal был разработан в 69 - 70 -х годах профессором Цюрихской Высшей технической школы Николасом Виртом специально для обучения программированию. При своем создании он был избавлен от согласований, имеет единую концептуальную основу, очень компактный, легко обозримый и просто реализуется применительно к компьютеру (сравнительно не большой транслятор). Средства этого языка наиболее полно отражают идеологию структурного программирования, основным признаком которой являются технология нисходящего проектирования программ и их блочная структура. Это позволяет создавать удобные легко читаемые программы.
В этом языке применяется новая концепция структуры типов данных, согласно которой помимо стандартных типов данных программист имеет возможность сам создавать требуемый тип, наиболее полно отвечающий поставленной задаче. Впоследствии фирмой Borland International было выпущено несколько версий пакетов программирования Turbo-Pascal, включающих в себя расширения языка Pascal для компьютеров типа IBM PC. Язык программирования обладает расширенными возможностями по сравнению со стандартом, развитой библиотекой модулей, позволяющей создавать оверлейные структуры (когда программа загружается в оперативную память по частям), организовывать ввод/вывод, формировать графические изображения и т. д. Среда программирования позволяет создавать тексты программ, компилировать их, находить ошибки и оперативно их исправлять, компоновать программы из отдельных частей, включая стандартные модули, отлаживать и выполнять отлаженную программу. Пакет представляет пользователю также большой объем справочной информации.
Алфавит языка Pascal образован следующими элементами, которые можно разбить на несколько групп: 1) буквы латинского алфавита; 2) цифры 0 1 2 3 4 5 6 7 8 9; 3) знаки арифметических операций (+), (-), (*), (/); 4) знаки отношений (<), (<=), (>), (>=), (<>); 5) специальные символы (. ), (, ), (: ), (; ); 6) скобки ( ), [ ], { };
7) служебные слова: and, array, begin, case, const, div, downto, else, end, file, for, function, goto, if, in, label, mod, nil, not, of, or, packed, procedure, program, record, repeat, set, then, to, type, until, var, while, with; 8) стандартные идентификаторы: Константы false, true, maxint; Типы boolean, integer, chr, real, text; Файлы input, output; Функции abs, sqr, succ, pred, ord, char, trunc, eof, sin, cos, exp, ln, sqrt, arctan, eoln; процедурыget, put, reset, rewrite, read, write, new dispose, readln, writeln. Служебные слова и стандартные идентификаторы распознаются компилятором языка Turbo-Pascal без дополнительного описания их в тексте программы, при этом служебные слова при наборе программы автоматически выделяются другим цветом. Можно использовать большие и малые буквы, они компилятором не различаются.
Cтруктура программы Общая структура программы на языке Pascal состоит из заголовка, раздела объявления данных, разделов функций и процедур и тела программы: program < имя программы > (<параметры>); { Комментарий к программе } uses <объявление модулей>; label <описание меток>; const <описание констант>; type <описание типов данных>; var <описание переменных>; function <описание функции>; procedure <описание процедуры>; begin <тело программы, операторы> end.
Объекты раздела описаний и тела программы отделяются друг от друга точкой с запятой. Заголовок программы в Turbo-Pascal является не обязательным. Выражения в фигурных скобках {. . . } игнорируются компилятором языка Turbo-Pascal и служат комментарием к программе, объясняющим ее цель, приложения и особенности. Комментарий к программе автоматически выделяется другим цветом. Порядок размещения разделов является произвольным, можно создавать несколько одинаковых разделов. В любом месте программы можно использовать только те элементы, которые были раньше определены.
Пример 1. Составить программу вычисляющую сумму двух чисел. Program Example 1(input, output); {Заголовок программы} Var {Описание переменных} x, y, summa: real; Begin {Начало программы} Write('Введите числа х и у'); {Вывод сообщения на экран} Read(x, y); {Чтение двух чисел} summa: =x+y; {Вычисление суммы} Write('Сумма равна', summa); {Вывод результата} End.
Концепция и классификация типов данных В программировании до появления языка Pascal существовал некоторый фиксированный набор типов данных (целый, вещественный, булевский и т. д. ). То сеть тип данных являлся атрибутом переменных, процедур, функций и не был самостоятельным объектом. В языке Pascal, а затем в Turbo-Pascal впервые реализована новая концепция, согласно которой тип данных определяется самим программистом, он становится самостоятельным объектом, его можно создавать. Синтаксическая форма объявления типа данных такова: Type <имя типа 1> = <определение типа 1>; <имя типа 2> = <определение типа 2>; . . . . <имя типа N> = <определение типа N>;
В Turbo-Pascal можно выделить следующие группы типов: • простые (стандартные) типы • структурированные типы • ссылочные типы (указатели) • процедурные типы • объектные типы
Простые типы данных Простым типом данных называется такой тип, который не содержит в своем определении другого типа данных. Он определяет упорядоченное множество значений. В Pascal имеются следующие группы простых типов: • • • целый тип вещественный тип логический тип символьный тип перечисляемый тип интервальный тип (тип-диапазон)
Целые типы Значениями переменной целого типа являются целые числа. Они могут использоваться в программе для управления вычислительным процессом, поскольку в памяти ЭВМ представлены точно. Над данными целого типа могут выполняться операции сложения + вычитания - умножения * целочисленного деления div остаток от целочисленного деления mod Эти операции выполняются точно в пределах диапазона представимых целых чисел. В результате целочисленного деления всегда получается целое число. Например, 17 div 5 = 3.
В отличие от классического Pascal, в котором есть только один целый тип - Integer в Turbo-Pascal имеется пять стандартных типов данных. Они представлены в таблице: Тип Диапазон Формат Размер в байтах Shortint -128. . 127 Знаковый 1 Integer -32768. . 32767 Знаковый 2 Longint -2147483648. . 2147483647 Знаковый 4 Byte 0. . 255 Беззнаковый 1 Word 0. . 65535 Беззнаковый 2
Вещественные типы Значениями переменной этого типа являются вещественные числа. Они в памяти компьютера представляются приближенно в пределах диапазона представимых вещественных чисел. Вещественные числа записываются либо в форме с фиксированной десятичной точкой, например: 345. 454682, -1. 038475, либо в экспоненциальной форме, например, 314 E-2, -5. 9 E 43 Символ Е является признаком десятичного порядка. Операции над действительными числами: сложения + вычитания - умножения * деления /
В Pascal имеется пять стандартных действительных типов данных. Они представлены в таблице: Тип Диапазон Число значащих цифр Размер в байтах Real 2. 9*10 -39. . 1. 7*1038 11 -12 6 Single 1. 5*10 -45. . 3. 4*1038 7 -8 4 Double 5. 0*10 -324. . 1. 7*10308 15 -16 8 Extended 3. 4*10 -4932. . 1. 1*104932 19 -20 10 Comp 19 -20 8 -263+1. . 263 -1
Логический тип Значениями переменной логического типа (Boolean) являются две константы, обозначаемые с помощью стандартных идентификаторов True - истина и False - ложь. Над данными этого типа могут выполняться операции отрицания - not, коньюнкции - and, дизьюнкции - or. При этом справедливы следующие условия: False < True Succ(False)=True Pred(True)=False Ord(False)=0 Ord(True)=1
Символьный тип Значениями переменной символьного типа (Char) является символ. Множество допустимых символов различно для различных компьютеров. Как правило, в это множество входит полный набор так называемых ASCII - символов. Это латинский алфавит, цифры, специальные символы и т. д. Каждый символ имеет свой порядковый номер. Константы символьного типа записываются в апострофах, например, 'a', '5', '? ' и т. д.
Перечисляемый тип Значениями переменной этого типа являются константы создаваемого типа, определяемые программистом: Type <имя типа> = (c 1, c 2, . . . , c. N); Здесь с1. . с. N - идентификаторы констант созданного типа. Например : Type workday = (mon, tue, wed, th, fri); Здесь важен порядок, в котором перечислены идентификаторы. Первому присваивается порядковый номер 0, второму 1 и т. д.
Интервальный тип (тип - диапазон) Если задан некоторый скалярный тип данных, в котором установлены базисные отношения (<), (>), (<=), (>=), (<>), то интервальный тип задается указанием нижней и верхней границ Type <имя типа> = (<мин. значение>. . <макс. значение>); Например: Type month = (1. . 12);
Переменные целого, вещественного, логического, символьного и других типов описываются в программе в разделе описания с помощью стандартных и других идентификаторов. Например : var i 1, i 2, i 3: integer; l 1, l 2, l 3: longint; s 1, s 2, s 3: shortint; b 1, b 2, b 3: byte; w 1, w 2, w 3: word; r 1, r 2, r 3: real; z 1, z 2, z 3: single; d 1, d 2, d 3: double; e 1, e 2, e 3: extended; m 1, m 2, m 3: comp; b 1, b 2, b 3: boolean; c 1, c 2, c 3: char; dd: workday; mm: month;
Выражения Выражение в Pascal это синтаксический объект языка определяющий способ вычисления некоторого значения. Выражение может содержать константы, переменные, знаки арифметических, логических и других операций, специальные знаки, скобки т. е. средства операционной композиции. Кроме того выражения могут содержать некоторые встроенные стандартные функции. Их неполный перечень приведен в следующей таблице: Арифметические функции Функция Назначение Тип результата Abs(x) Абсолютное значение аргумента Совпадает с типом х Arc. Tan(x) Арктангенс аргумента Вещественный Cos(x) Косинус аргумента Вещественный Exp(x) Экспонента Вещественный Frac(x) Дробная часть числа Вещественный Int(x) Целая часть числа Вещественный Ln(x) Натуральный логарифм Вещественный Pi Значение числа пи Вещественный Sin(x) Синус аргумента Вещественный Sqr(x) Квадрат аргумента Совпадает с типом х Sqrt(x) Квадратный корень аргумента Вещественный
Функции преобразования типа Функция Назначение Тип результата Chr(x) Преобразование кода в символ Символьный High(x) Максимальное значение величины Word Low(x) Минимальное значение величины Word Ord(x) Возвращает порядковый номер Longint Round(x) Округление вещественного числа Longint Trunc(x) Выделение целой части Longint Функции для величин порядкового типа Функция Назначение Тип результата Odd(x) Проверяет нечетность (нечетный аргумент True, четный - False) Boolean Pred(x) Возвращает предшествующее значение Порядковый тип Succ(x) Возвращает предыдущее значение Порядковый тип
Каждому выражению приписывается некоторых тип, который его вычисляет. Таким образом выражение является суперпозицией операций. Вот некоторые примеры выражений на языке Turbo. Pascal: • x+y+z; • (x+y)/z +sin(exp(-v*w); • abs(sqrt(1 -x*x)); • a and b or c • (x<0) and not((y>0) or (z<>0));
Операторы Оператор присваивания Выше мы отмечали , что оператор это конструкция языка программирования, представляющая законченное действие, он не вырабатывает явно значения, а связывает значение выражения с другими объектами программы. Одним из базисных операторов в языке Turbo-Pascal является оператор присваивания, который в общем случае имеет вид <переменная> : = <выражение>; При этом слева и справа от знака присваивания ( : = ) объекты должны иметь одинаковый тип данных. Например, Type dec = (0. . 9); Var c, k: dec; k: =8; c: =k-2; Оператор присваивания выполняется над любыми типами переменных
ОПЕРАТОР БЕЗУСЛОВНОГО ПЕРЕХОДА GOTO Любой оператор языка Turbo-Pascal может быть помечен меткой. Метки в Turbo-Pascal могут быть целым числом без знака от 0 до 9999 или обычным идентификатором, при этом один оператор может быть помечен только одной меткой. Метка располагается перед оператором, отделяясь от него двоеточием, например : 5: writeln(x, y, z); 17: end. Метка не влияет на выполнение оператора. Все метки должны быть описаны в разделе описаний программы. Это описание состоит из служебного слова Label и списка всех меток программы, например^: Label 1, 2, Metka;
Операторы программы выполняются в том порядке, в каком они написаны. Изменить этот порядок можно с помощью оператора безусловного перехода. Оператор безусловного перехода состоит из специального служебного слова Goto, за которым следует метка. Например : Goto 2. Этот оператор прерывает естественную последовательность операторов программы и заставляет выполняться оператор, помеченный меткой.
ПУСТОЙ ОПЕРАТОР Этот оператор представляет собой пустую совокупность символов, как правило, помеченных меткой, например: . . . Out: End. Здесь перед End расположен пустой оператор c меткой Out. Основное назначение пустого оператора - дать возможность выхода из середины программы или составного оператора.
Составной оператор представляет собой совокупность последовательно выполняемых операторов, заключенных в операторные скобки Begin, End. Составной оператор в языке Turbo -Pascal имеет общий вид: Begin <оператор 1>; <оператор 2>; . . . <оператор N> End; Вся конструкция (Begin. . . End) выполняется как один оператор, операторы отделяются друг от друга точкой с запятой , перед словом End точка с запятой не ставится. Например, Begin x: =z+y; x: =2*x+1; x: = x/(z-y) End; Составной оператор необходим в тех случаях, когда по правилам построения конструкций языка Turbo-Pascal можно использовать один оператор, а выполнить нужно несколько действий. Можно считать, что тело самой основной программы является составным оператором.
Условный оператор If-Then-Else Условный оператор If-Then-Else реализует алгоритмическую конструкцию ветвления и изменяет порядок выполнения программы в зависимости от истинности или ложности некоторого условия. Структура условного оператора в языке Turbo-Pascal имеет вид If <логическое условие> Then <оператор 1> Else <оператор 2> Если логическое условие истинно, то выполняется оператор 1, если - ложно, то оператор 2. Условный оператор является единым предложением, ни перед Then, ни перед Else точку с запятой ставить нельзя. Например, If x<0 Then y: =x*x Else y: =sqrt(x); Можно использовать укороченный вариант этого оператора If <логическое условие> Then <оператор 1>; В этом случае при ложном логическом условии выполняется следующий за условным оператор программы. If x>10 Then y: =5*x*x; При составлении сложных программ вложение условных операторов друга не рекомендуется.
Условный оператор case (оператор варианта) Условный оператор Case реализует алгоритмическую конструкцию множественного ветвления и направляет порядок выполнения программы по одному из многих вариантов в зависимости от значения некоторого селектора. Конструкция оператора выбора в Turbo-Pascal имеет вид: Case <селектор> Of m 1: <оператор 1>; m 2: <оператор 2>; . . . . m. N: <оператор N>; Else <оператор Е> End; Cелектор - это выражение любого скалярного типа, значение которого вычисляется, m 1, m 2, . . . , m. N - константы того же типа , что и селектор.
При совпадении селектора с одной из констант будет выполняться соответствующий оператор. Например, Case i Of 0, 2, 4, 6, 8: Write. Ln('Четная цифра'); 1, 3, 5, 7, 9: Write. Ln('Нечетная цифра'); 10. . 100: Write. Ln('Число от 10 до 100'); Else Write. Ln('Отрицательное число или больше 100') End; Оператор Е выполняется в том случае, если селектор не совпадает ни с одной из констант, причем конструкция Else <оператор Е> является необязательной. Следует отметить, что константы оператора выбора Сase не имеют ничего общего с обычными метками операторов, даже тогда, когда они являются целыми числами.
Операторы цикла Оператор цикла с предусловием Общая структура оператора цикла с предусловием имеет вид: While <логическое условие> Do Begin <оператор 1>; <оператор 2>; . . . <оператор N> End; Оператор цикла While - Do организует выполнение одного оператора неизвестное заранее число раз. Тело цикла выполняется до тех пор, пока условие истинно; выполнение прекращается, если условие становится ложным.
Пример 1. Составить программу на языке Turbo-Pascal решения нелинейного уравнения f(x) = 0 методом итераций с точностью до 0. 0001. f(x) = x - cos(x*x+1) Решение: Для решения задачи методом итераций запишем исходное уравнение в виде x = cos(x*x+1). Program iter; Uses Crt; Const eps=0. 0001; Var x, y : Real; Begin Writeln('Введите нулевое приближение x 0'); Read (y); x: =y+1; While (Abs(x-y) < eps) Do Begin x: =y; y: = cos(x*x+1); End; Writeln('Решение уравнения : x=', x); Repeat Until Key. Pressed End.
Оператор цикла с постусловием Общая структура оператора цикла с постусловием имеет вид: Repeat Until <оператор 1>; <оператор 2>; . . . <оператор N> <логическое условие>; Оператор цикла Repeat - Until организует выполнение нескольких операторов неизвестное заранее число раз. Тело цикла выполняется до тех пор, пока условие ложно, выполнение прекращается, если условие становится истинным. В отличие от оператора цикла While - Do этот оператор цикла всегда выполнится хоть один раз.
Пример 2. Составить программу на языке Turbo-Pascal решения нелинейного уравнения f(x) = 0 методом итераций с точностью до 0. 0001. f(x) = x - cos x Решение: Для решения задачи методом итераций запишем исходное уравнение в виде x = cos x. Program iter (Input, Output); Uses Crt; Const eps=0. 0001; Var x, y : Real; Begin Writeln('Введите нулевое приближение x 0'); Read (y); Repeat x: =y; y: = cos(x); Until (Abs(x-y) > eps); Writeln('Решение уравнения : x=', x); Repeat Until Key. Pressed End.
Операторы цикла с параметром Конструкции операторов циклов с параметром имеют вид: For <параметр>: =<начальное знач. > To <конечное знач. > Do Begin <оператор 1>; <оператор 2>; . . . <оператор N> End; For <параметр>: =<конечное знач. > Down. To <начальное знач. > Do Begin <оператор 1>; <оператор 2>; . . . <оператор N> End;
Операторы цикла For организуют выполнение одного оператора заранее известное число раз. Тело циклов этих операторов выполняется до тех пор, пока параметр не достигает конечного или начального значения, соответственно. Тип начального и конечного значений должен быть таким же, что и у параметра. Эти значения не должны изменяться в процессе выполнения цикла.
Структурированные типы данных определяют наборы однотипных или разнотипных компонентов, при этом типы компонентов образуются из других, например, простых типов данных. В языке Turbo-Pascal существует пять структурированных типов данных: • • • тип - массив тип - строка тип - запись тип - множество тип – файл
Тип - массив Составной тип данных массив представляет собой способ композиции однотипных данных. При описании массива указывается число его компонент, которое остается постоянным во время всего выполнения программы. Все компоненты массива имеют общее имя, доступ к любой отдельной компоненте осуществляется с помощью индексов. Объявления массива в программе имеют вид: type <имя массива>=array[<тип индекса>] of [тип компонент>]; Например: type vector=array[1. . 50] of integer; {одномерный массив} type matr=array[1. . 10, 1. . 20] of real; {двумерный массив} Обьявление переменных в программе имеет вид: var x: vector; y: matr;
Размерность массива может быть любой, компоненты массива могут быть любого (в том числе и структурированного типа), индексы могут быть любого порядкового типа, кроме типа Long. Int. Доступ к компонентам массива осуществляется указанием имени массива, за которым в квадратных скобках помещается значения индексов компонента. Например: vector[2] matr[x, y] M 2[Succ(i)] Одному массиву можно присвоить значения другого массива, но только идентичного типа. Например, если заданы массивы var A, B : array[1. . 5] of integer; C : array[1. . 5] of integer; то допустим оператор: A : = B; но не допустим оператор: С : = A; так как массивы А и С - не идентичных типов.
Тип - строка В языке Turbo-Pascal тип - строка (стандартный тип string) есть последовательность символов произвольной длины ( до 255 символов). У типа - строки в квадратных скобках может быть указан его размер от 1 до 225. Если размер строки не указан он считается равным 255, например: Str: string[80]; Max. Str: string; Const January: string[10]='Январь; Для строк имеют место операции конкатенации (+) и сравнения Например: Str 1: ='Turbo-'; Str 2: ='Pascal'; Str : =Str 1 + Str 2; Или if str = 'Turbo-Pascal' then writeln ('OK!'); Сравнивать строки можно разной длины, сравнение происходит слева направо в соответствии с кодами символов.
Тип - запись В отличие от типа - массива составной тип данных запись определяет способ композиции разнотипных данных. Тип-запись включает ряд компонент, называемых полями, которые могут быть разных типов. Общая структура этого типа имеет вид: type <имя записи> = record s 1 : t 1; s 2 : t 2; . . . . s. N : t. N end; Здесь si - имя i-го поля записи, ti - тип поля записи. Например, type time = record hour : 1. . 24; min : 1. . 60; sec : 1. . 60 end; var x : time;
Обращение к записи осуществляется указанием переменной и соответствующего поля, например, x. hour: =12; x. min: =45; x. sec: =35 Для того чтобы не выписывать каждый раз имя записи при обращении к ее полям, можно использовать оператор над записями With. Его структура имеет вид: With <имя записи> Do <оператор>; В этом случае внутри оператора можно указывать только поле записи, например фрагмент With x do begin hour: =12; min: =45; sec: =35 end; эквивалентен предыдущему.
Тип - множество Составной тип - множество это тип данных образуемый над некоторым базовым типом так, что в переменная множественного типа имеет в качестве значения множество всевозможных сочетаний объектов исходного множества. Число элементов исходного множества в Pascal не может быть больше 256, а порядковые номера элементов (значения функции Ord) должны находится в пределах от 0 до 255. В общем случае задание множественного типа имеет вид: type <имя типа> = set of <имя базового типа>; Например: type a = set of (0. . 2); Множеству в программе можно присвоить то или иное значение. Это выполняется с помощью конструктора множеств. Конструктор множеств задает множество элементов с помощью перечисления в квадратных скобках выражений, значения которых дают элементы этого множества. Например [Plus, Minus] [1. . K mod 12, 15] Chr(0). . Chr(31), 'A', 'B']
В каждое множество включено и пустое множество [ ]. Над переменными множественного типа могут выполняться операции: + объединение множеств, * пересечение множеств, - разность множеств, = проверка эквивалентности двух множеств, <> проверка неэквивалентности двух множеств, <= проверка включения левого множества в правое, >= проверка включения право-го множества в левое, in проверка принадлежности элемента слева в множество справа. Результатом операций объединения, пересечения , разности является соответствующее множество, остальные результаты дают результат логического типа.
Тип - файл представляет собой одну из разновидностей типов данных, которая отражает структуру исходных и входных данных, расположенных на внешних носителях (магнитных дисках). Файл представляет собой структурно организованный последовательный упорядоченный набор компонентов данных, при этом число компонентов файла не объявляется. Описание этого типа данных в программе имеет вид: type <имя файла> = file of <имя базового типа>; Например: type f = file of real; type g = file of char; var x: f; y: g; Для ввода, вывода и обработки текстовой информации в Turbo -Pascal используется стандартный файловый тип Text, например type letter : text;
С переменными файлового типа можно выполнять стандартные процедуры: начальной установки reset(f), чтение файла по компонентам get(f), стирание rewrite(f), запись в файл put(f). Для ввода и вывода информации на экран монитора в языке Turbo. Pascal существует два стандартных файла input, output. Файл input можно только читать, запись в этот файл запрещена, запрещен также возврат к прочитанной позиции (просмотр файла input возможен только один раз). В файл output возможна только запись, его чтение запрещено (запись в файл output возможна только один раз).
ДИНАМИЧЕСКИЕ ТИПЫ ДАННЫХ Рассматриваемые до сих пор параметры программы имели общее для них свойство, заключающееся в том что под них заранее выделяется определенный объем памяти и между ними устанавливаются определенные связи еще на этапе компиляции и компоновки программы. Во время работы программы вносить какие либо изменения в выделенный объем памяти или установленные связи нельзя. Это порой является очень неудобно. Например, размер массива должен быть известен заранее и определять максимальное количество своих возможных членов, даже если это не нужно. Это приводит к неэффективному использованию оперативной памяти.
В языке Turbo-Pascal есть возможность по ходу выполнения программы выделять и освобождать память для размещения в ней различных данных. Таким образом можно организовывать динамические, изменяющие размеры структуры данных. Оперативная память при этом используется наиболее эффективно. Это обеспечивается в Turbo-Pascal особого типа данных, который называется тип - указатель или ссылочный тип. Область оперативной памяти, где можно выделять отдельные участки для размещения данных и освобождать их называется областью динамической памяти или просто динамической памятью.
ТИП - УКАЗАТЕЛЬ (ССЫЛОЧНЫЙ ТИП) Тип - указатель или ссылочный тип данных служит для создания динамических переменных. В отличие от других типов данных, дающих жесткое соответствие между переменной и ее местом в памяти компьютера, ссылочный тип позволяет заниматься отведением и освобождением памяти для размещения объектов по ходу выполнения программы. Общий вид описания этого типа в программе имеет вид: type <имя ссылочного типа> = ^<имя базового типа>; Например: type p = ^t;
Если переменная p является переменной ссылочного типа ^t, то переменная типа p^ становится переменной базового типа t. Например: Type pint = ^integer; w = array[1. . 50] of real; p = ^w; Var n: pint; u: ^w; . . . . При этом допустимы операторы: Read(n^); n^: =n^+1; u^[1]: =1; u^[2]: =u^[n^]+1;
Для отведения места в памяти компьютера для объекта типа t используется стандартная процедура new(p). Для освобождения этой памяти используется стандартная процедура dispose(p). Одним из объектов любого ссылочного типа всегда является пустая ссылка nil 2. В программировании часто в рамках одной программы приходится решать несколько задач с данными различных типов. Применение динамических типов данных позволяет в таком случае экономно и эффективно использовать оперативную память компьютера. Под объект отводится физическая память только тогда. когда в этом есть необходимость, и эта память освобождается, когда необходимость в ней исчезает.
П р и м е р. Дано 10 000 действительных чисел a[i] и 8 000 натуральных чисел b[i] <= 8 000. Вывести числа a[i] в обратном порядке. Затем вывести то число b[k], номер которого k равен минимальному из чисел b[i]. Р е ш е н и е: program point(input, output); type ra = array[1. . 10 000] of real; ia = array[1. . 8 000] of integer; pr = ^ra; pint = ^ia; var k, i: integer; f : pr; g : pint; begin new(f); for i: =1 o 10 000 do read(f^[i]); for i: 000 downto 1 do writeln(f^[i]); dispose(f); new(g); read(g^[1]); k: =g^[1]; for i: =2 to 8 000 do begin read(g^[i]); if g^[i]
В этой программе сначала отводится место для массива ra. Пере- менные f^[i] получают значения, равные действительным числам. После решения первой части задачи выделенное место в памяти для объектов типа ra освобождается с помощью процедуры dispose(f). После этого отводится место в памяти для массива типа ia и решается вторая часть задачи. Память для объектов типа ra и ia выделяется поочередно, так что они могут располагаться в пересекающихся областях памяти компьютера.
ПОДПРОГРАММЫ В ЯЗЫКЕ TURBO - PASCAL Механизм подпрограмм в языке Turbo-Pascal дает возможность расчленить исходную крупную задачу на более мелкие подзадачи и тем самым снизить уровень сложность программы. Этот механизм в языке Turbo-Pascal реализуется в виде процедур и функций. Структура любой подпрограммы должна быть написана до того, как она будет использована в программе или другой подпрограмме. В языке Turbo-Pascal имеется две разновидности подпрограмм процедуры и функции. Различие между ними состоит в том, что после выполнения подпрограмма - функция возвращает одно значение, а подпрограмма - процедура может возвращать несколько значений. Все параметры, которые использует подпрограмма можно разбить на две категории: локальные параметры, объявленные внутри подпрограммы и доступные только ей самой, и глобальные параметры, объявленные в основной программе и доступные как программе, так и всем ее подпрограммам.
П Р О Ц Е Д У Р Ы Подпрограмма - процедура предназначена для выполнения некоторой законченной последовательности действий. Процедура должна быть описана в разделе описаний основной программы. Для выполнения процедуры в программе должен быть предусмотрен оператор вызова процедуры. Общая структура процедуры в языке Turbo-Pascal имеет вид: procedure <имя процедуры> (<список формальных параметров>); <описание локальных обьектов>; begin <тело процедуры> end; Формальные параметры подпрограммы указывают, с какими параметрами следует обращаться к этой подпрограмме (количество параметров, их последовательность и типы).
Имена списка формальных параметров отделяются друг от друга запятой и делятся на четыре категории: 1) параметры, вызываемые по значению (параметры - значения); 2) параметры, вызываемые по ссылке (параметры - переменные); 3) параметры - константы (только для Turbo-Pascal 7. 0); 4) параметры процедурного типа. При обращении к подпрограмме формальные параметры заменяются на соответствующие фактические параметры вызывающей программы или подпрограммы. Опишем подробно первые три категории параметров.
1) Параметры - значения передаются основной программой в процедуру и они не могут быть изменены в процессе выполнения процедуры. Параметр - значение указывается в заголовке процедуры своим именем и через двоеточие - типом. Тип параметра - значения может быть любым, кроме файлового. Если параметров значений одного типа несколько, их можно объединить в одну группу, перечислив их имена через запятую, а затем уже указать их общий тип. При этом отдельные группы параметров отделяются друг от друга точкой с запятой.
2) Процедура имеет доступ к параметрам - переменным и может их изменять в процессе выполнения процедуры. Параметры - переменные отделяются от остальных служебным словом var, при этом действие служебного слова var распространяется до ближайшей точки с запятой (в пределах одной группы). Например: procedure mult (x, y: integer; var 2 0 z: integer); {Процедура умножения целых чисел} var n: integer; begin n: =y; z: =0; repeat z: =z+x; n: =n-1 until (n=0) end;
3) Кроме параметров - значений и параметров - перемнных существуют еще параметры - константы. Их используют тогда, когда нужно передать в процедуру переменную но изменять ее подпрограмма не должна. Параметр - константа указывается служебным словом const, действие которого также распространяется до ближайшей точки с запятой. Например: procedure newstr(const s: string); Вызов этих процедур в теле основной программы осуществляется следующим образом: mult(5, 3; product); newstr('Turbo-Pascal'); Здесь фактические параметры по значению (5, 3) отделяются от фактических параметров - переменных по ссылке (product) точкой с запятой.
Ф У Н К Ц И И Общая структура подпрограммы - функции в языке Turbo-Pascal имеет общий вид: function <имя функции> (<список формальных параметров>): <тип функции>; { Комментарий функции } <описание локальных обьектов>; begin <тело функции> end; П р и м е р. Функция вычисления факториала. function factorial(n: byte): longint; var fact: longint; i: byte; begin fact: =n; for i: =n-1 downto 2 do fact: =ct*i; factorial: =ct end;
Вызов функции в теле основной программы осуществляется следующим образом: s: = factorial(50);
РЕКУРСИВНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ В языке Turbo-Pascal допускается вызов подпрограммой самой себя. Такой вызов называется рекурсивное обращение. Эта возможность обусловлена тем, что при каждом новом обращении к подпрограмме параметры, которые она использует, заносятся в память (в так называемый стек) причем параметры предыдущего обращения тоже сохраняются. В ряде случаев (как правило для рекурсивных алгоритмов) рекурсивное оформление подпрограммы может быть более компактным и эффективным, но не следует забывать об опасности переполнения стека. function factorial(n: byte ): longint; begin if (n = 0) or (n+1) then factorial: =1 else factorial: =n*factorial(n-1) end;
ОРГАНИЗАЦИЯ ВВОДА/ВЫВОДА В ЯЗЫКЕ TURBO-PASCAL В языке Turbo-Pascal ввод/вывод информации осуществляется через файловые переменные. Перед тем как осуществить вводвывод, файловая переменная работающей программы должна быть связана с конкретным внешним файлом на внешнем устройстве. Таким устройством может быть магнитный диск, клавиатура, дисплей, принтер и т. д. Этот файл должен быть открыт для чтения или записи, после этого можно осуществлять организацию ввода/вывода. В языке Turbo-Pascal имеются две стандартные файловые переменные для текстовых файлов: Input и Output. Переменная input по умолчанию связана с клавиатурой, а переменная output - с экраном дисплея. Эти устройства автоматически открываются при запуске программы и автоматически закрываются после завершения программы.
Первая стандартная процедура ввода данных в программу с клавиатуры компьютера имеет вид: Read(<список переменных>); Например: Read(x); Read(x, y, z); После выполнения этой процедуры соответствующим переменным присваиваются значения, вводимые с клавиатуры монитора ( из стандартного файла input). Вторая стандартная процедура ввода данных в программу с клавиатуры компьютера имеет вид: Read. Ln(<список переменных>); Например: Read. Ln(x); Read. Ln(x, y, z);
Отличие процедуры Read. Ln от Read заключается в том, что во в ней непрочитанная часть строки (вместе с признаком конца строки) пропускается. Первая стандартная процедура вывода результатов данных на экран имеет вид: Write(<список переменных>); Например: Write(x); Write(x, y, z);
После выполнения этих процедур на экран дисплея (в стандартный файл output) выводятся значения соответствующих переменных. Вторая стандартная процедура вывода результатов данных на экран имеет вид: Write. Ln(<список переменных>); Например: Write. Ln(x); Write. Ln(x, y, z); Отличие процедуры Write. Ln от Write заключается в том, что после ее выполнения курсор переводится на первую позицию следующей строки. Процедура Write. Ln без параметров осуществляет пропуск строки.
При выводе числовых результатов процедуры Write и Write. Ln представляют их в бесформатной - экспоненциальной форме, что часто является неудобным, особенно при оформлении отчетов. Для задания формата значения переменной в процедурах вывода следует указать общее число позиций выводимого значения и число позиций, отводимое под его дробную часть. Например: Write. Ln(x: m: n); Здесь m - число позиций всего числа, n - число позиций его дробной части. Для вывода текста на экран дисплея в процедурах Write и Write. Ln используются строковые переменные и константы. Например: Str: = 'Введите значения массива А'; Write. Ln(Str); Write('Вывод текста на экран дисплея');
В тех случаях, когда необходимо осуществить ввод данных в программу из хранимого на диске файла с именем Data, а вывод данных произвести также на диск во внешний файл с именем Result, то необходимо связать эти файлы с программными файловыми переменными D и R с помощью стандартной процедурой Assing. Например: Assing(D, 'Data' ); Assing(R, 'Result'); После этого процедуры ввода/вывода с внешнего носителя на внешний носитель принимают вид: Read(D, <список переменных>); Read. Ln(D, <список переменных>); Write(R, <список переменных>); Write. Ln(R, <список переменных>);
При этом файлы D и R должны быть описаны в разделе описаний программы. Перед использованием внешних файлов Data и Result они должны быть открыты с помощью файловых переменных D и R и стандартных процедур: Reset(D) - открытие существующего файла Data и Rewrite(R) - открытие нового файла Result. После выполнения программы внешние файлы Data и Result должны быть закрыты с помощью файловых переменных D и R и стандартной процедуры: Close(D); Close(R); Если D и R являются текстовыми файлами, то они описываются с помощью стандартного типа Text. Var D, R: Text;
Пример. Дано 100 действительных чисел a[i] во внешнем файле Mass на диске. Вывести числа a[i] в обратном порядке и записать результат во внешний файл New. Mass program revers; var i: integer; a: array[1. . 100] of real; f: file of integer; g: text; begin assign(f, 'mass'); reset(f); for i: =1 to 100 do read(f, a[i]); assign(g, 'newmass'); for i: = 0 downto 1 do writeln(g, a[i]); close(f); close(g) end. Для открытия файла и добавления информации в его конец в Turbo. Pascal существует стандартная процедура Append(f).
МОДУЛИ В ЯЗЫКЕ TURBO - PASCAL В классическом стандарте языка Pascal были предусмотрены только внутренние процедуры, которые должны были включаться в текст программы непосредственно, как это описано выше. Это иногда бывает не совсем удобно, поскольку при решении больших задач программа становится слишком массивной и труднообозримой. Кроме того отсутствие в языке внешних процедур не позволяет создавать профессиональную библиотеку подпрограмм. Позднее в реализациях Turbo-Pascal начиная с версии 4. 0 был учтен этот недостаток и появилась возможность при выполнении программы подключать к ней внешние подпрограммы и файлы. Это достигается двумя способами - применение так называемых директив компилятора и применение новых объектов программирования в Turbo-Pascal - модулей.
Для того, чтобы включить в программу текст хранимый на диске в некотором файле, необходимо в нужном месте программы поставить директиву компилятора {$I <имя файла>} при этом имя файла должно содержать путь к нему, например директива {$I c: pascalusermodul 1. pas} включит в текст программы текст хранимый в файле modul 1. pas. Если путь к файлу не указан, то компилятор будет его искать только в текущей директории.
Применение этой директории позволяет разбивать текст программы на небольшие сегменты, которые впоследствии могут быть собраны вместе. Кроме того отдельные файлы, оформленные например в виде отдельных процедур и функций, могут использоваться в различных однотипных программах и не переписываться каждый раз заново при их составлении. Более сильным средством организации внешних подпрограмм в языке Turbo-Pascal является аппарат модулей, наличие которого позволяет программировать и отлаживать программу по частям, создавать библиотеки подпрограмм и данных, пользоваться возможностями стандартных модулей и т. д.
Конструкция языка программирования Turbo-Pascal модуль состоит из нескольких частей: 1) Заголовок модуля состоит из служебного слова Unit и имени программы. Сам модуль должен быть помещен в файл, имя которого совпадает с именем модуля, а его расширение должно быть . pas 2) Интерфейс модуля Через интерфейс модуля осуществляется взаимодействие основной программы с модулем (или модуля с модулем). В интерфейсе указываются константы, типы, переменные, процедуры и функции, которые могут быть использованы основной программой (модулем) при вызове этого модуля. Интерфейс начинается со служебного слова interface. Далее после служебного слова uses указываются имена используемых здесь модулей, затем следует раздел описаний констант, типов, переменных и т. д.
3) Исполнительная часть модуля включает все его подпрограммы. Она может также включать локальные метки, константы, типы, переменные и т. д. Исполнительная часть модуля начинается служебным словом implementation, далее следуют имена модулей, раздел описаний и описания используемых подпрограмм. 4) Секция инициализации модуля применяется для установления его связи с какими-либо файлами и для инициализации переменных. Эта секция начинается словом Begin, после которого идут исполняемые операторы и заканчивается словом End. (с точкой). Если инициализация модуля не нужна, то в секции помещается лишь слово End. (с точкой).
Первые три раздела модуля являются обязательными, последовательность разделов так же является обязательной. Таким образом общая структура модуля имеет вид: Unit <имя модуля>; Interface; <описание объектов используемых основной программой> Implementation; <описание локальных объектов используемых модулем> Begin <операторы инициализации модуля> End.
Для того чтобы избежать многократного описания в различных программах некоторых общеупотребительных типов данных, можно сосредоточить их в одном модуле. Рассмотрим, например, модуль, связанный с описанием дат, месяцев, дней и т. д: Unit Calendar; Interface Type Days = (Mon, Tue, Wed, Thu, Fri, Sat, San); Months = (Jan, Feb, Mar, Apr, May, June, July, Aug, Sept, Oct, Nov, Decem); Work. Days = Mon . . Fri; Summer = June . . Aug; Autumn = Sept . . Nov; Spring = Mar . . May; Winter = Decem. . Feb; Day. No = 1 . . 31; Year. No = 1900 . . 2000; Date = Record Day : Day. No; Month : Months; Year : Year. No End; Implementation End.
Чтобы использовать подпрограммы, константы, типы, переменные, описанные в интерфейсе модуля, в основной программе следует записать слово Uses, после которого указать имя (имена) модуля (модулей), например: Program example(input, output); Uses Calendar; . . . . После этого в основной программе можно использовать идентификаторы, указанные в интерфейсе модуля (модулей).
СТАНДАРТНЫЕ МОДУЛИ В ЯЗЫКЕ TURBO - PASCAL Как отмечено выше, модули можно использовать для разработок библиотек стандартных подпрограмм и данных. В языке Turbo-Pascal в настоящее время имеется большое количество стандартных подпрограмм и данных, объединенных в несколько стандартных модулей. Они позволяют упростить процесс написания программ, более эффективно использовать возможности компьютеров IBM PC и операционной системы MS-DOS. В библиотеке имеются следующие стандартные модули: System - основная библиотека, Strings - работа со строками, Crt - работа с консолью, Graph - графическая библиотека, Dos - использование возможностей Dos, Win. Dos - использование возможностей Dos и строк, Overlay - организация оверлейных структур, Printer - работа с принтером
МОДУЛЬ SYSTEM Модуль System является фактически основной библиотекой среды Turbo-Pascal. В него входят все процедуры и функции стандарта Pascal и дополнительные подпрограммы позволяющие выполнять разнообразные действия общего назначения (управление вводом/выводом, работа со статической и динамической памятью и т. д. ). Модуль System автоматически подключается к любой программе и его можно не упоминать в разделе описания модулей Uses. Все функции и процедуры этого модуля можно просмотреть по встроенной помощи (
МОДУЛЬ CRT Модуль Crt содержит константы, переменные и подпрограммы для работы с консолью. С их помощью можно работать как с целым экраном так и отдельными создаваемыми окнами, управлять их размерами, цветом фона и символов. Все цвета пронумерованы, имеют свои коды от 0 до 15. Код 128 осуществляет мерцание символа. Цвета 0. . 7 можно использовать как для фона так и для символа, остальные коды 8. . 15 применяются только для символов. Назначение цветов их кода можно всегда посмотреть по контекстной помощи -
Рассмотрим только наиболее часто встречающиеся процедуры и функции модуля Crt: High. Video - устанавливает высокую яркость символов, Low. Video - устанавливает низкую яркость символов, Norm. Video - устанавливает нормальную яркость символов, Text. Background(<код цвета>) - устанавливает цвет фона, Text. Color(<код цвета>) - устанавливает цвет символов, Clr. Scr - очищает экран, Goto. XY(
ИСПОЛЬЗОВАНИЕ ГРАФИЧЕСКИХ ВОЗМОЖНОСТЕЙ СРЕДЫ TURBO-PASCAL ИНИЦИАЛИЗАЦИЯ ГРАФИЧЕСКОГО РЕЖИМА РАБОТЫ КОМПЬЮТЕРА Все рассмотренные нами выше средства программирования в среде Turbo-Pascal относятся к так называемому текстовому режиму работы компьютера, при котором все символы могут располагаться на экране в 25 строках и 80 позициях (столбцах). С помощью средств модуля Crt можно управлять цветом фона и символов, размером открываемых окон, их положением и т. д.
Для создания качественного изображения рисунков, схем, графиков функций и т. д. в языке Turbo-Pascal предусмотрен специальный графический режим работы. Этот режим работы компьютера обеспечивается специальными графическими адаптерами (CGA, EGA, VGA, SVGA, Hercules и. д. ), которые разбивают экран на более мелкие, чем в текстовом режиме, элементы - точки (pixel), закрашиваемые в тот или иной цвет. Каждая такая точка имеет две координаты X, Y. Начало системы координат помещено в левый верхний угол (0, 0). Ось OX направлена как обычно вправо, ось OY - вертикально вниз. Максимальное число точек по горизонтали и вертикали определяется типом адаптера и режимом его работы, например адаптер SVGA разбивает экран на 640 х 480 точек.
Все средства графики в среде Turbo-Pascal поддерживаются стандартным модулем Graph, поэтому если в конструируемой программе предусматривается работа с графикой, необходимо в ее начале поместить директиву Uses Graph; Для того, чтобы переключить режим работы компьютера из текстового режима в графический необходимо воспользоваться стандартной процедурой инициализации графики Init. Graph(Graph. Driver, Graph. Mode, 'C: TP 7BGI');
Здесь Graph. Driver - переменная целого типа в которой содержится код драйвера графического устройства (адаптера), Graph. Mode переменная целого типа в которой содержится код графического режима, строка - 'C: TP 7BGI' указывает путь к каталогу BGI (Borland Graphics Interface), в котором размещаются графические драйверы. Переменные Graph. Driver, Graph. Mode должны быть описаны в программе.
Значение кода графического адаптера необходимо задать до процедуры инициализации графики, например для адаптера VGA Graph. Driver: = 9; Если же значение этого кода заранее неизвестно, то перед инициализацией графики следует указать Graph. Driver: = Detect; В этом случае компьютер определит код адаптера автоматически. В результате описанных действий дисплей компьютера полностью очищается и переходит в цветной графический режим. Для того, чтобы после выполнения графической части программы, вернуться в обычный текстовый режим работы компьютера, необходимо выполнить процедуру закрытия графического режима Close. Graph; которая завершает работу в графическом режиме.
ИЗОБРАЖЕНИЕ ТОЧКИ И КОНТУРНЫХ ЛИНИЙ ТОЧКА Для того, чтобы высветить на экране отдельную точку необходимо воспользоваться процедурой Put. Pixel(X, Y, C); Здесь X, Y - координаты точки(тип Integer), С - код цвета (тип Word). Цвет можно также задавать словами (Black, White, Red, . . . ).
Пример 1. Вывести точку желтого цвета в центр экрана компьютера. Program Point; Uses Crt, Graph; Var xc, yc : Integer; Graph. Driver, Graph. Mode : Integer; Begin Graph. Driver: Detect; Init. Graph(Graph. Driver, Graph. Mode, 'C: TP 7BGI'); xc: =Get. Max. X div 2; yc: =Get. Max. Y div 2; Put. Pixel(xc, yc, Yellow) Repeat Until Key. Pressed Close. Graph End. Функции Get. Max. X и Get. Max. Y возвращают максимальные координаты экрана X и Y для данного графического драйвера в текущем режиме, соответственно.
ПРЯМАЯ ЛИНИЯ Чтобы провести прямую линию на экране между точками (X 1, Y 1) и (X 2, Y 2) необходимо применить процедуру Line(X 1, Y 1, X 2, Y 2); Процедура Line. Rel(DX, DY); проводит линию из текущей точки в точку, сдвинутую на величины DX, DY. Процедура Line. To(X, Y); проводит линию из текущей точки в точку, с координатами X, Y. Цвет линий можно задавать установочной процедурой Set. Color(C); Здесь C - код или имя цвета из палитры. Цвет фона в графическом режиме задается установочной процедурой Set. Bk. Color(C); C - код или имя цвета из палитры
Пример 2. Построить красный прямоугольник во весь экран и его диагонали. Uses Crt, Graph; Var Graph. Driver : Integer; Graph. Mode : Integer; x, y, xc, yc, : Integer; Begin Graph. Driver: Detect; Init. Graph(Graph. Driver, Graph. Mode, 'C: TP 7BGI'); x: =Get. Max. X; y: =Get. Max. Y; setcolor(Red); line(0, 0, 0, y); line(x, 0, x, y); line(0, 0, x, 0); line(0, y, x, y); line(0, 0, x, y); line(y, 0, x, 0); Repeat Until Key. Pressed; Close. Graph End.
ДУГА ОКРУЖНОСТИ Для того, чтобы построить дугу окружности необходимо воспользоваться процедурой Arc(X, Y, A, B, R); Здесь X, Y - координаты центра дуги, A, B - начальный и конечный углы в градусах, R - радиус. ОКРУЖНОСТЬ Для того, чтобы построить полную окружность необходимо воспользоваться процедурой Circle(X, Y, R); Здесь X, Y - координаты центра дуги, R - радиус.
Пример 3. Построить концентрические окружности с центром в центре экрана, используя все цветовую палитру. Uses Crt, Graph; Var Graph. Driver : Integer; Graph. Mode : Integer; x, y, xc, yc, hx, hy, k, i : Integer; Begin Graph. Driver: Юtect; Init. Graph (Graph. Driver, Graph. Mode, 'C: TP 6BGI'); x: =Get. Max. X; y: =Get. Max. Y; xc: =x Div 2; yc: =y Div 2; Set. Color(12); Line(0, 0, 0, y); Line(x, 0, x, y); Line(0, 0, x, 0); Line(0, y, x, y); hx: =x Div 6; hy: =y Div 6; {------------------------}
{------------------------} For i: =0 To 15 Do Begin Setcolor(i); For k: =0 To y Div 2 Do Circle(xc, k, k); Set. Color(i+2); For k: =y Div 8 Down. To 0 Do Circle(xc, k, k) End; {------------------------} Repeat Until Key. Pressed; Close. Graph End.
ДУГА ЭЛЛИПСА Для того, чтобы построить дугу эллипса необходимо воспользоваться процедурой Ellipse(X, Y, A, B, RX, RY); Здесь X, Y - координаты центра дуги, А - начальный угол, В конечный угол, RX - горизонтальная полуось эллипса, RY - вертикальная полуось эллипса.
Пример 4. Построить вертикально падающий и изменяющий размеры эллипс желтого цвета. Uses Crt, Graph; var Graph. Driver : Integer; Graph. Mode : Integer; x, y, xc, yc, hx, hy, k, i : Integer; Begin Graph. Driver: Detect; Init. Graph (Graph. Driver, Graph. Mode, 'C: TP 7BGI'); x: =Get. Max. X; y: =Get. Max. Y; xc: =x Div 2; yc: =y Div 2; Set. Color(12); Line(0, 0, 0, y); Line(x, 0, x, y); Line(0, 0, x, 0); Line(0, y, x, y); hx: =x Div 6; hy: =y Div 6; {------------------------}
{------------------------} begin For k: =0 To y-50 Do Begin Set. Color(yellow); Ellipse(xc, k, 0, 360, k div 5, 50); Set. Color(0); Ellipse(xc, k, 0, 360, k div 5, 50); End; {------------------------} Repeat Until Key. Pressed; Close. Graph end.
КОНТУР ПРЯМОУГОЛЬНИКА Для построения контура прямоугольника нужно воспользоваться процедурой Rectangle(X 1, Y 1, X 2, Y 2); Здесь X 1, Y 1 - координаты верхнего левого угла прямоугольника, X 2, Y 2 - координаты нижнего правого угла прямоугольника.
Пример 5. Построить прямоугольник зеленого цвета во весь экран. Uses Crt, Graph; Var Graph. Driver : Integer; Graph. Mode : Integer; x, y, xc, yc, : Integer; Begin Graph. Driver: =Detect; Init. Graph(Graph. Driver, Graph. Mode, 'C: TP 7BGI'); x: =Get. Max. X; y: =Get. Max. Y; Set. Color(Green); Rectangle(0, 0, x, y); Repeat Until Key. Pressed; Close. Graph End.