begin stop := False; repeat if IsEvent then begin Event(k, code, i); if (k = 1) and (code = 27) then stop := True; end; ... until stop; end; - егер бір нәрсе бола қалса...
- егер коды 27 (Esc) болатын перне басылса, онда стоп
- егер тоқтау қажет болса, True
- Процедура (сурет салу және өшіру)
- procedure Draw(x, y: integer; flag: boolean);
- begin
- if flag then
- Brush(1, 255, 255, 0)
- else
- Brush(1, 0, 0, 255);
- Rectangle(x, y, x+20, y+20);
- end;
- Идеялар
- бір процедура суретті салады және өшіреді
- өшіру = фонның түсімен бояу
- квадраттың шекарасын өшіріп тастау (негізгі программада)
- сурет салу (True) немесе салмау (False)?
- сурет саламыз: қылқаламның түсі – сары
- суретті өшіреміз: қылқаламның түсі – көк
- program qq;
- var x, y, k, code, i: integer;
- stop: boolean;
- procedure Draw(x,y: integer; flag: Boolean);
- begin
- ...
- end;
- begin
- Brush(1, 0, 0, 255);
- Rectangle(10, 10, 400, 400);
- Pen(0, 0, 0, 255);
- x := 10; y := 200; stop := false;
- repeat
- if IsEvent then begin
- ...
- end;
- Draw(x, y, True);
- Delay(10);
- Draw(x, y, False);
- x := x + 1;
- if x >= 400-20 then stop := true;
- until stop;
- end.
- шекараға тақалған кезде шығу
- "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;
- 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 мс сайын басқа түске боялып тұрады(жыпылықтау!)
- Бізге қажеттісі: ешқандай оқиға болмаса квадратты басқа түстерге боямау (жыпылықтатпау)
- Шығарылуы: квадратты бояп тастап, оқиғаны күту
- Жаңа проблема: оқиғаны қалай күтеміз ?
- Жаңа проблеманың шығарылуы: бос цикл «оқиға болмайынша ештеме істеме":
- 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);
- ...
- квадраттың суретін саламыз
- "4": Квадрат бағыттауыш пернелерді басқан бағытта жылжып отырады, алайда көк квадраттың шекарасынан асып кете алмайды:
-
- "5": Квадрат үздіксіз қозғалып отырады, бағыттауыш пернелер басылған кезде өз бағытын өзгертеді және көк квадраттың қабырғаларына соқтығысып кері жылжып отырады:
- Есеп: Жердің Күнді айналу моделін бейнелеу.
- Проблема: шеңбер бойымен айналу, координаталарды қалай өзгертіп отыруға болады?
- Шығарылуы: тәуелсіз айнымалы ретінде α –ның айналу бұрышын қолдану (циклде өзгерту)
- x = x0 + L·cos(α)
- y = y0 – L·sin(α)
- procedure Draw(x, y: integer; flag: boolean);
- const r = 10;
- begin
- if flag then
- Brush(1, 100, 100, 255)
- else
- Brush(1, 0, 0, 0);
- Ellipse(x-r, y-r, x+r, y+r);
- end;
- сурет салу (True) немесе салмау (False)?
- суретін саламыз: қылқалам түсі – көгілдір
- суретті өшіреміз: қылқалам түсі – қара
- Тұрақтылар мен айнымалылар
- program qq;
- const rSun = 60; { Күннің радиусы }
- L = 150; { Жер орбитасының радиусы }
- x0 = 200; { Күн центрінің координаталары }
- y0 = 200;
- var x, y, { Жердің координаталары }
- k, code, i: integer; { Event үшін }
- a, ha: real; { айналу бұрышы, қадам }
- stop: boolean; { программаны тоқтату белгісі }
- begin
- ...
- end.
- procedure Draw(x, y: integer; flag: Boolean);
- begin
- ...
- end;
- program qq;
- ...
- begin
- Brush(1, 0, 0, 0); Fill(1,1);
- Brush(1, 255, 255, 0);
- Ellipse(x0-rSun, y0-rSun, x0+rSun, y0+rSun);
- a := 0; ha := 1*pi/180;{ бастапқы бұрыш, 100 мс-та 1o қадам}
- stop := false;
- Pen(0,0,0,0); { контурларды өшіріп тастаймыз }
- repeat
- x := round(x0 + L*cos(a));
- y := round(y0 - L*sin(a));
- Draw(x, y, True);
- Delay(100);
- Draw(x, y, False);
-
- a := a + ha;
- until stop;
- end.
- if IsEvent then begin
- Event(k, code, i);
- if (k = 1) and (code = 27) then stop := true;
- end;
- "4": Күнді айналып жүрген екі планетаның моделін бейнелеу, планеталар бір-біріне қарама-қарсы бағытта қозғалатын болсын:
-
- "5": Күн-Жер-Ай жүйесінің моделін бейнелеу:
Паскаль тілінде программалау - Тақырып 12. Кездейсоқ сандар
- Кездейсоқ көріністер: барлық жерде…
- тиынды лақтыру ("орел" немесе "решка")
- қардың түсуі
- броундық қозғалыс
- телефон байланысында болатын ақаулар
- радиоэфирдің шуы
- Кездейсоқ сандар – бұған дейінгі сандардың ретін біліп отырсақ та, келесі санның қандай екені белгісіз болатын сандардың тізбегін айтады.
- Проблема: компьютерде осыны қалай алуға болады?
- Мүмкін болатын шешімдері:
- шу ақауларының сыртқы көздерін пайдалану
- математикалық түрлендірулерді пайдалану
- Жалған кездейсоқ сандар – бойында кездейсоқ сандардың қасиеті бар, бірақ әрбір келесі сан алдын ала берілген формула бойынша есептелетін сандардың тізбегін айтады.
- Мысалдар:
- Кездейсоқ бүтін сандар [0,m) (сызықты конгруэнтті әдіс)
-
- Кездейсоқ нақты сандар [0,1]
- Кездейсоқ сандардың орналасуы
- Модель: қар бұршақтары [a,b] кесіндісінің аралығына түседі
- Әр түрлі орналастырулардың саны қанша болуы мүмкін?
- Кездейсоқ сандардың орналасуы
- Ерекшеліктері:
- орналасу – бұл бір ғана санның емес бүкіл тізбектің сипаттамасы
- бірқалыпсыздардың саны – көп
- кез келген бірқалыпсыз орналасуды бірқалыпты орналасудың көмегімен алуға болады.
- Паскальдегі кездейсоқ сандардың генераторы
- [0,N] интервалындағы бүтін сандар:
- var x: integer;
- ...
- x := random ( 100 ); { интервал [0,99] }
- [0,1] интервалындағы бүтін сандар:
- var x: real;
- ...
- x := random; { интервал [0,1] }
- Есеп: 400х300 пиксельді тіктөртбұрыштың ішін түстері кездейсоқ нүктелермен бірқалыпты етіп толтыру.
- Нүктенің кездейсоқ координаталарын қалай алуға болады?
- x := random ( 400 );
- y := random ( 300 );
- Бірқалыптылықты қалай алуға болады? random функциясы қолданылса автоматты түрде қамтамасыз етіледі
- Кездейсоқ түстерді қалай алуға болады?
- Pen (1, random(256), random(256), random(256));
- Point ( x, y );
- program qq;
- var x, y, k, code, i: integer;
- stop: boolean;
- begin
- stop := False;
- repeat
- x := random(400);
- y := random(300);
- Pen(1, random(256), random(256), random(256));
- Point(x, y );
- if IsEvent then begin
- Event(k, code, i);
- if (k = 1) and (code = 27) then stop := True;
- end;
- until stop;
- end.
- Esc пернесін басып шығып кету
- "4": Пернетақтадан тіктөртбұрыш бұрыштарының координаталарын енгізіп, тіктөртбұрыштың ішін түстері кездейсоқ нүктелермен толтыру керек.
- "5": Үшбұрыштың ішін түстері кездейсоқ болатын нүктелермен толтыру. (бірқалыпты немесе бірқалыпты емес).
- Қосымша көмек: бұрышы 45о болатын теңбүйірлі үшбұрышты алу керек .
Достарыңызбен бөлісу: |