Есеп: 0 мен 2π интервалы арасындағы y = 3 sin(x) функциясының графигін құру.
Анализ:
x = π/2 болғанда максималды мән ymax = 3
x = 3π/2 болғанда минималды мән ymin = -3
Мәселе: функция координалардың математикалық жүйесінде көрсетілген, ал графикті координаталарын пиксельдермен көрсете отырып компьютер экранында шығару керек.
Координаталардың түрленуі
(x,y)
X
Y
x
y
Координаталардың математикалық
жүйесі
Координаталардың экрандық жүйесі (пиксельдер)
(xэ,yэ)
xэ
yэ
(0,0)
(0,0)
a
b
k – масштаб (экрандағы жекелеген кесінді кескінінің ұзындығы)
xэ = a + kx
yэ = b - ky
Программа
2π
h – x-тің өзгеру қадамы
w – ОХ осінің ұзындығы(пиксельдер саны)
экранда
координаталар осі
графиктің құрылу циклі
program qq;
const a = 50; b = 200; k = 50;
xmin = 0; xmax = 6.2832;
var x, y, h: real;
xe, ye, w: integer;
begin
w := round((xmax - xmin)*k);
Line(a-10, b, a+w, b);
Line(a, 0, a, 2*b);
x := xmin; h := 0.05;
while x <= xmax do begin
y := 3*sin(x);
xe := a + round(k*x);
ye := b - round(k*y);
Point (xe, ye);
x := x + h;
end;
end.
Кемшілігі ?
?
Нүктелерді қалай біріктіруге болады?
Алгоритм:
Егер бірінші нүкте болса
(xэ,yэ) нүктесіне өту
әйтпесе
(xэ,yэ) нүктесіне кесінді
Программа:
бастапқы мән
әрекеттердің нұсқасын таңдау
логикалық айнымалы
var first: boolean;
...
begin
...
first := True;
while x <= xmax do begin
...
if first then begin
MoveTo(xe, ye);
first := False;
end
else LineTo(xe, ye);
...
end;
end.
Тапсырмалар
"4": [-3,3] интервалы арасында y = x2 функциясының графигін құру.
процедурада қосымша айнымалы ретінде жергілікті(локальді) айнымалыларды пайдалануға болады, басқа процедуралар оған қатынай алмайды
program qq;
procedure A(x, y: integer);
var a, b: real;
begin
a := (x + y)/6;
...
end;
begin
...
end.
procedure A(x, y: integer);
var a, b: real;
begin
a := (x + y)/6;
...
end;
локальді айнымалылар
var a, b: real;
Параметр-айнымалылар
Есеп: екі айнымалы мәндерінің орындарын ауыстыратын процедураны құру.
Ерекшеліктері:
Процедурада жасалған өзгертулер шақырушы программаға белгілі болуы қажет.
program qq;
var x, y: integer;
begin
x := 1; y := 2;
Exchange ( x, y );
writeln ( ’x = ’, x, ’ y = ’, y );
end;
procedure Exchange ( a, b: integer );
var c: integer;
begin
c := a; a := b; b := c;
end;
мына процедура параметрлердің көшірмесімен жұмыс істейді
x = 1 y = 2
Параметр-айнымалылар
Қолданылуы: процедура(және функция) осындай әдіс арқылы бірнеше мән бере алады.
Шақыртудың тыйым салынған нұсқалары
Exchange ( 2, 3 ); { сандар }
Exchange ( x+z, y+2 ); { өрнектер }
procedure Exchange ( a, b: integer );
var c: integer;
begin
c := a; a := b; b := c;
end;
var
параметрлер өзгере алады
Тапсырмалар
"4": Процедураларды пайдалана отырып, мына фигураны құрастыру.
"5": Процедураларды пайдалана отырып, мына фигураны құрастыру.
a
a
a
0,866∙a
Тең қабырғалы үшбұрыш
Паскаль тілінде программалау
Тақырып 10. Рекурсия
Рекурсивті объектілер
Рекурсивті объект деп - бір объект немесе дәл осындай бірнеше объект арқылы анықталатын объектіні айтады.
Мысалдар:
Факториал:
егер
егер
Рекурсияланған сурет:
Пифагор ағашы
N деңгейлі Пифагор ағашы – бұл ағаштың діңгегі мен осы діңгектен симметриялы түрде өсіп шыққан N-деңгейлі екі Пифагор ағашы, бұл ағаштардың бағанының ұзындығы 2 есе кем және олардың арасындағы бұрыш 90o-қа тең.
6 деңгей:
Бұның рекурсивті фигура екенін қалай дәлелдеуге болады?
Рекурсивті процедура деп өзін өзі шақыратын процедураны айтады
Программа
program qq;
procedure Pifagor(x0, y0, a, L: real;
N: integer);
...
end;
begin
Pifagor (250, 400, pi/2, 150, 8);
end;
α бұрышы
баған ұзындығы
деңгейлер саны
x0
y0
Ағашты 30o оңға қалай еңкейтуге болады?
?
Pifagor (250, 400, 2*pi/3, 150, 8);
"4": Рекурсивті процедураны қолдана отырып, мына фигураны құрастыру:
"5": Рекурсивті процедураны қолдана отырып, мына фигураларды құрастыру:
Задания
Паскаль тілінде программалау
Тақырып 11. Анимация
Анимация
Анимация (ағылш. animation) – экрандағы кескінге жан бітіру.
Есеп: 400х400 пиксельді көк квадраттың ішімен 20х20 пиксельді сары квадрат солдан оңға қарай жылжып келеді. Программа өз жұмысын Esc пернесін басқанда немесе сары квадрат көк квадраттың оң жақ жетіне жеткен кезде тоқтатады.
Проблема: объектінің экранда қозғалуын қалай кескіндеуге болады?
Қосымша: объектінің қозғалысы (x,y) координаталарымен белгіленеді
Анимация қағидасы:
объектіні (x,y) нүктесінде саламыз
бірнеше миллисекундқа кідіру
объектіні өшіреміз
(x,y) координаталарын өзгертеміз
1-қадамға көшеміз
«Пернелерді шертуді» қалай іске асыруға болады?
Оқиға деп қандай да бір объектінің қалпында өзгерістің болуын немесе пайдаланушының әрекетін айтады. (пернені басу, тышқанды шерту).
IsEvent – қолданушы тарапынан қандай да бір әрекеттің болған-болмағандығын анықтайтын логикалық функция.
Event – нақты қандай оқиғаның болғандығын анықтайтын процедура.
"4": Екі квадрат бір біріне қарама-қарсы бағытта қозғалады:
"5": Екі квадрат бір біріне қарама-қарсы бағытта қозғалады және көк квадраттың қабырғасына соқтығысып кері бағытта жылжиды:
Тапсырмалар
Пернелермен басқару
Есеп: көк квадраттың ішінде орналасқан сары квадрат бағыттаушы пернелермен басқарылатындай болуы керек. Пернелердің коды:
солға – 37 жоғары – 38 Esc – 27
оңға – 39 төмен – 40
Проблема: қозғалыс бағытын қалай өзгертуге болады?
Шығарылуы:
if {оқиға болды} then begin
if {перне басулы} then begin
{перненің кодын алу - code}
if code = 37 then x := x – 1;
if code = 38 then y := y – 1;
if code = 39 then x := x + 1;
if code = 40 then y := y + 1;
if code = 27 then stop := True;
end;
end;
IsEvent
Event ( k, code, i);
if k = 1 then begin
case code of
37: x := x – 1; 38: y := y – 1;
39: x := x + 1; 40: y := y + 1;
27: stop := True;
end;
егер перне басылған болса, …
Программасы
program qq;
var x, y, k, code, i: integer;
stop: boolean;
begin
...
repeat
Draw(x, y, True);
Delay(20);
Draw(x, y, False);
until stop;
end.
procedure Draw(x,y: integer; flag: Boolean);
begin
...
end;
if IsEvent then begin
...
end;
Кемшілігі?
?
процедура
негізгі цикл
оқиғаларды өңдеу
Жыпылықтауды қалай кетіруге болады?
Проблема: ешбір перне басылмағанның өзінде де квадрат әр 20 мс сайын басқа түске боялып тұрады(жыпылықтау!)
Бізге қажеттісі: ешқандай оқиға болмаса квадратты басқа түстерге боямау (жыпылықтатпау)
Шығарылуы: квадратты бояп тастап, оқиғаны күту
Жаңа проблема: оқиғаны қалай күтеміз ?
Жаңа проблеманың шығарылуы: бос цикл «оқиға болмайынша ештеме істеме":
while not IsEvent do;
Программасы
program qq;
var x, y, k, code, i: integer;
stop: boolean;
begin
...
repeat
Draw(x, y, True);
while not IsEvent do;
until stop;
end.
procedure Draw(x,y: integer; flag: Boolean);
begin
...
end;
Draw(x, y, False);
Event(k, code, i);
...
while not IsEvent do;
процедура
квадраттың суретін саламыз
оқиғаны күтеміз
енді өшіруге болады
Нені жақсартуға болады?
?
"4": Квадрат бағыттауыш пернелерді басқан бағытта жылжып отырады, алайда көк квадраттың шекарасынан асып кете алмайды:
"5": Квадрат үздіксіз қозғалып отырады, бағыттауыш пернелер басылған кезде өз бағытын өзгертеді және көк квадраттың қабырғаларына соқтығысып кері жылжып отырады:
Тапсырмалар
Айналу
Есеп: Жердің Күнді айналу моделін бейнелеу.
Проблема: шеңбер бойымен айналу, координаталарды қалай өзгертіп отыруға болады?
Шығарылуы: тәуелсіз айнымалы ретінде α –ның айналу бұрышын қолдану (циклде өзгерту)
Жалған кездейсоқ сандар – бойында кездейсоқ сандардың қасиеті бар, бірақ әрбір келесі сан алдын ала берілген формула бойынша есептелетін сандардың тізбегін айтады.