var x, y,i: integer;

ch: char;

procedure Put(x, y,i, col: integer);

begin

textbackground(col);

gotoxy(x+i*3,y);

write(‘ ’,i,’ ’);

gotoxy(x+i*3+1,y);

end;

begin

textmode(3);

clrscr;

y:=13; x:=25;

for i:=0 to 9 do put(x, y,i,1);

i:=0; put(x, y,i,2);

repeat

ch:=readkey;

put(x, y,i,1);

if ch = #75 then dec(i);

if ch = #77 then inc(i);

if i<0 then i:=9;

if i>9 then i:=0;

put(x, y,i,2);

until ch=#27; {esc}

textmode(3);

end.

Вариант без процедуры:

uses crt;

var x, y,i: integer;

ch: char;

procedure Put(x, y,i, col: integer);

begin

gotoxy(x+i*3,y);

write(‘ ’,i,’ ’);

gotoxy(x+i*3+1,y);

end;

begin

textmode(3);

clrscr;

y:=13; x:=25;

textbackground(1);

for i:=0 to 9 do

begin

gotoxy(x+i*3,y);

write(‘ ’,i,’ ’);

end;

i:=0;

textbackground(2);

gotoxy(x+i*3,y);

write(‘ ’,i,’ ’);

gotoxy(x+i*3+1,y);

repeat

ch:=readkey;

if ch = #0 then

begin

ch:=readkey;

textbackground(1);

gotoxy(x+i*3,y); стирает подсветку

write(‘ ’,i,’ ’);

if ch = #75 then dec(i);

if ch = #77 then inc(i);

if i<0 then i:=9;

if i>9 then i:=0;

textbackground(2);

gotoxy(x+i*3,y); подсвечивает другую цифру

write(‘ ’,i,’ ’);

gotoxy(x+i*3+1,y);

end;

until ch=#27; {esc}

textmode(3);

end.

7.7 Модуль GRAPH

Cодержит процедуры и функции, обеспечивающие работу с экраном в графическом режиме (создание изображений).

1)  В графическом режиме весь экран разбивается на точки (пиксели – от англ. pixel). Каждую точку можно закрасить в любой цвет, таким образом из различных комбинаций точек создается изображение.

НЕ нашли? Не то? Что вы ищете?

2)  Каждая точка имеет координаты (х, у), х увеличивается по горизонтали слева направо, у – по вертикали сверху вниз. Верхний левый угол имеет координаты (0, 0), количество пикселей зависит от типа видеоадаптера и режима его работы. Для адаптера VGA – 640х480 (стандартный режим). Чем больше пикселей (точек), тем выше качество изображения.

{Драйвер устройства – программа управления устройством.

Видеоадаптер – системное устройство, непосредственно управляющее монитором и выводом информации на экран. Основные части – видеоконтроллер, видеоBIOS, видеопамять и т. д.}

3)  В графическом режиме можно выделить на экране графическое окно, тогда координаты отсчитываются внутри окна, верхний левый угол считается точкой (0,0).

4)  В графическом режиме, в отличие от текстового, курсор невидим на экране, но также можно переместить его в любую точку экрана, получить его текущие координаты.

Процедуры и функции управления графическими режимами.

initgraph (gd, gm, path); - процедура инициализации графического режима.

gd – код драйвер графического адаптера:

для CGA gd=1 или CGA

для EGA gd=3 или EGA

для VGA gd=9 или VGA

для автоматического определения драйвера gd=0 или Detect;

gm – код графического режима, устанавливается процедурой.

gd, gm – переменные целого типа!

path – строка, содержащая путь к драйверу: ‘c:\tp6\bgi’, т. е. вам надо сначала найти файл GRAPH. TPU и

здесь указать путь до этого файла.

closegraph; - процедура завершения графического режима и перехода в текстовый режим.

graphresult: integer; - возвращает код ошибки последней графической операции (0 – успешное выполнение).

