Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛабПрактОАиПН111.doc
Скачиваний:
58
Добавлен:
25.02.2016
Размер:
1.38 Mб
Скачать

Задания

Во всех заданиях в последней строке экрана сформировать подсказку о "горячих" клавишах и реализовать их в программе. Предусмотреть завершение выполнения программы нажатием клавиши "ключ" (ESC).

1. Составить программу вывода на экран двух окон, обрамленных рамкой. В первое окно ввести строку текста. При нажатии клавиши "Ввод" во втором окне появится ее копия в виде непрерывно "бегущей" справа налево строки.

2. То же, что в задании 1, но строка "бежит" сверху вниз.

3. Составить программу вывода на экран трех окон. В первое окно ввести вертикальную строку текста. Нажатием клавиши "Ввод" организовать непрерывное движение копий строки по "кольцу" последовательно через второе и третье окно. Направление "бегущей строки" сверху вниз.

4. То же, что в задании 3, но направление "бегущей строки" снизу вверх во втором окне.

5. Составить программу вывода на экран горизонтального меню, включающего пункты 1, 2, 3 и "Выход". Сформировать курсор. Предусмотреть активизацию пункта меню перемещением в него курсора и нажатием клавиши "Ввод". При активизации пункта 1 формируется окно, в котором находится информация о названии вуза; пункта 2 - окно с информацией о номере группы студента; пункта 3 - окно с Ф.И.О. студента. При активизации - "Выход" программа завершает работу.

6. То же, что в задании 5, но при активизации любого пункта меню на экране формируется и сохраняется только одно окно, - соответствующее этому пункту.

7. То же, что в задании 5, но меню расположено по вертикали.

8. То же, что в задании 5, но меню организуется в виде прямоугольников, расположенных последовательно по диагонали.

9. Составить программу вывода на экран горизонтального меню, состоящего из четырех пунктов и "Выход". Название пунктов считывать из файла при последовательной активизации каждого пункта меню курсором. При этом считать, что строка файла - это один пункт меню. Если в файле меньше четырех строк, то программа выводит сообщение об ошибке. При активизации "Выход" программа завершает работу.

10. То же, что в задании 9, но меню организуется в виде прямоугольников, расположенных последовательно по диагонали. .

11. Составить программу вывода на экран двух окон. Первое - обрамленное рамкой и в него занесен текст. Второе окно сформировано в виде ячеек разного оттенка цвета. Перемещение по ячейкам осуществляется стрелками управления курсором. При этом цвет фона окна с текстом меняется в соответствии с цветом ячейки.

12. То же, что в задании 11, но изменяется цвет символов.

13. То же, что в задании 11,. но изменяется цвет рамки первого окна.

14. Составить программу вывода на экран окна, обрамленного рамкой. Заполнить его текстом с помощью ReadKey. При нажатии клавиши "Ввод" символы текста должны изменить свой цвет (включая мерцание) по случайному закону. В программе учесть, что первый генератор случайных чисел используется для выбора цвета символа текста, а второй – для выбора цвета фона. 1

15. Разработать текстовый редактор содержимого одной строки. Предусмотреть режим вставки, удаления и замены символов.

16. Составить программу вывода на экран окна. Заполнить его текстом с помощью ReadKey. Окно разбить на вертикальные столбцы шириной в один символ. Столбцы закрасить периодически повторяющимися цветами фона с номерами от единицы до восьми. При нажатии клавиши "Ввод" цвет фона i-го столбца меняется на цвет фона i+1-го столбца по замкнутому кольцу.

17. То же, что в задании 16, но для строк.

18. То же, что в задании 16, но изменение цвета фона происходит только во время нажатия клавиши управления движением курсора "Влево" или "Впра­во".

19. Составить программу, реализующую работу однооктавного музыкального инструмента с использованием цифровых клавиш от 0 до 9 и кла­виш с символами “-“ и “=“. Нажатие любой из этих клавиш должно сопровождаться соответствующим тоном звука и появлением на экране в таблице клавиш значения частоты звука.

