Язык Си. Алгоритм Свойства алгоритма дискретность состоит из отдельных шагов (команд) понятность
![]()
|
Задания«5»: «Корона» Задания«3»: «Домик» «4»: «Лягушка» Штриховка (x1, y1) (x2, y2) N линий (N=5) h rectangle (x1, y1, x2, y2); line( x1+h, y1, x1+h, y2); line( x1+2*h, y1, x1+2*h, y2); line( x1+3*h, y1, x1+3*h, y2); ... rectangle(x1, y1, x2, y2); h = (x2 – x1) / (N + 1.); for (x = x1+h; x < x2; x += h) line(x, y1, x, y2); x дробная часть x отбрасывается x float x, h; ! результат – дробное число Штриховка (программа) (x1, y1) (x2, y2) h #include #include main() { int N = 10, x1 = 100, x2 = 300, y1 = 100, y2 = 200; float h, x; initwindow(800,600); rectangle (x1, y1, x2, y2); getch(); closegraph(); } прямоугольник штриховка N h = (x2 – x1) / (N + 1.); for (x = x1+h; x < x2; x += h) line(x, y1, x, y2); Штриховка (x1, y1) (x2, y2) (x3, y2) a h (x3+a, y1) line( x1+h, y1, x1+h-a, y2); line( x1+2*h, y1, x1+2*h-a, y2); line( x1+3*h, y1, x1+3*h-a, y2); ... h = (x3 – x2) / (N + 1.); a = x2 – x1; x = x1 + h; for (i = 1; i <= N; i ++, x += h ) line(x, y1, x-a, y2); x x-a i ++, x += h после каждого шага выполняются две команды Плюсы и минусы? ? Штриховка (x1, y1) (x2, y2) hx hy y x y line( x1, y1+hy, x1+hx, y1+hy ); line( x1, y1+2*hy, x1+2*hx, y1+2*hy); line( x1, y1+3*hy, x1+3*hx, y1+3*hy); ... hx = (x2 – x1) / (N + 1.); hy = (y2 – y1) / (N + 1.); x = x1 + hx; y = y1 + hy; for (i=1; i <= N; i++) { line( x1, y, x, y ); x += hx; y += hy; } Задания «3»: Ввести с клавиатуры количество линий, построить фигуру и выполнить штриховку: «4»: Ввести с клавиатуры количество линий, построить фигуру и выполнить штриховку: или Задание«5»: Ввести с клавиатуры количество линий и построить фигуру: COLOR(c, c, c) Как менять цвет? (x1, y1) (x2, y2) hc = 255 / N; c = 0; for ( i=1; i<=N+1; i++ ) { setfillstyle ( 1, COLOR(c,c,c) ); floodfill( ???, ???, 15 ); c += hc; } цвет границы Шаг изменения c: серый: R = G = B Цвет: Изменение c: 0, ..., 255 N Как менять цвет? setfillstyle( 1, COLOR(c,c,c) ); floodfill ( ???, ???, 15 ); hc = 255 / N; c = 0; x = x1 + h; for ( i=1; i <= N+1; i++ ) { setfillstyle(1,COLOR(c,c,c)); floodfill ( x-1, y1+1, 15 ); x += h; c += hc; } c = 0; COLOR(c,c,c) c += hc; правая граница полосы Как объединить циклы штриховки и заливки? ? (x1, y1) (x2, y2) (x-1, y1+1) x Задания «4»: Ввести с клавиатуры число линий штриховки и построить фигуру, залив все области разным цветом. «5»: Ввести с клавиатуры число окружностей и построить фигуру, залив все области разным цветом. Тема 10. Графики функций (только с 9 класса) Построение графиков функций Задача: построить график функции y = 3 sin(x) на интервале от 0 до 2π. Анализ:
минимальное значение ymin = -3 при x = 3π/2 Проблема: функция задана в математической системе координат, строить надо на экране, указывая координаты в пикселях. Преобразование координат (x,y) X Y x y Математическая система координат Экранная система координат (пиксели) (xэ,yэ) xэ yэ (0,0) (0,0) a b k – масштаб (длина изображения единичного отрезка на экране) xэ = a + kx yэ = b - ky Программа const a = 50, b = 200, k = 50; const float xmin = 0, xmax =2*M_PI; float x, y, h = 0.01; int xe, ye, w; w = (xmax - xmin)*k; line(a-10, b, a+w, b); line(a, 0, a, 2*b); for (x = xmin; x < xmax; x += h) { y = 3*sin(x); xe = a + k*x; ye = b - k*y; putpixel (xe, ye, 12); } Что плохо? ? 2π h – шаг изменения x w – длина оси ОХ в пикселях координаты точки на экране оси координат Как соединить точки? Алгоритм: Если первая точка перейти в точку (xэ,yэ) иначе отрезок в точку (xэ,yэ) Программа: выбор варианта действий переменная-флаг (1 или 0) int first; ... first = 1; for (x = xmin; x < xmax; x += h) { ... if ( first ) { moveto(xe, ye); first = 0; } else lineto(xe, ye); ... } начальное значение Задания «4»: Построить график функции y = x2 на интервале [-3,3]. «5»: Построить график функции (эллипс) Тема 11. Процедуры Процедуры Задача: Построить фигуру: Особенность: Три похожие фигуры.
отличия: координаты, цвет Можно ли решить известными методами? ? Сколько координат надо задать? ? Процедуры Процедура – это вспомогательный алгоритм, который предназначен для выполнения некоторых действий. Применение:
Подзадача1 Подзадача2 Подзадача3 1.1 1.2 1.3 2.1 2.2 2.3 3.1 3.2 3.3 Задача Процедуры Порядок разработки:
найти в них общее (размеры, форма, угол поворота) и отличия (координаты, цвет) отличия записать в виде неизвестных переменных, они будут параметрами процедуры (x, y) 100 60 (x+100, y) (x, y-60) void Tr( int x, int y, int c ) { ... } имя процедуры тело координаты цвет void – «пустой» (некоторые действия) параметры Процедуры (x, y) 100 60 (x+100, y) (x, y-60) void Tr( int x, int y, int c ) { moveto ( x, y ); lineto ( x, y-60 ); lineto ( x+100, y ); lineto ( x, y ); setfillstyle ( 1, c ); floodfill ( x+20, y-20, 15); } тело процедуры формальные параметры «Формальные параметры» могут изменяться, заранее неизвестны (обозначаются именами, как переменные). Программа #include #include main() { initwindow (400, 300); Tr (100, 100, COLOR(0,0,255)); Tr (200, 100, COLOR(0,255,0)); Tr (200, 160, COLOR(255,0,0)); getch(); closegraph(); } (100,100) 100 60 фактические параметры вызовы процедуры void Tr( int x, int y, int c) { ... } формальные параметры процедура Процедуры Особенности:
void Tr( int x, int y, int c ) Tr ( 200, 100, COLOR(255,0,0)); x y c Процедуры Особенности:
внутри процедуры параметры используются так же, как и переменные в процедуре можно объявлять дополнительные локальные переменные, остальные процедуры не имеют к ним доступа void A ( int x, float y, char z ) { ... } void A ( int x, float y, char z ) { int a2, bbc = 345; ... } локальные переменные int a2, bbc = 345; Как поменять местами? 2 3 1 Задача: поменять местами содержимое двух чашек. Задача: поменять местами содержимое двух ячеек памяти. 4 6 ? 4 6 4 x y c c = x; x = y; y = c; x = y; y = x; 3 2 1 Можно ли обойтись без c? ? Параметры-переменные Задача: составить процедуру, которая меняет местами значения двух переменных. Особенности: надо, чтобы изменения, сделанные в процедуре, стали известны вызывающей программе. main() { int x = 1, y = 2; Swap ( x, y ); printf ( "x = %d, y = %d", x, y ); } void Swap ( int a, int b ) { int c; c = a; a = b; b = c; } эта процедура работает с копиями параметров x = 1, y = 2 Параметры-переменные Применение: таким образом процедура (и функция) может возвращать несколько значений Запрещенные варианты вызова
Swap ( x+z, y+2 ); // выражения void Swap ( int & a, int & b ) { int c; c = a; a = b; b = c; } & параметры могут изменяться & |