grapherrormsg (cool: intrger):string; - возвращает сообщение об ошибке для заданного кода ошибки.

restorecrtmode; - процедура восстановления текстового режима.

setgraphmode (gm); - процедура установления графического режима.

Пример 1.

uses crt, graph;

var gd, gm: integer;

begin

gd:=detect;

initgraph (gd, gm, ‘c:\tp6\bgi’); {укажите правильный путь до bgi}

if graphresult <> 0 then

begin

write (‘ошибка графики:’, grapherrormsg (graphresult));

halt;

end;

closegraph;

end.

Процедуры управления экраном и окном.

cleardevice; - процедура очистки графического экрана, заполнения его цветом фона, установления курсора в (0,0).

setviewport (x1, y1, x2, y2: integer; clip: boolean); - процедура установки графического окна.

x1, y1 – верхний левый угол,

x2, y2 – нижний правый угол,

clip – ограничитель фигур. Если clip=true, то построение фигур происходит только в пределах окна, в противном случае фигуры могут выходить за пределы окна.

clearviewport; - процедура очистки графического окна (заполняет цаетом фона, курсор в (0,0)).

Процедуры и функции работы с точками.

GetmaxX: integer; - возвращает максимальное значение координаты x экрана.

GetmaxY: integer; - возвращает максимальное значение координаты y экрана.

GetX: integer; - возвращает координату x текущей позиции на экране.

GetY: integer; - возвращает координату y текущей позиции на экране.

GetPixel (x,y): word; - возвращает цвет точки с заданными координатами.

PutPixel (x,y,color); - процедура закрашивает точки с координатами (x, y) в цвет color.

Процедуры работы с линиями

line (x1, y1, x2, y2); - проводит прямую между точками (x1,y1) и (x2,y2).

moveto (x,y); - перемещает курсор в точку (х, у).

lineto (x,y); - проводит прямую из текущей точки в точку с координатами (x, y).

linerel (dx,dy); - проводят прямую из текущей точки в точку, сдвинутую на dx и dy: (x+dx, y+dy).

moverel (dx,dy); - перемещает курсор в точку, сдвинутую на dx, dy.

Процедуры построения фигур из линий.

bar (x1, y1, x2, y2); - построение закрашенного прямоугольника

(x1,y1)

(x2,y2)

bar3d (x1, y1, x2, y2, gr, top); - построение закрашенного параллелепипеда, gr – ширина боковой грани (отсчитывается по горизонтали), top = true – рисовать верхнюю грань

 

(x1, y1)

(x2, y2)

rectangle (x1, y1, x2, y2); - построение контура прямоугольника

arc (x, y, st, end, r); - построение дуги окружности, (х, у) – координаты центра, st – угол начала, end – угол конца дуги, r – радиус. Отсчет идет против часовой стрелки от горизонтальной оси справа от центра.

circle (x, y, r); - построение окружности, (х, у) – центр, r – радиус.

ellipse (x, y, st, end, xr, yr); - построение дуги эллипса, (x, y) – центр, st, end – углы начала и конца, xr, yr – радиусы по оси х и у.

fillellipse (x, y, xr, yr); - построение закрашенного эллипса.

pieslice (x, y, st, end, r); - построение закрашенного сектора круга.

sector (x, y, st, end, xr, yr); - построение закрашенного сектора эллипса.

Пример:

x1:=10; y1:=10; x2:=100; y2:=50; dx:=40; dy:=20;

for i:=1 to 10 do

begin

bar(x1, y1, x2, y2);

x1:=x1+dx; x2:=x2+dx;

y1:=y1+dy; y2:=y2+dy;

end;

Процедуры установки цветов и стилей.

setcolor (color); - устанавливает текущий цвет рисования (для линий и текста).

setbkcolor (color); - устанавливает цвет фона экрана.

setlinestyle (sl, p,t); - установка стиля и толщины линии (sl – стиль, p – шаблон при sl=4, t – толщина линии).

