Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Алгоритмы,ответы по практикам.docx
Скачиваний:
2
Добавлен:
01.05.2025
Размер:
1 Мб
Скачать
☆

39 Очередь–

это вид списка, имеющего два указателя на первый и последний элемент цепочки. Новые элементы записываются вслед за последним, а выборка элементов идет с первого. Этот алгоритм типа «первым пришел – первым вышел».

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

40 Операции над динамиескими структурами данных Добавление элемента в стек

Пусть указатель a содержит адрес вершины стека, b - другой объявленный указатель.

  1. Выделяем память под данные, на которые указывает b.

  2. Записываем в эту память смысловые данные и ссылку на вершину стека, которая хранится в a.

  3. a присваиваем значение b, т.е. a начинает указывать на новую вершину стека.

Извлечение элемента из стека

a - указатель на вершину, b - другой указатель

  1. Извлекаем смысловые данные по указателю a.

  2. В b сохраняем значение a.

  3. a присваиваем значение поля-указателя элемента, на который она указывала.

  4. Очищаем память, на которую указывает 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.

25