- •10 Выражения
- •Порядок выполнения операций
- •15 Операторные скобки
- •13. Ввод/вывод данных в языке pascal Ввод - вывод. Операторы Read (Readln), Write (Writeln). Простейшие линейные программы
- •Операторы Write и WriteLn
- •Операторы Read и ReadLn
- •16 Цикл с предусловием, с постусловием
- •Цикл с предусловием.
- •20 Массивы
- •22 Способы сортировки
- •23 Сортировка методом пузырька
- •Алгоритм и особенности этой сортировки таковы:
- •16. Цикл с предусловием и с постусловием
- •24 Метод выбора
- •26 Метод вставки
- •35 Организация динамических структур данных
- •36 Списки
- •37 Кольца (двунаправленный списк)
- •38 Стек
- •39 Очередь–
- •40 Операции над динамиескими структурами данных Добавление элемента в стек
- •Извлечение элемента из стека
- •47 Создание динамических графических изображений
39 Очередь–
это вид списка, имеющего два указателя на первый и последний элемент цепочки. Новые элементы записываются вслед за последним, а выборка элементов идет с первого. Этот алгоритм типа «первым пришел – первым вышел».
Возможно организовать списки с произвольным доступом к элементам. В этом случае необходим дополнительный указатель на текущий элемент.
40 Операции над динамиескими структурами данных Добавление элемента в стек
Пусть указатель a содержит адрес вершины стека, b - другой объявленный указатель.
Выделяем память под данные, на которые указывает b.
Записываем в эту память смысловые данные и ссылку на вершину стека, которая хранится в a.
a присваиваем значение b, т.е. a начинает указывать на новую вершину стека.
Извлечение элемента из стека
a - указатель на вершину, b - другой указатель
Извлекаем смысловые данные по указателю a.
В b сохраняем значение a.
a присваиваем значение поля-указателя элемента, на который она указывала.
Очищаем память, на которую указывает b.
Проверка, пуст ли стек;
Просмотр элемента в вершине стека без удаления;
Очистка стека.
типовые операции над списками:
добавление звена в начало списка;
удаление звена из начала списка;
добавление звена в произвольное место списка, отличное от начала (например, после звена, указатель на которое задан);
удаление звена из произвольного места списка, отличного от начала (например, после звена, указатель на которое задан);
проверка, пуст ли список;
очистка списка;
печать списка.
47 Создание динамических графических изображений
Действия с рисунком
n:= LoadPicture (name) – загружает рисунок из файла с именем name в оперативную память и возвращает описатель рисунка в целую переменную n.
Если файл не найден, то возникает ошибка времени выполнения.
Загружать можно рисунки в формате .bmp, .jpg или .gif.
DrawPicture (n, x, y) - выводит рисунок с описателем n в позицию (x,y) графического окна.
DrawPicture (n, x, y, w, h) – устанавливает ширину (w) и высоту (h) рисунка
SetPictureTransparent(n, true) - устанавливает (b = True) или отключает (b = False) режим прозрачности при рисовании рисунка с описателем n. Если b = True, то при его рисовании фон не отображается. Фоновым считается цвет левого нижнего пиксела рисунка.
Sleep(ms) - осуществляет паузу в выполнении программы на ms миллисекунд
Использование процедуры перерисовки Redraw позволяет избежать моргания экрана.
Практическая работа
Пусть автомобиль перемещается на фоне здания и деревьев слева направо на расстояние 400 пикселей.
Загрузим изображения фона и автомобиля из файлов gorod.gif и avto.jpg, поместив их описатели в переменные fon и avto. Установим прозрачность фона для изображения автомобиля SetPictureTransparent(avto,true). Зададим начальные координаты (х, у), ширину w и высоту h изображения автомобиля. Все переменные имеют тип integer.
Процедуры рисования и стирания будем повторять в цикле с предусловием While до тех пор, пока автомобиль не переместится на 400 пикселей. На каждом шаге цикла координату х левого верхнего угла изображения увеличиваем на 10. Ширину уменьшаем на 2, а высоту на 1 пиксель для уменьшения изображения при удалении.
program Avto1;
uses GraphABC;
var fon, avto, x,y, w,h: integer;
begin
SetWindowSize (600, 300);
fon:= LoadPicture ('город.gif');
avto:= LoadPicture ('автомобиль.jpg');
SetPictureTransparent (avto, true);
x:= 10; y:= 170; w:= 240; h:= 100;
while x < 400 do
begin
ClearWindow;
DrawPicture (fon, 0, 0);
DrawPicture (avto, x, y, w ,h);
x:= x + 10; w:= w - 2; h:= h - 1;
sleep (20); Redraw;
end;
end.
program babochka;
uses Graphabc;
var f, b, x, y : integer;
begin
setwindowsize (450, 550);
b:= LoadPicture ('цветы.jpg');
f:= LoadPicture ('бабочка.gif');
x:= 10; y:= 350;
while x<= 200 do
begin
DrawPicture (b, 0, 0);
Setpicturetransparent (f, true);
DrawPicture (f, x, y);
x:= x + 7;
y:= y- 4;
sleep (200);
end;
end.
Загрузим изображение циферблата из файла таймер.jpg, поместив описатель в переменную fori. Зададим координаты центра вращения стрелок (хО.уО) и начальные значения секунд sec:=0 и минут min:=0.
На каждом шаге цикла с постусловием repeat...until будем увеличивать значение секунд на 1 до тех пор. пока время не превысит 60 мин. или не нажата любая клавиша (keyPressed). Значения минут вычислим целочисленным делением секунд на 60: min:= secdiv60.
Секундную стрелку будем рисовать линией длиной 120 и толщиной 3 пикселя, а минутную - 100 и 7 пикселей. Радианная мера угла поворота секундной стрелки равна Pi*sec/30. а минутной Pi"min/30. Координаты концов стрелок (х,у) вычисляем по формулам тригонометрии и округляем до целых Например, для секундной стрелки x:=x0+Round<120"sin(Pi'sec/30))i y:=yO-Round(120'cos(Pi'sec/30)).
Program Timer;
uses crt, GraphABC;
var fon, x0, y0, x, y, R, min, sec: integer;
begin
SetWindowSize (360, 480); HideCursor;
x0 := 173; y0 := 300; min : =0; sec := 0;
fon := LoadPicture ('таймер.jpg');
repeat
DrawPicture (fon, 0, 0);
sec := sec + 1; min := sec div 60;
x := x0 + Round (120 * sin (Pi * sec / 30));
y := y0 – Round (120 * cos (Pi * sec / 30));
SetPenWidth (3);
Line (x0, y0, x, y);
x := x0 + Round (100 * sin (Pi * min / 30));
y := y0 – Round (100 * cos (Pi * min / 30));
SetPenWidth (7);
Line (x0, y0, x, y);
sleep (1000);
until (min >= 60) or keyPressed;
end.
