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 – номер позиции. Не используется для текстовых файлов (!).
|
2 | 5 | 3 | 8 | 8 | 6 |
Пример:
var f: file of integer;
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 |


