ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 31.03.2021
Просмотров: 6806
Скачиваний: 51
246
Средство для реализации таких структур дает аппарат динамических переменных.
Простейшей из обсуждаемых структур является однонаправленный список. Он строится
подобно очереди на прием к врачу: пациенты сидят на любых свободных местах, но каждый из
них знает, за кем он в очереди (т.е. данные размещаются на свободных местах в памяти, но каж-
дый элемент содержит ссылку на предыдущий или следующий элемент). Поскольку количество
пациентов заранее не очевидно, структура является динамической.
Другая подобная структура, с упоминанием о которой мы уже не раз встречались -
стек
.
Его моделью может служить трубка с запаянным концом, в которую вкатывают шарики. При этом
реализуется принцип «последним вошел - первым вышел». Возможное количество элементов в
стеке не фиксировано.
Остановимся на примере стека и покажем его программную реализацию. Технически при
этом следует решить ряд задач, из которых наиболее специфическими являются
а) связывание последующих компонентов стека;
б) смещение ссылок при каждом движении по стеку.
Из-за необходимости хранить не только значение каждого элемента, но и соответствующую
ссылку на последующий элемент, каждый из элементов будем хранить в виде двухполевой записи,
в которой первое поле - значение элемента, а второе -ссылка на следующий элемент. Схематиче-
ски эту структуру можно описать следующим образом
(элементу, который пришел первым, ссылаться не на что, о чем свидетельствует «пустая
ссылка» nil).
Пусть для конкретности элементы стека - действительные числа, и при последовательном
заполнении состояния стека будут
1,75
35,7
1,75
-6,94
35,7
1,75
Приведенная ниже программа включает две процедуры: добавления очередной компоненты к
стеку и изъятия ее. Программа формирует указанный стек и производит контрольное извлечение
из него. Каждое действие снабжено комментарием, который поможет разобраться в программе.
Следует обратить
особое внимание на организацию смещения ссылок.
Программа 28
program stack;
(формирование динамической структуры - стека}
type s^StackComp; StackComp=record
b:real;
p;s;
end;
var a:s; k:real;
procedure Dobavl(k:real); (процедура добавления к стеку числа «к»}
var j : s ;
begin new(j);
(создание новой динамической записи}
j^.b:=k;
(внесение следующей компоненты стека}
j^.p;=a;
(смещение указателя} a:=j (формирование новой записи)
end;
procedure Vzjat(var k:real); (процедура чтения из стека)
var j :s;
begin j:=а;
k:j^b;
(k-значение последней компоненты}
a:=j^p;
(перенастройка указателя)
dispose(j)
(ликвидация использованной записи)
end;
begin
(пример записи и чтения)
a:=nil; Dobavl(1.75) ;
247
Dobavl(35.7);
Dobavl(-6.94);
(
сформирован стек: -6.94, 35.7, 1.75)
Vzjat(k); writeln(k);
(контрольное взятие из стека)
Vzjat(k); writeln(k);
(еще одно взятие из стека)
Vzjat(k); writeln(k)
(еще одно взятие из стека)
end.
(результат работы программы: -6.94 35.7 1.75}
Контрольные вопросы
1.
В чем принципиальное различие статических и динамических переменных?
2.
2 Как реализуется связь указателя с динамическим объектом?
3.
3. Что такое «связанный список данных»?
3.7. РАБОТА С ГРАФИКОЙ
Машинная (компьютерная) графика
- одно из важных направлений в современной при-
кладной информатике. В отличие от базового Паскаля, современные версии содержат мощные
средства разработки графических программ. Рассмотрим часть соответствующих возможностей
Турбо-Паскаля, в котором они реализованы с помощью стандартного модуля Graph.
Модуль представляет собой мощную библиотеку графических подпрограмм универсально-
го назначения, рассчитанную на работу с наиболее распространенными графическими адаптерами
CGA, EGA, VGA, SVGA IBM-совместимых персональных компьютеров.
Подключение модуля Graph, tpu к программе выполняется директивой
uses graph;
Инициализация графического экрана осуществляется с помощью процедуры Initgraph.
Драйвер поддерживает тот или иной режим экрана, табл. 3.1.
Таблица 3.1
Некоторые сведения о драйверах н определяемых ими режимах
Адаптер
Драйвер
Режим (Номер, имя)
Разрешимость
Число страниц
EGA
EGA
OEgalo
640х200
4
1 Egahi
640х350
2
VGA
VGA
OVgalo
640х200
4
IVgalo
640х350
2
2Vgalo
640х480
1
Процедура инициализации в Турбо-Паскале имеет три аргумента:
Initgraph(<драйвep>, <режим>, '<путь к драйверу>').
Она может быть выполнена так:
uses graph;
var gd, gm: integer; {переменные gd и gm определяют драйвер и режим}
begin
gd:=vga; gm:=vgahi;
initgraph(gd,gm.'d:\tp55
1
);
Первые две команды можно заменить одной:
gd:=detect
Целая константа detect=0 в модуле Graph автоматически распознает драйвер и устанавлива-
ет режим максимального разрешения для данной машины.
Процедура closegraph освобождает память от драйвера и устанавливает режим работы эк-
рана, который был до инициализации графики.
248
Для обнаружения ошибок в графике применяются функции graphresult и grapherrormsg (код
ошибки). Последняя выдает строку сообщения о характере ошибки, соответствующей коду. Ини-
циализация графического режима с проверкой ошибок может быть выполнена в программе сле-
дующим образом:
uses graph; var gd, gm, errorcod: integer;
begin
gd:=detect; initgraph(gd,gm,");
errorcod'=graphresult;
if errorcod <>grok then
begin
writeln('ошибка графики');
writeln(grapherrormsg(errorcod));
halt
end;
Процедура Halt останавливает выполнение программы и возвращает управление операци-
онной системе.
Для формирования палитры используется система смешения красного, зеленого и синего
цветов и изменения яркости луча. Цвет задается номером из списка цветов палитры в интервале 0
.. 15.
Процедуры sе1со1ог(<цвет>) и setbkcolor(<цвет>) устанавливают текущий цвет рисунка и
цвет фона. При инициализации графики по умолчанию устанавливается черный фон и белый цвет
рисунка.
В табл. 3.2 указаны основные процедуры для модуля Graph, применяющиеся для построе-
ния простейших геометрических примитивов.
Координаты точек воспринимаются в «экранной» системе координат, в которой начало -
верхний левый угол экрана, ось «х» направлена вниз, ось «у» -направо. Максимальные значения
координат определяются разрешимостью экрана (см. табл. 3.1).
Первый аргумент процедуры setlinestyle(a,b,t) а - стиль линии второй параметр b -«образец»
- имеет значение 4, если а=4, в остальных случаях b=0; третий параметр t -толщина линии - может
иметь значение 1 (нормальная толщина) или 3 (жирная линия).
Таблица 3.2
Основные процедуры модуля Graph
Заголовок процедуры
Геометрический смысл
putpixel(x,y,c)
Построить точку (х,у) цветом с
setlinestyle(a,b,t)
Установить стиль, образей и толщину линий
line(xl,yl,x2,y2)
Соединить две точки отрезком
rectangle(xl,yl.x2.y2)
Построить прямоугольник с заданными концами диагонали и
сторонами, параллельными осям координат
circle(x,y,r)
Построить окружность с центром (х,у) и радиусом г
arc(x,y,a,b,r)
Построить дугу окружности: a,b - начальный и конечный угол в
Градусах
ellipse(x,y,a,b,rx,ry)
Построить эллиптическую дугу: rx, rу - полуоси эллипса
setfillstyle(t,c)
Установить стиль закраски и ее цвет
fillellipse(x,y,rx,ry)
Построить закрашенный эллипс, используя цвет рисунка
floodfill(x,y,cg)
Закрасить фигуру до границы с цветом cg; (x,y) - внутренняя
точка фигуры
bar(xl,yl,x2,y2)
Построить столбец, используя тип и цвет закраски
pieslice(x,y,a,b.r)
Построить и закрасить сектор круга
249
sector(x,y.a,b,rx,ry)
Построить и закрасить эллиптический сектор
settextsiyle(f,n,d)
Установить шрифт, направление вывода и размер символа тек-
ста '
outtextxy(x,y,st)
Вывести строку st, начиная с точки (х,у)
outtext(st)
Вывести строку, начиная с точки расположения текущего ука-
зателя
Первый аргумент процедуры setfillstyle(t,c) - тип закраски t - принимает значения из интер-
вала 0..12. Наиболее употребителен тип t = 1 - заполнение фигуры текущим цветом.
Для вывода текста на графический экран сначала выполняется процедура settextstyle(f,n,d),
устанавливающая шрифт f, направление вывода п и размер символов (параметр d). При f = 0 ис-
пользуется стандартный точечный шрифт, встроенный в систему Турбо-Паскаль. С использовани-
ем других шрифтов познакомимся ниже. Направление вывода п принимает значения 0 (горизон-
тальный вывод) и 1 (вертикальный вывод).
Размер букв определяется параметром d, принимающим значения из интервала 1..10. Если d
= 1 и f = 0, то каждый символ занимает квадрат 8*8 точек, при d > 1 сторона квадрата умножается
на d.
Далее, с помощью процедуры outtextxy(x,y,st) строка st выводится на экран, начиная с точ-
ки (х,у).
Например:
settextstyle(0,0,2); оuttехtху(100,200,'горизонтальная строка');
оuttехtху(100,230,'размер увеличен вдвое');
Примеры графических программ
Пример 1:
программа рисует звездное
небо с 400 «звездами», вспыхивающими постепенно,
и полную желтую луну.
Програлша 29
program sky;
uses crt,graph;
var k,gd,gm:integer;
begin gd:=detect;
initgraph (gd, gm, ' '); randomize;
for k:=l to 400 do
begin putpixel(random(640),random(480),random(15)+1); de-
lay(10);
end;
setfillstyle(l,14); setcolor(14);
circle(550,80,30) ; floodfill(550,80,14) ;
repeat until keypressed; closegraph
end.
Пример 2
.
Узор.
Используя простейшие геометрические образы строят замечательные гра-
фические изображения. Ниже приведена программа изображения муарового узора, полученного
пересечением двух семейств расходящихся отрезков прямых. Качество и изображение получаемо-
го узора зависит в основном от трех параметров: kl, k2 - расстояний между отрезками слева и
справа ; h - смещения вниз (вверх) всего семейства.
Программа 30
program uzor;
uses crt, graph;
var gd,gm,errCode,i,kl,k2,h; integer;
begin
kl:=8; k2:=3; h:=110; gd:=Detect; InitGraph(gd,gm.'') ;
250
errCode:=GraphResult ;
if errCode = grOk then begin
setcolor(green); *
for i:=l to (420 div kl) do
begin line(0,i*kl,640,i*k2+h); line(0,i*k2+h,640,i*kl);
end;
repeat until keypressed; CloseGraph;
end else writeln('errCode=',errCode)
end.
Процедуры построения прямоугольных фигур удобно использовать, в частности, при по-
строении схем, диаграмм.
Пример 3:
программа 31 строит столбчатую диаграмму, наглядно отражающую числовую
информацию о населении 6 крупных городов мира: Токио, Гамбурга, Москвы, Бангкока, Мехико и
Парижа.
Программа 31
program colon;
uses crt,graph;
const m:array[l..6] of real=(11500,2300,9700.5100,12400,8200) ;
name:array[I..6] of
string =('Токио','Гамбург','Москва','Бангкок','Мехико','Париж');.
var gd,gm,k,n,s:integer; st:string[6];
begin
gd:=detect;
initgraph(gd,gm,' ');
setcolor(15);
setlinestyle(0,0,1);
line(60,400,620,400);
line(60,400,60,100) ;
settextstyle(0,0,1);
for k:=l to 12 do begin n:=1000*k; str(n.st);
outtextxy(10,400-20*k-4,st);
line(60,400-k*20,65,400-k*20)
end;
setcolor(14); settextstyle(0,0,2);
outtextxy(120,20, 'Население городов (тысяч)');
settextstyle(0,0,1);
for k:=l to 6 do begin setfillstyle(1,k+2);
bar(100+(k-l)*70,400,100+k*70,round(400-m[k]/1000*20)) ;
outtextxy(100+(k-l)*70+4,450,name[k]) ;
end;
repeat until keypressed;
closegraph
end.
Процедура bar3d(xl,yl,x2,y2,d,top) рисует трехмерный столбец, глубина которого определя-
ется параметром d. Последний параметр процедуры top - логического типа. Если top=true, рисуется
верхнее основание столбика, в противном случае оно не изображается, что позволяет рисовать
столбики один над другим. Диаграммы с трехмерными столбиками красивы, но их труднее созда-
вать.
Построение графиков функций
. Построение графиков функции - неотъемлемая часть
большинства программ, предназначенных для обучения математике, физике. Ниже представлен
пример программы построения графика функции y=x*x*sin(l/x). на произвольном отрезке [а, b].
Количество точек графика (параметр п) также задается произвольно (точка х=0 исключается, так
как в ней функция не определена). В программе также определяются величины tl=(xl-x0)/(b-a) и
t2=(yl-y0)/(2m), которые означают масштабы по осям Х и Y соответственно.