- •ПРЕДИСЛОВИЕ
- •1.1. История и классификация языков программирования высокого уровня
- •1.2. Первое (знакомство с Паскалем
- •Задания
- •Лекция 2
- •2.1. Некоторые сведения о системе ТУрбо-Паскаль
- •2.2. Способы описания языка программирования
- •Лекция 3
- •3.2. Типы данных
- •4.1. Структура Паскаль-программы
- •4.2. Арифметические операции, функции, выражения Арифметический оператор присваивания
- •Форматы процедуры write
- •Задания
- •1. Что будет напечатано программой
- •если последовательно вводятся три числа: 36, -6, 2345?
- •5.2. Функции, связывающие различные типы данных
- •Задания
- •Теперь посмотрим, как это программируется наТЛаскале.
- •Здесь
- •<параметр цикла>::= <имя простой переменной порядкового типа>
- •Задания
- •7.1. Подпрограммы-процедуры
- •7.2. Подпрограммы-функции
- •7.4. Рекурсивные подпрограммы
- •8.1. Что такое рекуррентная последовательность
- •8.2. Программирование вычислений рекуррентных последовательностей
- •Задания
- •Задания
- •6. Вывод результата.
- •Теперь будем составлять подпрограммы.
- •Задания
- •12.2. Операции над множествами
- •12.3. Примеры использования множеств
- •Красивая программа! К сожалению, ею нельзя воспользоваться для
- •В этой программе использована функция определений размера файла:
- •.Fiiesize(<HMH файловой переменной>);
- •Задания
- •14.2. Работа с файлами записей
- •Задания
- •15.2. Связанные списки
- •Лекция 16
- •16.1. Организация внешних подпрограмм
- •16,2. Создание и использование модулей
- •распечаткой текста программы с подробными комментариями.
- •выполнения следующих операции над обыкновенными дробями вида -q
- •(Р — целое, Q — натуральное):
- •1) сложение;
- •2) вычитание;
- •3) умножение;
- •4) деление;
- •5) сокращение дроби;
- •7) функции, реализующие операции отношения (равно, не равно,
- •Используя этот модуль, решить задачи:
- •При разработке модуля рекомендуется такая последовательность
- •Задания
- •Приведем текст программы целиком.
- •ЗАДАНИЯ ПО ТЕМЕ “ЛИНЕЙНЫЕ АЛГОРИТМЫ”
- •ЦЕЛОЧИСЛЕННАЯ АРИФМЕТИКА
- •Сортировка массивов
- •ЗАДАЧИ ПО ТЕМЕ “ОБРАБОТКА СТРОК”
- •ЗАДАНИЯ ПО ТЕМЕ “МОДУЛИ”
- •ЗАДАНИЯ ПО ТЕМЕ “ДИНАМИЧЕСКИЕ ПЕРЕМЕННЫЕ”
- •Задачи, предлагавшиеся на школьных олимпиадах по программированию (Пермская область)
- •Учебное издание
Однако нам неизвестен коэффициент К. Его можно найти, используя условие
Рзо = 70.
Для этого будем делать “обратные” подстановки:
Рзо = (1-А-)-й 9 = (1 -К )‘2Р28 = {l-K f-p 21 = ... = {\ -К )гй-ро = (1-АГ)30-9б.
Из равенства
(1 - К )30•96 = 70
находим:
(щУЗО 1 - К = {% )
Далее программирование становится тривиальным.
Var I Byte; {exampl9.pas} Р, Q Real;
Begin
P:= 96;
Q:* Exp(l / 30 * Ln(70 / 96)); For I := 1 To 29 Do
Begin
P := Q * P;
|
WriteLnCl, »-й день - |
P |
5 3, » гг’ ) |
|
End |
|
|
|
End. |
|
|
|
Задания |
||
1. |
Рекуррентная последовательность определена следующим обра |
||
зом: |
( 1, |
|
если г = 0, |
|
|
||
|
а* ~~ | а,_! - г + |
i , |
если г > 0. |
Для данного натурального п получить значение ап. |
|||
2. |
Дана последовательность: |
|
|
|
Г1, |
если г = 0 и i = 1, |
|
|
а*= | а*_24- |
если * > 1* |
|
Вычислить произведение элементов с 1-го по 20-й. |
|||
3. |
Используя рекуррентный подход, вычислить сумму многочлена |
10-й степени по формуле Горнера, где х — данное вещественное число.
Ют10 + 9х9 + 8т8 Н------ h 2х2 + х =
Здесь целая переменная Driver определяет тип графического драйвера; целая переменная Mode задает режим работы графического драйвера; Path — выражение типа String, содержащее маршрут поиска файла графического драйвера.
Список констант модуля Graph, определяющих типы драйверов и режимы, приведен в табл. 1 Приложения 2.
Вот пример программы, инициализирующей графический режим VGAHi для работы с драйвером VGA (монитор типа VGA).
Uses |
Graph; |
|
|
|
Var |
D river, |
Mode |
Integer; |
|
begin |
|
|
|
|
Driver |
:= |
VGA; |
{драйвер} |
|
Mode := |
VGAHi; |
[режим работы} |
||
InitG raph(Driver, |
Mode, >C:\TP\BGI>); |
Здесь указывается, что файл EGAVGA.BGI с драйвером для VGAмонитора находится в каталоге C:\TP\BGI. Режим VGAHi соответ ствует графической сетке 640 х 480 с палитрой из 16 цветов.
Возможно также автоматическое определение типа драйвера и уста новка режима. Этот прием позволяет программе работать с разными типами мониторов, не внося изменений в текст:
Driver := D etect;
InitG raph(Driver, Mode, ,C:\TP\BGIi ) ;
При этом автоматически устанавливается режим с наибольшей раз решающей способностью и цветностью.
После окончания работы в графическом режиме следует вернуться
втекстовый режим экрана.
Вмодуле Graph процедура возвращения в текстовый режим имеет заголовок:
Procedure CloseGraph;
Ц вет фона и цвет рисунка. На цветном мониторе можно ме нять окраску экрана. Установленная окраска экрана называется цве том фона. Рисунок на этом фоне наносится с помощью разнообразных линий: прямых, окружностей, прямоугольников, ломаных и пр. Цвета этих линий также могут меняться.
В табл. 2 Приложения 2 приведены имена констант, определяющих 16 цветов палитры для мониторов типа EGA, VGA.
Заголовок процедуры установки цвета фона:
Procedure SetBkColor(Color Word);
Здесь Color — выражение целого типа, определяющее номер цвета фона.
Заголовок процедуры установки цвета линий:
Procedure SetColor(Color Word);
Заметим, что если в качестве номера цвета линии указывается О, то это всегда совпадает с цветом фона (невидимая линия).
Если необходимо очистить графический экран (стереть рисунок), то для этого используется процедура очистки экрана.
Заголовок процедуры очистки экрана:
Procedure ClearDevice;
В результате выполнения этой процедуры экран заполняется уста новленным цветом фона.
Графические координаты. Положение каждого пикселя графиче ской сетки однозначно определяется указанием его координат. Графи ческие оси координат расположены на экране т* <, как показано на сле дующем рисунке:
О |
X |
640 |
Горизонтальная ось X направлена слева направо, вертикальная ось Y — сверху вниз. На рисунке указаны предельные графические коор динаты, соответствующие режиму VGAHi.
Можно определить максимальные координаты по осям, соответ ствующие данному драйверу. Это делается с помощью двух целочис ленных функций:
Function GetMaxX;
Function GetMaxY;
Графическое окно. Область вывода изображения может быть ограничена любым прямоугольником в пределах экрана. Такая область называется графическим окном. Существует процедура, устанавлива ющая положение графического окна на экране.
Заголовок процедуры назначения графического окна:
Procedure |
SetViewPort(XI, Y l, Х2, Y2 Integer; Clip Boolean); |
Здесь (X I ,Y l) |
— координаты левого верхнего угла окна; (Х2,У2) — |
координаты правого нижнего угла окна; Clip — ограничитель фигур; если C lip = True, то все построения производятся только в пределах окна, иначе — могут выходить за пределы окна.
После установки окна координаты точек внутри него отсчитыва ются от его верхнего левого утла.
Существует понятие графического курсора (по аналогии с символь ным курсором). Но, в отличие от символьного курсора, графический курсор на экране не виден. Графический курсор указывает на теку щую позицию на экране. При входе в графический режим координаты текущей позиции равны (0, 0). Процедура назначения координат гра фического курсора:
Procedure MoveTo(X, Y In teger);
Здесь Х ,У — устанавливаемые координаты курсора. Координаты указываются относительно левого верхнего угла окна или, если окно не установлено, экрана.
Процедура “поставить точку” — основная процедура получения изображения, поскольку любой рисунок складывается из точек. Со стояние светящейся точки определяется
—координатами точки на экране;
—цветом точки.
Заголовок процедуры выставления точки на графическом экране:
Procedure PutPixel(X, Y Integer; Color Word);
Здесь Х ,У — координаты точки, Color — цвет точки.
П ример 1. Следующая программа устанавливает по центру Экрана графическое окно размером 100 х 100, заливает его желтым фоном и заполняет синими точками, расположенными через 4 позиции.
Uses |
Graph; |
Integer; |
|
Var |
Driver, Mode |
Integer; |
|
Begin |
X, Y, XI, Yl, |
X2, Y2, Xc, Yc |
|
|
|
|
{________ Инициализация графического режима_________________ >
Driver :® Detect;
InitGraph(Driver, Mode, ^iXTPXBGlO ;
{_______ Определение координат центра экрана__________ _____ }
Xc :* GetMaxX Div 2;
Yc := GetMaxY Div 2;
{_______ Определение координат графического окна___________ }
XI |
:» Xc |
- 50 |
||
Yl |
; s |
Yc |
- 50 |
|
X2 |
; s |
Xc |
+ |
50 |
Y2 |
; s |
Yc |
+ |
50 |
{____ |
Установка графического окна__________ |
_________ > |
|
|
SetVievPortOU, Yl, X2, Y2, true); |
_________ > |
|
{____ __ Установка цвета фона н очистка экрана__ |
|||
|
SetBkColor(Yellow); |
|
|
{____ |
ClearDevice; |
.... _ |
_________> |
Расстановка точек в окне |
|||
|
For X := 1 То 25 Do |
|
|
|
For Y :» 1 То 25 Do |
|
|
PutPixel(4 * X, 4 * Y, Blue);
Задержка изображения на экране до нажатия <ЕНТЕЯ>_} ReadLn;
{_____^„.Вкхоц из графического режима в символьной._________> CloseGraph;
End.
Графические примитивы. Хотя любое изображение можно по строить из точек, но программировать получение сложного рисунка или чертежа, используя только процедуру “Поставить точку” , было бы слишком неудобно и громоздко. В любом графическом пакете суще ствуют процедуры рисования основных геометрических фигур: пря мых линий, окружностей, эллипсов, прямоугольников и др. Такие фи гуры называют графическими примитивами.
Рассмотрим несколько основных процедур рисования графических примитивов, имеющихся в модуле Graph.
Линия с заданными координатами концов (X I, Y1) и (Х2,У2):
Procedure Line(Xl, Yl, Х2, Y2 |
Integer); |
Линия от текущей точки до точки с координатами X , Y :
Procedure LineTo(X, Y Integer);
Линия от текущей точки до точки с заданными приращениями ко ординат DX, DY:
Procedure LineRel(DX, DY Integer);
Прямоугольник с заданными координатами верхнего левого угла (X I, У1) и нижнего правого угла (Х2,У 2);
Procedure Rectangle(XI, Yl, Х2, Y2 Integer);
Окружность с центром в точке (X, У) и радиусом R — в пикселах:
Procedure Circle(X, Y Integer; R Word);
Дуга окружности с центром в точке (Х ,У ), радиусом R, начальным
углом ВедА и конечным углом EndA. |
Углы измеряются в градусах |
против часовой стрелки от направления оси X . |
|
Procedure Arc(X, Y Integer; |
BegA, EndA, R Word); |
Эллипсная дуга с центром в точке Х ,У с начальным и конечным углами BegA и EndA, горизонтальным радиусом RX и вертикальным радиусом R Y:
Procedure EllipseCX, Y |
Integer; BegA, EndA, RX, RY |
Word); |
Пример 2. Составим программу, рисующую голову робота так, как показано на рисунке.
100 |
150 |
250 |
300 |
Рисунок содержит два прямоугольника, две окружности, две дуги, эллипс и три прямые линии. Заранее продумываются все координаты и размеры элементов рисунка.
Uses |
Graph; |
Integer; |
|
|
|
|
|
|||
Var |
Driver, Mode |
|
|
|
|
|
||||
Begin |
|
|
|
|
|
|
|
|
|
|
{-------- Инициализация графического режима_________________ > |
||||||||||
|
Driver := Detect; |
|
|
>C:\TP\BGI’); |
|
|
|
|||
|
InitGraph(Driver, Mode, |
|
|
|
||||||
|
SetColor(White); |
|
|
|
{ белый цвет рисунха } |
|||||
|
SetBkColor(Black); |
300, |
300); |
{ черный цвет фона } |
||||||
|
Rectangle(100, |
100, |
{ голова |
} |
|
|||||
|
Circle(150, |
170, |
30); |
|
{ левый глаз > |
} |
||||
|
Circle(250, |
170, |
30); |
|
{ правый глаз |
|||||
|
Arc(150, 170, 45, 135, 40); |
{ левая |
бровь |
} |
||||||
|
Arc(250, 170, 45, 135, 40)'; |
{ правая |
бровь |
} |
||||||
|
Ellipse(200, 250, 0, 359, Ю, 20); |
{ нос |
> |
|
|
|||||
|
Rectangle(130, |
280, |
270, |
290); |
{ рот |
} |
|
|
||
|
MoveTo(100, |
300); |
|
|
{ три |
{ установка вниз влево > |
||||
|
LineTo(50, |
350); |
|
|
} |
|
|
|
||
|
LineTo(350, |
350); |
|
|
{ линии |
} |
|
|
|
|
|
LineTo(300, |
300); |
|
Red); |
{ шеи |
} |
> |
|
|
|
|
PutPixel(150, |
170, |
{ левый зрачок |
|
|
|||||
|
PutPixel(250, |
170, |
Red); |
{ правый зрачок |
} |
|
||||
|
ReadLn; |
|
|
|
|
{ задержка } |
|
|
|
|
End. |
CloseGraph; |
|
|
|
|
{ выход из I.афики > |
|
|||
|
|
|
|
|
|
|
|
|
|
В приведенном примере все линии рисуются сплошными со стан дартной толщиной. Модуль Graph позволяет управлять стилем линии (сплошная, пунктирная, точечная и пр.) и толщиной. Для этого суще ствует процедура SetLineStile (см. Приложение 2).
Закраски и заполнения. Среди графических примитивов суще ствуют закрашенные области. Цвет закраски определяется процедурой SetColor. Кроме того, можно управлять рисунком закраски (типом заполнения). Это может быть сплошная закраска, заполнение редкими точками, крестиками, штрихами и пр.
В табл. 3 Приложения 2 описаны константы для указания типа за полнения.
Процедура определения типа заполнения (F ill) и цвета заполнения
(Color,) имеет следующий заголовок:
Procedure SetFillStyle(Fill, Color Word);
Заполненная прямоугольная область с заданными координатами
углов:
Мы рассмотрим лишь один простейший вариант математической графики — построение графика функции.
Требуется составить программу построения на экране дисплея гра фика функции
V = F(x).
Решение этой задачи удобно проводить в следующем порядке.
1.Определить границы значений аргумента, в пределах которых будет строиться график. Обозначим их Xmin — нижняя граница, Х тах
—верхняя граница.
2.Для данной области значений аргумента определить предельные значения функции: У ^ и УшахЭти значения не обязательно должны быть точными. Они могут быть оценочными, соответственно, снизу и сверху.
3.Задать границы графического окна, в пределах которого будет рисоваться график: [Хдт^ Х д тах]^ [У&пнпУ&пах]- Поскольку в графиче ских координатах вертикальная ось направлена вниз, то У <7min > Удтвх.
Таким образом, мы имеем две системы координат: (Х ,У ), которые назовем математическими координатами (в литературе чаще исполь зуют термин “мировые координаты” ) и (Xg,Yg) — графические ко ординаты. Нетрудно получить формулу, связывающую графические и математические координаты:
Хд — X ^mm |
-^<7max |
^9тти/ v |
v |
\ |
|
Шах |
Y |
|
—^Vmin; |
||
|
min |
|
|
|
|
Уд — У9т\п "Ь |
Уд max ~ |
^ Я ш п |
( \ г |
у |
\ |
V |
V |
V-1 |
•‘ min/ |
||
|
1max ~ |
1min |
|
|
|
Здесь квадратные скобки означают округление до целого значения (функция round).
Построение графика функции может производиться либо точеч ным методом, либо кусочно-линейным. При первом способе график строится как последовательность точек, расположенных максимально близко. Производится “попиксельный” перебор значений аргумента в интервале [Х&ш^Х^шах] с выставлением точек с соответствующими У-координатами.
При кусочно-линейном методе задается математический шаг ДХ, рассчитывается последовательность значений (Х,-,1*):
Xi = X mia + i-AX, |
Yi = F(X{), |
_ n i |
^ |
,---- ^max |
^min |
» |
l —u,i,...,n, |
П —----------------- |
|
и график строится в виде отрезков прямых, проведенных через точки ( В Д ) , (Xi+uYl+г).
Пример. Составим программу построения графика функции
у= sinx
для х е [0;27г], используя первый (точечный) метод.
Из условия задачи следует, что Х т[п= 0, Х тйх = 2л. В этих пределах функция sinx меняется от -1 до 1. Поэтому Ущщ = -1, Ушах = 1.
Выберем следующие границы графического окна:
Xgmin = Ю» |
Хдтах = 200,’ |
Y 9тт= 140; |
УУшах —40. |
10 |
200 |
Графпк строится в виде последовательности точек с математиче скими координатами
Х{ = Xnun + г •/г; Y{ = sin(Xi); г = 0,..., 190.
Шаг h выбирается минимально возможным, соответствующим шагу графической сетки:
Ь _ -^тах -^min _ ^7Г _
^ ш а х - ^ ш ш " 1 9 0 “ 95-
Приведенные выше формулы пересчета математических коорд^ат в графические примут вид:
X д = 10 -Ь |
'200л-10 |
-А' |
= 10 + |
'95' |
|
2л |
|
|
. п |
Yg —140 + 40-140 (г+ 1) = 90 - [50F].
Вместе с графиком функции строятся оси координат. Ось X имеет координату Yg = 90, ось У с координатой Хд = 10.