20. Составить программу вывода на экран окна. Заполнить его текстом с помощью ReadKey. При нажатии клавиши "Ввод" в границах этого окна формируется второе "непрозрачное" окно меньших размеров. С помощью клавиш управления движением курсора оно может перемещаться в границах первого окна. При этом должен восстанавливаться ранее закрываемый текст первого окна.

21. То же, что в задании 20, но цвет фона второго окна выбран таким, что оно "прозрачно" для текста первого окна.

22. Составить программу вывода на экран окна, которое условно "разбито" на вертикальные столбцы. Верхние части столбцов окрашены одним фоном, нижние - другим. Граница раздела фонов столбцов формирует синусоиду произвольной амплитуды с периодом, равным ширине окна. При нажатии клавиши "Ввод" начинают изменяться соотношения заполнения столбцов разными фонами, т.е. создается эффект "бегущей" слева направо волны.

23. То же, что а задании 22, но волна бежит справа налево.

24. То же, что в задании 22, но для строк, и водна "бежит" сверху вниз.

25. То же, что в задании 24, но волна бежит снизу вверх.

26. Составить программу вывода на экран основного (внешнего) окна. Заполнить его текстом с помощью ReadKey. При нажатии клавиши "Ввод" внутри этого окна появится новое окно меньших размеров с другим цветом фона. При этом текст основного окна должен быть сохранен. Повторное нажатие "Ввод" формирует следующее окно еще меньших размеров со своим фоном . Текст основного окна должен все время сохраняться.

27. То же, что в задании 26, но сначала формируется самое внутреннее окно и заполняется текстом, а затем - очередное внешнее.

28 Составить программу вывода на экран окна. Заполнить его текстом с помощью ReadKey. В пределах окна сформировать курсор. При его переме­щении с помощью клавиши управления движением курсора за ним должен оставаться "след" с другим фоном. При пересечении "следа" со "следом" в точке пересечения фон должен измениться на фон окна.

29. Составить программу вывода на экран двух окон. В первом окне набирать целые или действительные числа. Если число набрано нужного типа, то оно отображается во втором окне. В противном случае - сообщение об ошибке. Предусмотреть коррекцию числа в первом окне.

30. Составить программу вывода на экран окна, обрамленного рамкой. Окно состоит из ячеек. При нажатии клавиши "Ввод" первый генератор случайным образом меняет цвет ячейки, второй - цвет фона рамки окна. Изменение цвета ячейки сопровождается изменением тональности звука.

Лабораторная работа 13

Процедуры и функции модуля GRAPH

Цель работы: Формирование умений и навыков в разработке программ, использующих графические возможности Паскаля.

Что нужно знать для выполнения работы

1. Стандартные процедуры и функции модуля GRAPH.

2. Методы анимации изображений.

Пример 1

Разработать рекурсивную процедуру заполнения замкнутой области закраской, определенной шаблоном пользователя

Текст программы

program L13_1;

{Демонстрация рекурсивного алгоритма заполнения замкнутой области

определенным видом закраски}

uses

crt,graph;

const

shx = 5;

shy = 5;

{ Шаблон закраски}

shablon : array [0..shy-1,0..shx-1] of byte =

((1,1,1,1,1),

(1,3,2,3,1),

(1,2,1,2,1),

(1,3,2,3,1),

(1,1,1,1,1));

var

Gd, Gm: Integer;

procedure Fill(x,y :word);

{Заполнение замкнутой области}

begin

if GetPixel(x,y)>0 then

exit;

PutPixel(x,y,shablon[y mod shy,x mod shx]);

Fill(x+1,y);

Fill(x-1,y);

Fill(x,y+1);

Fill(x,y-1);

end;

begin

Gd := Detect;

InitGraph(Gd, Gm, '');

if GraphResult <> grOk then

Halt(1);

