Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Тurbo Pascal 7+.doc
Скачиваний:
12
Добавлен:
24.12.2018
Размер:
10.09 Mб
Скачать

10.4. Переменные вместо чисел

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

Вот программа для задания 3 из раздела 9.7 для бесконечного движения окружности влево-вправо. В ней этот принцип пока не соблюдается..

USES Graph;

VAR x, Device, Mode :integer;

BEGIN

Device:=0;

InitGraph(Device, Mode, '<путь к графическим драйверам>');

ReadLn;

repeat {Внешний цикл для бесконечности отскоков}

{Движение направо:}

х:=40; {Начинаем перемещение из левой части экрана}

repeat {Вложенный цикл для движения направо)

SetColor(White);

Circle(x,100,10); {Рисуем белую окружность}

SetColor(Black);

Circle(x,100,10); {Рисуем черную окружность}

х:=х+2 {Перемещаемся немного направо}

until x>600; {пока не достигнем правого края экрана}

{Движение налево:}

х:=600; {Начинаем перемещение из правой части экрана}

repeat {Вложенный цикл для движения налево}

SetColor(White);

Circle(x,100,10); {Рисуем белую окружность}

SetColor(Black);

Circle(x,100,10); {Рисуем черную окружность}

х:=х-2 {Перемещаемся немного налево}

until x<40 {пока не достигнем в левого края экрана}

until 8>9 {Невыполнимое условие, чтобы цикл выполнялся бесконечно}

END.

Предположим, мы хотим, чтобы шарик летал в 3 раза быстрее. Для этого нам достаточно в двух местах программы вместо 2 написать 6

Теперь напишем вариант той же программы, но с использованием переменных величин:

USES Graph;

VAR x, Device, Mode, lev, prav, shag :Integer;

BEGIN

Device:=0;

InitGraph(Device, Mode, '<путь к графическим драйверам>');

ReadLn;

lev:=40; prav:=600; shag:=2;

repeat

x:=lev;

repeat

SetColor(White);

Circle(x,100,10);

SetColor(Black);

Circle(x,100,10);

x:=x+shag

until x>prav;

x:=prav;

repeat

SetColor(White);

Circle(x,100,10);

SetColor(Black);

Circle(x,100,10);

x:=x-shag

until x<lev

until 8>9

END.

Теперь для того, чтобы изменить скорость шарика, достаточно заменить 2 на 6 только в одном месте.

10.5. Записываем программу целиком

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

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

При работе на компьютере ни в коем случае не вводите сразу всю программу. Потому что профессиональный программист в среднем допускает одну ошибку в 10 строках. Значит, в вашей программе будет порядка 10 опечаток, или ошибок. Все 10 сразу вы не найдете и за сутки. Потому что сразу 10 ошибок искать в 100 раз труднее, чем 10 раз по одной. Поэтому, следуя не спеша за материалом этого раздела, действуйте в таком порядке:

Прочтите часть материала, посвященного горизонту. Введите в программу строки, необходимые для рисования горизонта: прежде всего в раздел VAR нужно добавить описание y_goriz. Затем введите строку y_goriz:=240. Затем строку Line (0, y_goriz, 640, y_goriz). Запустите программу. Если горизонт на месте и все в порядке, сверьтесь с текстом программы в учебнике и сотрите изображение горизонта.

С горизонтом закончили. Что дальше должно рисоваться на экране? Синева. Введите пару строк про синеву. Запустите программу. Все в порядке, сверьтесь с текстом.. Сотрите изображение синевы.

И так далее. Вводите за один раз не больше одной-двух строк, после чего запускайте программу и смотрите, как она работает.

Старайтесь не списывать с учебника, а придумывайте программу сами.

А теперь приступим к объяснениям в самой программе.

Поскольку у нас первым будет рисоваться горизонт из процедуры "Пейзаж", с него и начнем. Исходим из того из того, что размер вашего экрана 640x480 пикселов. Если другой, то вам нетрудно будет внести изменения в текст нашей программы.

Пусть горизонт делит экран пополам. Тогда подойдет оператор Line(0,240,640,240). Посмотрим, какие числа здесь целесообразно заменить переменными величинами. Числа 0 и 640 нам менять не понадобится, а вот высоту горизонта мы вполне можем изменить. Придумаем переменную величину y_goriz и поставим ее вместо числа 240. У нас вместо одного оператора получится два:

y_goriz:=240;

Line (0, y_goriz, 640, y_goriz)

Оператор y_goriz:=24 поместим в начало раздела операторов, так как значение y_goriz понадобится и части Звезды, и процедуре Летающая тарелка.

Части Синева, Луна, Звезды понятны без пояснений. Попробуем теперь сделать процедуру Дерево. Начнем с того дерева, что в левом нижнем углу:

PROCEDURE Tree;

BEGIN

SetColor(White);

{Рисуем крону:}

Ellipse (100,400,0,360,15,30);

SetFillStyle(1,LightGreen);

FloodFill(100.400,White);

{Рисуем ствол:}

Rectangle (97,430,103,460);

SetFillStyle(1,Brown);

FloodFill(100,440,White),

END.

Сделаем переменными все величины, от которых зависит местоположение дерева, а величины, от которых зависят форма и размеры, для простоты трогать не станем. Будем считать "координатами дерева" координаты центра эллипса, образующего крону. Придумаем им имена x_tree и y_tree, и от них будем отсчитывать все остальные координаты дерева. Тогда процедура примет такой вид:

PROCEDURE Tree;

BEGIN

SetColor(White);

{Рисуем крону:}

Ellipse (x_tree, y_tree, 0,360,15,30);

SetFillStyle(1,LightGreen);

FloodFill(x_tree, y_tree, White);

{Рисуем ствол:}

Rectangle (x_tree-3,y_tree+30,x_tree+3,y_tree+60);

SetFillStyle(1,Brown);

FloodFill (x_tree,y_tree+40,White);

END;

Теперь для того, чтобы дерево было нарисовано в нужном месте, нужно перед выполнением процедуры Tree присвоить координатам дерева нужные значения: x_tree := 100, y_tree.= 400. В программе процедура выполняется 3 раза, причем каждый раз перед ее выполнением координатам дерева присваиваются разные значения.

Аналогично составляем процедуру Дом. Сначала напишем ее без переменных:

PROCEDURE House;

BEGIN

SetColor(White);

{Рисуем стену:}

Rectangle (300,400,340,440);

SetFillStyle(1,LightBlue);

FloodFill (301,401 .White);

{Рисуем окно:}

Rectangle (315,410,325,420);

SetFillStyle(1.DarkGray);

FloodFill (320,415, White);

{Рисуем крышу:}

Line(295,400,345,400);

Line(295,400,320,370);

Line(345,400,320,370);

SetFillStyle(1,Red);

FloodFill (320,399, White);

END;

Выберем левый верхний угол стены точкой начала отсчета. Ее координаты x_house:=300, y_house:=400. Окончательный вид процедуры House вы можете видеть в программе.

Вот полный текст программы:

USES Graph, CRT;

VAR Device, Mode, i :Integer;

y_goriz, x_tree, y_tree, x_house, y_house,

x_tar, y_tar, shirina_tar, visota_tar :Integer;

PROCEDURE Tree;

BEGIN

SetColor(White);

{Рисуем крону:}

Ellipse (x_tree, y_tree, 0,360, 15,30);

SetFillStyle(1,LightGreen);

FloodFill(x_tree, y_tree, White);

{Рисуем ствол}

Rectangle (x_tree-3, y_tree+30, x_tree+3, y_tree+60);

SetFillStyle(1, Brown);

FloodFill (x_tree, y_tree+40,White);

END;

PROCEDURE House;

BEGIN

SetColor(White);

{Рисуем стену}

Rectangle(x_house, y_house, x_house+40, y_house+40);

SetFillStyle(1,LightBlue);

FloodFill(x_house+1, y_house+1, White);

{Рисуем окно!}

Rectangle (x_house+15, y_house+10, x_house+25, y_house+20);

SetFillStyle(1,DarkGray);

FloodFill (x_house+20, y_house+15, White);

{Рисуем крышу}

Line(x_house-5, y_house, x_house+45, y_house);

Line(x_house-5, y_house, x_house+20, y_house-30);

Line(x_house+45, y_house, x_house+20, y_house-30);

SetFillStyle(1,Red);

FloodFill (x_house+20, y_house-1, White);

END;

PROCEDURE Landscape;

BEGIN

{горизонт:}

Line(0, y_goriz, 640, y_goriz);

{синева:}

SetFillStyle(1,Blue);

FloodFill(10,10,White);

{луна:}

SetColor(Yellow);

Circle(500,100,30);

SetFillStyle(1,Yellow);

FloodFill(500,100,Yellow);

{звезды:}

for i:=1 to 100 do PutPixel (Random(640),Random(y_goriz), Random(16));

{Три дерева:}

x_tree:=100; y_tree:=400; Tree;

x_tree:=300; y_tree:=300; Tree;

x_tree:=550; y_tree:=380; Tree;

{Два дома:}

x_house:=300; y_house:=400; House;

x_house:=470; y_house:=300; House;

{трава:}

SetFillStyle(1,Green);

FloodFill(10,470,White);

END;

PROCEDURE Music;

BEGIN

Sound(200);Delay(1000);

Sound(500);Delay(1000);

Sound(300);Delay(1000);

NoSound

END;

PROCEDURE Flying_Sauser;

BEGIN

{Задаем начальные координаты летающей тарелки и ее размеры.

Их не обязательно задавать в начале раздела операторов, так как

они другим процедурам не нужны }

x_tar:=100; y:=40; shirina_tar:=30; visota_tar:=15;

repeat { цикл движения тарелки }

SetColor(While);

Ellipse (x_tar, y_tar, 0, 360, shirina_tar, visota_tar);

Delay(20); { чтобы замедлить движение }

SetColor(Blue);

Ellipse(x_tar, y_tar, 0, 360, shirina_tar, visota_tar);

Y_tar:=y_tar+1

Until y tar> y_goriz;

{ рисуем последний раз тарелку на горизонте: }

SetColor(White);

Ellipse(x_tar, y_tar, 0, 360, shirina_tar, visota_tar);

END;

BEGIN

Device:=0;

InitGraph(Device, Mode, ‘< путь к графическим драйверам >’);

Y_goriz:=240;

Landscape; { рисуем пейзаж }

Delay(3000); { пауза 3 секунды }

Music; { музыка }

Fleing_Saucer; { движение тарелки }

Music; { музыка }

SetFillStyle(1, Yellow); { свет в окне }

FloodFill (x_house+20, y_house+15, White); { свет в окне }

ReadLn;

CloseGraph

END.