Основы программирования на языке Паскаль
Процедура PutPixel (Х, Y, Color); выводит на экран точку Color цвета. Процедура LineTo (Х, Y); вычерчивает линию от текущего положения указателя до точки Х, Y.
Процедура SetLineStyle (Туре, Pattern, Thick);
Где Туре - тип линии. Pattern - образец линии. Thick - толщина линии.
Тип линии:
0 - сплошная,
1 - точечная,
2 - штрихпунктирная,
3 - . . . . . . . .
4 - узор линии определяет пользователь параметром pattern.
Thick=l - толщина линии в 1 пиксел.
Thick=2 - толщина линии в 3 пиксела.
Процедура Rectangle (Х1, Y1, Х2, Y2); вычерчивает прямоугольник с использованием текущего цвета и текущего стиля линий.
Процедура DrawPoly (N, Р); вычерчивает произвольную ломаную линию. N - количество точек излома, включая крайние; Р - переменная типа PointType, которая в Graph имеет вид:
type
PointType=record
X, Y: Word
end;
При вычерчивании используются текущий цвет и текущий стиль линий. Процедура Circle (Х, Y, R); вычерчивает окружность с центром X, Y и радиусом R.
Процедура Arc (Х, Y, Beg А, End А, R); вычерчивает дугу окружности Beg А и End А, соответственно, начальный и конечный углы дуги.
Процедура Ellipse (Х, Y, Beg А, End А, RX, RY); вычерчивает дугу эллипса с центром X, Y; Beg А, End А - начальный и конечный угол, RX и RY - горизонтальный и вертикальный радиусы.
Процедура Bar (Х1, Y1, Х2, Y2); заполняет прямоугольную область экрана образцом узора и текущим цветом, которые устанавливаются процедурой SetFillStyle.
Процедура Ваr3D (Х1, Y1, Х2, Y2, Depth, Тор); вычерчивает трехмерное изображение параллелепипеда и закрашивает его переднюю грань. Depth - глубина третьего измерения, Top=true - верхняя грань вычерчивается, false - нет.
Процедура FillPoly (n, Coords); обводит линией и закрашивает замкнутый многоугольник; n - количество вершин, Coords - переменная типа PointType, содержащая координаты вершин (см. DrawPoly).
Процедура FillEllipse (Х, Y, Rx, Ry); обводит линией и заполняет эллипс.
Процедура Sector (Х, Y, Beg А, End А, Rx, Ry); вычерчивает и заполняет эллипсный сектор.
Процедура PieSlice (Х, Y, Beg А, End А, R); вычерчивает и заполняет сектор окружности.
Процедура SetColor (Color); устанавливает текущий цвет для выводимых линий и символов.
Процедура SetbkColor (Color); устанавливает цвет фона окна.
Процедура SetFillStyle (Fill, Color); устанавливает стиль Fill и цвет заполнения Color.
Значения Fill:
заполнение фоном (узор отсутствует);
сплошное заполнение;
заполнение - - - - -;
- « - /////// ;
- « - утолщенными ///////;
- « - утолщенными \\\\\\ ;
- « - \\\\\\ ;
- « - + + + + + +;
- « - ******;
- « - прямоугольной клеточкой;
- « - редкими точками ;
- « - частыми точками ;
- « - узор определяется пользователем.
Процедура FloodPill (Х, Y, Color); заполняет произвольную замкнутую линию (точки соединения должны совпадать, например, концы линий не могут пересекаться) текущим стилем и текущим цветом. X, Y - координаты точки внутри фигуры, Color -- цвет ограничений линии. Если линии разомкнуты или пересекаются и концы «торчат», то цвет «разольется» по всему окну.
Функция ImageSize (X1, Y1, X2, Y2); возвращает размер памяти в байтах, необходимый для размещения прямоугольного фрагмента изображения (например, окна с рисунком).
Процедура GetImage (X1, Y1, X2, Y2, Buf); помещает в память копию прямоугольного фрагмента изображения. Buf -- переменная или участки кучи, куда будет помещена копия видеопамяти с фрагментом изображения. Размер Buf должен быть не меньше значения, возвращаемого функцией ImageSize с теми же координатами X1...Y2.
Процедура PutImage (X, Y, Buf, Mode); выводит в заданное место экрана копию фрагмента изображения, ранее помещенную в память процедурой GetImage.
X, Y -- координаты левого угла того места на экране, куда будет скопирован фрагмент изображения. Buf -- переменная, или участок кучи, откуда берется фрагмент изображения. Mode -- способ копирования.
12.3. Примеры программ
Ниже приведены программы, демонстрирующие некоторые возможности графики в Паскале.
Программа Prim 54 демонстрирует вывод различных простых объектов-окружностей, дуг, эллипсов, прямоугольников, параллелепипедов.
Program Prim54;Uses Graph;var grDriver,grMode,errCode,Radius,i,Width,y0,y1,y2,x1,x2:integer;Begin grDriver:=detect; { определение номера драйвера }
InitGraph(grDriver,grMode,'');
{ инициализация графического режима }
errCode:=GraphResult;
if errCode=grOK then
begin { графический режим открыт, можно работать }
for radius:=1 to 5 do
begin { рисуем окружности с радиусами 10,20..50,
с центром x=200, y=70 точек растра }
Circle(200,70,Radius*10); readln; end;
{ Cleardevice;} { если бы этот оператор не был в
комментарных скобках, т.е. не заблокирован, то
сейчас окружности были бы стерты с экрана }
Ellipse(200,200,0,360,30,50); { рисуем дугу эллипса с центром 200,200, начальный угол=0, конечный - 360 (замкнутый,
эллипс радиусами 30,50 }
readln;
Ellipse(300,200,0,180,50,30); {полэллипса }
readln;
for Radius:=1 to 5 do
Arc(300,100,0,90,radius*10); {дуги с центром 300,100, от
0 до 90 градусов, радиусами 10,20..50}
readln;
Width:=10;
Bar(30,20,50,100); {прямоугольник с координатами 30,20 -
верхний левый угол и 50,100 - нижний правый угол}
for i:=1 to 5 do
Bar(10+i*Width,300+i*10,20+i*Width,400);
{пять прямоугольников: первый 20,310.30,400,
второй 30,320,40,400 и т.д. }
readln;
Bar3D(210,300,250,360,10,TopOn); {параллелепипед с крышкой}
readln;
x1:=410; y1:=300; x2:=450; y2:=360;
Bar3D(x1,y1,x2,y2,10,TopOff); { параллелепипед без крышки }
readln;
CloseGraph; {закрыть Graph}
end
else Halt(1); { режим Graph не удалось открыть. }
End.
Prim 55 рисует в динамике случайно расположенные цветные линии в окне до тех пор, пока не будет нажата клавиша Enter. Затем машина выводит последним случайным цветом главную диагональ окна, после Enter - случайные лучи и после Enter - прямоугольник.
Program Prim55;
Uses CRT,Graph;
var GrDriver,grMode,errCode:integer;
begin grDriver:=Detect;
InitGraph(grDriver,grMode,' ');
errCode:=GraphResult;
if errCode=grOK then
begin Randomize; {запустить генератор случайных чисел}
repeat {рисуются цветные линии в квадрате 500 x 500,
пока не будет нажата любая клавиша, координаты
линий случайны, цвета линий случайны}
SetColor(Random(GetMaxColor)+1);
Line(Random(500),Random(500),Random(500),Random(500));
Delay(1000); {каждая линия рисуется с задержкой}
until KeyPressed;
Cleardevice;
MoveTo(1,2); {перевести курсор}
LineRel(500,500); {провести линию из предыдущей точки в 500,500
последним цветом}
readln; readln;
repeat
LineTo(random(500),random(500)); {провести линию в случайную точку}
Delay(6000);
until KeyPressed; readln;
ClearDevice;
Rectangle(29,29,GetMaxX-29,GetMaxY-29); {прямоугольник}
readln;
CloseGraph; end
else Halt(1); end.
Prim56 рисует эллипсы и круги, закрашенные красным цветом.
Program Prim56;
Uses CRT, Graph;
Var grDriver,grMode,errCode:integer;
Begin grDriver:=Detect;
InitGraph(grDriver,grMode, ' ');
errCode:=Graphresult;
if errCode=grOK then
Begin SetBkColor(blue);
SetFillStyle(1,4);
FillEllipse(220,150,50,50);
FillEllipse(420,150,50,50);
FillEllipse(320,230,50,130);
FillEllipse(370,405,50,30);
FillEllipse(275,410,50,30);
readln; end
else Halt(1); end.
Prim56 рисует обезьяну с тазиком.
Program Prim57;
Uses Graph;
Var i,grDriver,grMode,TrrCode,errCode:integer; x,y:word;
xm,ym,rc,xc,yc,x1,y1,x2,y2,r:word;
k:arccoordsType; kr:array[1..20] of PointType;
Begin grDriver:=detect;
InitGraph(grDriver,grMode,' ' );
errCode:=GraphResult;
if errCode=grOK then
begin
x:=150; y:=150;
SetBkColor(white);
{уши}
y1:=y-30; x1:=x-30; x2:=x+40; r:=15;
SetColor(lightred);
SetFillStyle(solidfill,brown);
pieslice(x1,y1,0,360,r);
pieslice(x2,y1,0,360,r);
r:=r-3;
SetFillStyle(solidfill,lightred);
pieslice(x1,y1,0,360,r);
pieslice(x2,y1,0,360,r);
{голова}
r:=(x2-x1) div 2-3;
x1:=x1+r+2;
y1:=y1+2;
xc:=x1;
yc:=y1;
rc:=r;
setColor(brown);
SetFillStyle(solidfill,brown);
pieslice(x1,y1,0,360,r);
{майка}
setColor(brown);
SetFillStyle(solidfill,yellow);
y2:=y1+r-3;
x1:=x1-r div 2+2;
ym:=y2;
line(x1-5,y2-5,x1-27,y2+68);
x2:=x1+r+16;
xm:=x2;
line(x2-15,y2-5,x2+27,y2+68);
line(x1-27,y2+68,x2+27,y2+68);
putpixel(x2-22,y2+25,blue);
floodfill(x2-22,y2+25,brown);
{пояс}
setcolor(green);
setfillstyle(solidfill,green);
bar(112,215,214,225);
{штаны}
setcolor(blue);
setfillstyle(solidfill,blue);
kr[1].x:=113; kr[1].y:=223;
kr[2].x:=113; kr[2].y:=270;
kr[3].x:=165; kr[3].y:=270;
kr[4].x:=170; kr[4].y:=260;
kr[5].x:=180; kr[5].y:=270;
kr[6].x:=225; kr[6].y:=270;
kr[7].x:=212; kr[7].y:=223;
kr[8].x:=113; kr[8].y:=223;
fillpoly(8,kr);
{левая нога}
setcolor(brown);
setfillstyle(solidfill,brown);
kr[1].x:=135; kr[1].y:=270;
kr[2].x:=145; kr[2].y:=320;
kr[3].x:=123; kr[3].y:=350;
kr[4].x:=145; kr[4].y:=358;
kr[5].x:=145; kr[5].y:=350;
kr[6].x:=162; kr[6].y:=320;
kr[7].x:=145; kr[7].y:=270;
kr[8].x:=135; kr[8].y:=270;
fillpoly(8,kr);
{правая нога}
kr[1].x:=195; kr[1].y:=270;
kr[2].x:=205; kr[2].y:=320;
kr[3].x:=183; kr[3].y:=350;
kr[4].x:=205; kr[4].y:=358;
kr[5].x:=205; kr[5].y:=350;
kr[6].x:=222; kr[6].y:=320;
kr[7].x:=205; kr[7].y:=270;
kr[8].x:=195; kr[8].y:=270;
fillpoly(8,kr);
{башмаки}
setfillstyle(solidfill,red);
pieslice(160,360,0,360,10);
pieslice(200,370,10,160,20);
pieslice(215,360,0,360,10);
pieslice(142,370,10,160,20);
setfillstyle(solidfill,white);
fillellipse(145,115,5,8);
fillellipse(163,115,5,8);
setfillstyle(solidfill,blue);
pieslice(147,115,0,360,3);
pieslice(165,115,0,360,3);
setcolor(yellow);
arc(154,160,30,145,30);
setcolor(red);
setfillstyle(solidfill,lightmagenta);
fillellipse(154,146,5,8);
{бабочка}
kr[1].x:=140; kr[1].y:=153;
kr[2].x:=135; kr[2].y:=163;
kr[3].x:=155; kr[3].y:=158;
kr[4].x:=175; kr[4].y:=163;
kr[5].x:=170; kr[5].y:=153;
kr[6].x:=155; kr[6].y:=158;
kr[7].x:=140; kr[7].y:=153;
fillpoly(7,kr);
{тазик}
setfillstyle(solidfill,blue);
kr[1].x:=243; kr[1].y:=225;
kr[2].x:=255; kr[2].y:=280;
kr[3].x:=325; kr[3].y:=280;
kr[4].x:=335; kr[4].y:=225;
kr[5].x:=255; kr[5].y:=225;
fillpoly(5,kr);
sector(290,230,0,360,50,12);
setfillstyle(solidfill,lightcyan);
fillellipse(290,230,40,10);
{руки}
setfillstyle(solidfill,brown);
kr[1].x:=184; kr[1].y:=164;
kr[2].x:=295; kr[2].y:=225;
kr[3].x:=300; kr[3].y:=215;
kr[4].x:=175; kr[4].y:=150;
kr[5].x:=180; kr[5].y:=160;
fillpoly(5,kr);
pieslice(295,224,0,170,12);
pieslice(265,244,0,360,10);
kr[1].x:=136; kr[1].y:=184;
kr[2].x:=265; kr[2].y:=255;
kr[3].x:=270; kr[3].y:=245;
kr[4].x:=135; kr[4].y:=170;
kr[5].x:=136; kr[5].y:=184;
fillpoly(5,kr);
end else halt(1);
readln; end.
Prim58 демонстрирует возможности мультипликации: по фоновому рисунку - дом, луна, висящий "базовый" НЛО; мечется с переменной скоростью малый НЛО и издает звуки случайными частотами.
Program Prim58;
Uses CRT,Graph;
Label loop;
Const r=30; p=600; pr=1000; {константы, определяющие скорость}
{рисования и перемещения объектов}
Var d,m,e,xm,ym,x,y,lx,ly,rx,ry,size,i,dx,dy,
width,height,grDriver,grMode,errCode,a,b,c,
f,s,j:integer;
saucer:pointer;
Begin grDriver:=Detect;
InitGraph(grDriver,grMode,'');
errCode:=GraphResult;
if errCode=grOK then
Begin x:=r*3; y:=r*2; xm:=GetMaxX div 2; ym:=GetMaxY div 2;
{тарелка}
SetBkColor(blue);
SetFillStyle(solidfill,red);
Ellipse(x,y,0,360,r+40,r div 10);
Ellipse(x,y-4,0,360,r-1,r);
Line(x+7,y-6,x+10,y-12);
Line(x-7,y-6,x-10,y-12);
Circle(x+10,y-12,2);
Circle(x-10,y-12,2);
Floodfill(x+1,y+4,White);
{определяем габариты НЛО и помещаем данные о нем в кучу}
lx:=x-r-1;
ly:=y-14;
rx:=x+r+1;
ry:=y+r div 6;
Width:=rx-lx+1;
Height:=ry-ly+1;
Size:=Imagesize(lx-9,ly,rx+3,ry+10);
GetMem(Saucer,size);
GetiMage(lx-9,ly,rx+10,ry+3,saucer^);
{создаем звездное небо}
Rectangle(xm,ym,3*xm,3*ym);
SetViewPort(xm+1,ym+1,3*xm-1,3*ym-1,Clipon);
xm:=2*xm;
ym:=2*ym;
for i:=1 to 200 do
PutPixel(random(xm),random(ym),white);
{дом}
SetFillStyle(solidfill,DarkGray);
bar(320,240,640,480); Delay(p*10); {дом}
bar(370,220,600,240); Delay(p*10); {чердак}
Line(320,240,640,240); Delay(p*10); {крыша}
Line(370,240,370,220); Delay(p*10); {левая стена чердака}
Line(600,220,600,240); Delay(p*10); {правая стена чердака}
Line(370,220,600,220); Delay(p*10); {крыша чердака}
Line(430,220,430,180); Delay(p*10); {мачта антенны}
Line(430,180,410,170); Delay(p*10); {верхний ус антенны}
Line(430,180,410,190); Delay(p*10); {нижний ус антенны}
Line(430,180,410,180); Delay(p*10); {средний ус антенны}
bar(0,460,640,480); Delay(p*10); {земля}
Line(0,460,640,460); Delay(p*10);
SetFillStyle(solidfill,Yellow);
b:=270; {окна}
for i:=1 to 4 do
begin a:=350; f:=b+20; c:=a+15; Delay(p*5);
for j:=1 to 8 do
begin
bar(a,b,c,f); Delay(p*5);
SetColor(DarkGray);
Line(a,b+8,c,f-12); Delay(p*5);
Line(a+5,b+8,a+5,b+20); Delay(p*5);
a:=a+35; c:=c+35; end;
b:=b+50; end; Delay(p*10);
Pieslice(500,80,300,100,20); {месяц}
SetColor(green); Delay(p*10);
Line(150,460,150,400); Delay(p*10); {дерево}
Circle(170,365,25); Delay(p*10);
Circle(165,375,25); Delay(p*10);
Circle(150,375,25); Delay(p*10);
Circle(135,365,25); Delay(p*10);
Circle(155,345,25); Delay(p*10);
{задаем начальное положение нло и направление движения}
x:=xm div 2;
y:=ym div 2;
dx:=100;
dy:=100;
{основной цикл}
Repeat
PutImage(x,y,Saucer^,XorPut);
Sound(Random(2*2000));
Delay(pr*2); NoSound;
Putimage(x,y,Saucer^,XorPut);
{получаем новые координаты}
loop:x:=x+dx;
y:=y+dy;
if (x<0) or (x+width+1>xm) or (y<0) or (y+height+1>ym) then
begin
{НЛО достиг границы экрана, меняем направление его движения}
x:=x-dx; y:=y-dy;
dx:=GetMaxX div 10 - random(GetMaxX div 5);
dy:=GetMaxY div 30 - random(GetMaxY div 15);
goto loop;
end until KeyPressed;
if ReadKey=#0 then x:=ord(ReadKey);
end else CloseGraph;
end.
Список использованной и рекомендуемой литературы:
1. А.Н. Воловачев, В.С. Крисевич. Программирование на языке Паскаль для персональных ЭВМ ЕС. - Минск: "Высшая школа", 1989.
2. В.Я. Сердюченко. Розробка алгоритмів та програмування мовою TURBO PASCAL. - Харьков: "Паритет", 1995.
3. В.В. Фаронов. TURBO PASCAL 7.0 /Практика программирования/ - "Нолидж", 1997.
4. В.В. Фаронов. TURBO PASCAL 7.0 /Начальный курс/ - "Нолидж", 1997.
ОГЛАВЛЕНИЕ
- 1. Предварительные сведения 4
- 1.1. Алфавит 4
- 1.2. Решение задач 4
- 2. Простейшие программы 5
- 2.1. Оператор присваивания 5
- 2.2. комментарии 7
- 2.3. Программа 7
- 2.4. Простейший ввод-вывод 8
- 2.5. Арифметические выражения 9
- 2.6. Описания переменных. 12
- 2.7. Раздел описания типов 14
- 3. Разветвляющиеся программы 16
- 3.1. Общие положения 16
- 3.2. Оператор goto, раздел описания меток 17
- 3.3. Оператор if 19
- 3.4. Оператор case (оператор выбора) 25
- 4. Циклические программы 27
- 4.1. Оператор for 27
- 4.2. Оператор repeat. Общий вид 32
- 4.3. Оператор While 33
- 4.4. Вложенные циклы 34
- 5. Ввод - вывод 37
- 5.1. Общие положения 37
- 5. 2. Ввод 38
- 5. 3. Вывод 39
- 5. 4. Некоторые возможности ввода-вывода 39
- 6. Массивы 41
- 6. 1. Описание массивов 41
- 7. Подпрограммы 49
- 7.1. Общие положения 49
- 7.2. Подпрограммы-функции, определенные пользователем 51
- 7.3. Подпрограммы-процедуры 54
- 7.4. Локальные и глобальные описания объектов 58
- 8. Строковые данные 59
- 8.1. Общие замечания 59
- 8.2. Строковые выражения 60
- 8.3. Стандартные процедуры и функции для обработки строк 61
- 8.3.1. Процедуры обработки строк 61
- 8.3.2. Функции обработки строк 62
- 9. Записи 63
- 9.1. Комплексные данные 68
- 9.2. Запись с вариантами 70
- 10. Файлы 71
- 10.1. Общие замечания 71
- 10.2. Стандартные процедуры и функции для работы с файлами 72
- 10. 3. Стандартные файлы 73
- 10.4. Файлы последовательного доступа, созданные пользователем 74
- 10.5. Файлы произвольного доступа 80
- 10.6. Текстовые файлы 83
- 11. Использование библиотеки CRT 85
- 11.1. Программирование клавиатуры 85
- 11.2. Текстовый вывод на экран 88
- 11.3. Программирование звукового генератора 96
- 12. Графика в Паскале 99
- 12.1. Инициализация графического режима 99
- 12.2. Процедуры и функции библиотеки Graph 99
- 12.3. Примеры программ 102
- СПИСОК ИСПОЛЬЗОВАННОЙ ЛИТЕРАТУРЫ............................................109
Array
Страницы: 1, 2, 3, 4, 5, 6, 7, 8
|