circle(180,100,60);

circle(160,100,20);

readkey;

fill(160,125);

readkey;

CloseGraph;

end.

Пример 2

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

Текст программы

program L13_2;

{Песочные часы}

uses

crt,Graph;

type

mas1=array[1..800] of word;

var

ch:char;

Driver,Mode,i,j,k,m,n,v,p:integer;

x1,y1,x2,y2,x3,y3:mas1;

procedure verchcolb(x1,y1:mas1;var x2,y2:mas1;x3,y3:mas1;n,v:integer);

var

t:word;

i,j:integer;

begin

{Струя}

for i:=1 to n do

begin

y3[i]:=random(115)+190;

x3[i]:=196+trunc(random(8));

if y3[i]>300 then

if odd(y3[i]) then

x3[i]:=x3[i]+random(5)

else

x3[i]:=x3[i]-random(5);

end;

{Нижняя колба}

for i:=1 to n do

begin

y2[i]:=random(80)+220;

x2[i]:=360-trunc(0.8*y2[i])+random(trunc(1.6*y2[i]-320));

end;

{Сортировка по убыванию у}

for i:=1 to n-1 do

for j:=1 to n-i+1 do

if y2[j]<y2[j+1] then

begin

t:=y2[j];

y2[j]:=y2[j+1];

y2[j+1]:=t;

t:=x2[j];

x2[j]:=x2[j+1];

x2[j+1]:=t;

end;

{Ближе к оси -в первую очередь}

i:=1;

m:=1;

while i< n-1 do

begin

p:=x2[i];

inc(i);

while x2[i]=p do

inc(i);

for j:=m to i-2 do

for k:=m to i-2 do

begin

if abs(x2[k]-200)>abs(x2[k+1]-200) then

begin

t:=y2[k];

y2[k]:=y2[k+1];

y2[k+1]:=t;

t:=x2[k];

x2[k]:=x2[k+1];

x2[k+1]:=t;

end;

end;

m:=i;

end;

{Верхняя колба}

for i:=1 to n do

begin

y1[i]:=random(80)+130;

x1[i]:=40+trunc(0.8*y1[i])+2*random(trunc(160-0.8*y1[i]));

rectangle(x1[i]-1,y1[i]-1,x1[i]+1,y1[i]+1);

end;

{Сортировка по возрастанию у}

for i:=1 to n-1 do

for j:=1 to n-i+1 do

if y1[j]>y1[j+1] then

begin

t:=y1[j];

y1[j]:=y1[j+1];

y1[j+1]:=t;

t:=x1[j];

x1[j]:=x1[j+1];

x1[j+1]:=t;

end;

{Часы пошли}

for i:=1 to n do

begin

rectangle(x1[i]-1,y1[i]-1,x1[i]+1,y1[i]+1);

delay(100*v);

rectangle(x3[i]-1,y3[i]-1,x3[i]+1,y3[i]+1);

rectangle(x3[601-i]-1,y3[601-i]-1,x3[601-i]+1,y3[601-i]+1);

if i<500 then

begin

rectangle(x2[i]-1,y2[i]-1,x2[i]+1,y2[i]+1);

delay(100*v);

end;

end;

end;

begin

{Инициализация графического режима}

Driver:= Detect;

InitGraph(Driver,Mode,'');

{Рисуем песочные часы}

setbkcolor(3);

setcolor(4);

setlinestyle(4,$ffff,3);

ellipse(200,100,0,360,80,20);

ellipse(200,110,0,360,80,20);

ellipse(200,300,0,360,80,20);

ellipse(200,290,0,360,80,20);

ellipse(188,200,270,90,5,10);

ellipse(212,200,90,270,5,10);

ellipse(200,290,150,30,80,20);

setlinestyle(4,$ffff,3);

setwritemode(XORPut);

setfillstyle(solidfill,6);

setcolor(4);

line(119,108,195,201);

line(281,108,205,201);