sl = 0 – сплошная t = 1 – нормальная

sl = 1 – пунктирная t = 3 – толстая

sl = 2 – штрихпунктирная

sl = 3 – штриховая

sl = 4 – задается пользователем (р – шаблон из …) p: word;

setfillstyle (sl, color); - установка стиля и цвета заполнения фигур.

sl = 0 – цвет фона (нет заполнения) sl = 7 – клетка

sl = 1 – заполнение цветом sl = 8 – косая клетка

sl = 2 – заполнение пунктиром sl = 9 – частая сетка

sl = 3 – sl = 10 – редкие точки

sl = 4 – толстые sl = 11 – частые точки

sl = 5 – толстые sl = 12 – задается пользователем

sl = 6 –

floodfill (x, y, colline); - закрашивает замкнутую область, ограниченную непрерывной линией. (х, у) – координаты любой точки внутри области, colline – цвет линии, до которой закрашивается.

Пример: Построить спираль с начальной точкой (хс, ус), n витками и начальным углом α.

uses crt, graph;

const n=10; alf=pi; dt=pi/45;

var gd, gm, x, y, xc, yc, i, j: integer;

procedure Spi(xc, yc, n: integer; dt, alf: real);

begin

moveto(xc, yc);

t:=alf;

for i:=1 to n do

for j:=1 to 90 do

begin

t:=t+dt; r:=2*t;

x:=round(r*cos(t)+xc); x=r*cos(t) окружность, t-угол.

y:=round(r*sin(t)+yc); y=r*sin(t) r увеличиваем, получаем

lineto(x, y); спираль.

end;

end;

begin

gd:=detect;

initgraph (gd, gm, ‘L:\tp6\bgi’);

if graphresult <> 0 then

begin

write (‘ошибка графики:’, grapherrormsg (graphresult));

halt;

end;

xc:=getmxx div 2;

yc:=getmaxy div 2;

spi(xc, yc, n,dt, alf);

readln;

closegraph;

end.

Процедуры работы с текстом.

outtext (text: string); - выводит на экран текстовую строку, начиная с текущей позиции.

outtext(‘hello’);

outtextxy (x, y, text); - выводит на экран текстовую строку, начиная с заданных координат (х, у).

outtextxy(100,100,‘hello’);

settextstyle (font, dir, size); - устанавливает стиль текста

font – шрифт dir – направление size – размер символов

0 – стандартный 0 – слева направо (0-30)

1 – утроенный 1 – сверху вниз

2 – маленький

3 – прямой

4 – готический

settextjustify (horiz, vert); - устанавливает выравнивание текста на экране (horiz-горизонтальное, vert-вертикальное).

0 – слева (снизу)

1 – по центру

2 – справа (сверху)

Процедуры обмена с памятью

getimage (x1, y1, x2, y2, M); - копирует в массив М прямоугольную область экрана, заданную координатами (х1,у1) и (х2,у2).

putimage (x, y, M, bit); - выводит изображение из массива М на экран. (х, у) – координаты точки, в которой будет левый верхний угол изображения, М – массив, в котором было сохранено изображение, bit – операция объединения выводимого изображения с имеющимся на экране.

0 – mov экран + массив - старое изображение исчезает

1 – xor + - стираются точки пересечения

2 – or + - оба изображения

3 – and + - остаются точки пересечения

Пример1: Программа перемещения по экрану графического объекта

uses crt, graph;

var gd, gm, x, y: integer;

m: array [1..1500] of byte;

begin

gd:=detect;

initgraph (gd, gm, ‘c:\tp6\bgi’);

if graphresult <> 0 then

begin

write (‘ошибка графики:’, grapherrormsg (graphresult));

halt;

end;

circle(20,20,20);

getimage(0,0,40,40,m);

x:=0; y:=0;

readln;

while x<600 do

begin

putimage(x, y,m,1);

x:=x+2; y:=y+1;

putimage(x, y,m,1);

