52841.fb2
Мета уроку: показати можливості роботи з діловою графікою засобами мови Паскаль на прикладах розв’язання задач.
На цьому уроці пропонується показати можливості мови Паскаль при побудові графіків функцій та різного виду діаграм.
ЗАДАЧА № 614
Умова: Зобразити на екрані монітора декартову систему координат, початок якої збігається з центром екрана.
Розв’язування: Для малювання осей х та у слід скористатися процедурою line, причому координати початку та кінця цих прямих обчислити неважко, тому що вони мають розміщуватись в центрі екрану. Градуювання осей робиться теж за допомогою коротких відрізків довжиною 8 пікселів, що розташовані з кроком step пікселів (крок в програмі заданий у вигляді константи, хоча можна його задавати і іншим методом). Підписи на осях можна зробити таким чином: число, що треба написати, переводиться в рядок процедурою str, а потім виводиться на екран процедурою OutTextXy. Зверніть увагу на те, що на від’ємному проміжку вісі до числа ліворуч дописується знак «-» командою S := ‘-’ + S, де S — рядок, що містить підпис під поділкою. Для якісного оформлення малюнку використовується процедура settextjustify(1,1), що забезпечує відцентроване виведення тексту у вказану позицію. Програма, що реалізує алгоритм, має вигляд:
Program Example_614;
Uses graph; {Підключення бібліотек}
Const
Step=25; {Крох між поділками на осях}
Var GraphDriver,GraphMode:integer;
x,у:integer; {x,y - координати центру декарт. сист. коорд.}
r:integer; {r - відстань від центру координат до чергової поділки}
S:string; {S - рядок, де зберігається символьне значення підпису для поділки)
Begin
Randomize;
GraphDriver:=VGA; {Ініціалізація графічного режиму}
GraphMode:=VGAHi;
InitGraph(GraphDriver,GraphMode,’’); {Малювання осей}
line(0,240,640,240); line(320,0,320,480);
{Малювання стрілочок на кінцях осей}
line(630,235,640,240); line(630,245,640,240);
line(315,10,320,0); line(325,10,320,0);
{Підписи на осях}
outtextxy(330,5,’Y’); outtextxy(630,220,’X’) ;
x:=320; y:=240; r: =0; {Малювання та підпис поділок на вісі X}
while x+r<640 do
begin
line(x+r,y-4,x+r,y+4); line(x-r,y-4,x-r,y+4);
r:=r+step;
str(r div step, S);
settextjustify (1,1);
outtextxy(x+r,y+10,S);
s:=’-’+S;
outtextxy(x-r,y+10,S) ;
end;
r:=0; {Малювання та підпис поділок на вісі Y}
while y+r<4 80 do
begin
line(x+4,y+r,x-4,y+r); line(x+4,y-r,x-4,y-r);
r:=r+step;
str(r div step, S);
settextjustify (1,1); outtextxy(x-10,y-r,S);
s:=’-’+S; outtextxy(x-10,y+r,S);
end;
Readkey;
Closegraph; {Закриття графічного режиму}
End.
ЗАДАЧА № 616
Умова: Стовпчаста діаграма - це послідовно зображені прямокутники однакової ширини, що розташовані на одному горизонтальному рівні. Висота прямокутників пропорційна значенням деякої числової послідовності. Побудувати стовпчасту діаграму за даними п цілими значеннями. Для наочності стовпчики зафарбувати різними кольорами.
Розв ‘язок: Для побудови діаграми, по-перше, необхідно задати кількістьстовпчиків, тобто кількість числових значень, по яких буде будуватисядіаграма, а, по-друге, - самі значення. В даному алгоритмі всі ці величинивводяться з клавіатури, хоча можна передбачити і інші методи, наприклад,заповнення генератором випадкових чисел. Після введення числових данихслід розрахувати коефіцієнти пропорційності по осях Хта Y, щоб отриматималюнок на весь екран. Врахуємо, що максимальний розмір по осі X -640 пікселів, а по осі Y - 480 пікселів. Тоді коефіцієнт по осі X можнаобчислити за формулою
де SizeX—коефіцієнт пропорційності, N—кількість стовпчиків на діаграмі.
Константне значення 5 від дробу віднімається, щоб розділити стовпчики між собою хоча б на 5 пікселів (це значення можна змінити).
По осі Y знайти коефіцієнт пропорційності важче, тому що для цього слід спочатку визначити максимальне значення, що використовується для побудови діаграми. Для знаходження максимуму використовуємо стандартний алгоритм. Тут можна запропонувати дітям згадати цей алгоритм самостійно. Після знаходження максимуму знаходимо коефіцієнт пропорційності по осі Y за очевидною формулою
де SizeY- шуканий коефіцієнт, Мах - максимальне значення з масиву.
Обидва шукані коефіцієнти пропорційності округлюємо функцією round, тому що екранні координати не можуть бути дробовими, а після цього нормалізуємо значення масиву множенням на коефіцієнт SizeY.
Після підготовки даних можна побудувати стовпчасту діаграму. Кожен її елемент будується процедурою Ваг, що малює зафарбований прямокутник, колір якого задається процедурою SetFillStyle. Очевидно, що ширина кожного стовпчика буде дорівнювати SizeX - 5, тому початкова координата по осі А’дорівнює (і - l)*SizeX, а кінцева — i*SizeX - 5, де і - змінна циклу, що рахує номер чергового стовпчика. Початкова координата по осі Y буде максимальною, тобто 480, а кінцева координата дорівнювати різниці між 480 та елементом масиву.
Програма має наступний вигляд:
Program Example_616;
Uses graph;
Var GraphDriver,GraphMode:integer;
N,i,Max :integer;
A:array [1. .100] of integer; {Масив значень побудови діаграми}
SizeX, SizeY : integer;
{Коефіцієнти пропорційності no відповідних осях}
Begin
ClrScr;
Write (‘Введіть кількість стовпчиків у діаграмі: ‘);
ReadLn (N); {Введення значень для побудови діаграми}
for i:=l to N do
begin Write (‘Введіть A[‘,i,’]:’); ReadLn (A[i]); end;
Randomize;
GraphDriver:=VGA; {Ініціалізація графічного режиму}
GraphMode:=VGAHi; InitGraph(GraphDriver,GraphMode,’’) ;
SizeX:=round(640/N-5); {Пошук максимального значення в масиві для побудови діаграми на весь екран}
Мах:=А[1];
for і:=2 to N do
if A[i]>Max then Мах:=А[і];
SizeY:=round(480/Max); {Перетворення масиву значень у відповідності з коефіцієнтом пропорційності}
for i:=l to N do A[i]:=A[i]*SizeY;
for i:=1 to N do
begin {Встановлення випадковим чином кольору зафарбування стовпчиків діаграми}
SetFillStyle (1,random(14)+1); Bar ((i-l)*SizeX,480,i*SizeX-5,480-A[i]);
end;
Readkey; {Затримка зображення на екрані}
CloseGraph; {Закриття графічного режиму}
end.
ЗАДАЧА № 618
Умова: Секторною діаграмою називають круг, площі секторів якого пропорційні відповідним числовим величинам, узятим з деякої послідовності. Для заданої послідовності з п дійсних чисел побудувати секторну діаграму. Для наочності сектори діаграми зафарбувати різними кольорами.
Розв’язування: Кількість елементів діаграми в цій задачі вводиться так само, як і в попередньому випадку, тобто з клавіатури, а заповнення масиву даними зробимо генератором випадкових чисел. Далі, як і в попередній задачі, необхідно промасштабувати початкові значення для виведення їх на екран у вигляді кругової діаграми. Для цього спочатку знаходимо суму всіх елементів масиву, а потім масштабуємо їх за формулою
де Sum - загальна сума елементів масиву, 360 - кількість градусів у повному колі.
Сама діаграма будується за допомогою процедури PieSlice, що виводить на екран зафарбований сектор круга. Колір зафарбування задається процедурою SetFillStyle, а початковий та кінцевий кути сектора обчислюються від поточного кута. Angle з урахуванням значення елементу масиву. Центр кола, на якому будується кругова діаграма, завжди константний (320; 240). Програма, що реалізує описаний алгоритм, має вигляд:
Program Example_618;
Uses graph; (Підключення бібліотек}
Var GraphDriver,GraphMode:integer; N, і : integer;
Sum,Ang : real;
A : array [1..100] of real; S : string; Begin
ClrScr; Randomize;
Write (ЛВведіть кількість елементів діаграми: *).;
ReadLn (N);
(Введення значень для побудови діаграми}
for i:=l to N do A[i]:=random*200;
GraphDriver:=VGA;
GraphMode:=VGAHi;
InitGraph(GraphDriver,GraphMode,»);
Sum:=0;
for i:=1 to N do Sum:=Sum+A[i];
for i:=1 to N do A[i]:=A[i]*360/Sum;
Ang:=0;
for i:=1 to N do
begin
SetFillStyle (l,Random(14)+l);
PieSlice (320,240,round (Ang), round (Ang+A[i]),230);
(Виведення на діаграмі числових значень)
Str (A[i]*Sum/360:3:0,S);
OutTextXY(round(320+120*coe((2*Ang+A[i]))*Pi/360),
round(240-120*ein((2*Ang+A[i])*Pi/360)),S);
Ang:=Ang+A[i];
end;
Readkey; CloseGraph; {Закриття графічного режиму)
end.
Домашнє завдання:
• повторити сторінки 221 - 229 запропонованого підручника;
• задачі №615,617,620.