лаба1. Светлана, лаба1. Отчет по лабораторной работе 1 примитивная графика. Рекурсивные функции вариант 19 Выполнил ст гр. Номер фамилия и. О
Скачать 273 Kb.
|
Министерство науки и высшего образования РФ Федеральное государственное бюджетное образовательное учреждение высшего образования «Уфимский государственный нефтяной технический университет» Кафедра «Вычислительная техника и инженерная кибернетика» ОТЧЕТ по лабораторной работе № 1 ПРИМИТИВНАЯ ГРАФИКА. РЕКУРСИВНЫЕ ФУНКЦИИ Вариант 19 Выполнил ст. гр. НОМЕР ФАМИЛИЯ И.О. _____________ подпись, дата Проверил: преподаватель Салихова М.А. ______________ оценка, дата, подпись Уфа 2022 Лабораторная работа №1«Примитивная графика. Рекурсивные функции» 1 Постановка задачи 1.Выбрать объект, в соответствие с вариантом: 2) Первый корпус УГНТУ 2. Изобразить объект произвольного размера и цвета. 3. Общие требования к изображению: 1) Использование более пяти различных цветов. 2) Использовать более трех функций изображения графических элементов в Си. 4. Организовать движение рисунка (или части рисунка) в произвольном направлении, используя работу с буфером обмена. 5. Вывести текст на экране (по заданной теме). 6. Реализовать возможность рекурсивного повторения рисунка n-раз (n вводится с клавиатуры). 2 Анализ задачи Задача решается с помощью использования графических функций. 3 Алгоритмы решения задачи Рисунок 1 – Алгоритмы процедуры window Рисунок 2 – Алгоритм процедуры redrectangle Рисунок 3 – Алгоритм процедуры whiterectangle Рисунок 4 – Алгоритм процедуры door Рисунок 5 – Алгоритм функции ugntu Рисунок 6 – Алгоритм процедуры action Рисунок 7 – Алгоритм функции rekurs Рисунок 8 – Алгоритм главной функции 4 Таблица переменных Таблица 1 – Таблица переменных для алгоритма и программы
5 Текст программы на СИ #include "graphics.h" #include using namespace std; void window(int x, int y) { moveto(x, y); setlinestyle(0, 0, 3); setcolor(BLACK); lineto(x+80, y); lineto(x+80, y+110); lineto(x, y+110); lineto(x, y); setfillstyle(1, CYAN); floodfill(x+10, y+25, BLACK); moveto(x, y+30); lineto(x+80, y+30); moveto(x+20, y); lineto(x+20, y+110); moveto(x+40, y); lineto(x+40, y+110); moveto(x+60, y); lineto(x+60, y+110); } void redrectangle(int x, int y) { moveto(150, 120);//красные прямоугольники moveto(x, y); lineto(x, y+380); moveto(x+90, y); lineto(x+90, y+380); setfillstyle(1, RED); floodfill(x+10, y+280, WHITE); setcolor(WHITE); moveto(x, y+140); setlinestyle(0, 0, 3); lineto(x+90, y+140); } void whiterectangle(int x, int y) { moveto(x, y); lineto(x, y-140); lineto(x+40, y-140); lineto(x+40, y); lineto(x+40, y); setfillstyle(1, LIGHTGRAY); floodfill(x+15, y-125, LIGHTGRAY); } void door(int x, int y) { moveto(x, y); lineto(x, y-100); lineto(x+50, y-100); lineto(x+50, y); setfillstyle(1, BLACK); floodfill(x+20, y-50, LIGHTGRAY); } void ugntu() { setcolor(YELLOW); setfillstyle(1, YELLOW); bar(100, 100, 800, 500); setcolor(WHITE); setlinestyle(0, 0, 3); moveto(100, 100); lineto(100, 500); lineto(800, 500); lineto(800, 100); lineto(90, 100); lineto(810, 100); moveto(100, 100); lineto(100, 70); lineto(450, 30); lineto(800, 70); lineto(800, 100); floodfill(450, 35, WHITE); moveto(100, 120); lineto(800, 120); setcolor(WHITE); setlinestyle(0, 0, 1); redrectangle(160, 120); redrectangle(280, 120); redrectangle(400, 120); redrectangle(520, 120); redrectangle(640, 120); window(165, 140); window(165, 280); window(285, 140); window(285, 280); window(405, 140); window(405, 280); window(525, 140); window(525, 280); window(645, 140); window(645, 280); setcolor(LIGHTGRAY); setlinestyle(0, 0, 3); moveto(230, 500); lineto(670, 500); moveto(230, 500); lineto(230, 330); lineto(350, 330); lineto(350, 300); lineto(550, 300); lineto(550, 330); moveto(670, 500); lineto(670, 330); lineto(550, 330); setfillstyle(1, YELLOW); floodfill(300, 400, LIGHTGRAY); moveto(230, 360); setlinestyle(0, 0, 3); lineto(670, 360); whiterectangle(230, 500); whiterectangle(360, 500); whiterectangle(500, 500); whiterectangle(630, 500); setfillstyle(1, RED); floodfill(300, 400, LIGHTGRAY); floodfill(430, 400, LIGHTGRAY); floodfill(570, 400, LIGHTGRAY); door(290, 500); door(425, 500); door(560, 500); } void action() { int vibor; ugntu(); void* bitmap; unsigned size; size = imagesize(90, 30, 810, 500); if (size != 0xffff) { bitmap = malloc(size); if (bitmap) { getimage(90, 30, 810, 500, bitmap); cleardevice(); for (int i = 90; i < 800; i++) { putimage(i, 30, bitmap, COPY_PUT); delay(5); if (i != 799) cleardevice(); } setcolor(LIGHTMAGENTA); outtextxy(810, 570, "УГНТУ"); } } delay(3000); cleardevice(); ugntu(); outtextxy(100, 550, "Введите количество повторений рисунка для рекурсии в консоли"); } int rekurs(int j, int m, int n) { void* bitmap; unsigned size; size = imagesize(90, 30, 810, 500); if (size != 0xffff) { bitmap = malloc(size); if (bitmap) getimage(90, 30, 810, 500, bitmap); } delay(1000); if (m >= n - 1) return 1; if (m < n - 1) { putimage(j+750, 30, bitmap, COPY_PUT); m++; } rekurs(j+750, m, n); } int main() { setlocale(LC_ALL, "RUS"); int j = 90, m = 0, n; initwindow(2000, 1500); ugntu(); delay(3000); action(); cout << "Введите N (Для рекурсии): "; cin >> n; rekurs(j, m, n); delay(3000); closegraph(); return 0; } 6 Результаты Рисунок 9 – начальное положение рисунка. Рисунок 10 – конечное положение рисунка. Рисунок 11 – повторение рисунка n( = 3) раз. 7 Вывод В данной лабораторной работе изучена и закреплена тема примитивной графики и рекурсивных функций, написана программа, которая рисует первый корпус УГНТУ, реализует анимацию (движение вправо), рекурсивно повторяет рисунок n раз. |