delay(100);

end;

closegraph;

end.

8. Записи

8.1 Определение записи

Относится к структурированным типам данных (как и массив, файл, множество). Запись состоит из фиксированного числа компонентов, называемых полями записи. В отличие от массива, поля записи могут быть различных типов.

Описание записи обычно осуществляют с использованием оператора TYPE, т. е. сначала определяют тип-запись, а затем в разделе var описывают конкретную запись. Тип-запись описывается следующим образом:

type <имя типа> = record

<поле1>: тип;

<поле2>: тип;

<полеN>: тип;

end;

Пример1:

type date = record

day: 1..31;

month: 1..12;

year: integer;

end;

type person = record

name: string[20];

age: integer;

adres: string[50];

end;

day month year

10

5

1980

var birthday: date;

student: person; name age adres

Доступ к полям записи осуществляется указанием имени записи и имени поля через точку:

birthday. day:=10;

birthday. month:=5;

birthday. year:=1980;

Пример 2:

type detal = record

name: string[20];

kod: integer;

weight: real;

end;

var d: detal;

Begin

d. name:=’гайка’;

d. kod:=155;

d. weight:=0.057;

write(‘Деталь: ’,d. name,’ Код: ’, d. kod,’ Вес: ‘,d. weight);

End.

8.2 Оператор над записями

Для того, чтобы не писать каждый раз имя записи при обращении к ее полям можно использовать оператор над записями WITH.

Структура оператора:

with <имя записи> do <оператор>;

обычно требуется begin…end;

В этом случае можно указывать только поле записи:

with birthday do

begin

day:=10;

month:=5;

year:=1980;

end;

8.3 Вложенные записи

Поля записи могут быть любого типа, в том числе поле записи может быть тоже записью. В этом случае образуются вложенные записи.

Пример:

type data = record

day: byte;

month: byte;

year: word;

end;

type stud = record

name: string[15];

fam: string[30];

pol: char;

adres: string[80];

birthday: data;

end;

stud

var stud: person;

begin begin

stud. name:=’Денис’; with stud do begin

stud. fam:=’Иванов’; name:=’Денис’;

stud. pol:=’м’; fam:=’Иванов’;

stud. adres:=’ ’; pol:=’м’;

stud. birthday. day:=21; with birthday do begin

stud. birthday. month:=3; day:=21;

stud. birthday. year:=1980; month:=3;

end. year:=1980;

end;

end;

end.

8.4 Массив записей

На практике часто используются не отдельные записи, а массивы записей. Рассмотрим использование массива записей на примере.

Пример 1: Программа, заполняющая экран точками различного цвета и стирающая их.

uses crt, graph;

type point = record

x, y: integer;

color: byte;

end;

var gd, gm, i: integer;

p: array [1..5000] of point;

begin

gd:=detect;

initgraph (gd, gm, ‘c:\tp6\bgi’);

if graphresult <> 0 then

begin

write (‘ошибка графики:’, grapherrormsg (graphresult));

halt;

end;

randomize;

for i:=1 to 5000 do

with p[i] do begin

x:=random(640);

y:= random(350);

color:= random(15)+1;

putpixel (x, y,color);

delay(50);

end;

for i:=1 to 5000 do

begin

putpixel(p[i].x, p[i].y,0);

delay(50);

end;

end.

Пример 2: Программа создания библиотечного каталога и вывод на экран списка всех книг, изданных в указанном году.

uses crt;

type book = record

name: string;

autor: string;

year: string;

str: string;

end;

var i, n, god: integer;

ch: char;

b: array [1..1000] of book;

begin

i:=0;

repeat

inc(i);

with b[i] do begin

write(‘название:’); readln(name);

write(‘автор:’); readln(autor);

write(‘год:’); readln(year);

write(‘количество страниц:’); readln(str);

end;

write(‘Еще вводить? Y/N’); readln(ch);

writeln; n:=i;

until (upcase(ch)=’N’);