line(119,288,195,200);

line(281,288,205,200);

line(120,300,120,290);

line(280,300,280,290);

v:=10;

outtextxy(60,340,'<Enter>-заполнить колбу <Esc>-выход');

outtextxy(10,360,

'<Стрелка вверх>-увеличить скорость <Стрелка вниз>-уменьшить');

ch:=readkey;

while ch<>#13 do

begin

if ch=#0 then

begin

ch:=readkey;

if ch=#80 then

v:=4*v

else

if (ch=#72) and (v>1) then

v:=v div 4;

end;

ch:=readkey;

end;

while ch=#13 do

begin

verchcolb(x1,y1,x2,y2,x3,y3,600,v);

ch:=readkey;

if ch=#27 then

break;

if ch=#0 then

begin

ch:=readkey;

if ch=#80 then

v:=4*v

else

if (ch=#72) and (v>1) then

v:=v div 4;

end;

for i:=1 to 800 do

if i<500 then

rectangle(x2[i]-1,y2[i]-1,x2[i]+1,y2[i]+1);

ch:=readkey;

end;

CloseGraph;

end.

Пример 3

Составить программу вывода на экран трех вложенных друг в друга окружностей, представляющих собой беговые дорожки. На линии старта находятся три участника забега (произвольной фигуры). При нажатии клавиши "Ввод" участники стартуют с одинаковой угловой скоростью. После старта угловая скорость каждого участника в процессе гонки изменяется по случайному закону. На финише указать место, занятое каждым участником

Текст программы

Program L13_3;

{Ипподром}

uses

crt,graph;

Var

gd,gm :Integer;

r : Array [1..3] of Real; {радиусы дорожек}

alfa : Array [1..3] of Real; {угловое положение участников}

w : Array [1..3] of Real; {угловая скорость участников}

timer : LongInt absolute 0:$46c;

tick : Longint;

i,m : Integer;

x,y : Array [1..3] of Integer; {декартовы координаты участников}

n : Real; {количество кругов дистанции}

s,c : Real;

mesto : Array [1..3] of Integer; {место каждого участника}

Begin

ClrScr;

WriteLn('Забег Века ( прогноз )');

Write('Введите размер дистанции (в долях круга): ');

ReadLn(n);

s:=sin(n*2*pi);

c:=cos(n*2*pi);

gd := Detect;

InitGraph(gd, gm,'');

directvideo:=false;

circle(320,240,150);

circle(320,240,170);

circle(320,240,190);

circle(320,240,210);

r[1]:=160;

r[2]:=180;

r[3]:=200;

for i:=1 to 3 do

begin

alfa[i]:=0;

mesto[i]:=0;

end;

setcolor(0);

randomize;

repeat

Tick:=Timer+1;

for i:=1 to 3 do

begin

if (alfa[i] > n*2*pi) then

begin

if mesto[i]=0 then

begin

mesto[i]:=m;

Inc(m);

end;

w[i]:=0;

end

else

w[i]:=random*5*pi/180;

alfa[i]:=alfa[i]+w[i];

setcolor(0);

SetFillStyle(SOLIDFILL,0);

fillellipse(x[i],y[i],3,3);

x[i]:=round(320+r[i]*cos(alfa[i]));

y[i]:=round(240-r[i]*sin(alfa[i]));

SetFillStyle(SOLIDFILL,12+i);

fillellipse(x[i],y[i],3,3);

setcolor(15);

line(320+150,240,320+210,240);

OuttextXY(320+156,242,'1');

OuttextXY(320+176,242,'2');

OuttextXY(320+196,242,'3');

line(320+round(c*150),240-round(s*150),

320+round(c*210),240-round(s*210));

end;

while Timer<Tick do;

until Keypressed or (m>3);

WriteLn('Результаты Забега : ');

Writeln;

for i:=1 to 3 do

WriteLn('Участник N° ',i,' - ',mesto[i],' место');

ReadKey;

End.