Файл: Могилев А.В. Информатика.pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 31.03.2021

Просмотров: 6806

Скачиваний: 51

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

 

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) ; 


background image

 

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 

 

 

1 Egahi 

 

640х350 

 

 

VGA 

 

VGA 

 

OVgalo 

 

640х200 

 

 

IVgalo 

 

640х350 

 

 

2Vgalo 

 

640х480 

 

 

 

Процедура инициализации в Турбо-Паскале имеет три аргумента: 

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  освобождает  память  от  драйвера  и  устанавливает  режим  работы  эк-

рана, который был до инициализации графики. 


background image

 

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) 
 

Построить и закрасить сектор круга 
 


background image

 

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.'') ; 


background image

 

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 соответственно.