repeat {поиск в каталоге}

write(‘Введите год’); readln(god);

for i:=1 to n do

if b[i].year=god then writeln(b[i].name, b[i].autor, b[i].year, b[i].str);

writeln(‘Продолжить поиск? Y/N’); readln(ch);

until (upcase(ch)=’N’);

end.

8.5 Записи с вариантами

Кроме фиксированного списка полей, запись может содержать вариантную часть, определяющую несколько вариантов структуры записи. Различие может касаться количества полей и их типов.

Вариантная часть содержит несколько альтернатив, для каждой из которых в скобках указывается список полей, присущих данному варианту.

Например, в библиотечном каталоге хранятся не только книги, но и журналы. Кроме названия, для книг хранится автор, год издания и количество страниц, а для журналов – номер и год выпуска.

b. name:=’Введение в Паскаль’;

b. autor:=’’;

b. year:=1980;

b. str:=253;

или

b. name:=’Мир ПК’;

b. nomer:=2;

b. god:=1998;

Вариантная часть может быть только одна и должна располагаться в конце записи. Она начинается со слова CASE, за которым следует переменная выбора варианта с указанием типа. Затем перечисляются варианты записи с указанием их полей.

В стандарте Паскаля перед тем, как использовать один из вариантов записи, переменной выбора варианта необходимо присвоить соответствующее значение. В Турбо-Паскале это делать необязательно (!).

case <переменная выбора>: тип of

вариант1: (поле1: тип;

поле2: тип;

полеN: тип);

вариант2: (поле1: тип;

поле2: тип;

полеK: тип);

Пример:

type izdanie = (book, magazine);

zap = record

name: string;

case tip: izdanie of

book: (autor: string;

year: integer;

str: integer);

magazine: (nomer: byte;

god: integer);

end;

var b: zap;

begin

if tip = book then writeln (b. name, b. autor, b. year, b. str)

else writeln (b. name, b. nomer, b. god);

end.

В запись с вариантами можно не вводить переменную выбора, перечислить только разные варианты.

type dostup = record

case integer of

1: (one_word: word);

2: (byte1: byte;

byte2: byte);

end;

9. Файлы

9.1 Определение файла

В Паскале файл относится к структурированным типам данных, как массив и запись. Файл представляет собой последовательность компонентов одного типа, расположенных на внешнем устройстве (например, магнитный диск). Тип компонентов файла может быть любым, кроме файлового. Количество компонентов в файле не оговаривается и ограничивается только объемом памяти на внешнем устройстве.

В Турбо-Паскале выделяют 3 типа файлов:

Текстовые файлы – используются для хранения текстовой информации в виде символов, объединенных в строки.

Описание: var <файловая переменная>: text;

Например, var f1: text;

Типизированные файлы – используются для хранения данных определенного типа.

Описание: var <файловая переменная>: file of <тип>;

Например, var f1: integer;

var f2: real;

var f3: ‘A’..’z’;

Нетипизированные файлы – используются для организации доступа к любым данным, независимо от их структуры (тип компонентов не указывается).

Описание: var <файловая переменная>: file;

Например, var f: file;

9.2 Процедуры и функции для работы с файлами

assign (<файловая переменная>, <имя. расширение>); - устанавливает связь между файловой переменной и именем файла на диске. Имя файла состоит из двух частей: имя (не более 8 символов) и расширение (не более 3 символов). Расширение может отсутствовать.

Например, assign(f1,’res. txt’);

Далее в программе, где будет упоминаться переменная f1 - подразумевается, что работа ведется с реальным файлом res. txt.

reset (<файловая переменная >); - открывает существующий файл для чтения.

Например, reset(f1);

rewrite (<файловая переменная >); - открывает файл для записи. Если файла нет на диске, то он создается. Если есть такой файл, то он создается заново пустым, вся старая информация стирается.

Например, rewrite(f1);

append (<файловая переменная >); - открывает файл для добавления в него новой информации (старая не стирается). Только для текстовых файлов (!).

Например, append(f1);

read (<файловая переменная >, <переменная>); - чтение одного элемента из файла, соответствующего файловой переменной, и помещение его в переменную программы. Чтение осуществляется последовательно, после чтения каждого значения, указатель в файле перемещается на следующую позицию.

Пример: Пусть на диске есть символьный файл mebel. Задача: написать программу, которая последовательно считывает из этого файла первые 4 символа и выводит их на экран.

Изобразим файл следующим образом:

1-ый байт памяти

2-ой байт памяти

Mebel

с

т

о

л

Программа:

var F1: file of char;

x: char; i:integer;

Begin

assign(F1,’mebel’);

reset(F1);

for i:=1 to 4 do

begin

read(F1,x);

write(x);

end;

close(F1);

End.

На экране увидим:

стол

Для текстового файла может использоваться процедура readln, которая читает значение из файла и пропускает непрочитанную часть строки и признак конца строки.

write (<файловая переменная >, <переменная>); - запись в файл данных из переменных программы. Вывод информации осуществляется последовательно.

var f1: file of char;

y: array [1..100] of integer;

for i:=1 to 100 do write(f1,y[i]);

eof (var f): boolean; - функция проверки конца файла. Возвращает true, если достигнут конец файла, иначе возвращает false.

while not eof(f) do read(f, x);

{команда читается так: пока не конец файла делай команду: чтение очередного элемента из файла, соответствующего файловой переменной f, в переменную x}

close (<файловая переменная >); - процедура закрытия файла, завершает действия с файлом. После процедуры close файловую переменную можно связать с другим файлом или снова открыть этот же файл.

assign(f2,’MyFile. txt’);

rewrite (f2);

close(f2);

reset(f2);

close(f2);

assign(f2,’OtherFile. txt’);

reset(f2);

Пример 1: Программа, переписывающая из файла a. txt в файл b. txt все символы, кроме цифр.

var ch: char:

f1,f2: text:

begin

assign(f1, ‘a. txt’);

assign(f2, ‘b. txt’);

reset(f1);

rewrite(f2);

repeat

read(f1,ch);

if (ch<=’0’) or (ch>=’9’) then write(f2,ch);

until eof(f1);

close(f1); close(f2);

end.

Пример 2: Программа для вычисления и вывода в файл таблицы Пифагора (таблицы умножения).

Var i, j, n : Integer;

f : Text;

Begin

Assign(f, ‘tab_pif. txt’);

Rewrite(f);

For i := 1 to 9 do begin

For j := 1 to 9 do begin

n := i*j;

Write(n:4); {вывод результата на экран}

Write(f, n:4); {вывод результата в файл; т. е., если в процедуре Write первым параметром

указана файловая переменная, то вывод осуществляется не на экран, а в файл,

с которым связана эта переменная в процедуре Assign }

end;

WriteLn; {перевод строки на экране}

WriteLn(f); {перевод строки в файле}

end;

Close(f);

End.

rename(<файловая переменная>,<новое имя файла>); - переименование файла на диске. Перед использованием этой поцедуры необходимо связать файловую переменную со старым именем файла. Если файл был открыт, то необходимо его закрыть.

Пример:

var f1,f2: text;

i: integer;

begin

assign(f1, ‘res. txt’);

rename(f1, ‘res. old’);

assign(f2, ‘res. old’);

rewrite(f2);

for i:=1 to 20 do writeln(f2,i);

close(f2);

end.

erase (<файловая переменная>); - удаление файла с диска. Если файл был открыт, то закрыть, связать с файловой переменной.

assign(f,’res. old’);

erase(f);

seek (<файловая переменная>, N); - перемещение в заданную позицию файла, нумерация позиций с нуля, N – номер позиции. Не используется для текстовых файлов (!).

a. dat

 

2

5

3

8

8

6

Пример:

var f: file of integer;

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6