Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Bakit-pasсал-лек.doc
Скачиваний:
44
Добавлен:
01.05.2015
Размер:
665.6 Кб
Скачать

2. Функциялар.

Функцияларды сипаттаудың өз ерекшелігі бар. Функция қанда да бір мәнді есептеуге арналғандықтан оның түрін (типін) көрсету қажет болды.

Функцияны сипаттау:

Function <Функция аты>(<формальды параметрлер тізімі>):типі;

Сонымен бірге функция денесінде оның атына қандай да бір мән меншіктелуі тиіс. Ол функция типімен сәйкес келуі керек.

3-есеп. Екі бүтін санның кішісін таңдайтын функция жазыңдар.

program prog_4;

var i, j : integer;

function min(i, j : integer) : integer;

begin

if i<j then min := 1 else min := j

end;

begin

writeln('Екі бүтін сан енгіз');

readln(i, j);

writeln('min =', min(i, j))

end.

Есепті шешу алгоритмі:

1. Бағдарлама денесін айнымалыларды сипаттаудан бастаймыз.

2. min функциясын сипаттаймыз.

3. i және j бүтін сандарын енгіземіз.

4. min функциясын шақырамыз және сандардың кішісін анықтаймыз.

5. Программа жұмысын аяқтаймыз.

Айнымалылар:

min функциясында:

i және j екі бүтін сан (глобальды айнымалы);

Негізгі бағдарламада:

i және j екі бүтін сан (глобальды айнымалы);

Функция мен процедураларды сипаттауды - өзін-өзі шақыру арқылы рекурсия көмегімен құруға болады. Подпрограмманы әрбір жаңадан шақырғанда пайдаланылатын параметрлердің мәндері стекке ендіріледі, сондай-ақ алдыңғы шақырулардағы параметрлердің мәндері де сақталады.

F(x) функциясы үшін рекурсияны былай сипаттауға болады:

if x = <алғашқы мән> then f := <функцияның алғашқы мәні>

else f := w(f);

Мұндағы f :=<функцияның алғашқы мәні> конструкциясы рекурсия түбі (глубина) деп аталады, ал f := w(f) Xn нүктесіндегі аргументтің Xn-1, Xn-2 және т.б. кіші мәндері үшін функцияның мәндерін шақыру тәсілін анықтайды.

Жай (сызықты) рекурсияның классикалық мысалы ретінде n натурал санның fakt(n) факториалын есептейтін функцияны қарастырайық.

іf n = 0 then fact := 1

else fact := n* fact(n-1);

Мысалы, n=4 болса, fact функциясы 5 рет шақырылады (n=4, n=3, n=2, n=1, n=0 үшін). Бұлардың соңғысынан басқа әрқайсысы стекке ендіріледі. Соңғы 5-ші рет шақырғанда fact(0) = 1 есептелінеді. Сонан соң стектегі мәндер ретімен есептеледі.

Fact(1)= 1*fact(0)= 1, fact(2)= 2*fact(1)= 2, fact(3)= 3*fact(2)=6,

fact(4)-4*fact(3)=12

Рекурсияны пайдаланғанда стектің көлемі шектеулі екендігін ескеріңдер. Себебі ол тез толтырылады.

7-есеп. Фибоначчидің І-ші санын есептеңдер.

Фибоначчидің әрбір келесі саны алдыңғы екеуінің қосындысына тең екендігі бізге белгілі:

0 1 1 2 3 5 8 13 21 34 55….

алғашқы екі мүшесі 0 және 1 болады.

Бұл есепті шешу барысында Фибоначчидің әр санын есептеу үшін алдыңғы мәндерді бірнеше рет шақыру қажет болады.

program prog_7;

var i : integer;

function fib( i : integer) : integer;

begin

if i = 0 then fib :=0;

if (i=1) or (i=2) then fib:=1;

else fib := fib(i-1)+fib(i-2)

end;

begin

repeat

write('Санның рет номерін енгізіңдер i=');

readln(i);

until i>=0;

writeln('Фибоначчидің', i : 5, ' саны', fib(i), ' –ге тең')

end.

Есепті шешу алгоритмі:

1. Бағдарлама денесін айнымалыларды сипаттаудан бастаймыз.

2. fib функциясын сипаттаймыз.

3. i санының рет номерін енгіземіз.

4. Фибоначчи санын анықтау үшін fib(i) рекурсиялық функциясын шақырамыз.

5. Бағдарлама жұмысын аяқтаймыз.

Айнымалылар:

fib функциясында:

і – натурал сан (формальды айнымалы);

Негізгі бағдарламада:

і – натурал сан (глобальды айнымалы);

9-есеп. Келесі өрнектің мәнін есептеуге бағдарлама құрыңдар:

S = 5! + 6! + 7! + 8!

program prog_9;

var s1, s2, s3, s4, s : real;

procedure fak(var n : integer; p : real);

var і : integer;

begin

p :=1;

for і := 1 to n do

p :=p*і;

end;

begin

fak(5, s1); fak(6, s2); fak(7, s3); fak(8, s4);

s :=s1+s2+s3+s4;

writeln('s=', s)

end.

Бұл бағдарламада 5!, 6!, 7!, 8! мәндерін есептеу үшін процедура 4 рет шақырылады.

10-есеп. Келесі өрнектің мәнін есептеуге бағдарлама құрыңдар.

< 10

s =

program prog_9;

var a : array[1..50] of real;

i, j : integer;

s, s1, s2 : real;

procedure max;

var і : integer;

begin

r := a[1];

for і := 2 to n do

if a[і]>r then r :=a[і]

end;

procedure min;

var i : integer;

begin

m :=a[1];

for і :=2 to n do

if a[і]<m then m: = a[і]

end;

begin

writeln(' Массив өлшемін n-енгіз');

readln (n);

writeln('Енді массив элементтерін енгіз');

for j :=1 to n do

read(a[j]);

max; {max – Процедурасын шақыру}

if r<10 then begin

s1:=0;

for j :=1 to n do

s1:= s1+a[j];

s :=s1+1.2;

writeln('s=', s)

end;

else begin

s2 :=1;

for j : = 1 to n do

s2:=s2*sqr(a[j]);

min;

s:=s2+m;

writeln('s=', s);

end;

end.

10-лекция. Паскаль тілінің графикалық мүмкіншіліктері. Түстер. Операторлар.

Әртүрлі елуден астам процедуралары мен функциялары бар graph графикалық подпрограммалар кітапханасы pascal 7.0 тілінің бейне жасау мүмкіндіктерін кеңейте түседі. Төменде осы функциялар мен процедуралардың бірқатарына қысқаша сипаттама береміз.

procedure PutPixe(x, y : integer; Pixel : Word)- нүкте салу;

procedure Line(x1, y1, x2, y2 : integer)- сызық салу;

procedure LineRel(Dx, Dy : integer) - салыстырмалы координатада сызық салу;

procedure Line To(x, y : integer) - көрсетілген нүктеге дейін сызық салу;

procedure MoveTo(x, y : integer) - экранды көрсетілген нүктеге жылжыту;

procedure OutText(TextString : string)- текст шығару;

procedure OutText x, y(x, y : integer: TextString : string)- көрсетілген нүктеден текст шығару;

procedure RestoreCrtMode - текстік режимге қайта оралу;

procedure SetColor(Color : Word) - сызықтың, нүктенің және т.б. түсін беру;

procedure SetFiUPattern(Pattern : FillPattern Type; Color : Word) - кез-келген тұйық фигураны бояу;

procedure SetFillStyle(Pattern : Word; Color : Word)- бояу, толтыру стилін орнату;

procedure Arc (x, y : integer; StAngle, EndAngle, Radius : Word)- шеңбер доғасын салу;

procedure Sector(x, y : integer; StAngle, EndAngle, Xradius, Vradius : Word)- сектор салу және бояу;

procedure Rectangle(x1, y1, x2, y2 : integer)- төртбұрыш салу;

procedure Bar(x1, y1, x2, y2 : integer)- боялған төртбұрыш салу;

procedure Bar3D(x1, y1, x2, y2 : integer: Pixel : Word)- боялған параллелепипед салу;

procedure Circle(x, y : integer; Radius : Word)- шеңбер салу,;

procedure ClearDevice - экранды тазалау және оны фон түсімен бояу;

procedure ClearViewPort - терезені тазалау және оны 0 түспен бояу;

procedure CloseGraph - графикалық режимнен шығу;

procedure Drawpoly(NumPoints : ; var PolyPoints)- көпбұрыш салу;

procedure Ellipse(x, y : integer; StAngle, EndAngle :Word; Xradius, Yradius:Word)- эллипс салу;

procedure FillEllipse(x, y : integer; Xradius, YRadius : Word)- боялған эллипс;

procedure FillPoly(NumPoints : Word; var PolyPoints) - боялған көпбұрыш;

procedure FloodFill(x, y : integer; Border : Word)- ағымдағы түспен тұйық фигураны бояу;

function GetColor : Word - сызықтар мен контурлардың түсін қайтару;

function GetMaxX : integer - х-тің ең үлкен координатасын қайтарады;

function GetMaxY : integer - у-тің ең үлкен координатасын қайтарады;

function GetPixe(x, y : integer) : word - пиксель түсін қайтару;

function GetX : integer - х-тің координатасын қайтару;

function GetY: integer - у-тің координатасын қайтару;

1. Графикалық режимде жұмыс істеу үшін бағдарлама басында модулге сілтеме болуы тиіс: uses graph;

2. Модуль жұмысын нақтылау керек: initgraph(driver, mode, 'C : \bp\bgі'); Мұндағы driver – видеоадаптердің графикалық драйверінің типін орнату параметрі; mode - оның жұмыс істеу режимін беру; 'C : \bp\bgі' – тіркеуі *.bgi графикалық драйверлер орналасқан каталогқа сілтеме жолы. Егер тіркеуі *.bgi драйверлер сендердің бағдарламаларың орналасқан каталогта болса, онда бұл жолды бос қалдырамыз: Іnitgraph(driver, mode, ' ');

3. Видеоадаптердің жұмыс істеу режимін жүйенің өзі табу үшін мына функцияны жазу керек: detect.

program proba;

uses craph;

var driver, mode : integer;

begin

driver := detect;

initgraph(driver, mode, 'c : \bp\bgі');

(Бағдарламамен жұмысты аяқтау алдында графикалық режимді closegraph командасымен жабу қажет)

1-есеп. Центрі синусоидада жататын ұқсас дөңгелектер тобын салыңдар.

Бұл есепте ең алдымен синусоиданы дұрыс салып алу керек. Біріншіден, синусоидадағы нүктенің координатасын анықтау үшін алынған нәтижелердің бөлшек бөлігін алып тастап отыру керек, себебі экран координаталары тек бүтін сандар болып келеді. Екіншіден, синусоиданы у осін бойлай созатын коэффициентті таңдау керек. Егер тек sin (x) стандартты функциясын пайдалансақ, оның ең үлкен мәні бірден артпайды, ал оны дөңгелектегенде түзу сызық пайда болады. шіншіден, х осі бойынша жылжитын қадамды таңдау қажет. Төртіншіден, синусоиданың симметрия осі экранның ортасынан өтуі тиіс. Осылардың нәтижесінде біз келесі формулаға ие боламыз:

y := getmaxy div 2+trunc(50* sin(10*x));

program prog_1;

uses graph, crt;

var driver, mode, x, y : integer;

begin

driver := detect;

initgraph(driver, mode, '');

setcolor(3);

setfillstyle(1, 1); floodfill(1, 4, 1);

x := -5; y :=getmaxy div 2;

setcolor(16);

repeat

x := x+10;

y := getmaxy div 2+trunc(50*sin(10*x));

setfillstyle(1, 10);

fillellipse(x, y, 20, 20)

until x> = getmaxx;

repeat

until keyressed;

closegraph

end.

Есепті шешу алгоритмі:

1. Бағдарлама денесін айнымалыларды сипаттаудан бастаймыз.

2. graph модулін іске қосамыз.

3. Экранға көк түс, шеңбердің түсін және синусоиданың алғашқы координатасын анықтаймыз.

4. Экранның оң жақ жиегіне дейін шеңберді екі бөліп, ашып отыратын цикл ұйымдастырамыз.

5. Шығару аяқталғанда синусоиданы экранда кез-келген пернені басқанша ұстап тұру операторымен аяқтаймыз.

Айнымалылар:

х, у – келесі шеңбер центрінің координатасы; - driver графикалық драйвердің типі; mode - графикалық адаптердің жұмыс режимі.

2-есеп. Әртүрлі түстегі кездейсоқ орналасқан шеңберлер салыңдар.

Бұл есепті шешуде кездейсоқ санды анықтау random функциясын пайдаланамыз. Келесі 3 оператор кездейсоқ түрде шеңбердің центрінің координатасын есептеу мүмкіндігін береді.

x := random(getmaxx); y := random(getmaxy); circle(x, y, 10);

Ал setcolor(random(16)); операторы осы шеңберді кездейсоқ түспен бояйды.

program prog_2;

uses graph, crt;

var driver, mode, x, y : integer;

begin

driver := detect;

initgraph(driver, mode, ' ');

repeat

setcolor(random(16));

x := random(getmaxx);

y := random(getmaxy);

circle(x, y, 10); delay(10);

until keypressed;

closegraph

end.

Есепті шешу алгоритмі:

1. Бағдарлама денесін айнымалыларды сипаттаудан бастаймыз.

2. graph модулін іске қосамыз.

3. Радиусы 10 әртүрлі түстегі шеңберлер салатын, оларды кез-келген перне басылғанша экранда кездейсоқ орналастыратын цикл ұйымдастырамыз.

Айнымалылар:

x, y – келесі шеңбер центрінің координатасы; driver – графикалық драйвердің типі; mode – графикалық адаптердің жұмыс режимі.

3-есеп. Әртүрлі түстегі кездейсоқ орналасқан квадраттар салыңдар.

program prog_3;

uses graph, crt;

var driver, mode, x, y : integer;

begin

driver := detect;

inigraph(driver, mode, ' ');

setcolor(3);

repeat

setfillstyle(1, random(16));

x := random(getmaxx);

y := random(getmaxy);

bar(x-8, y-8, x+8, y+8);

delay(10);

until keypressed;

closegraph;

end.

Есепті шешу алгоритмі:

1. Бағдарлама денесін айнымалыларды сипаттаудан бастаймыз.

2. graph модулін іске қосамыз.

3. Әртүрлі түстегі квадраттар салып, оларды экранда кез-келген перне басылғанша кездейсоқ орналастыратын цикл ұйымдастырамыз.

Айнымалылар:

x, y – келесі шеңбер центрінің координатасы; driver – графикалық драйвердің типі; mode – графикалық адаптердің жұмыс режимі.

4- есеп. Әр түрлі түстегі шеңберден кездейсоқ кесіп салынған секторлар тобын салыңдар.

program prog_4;

uses graph, crt;

var driver, mode, x, y : integer;

begin

driver := detect;

initgraph(driver, mode, ' ');

setcolor(3);

repeat

setfillstyle(1, random(16));

x := random(getmaxx);

y := random(getmaxy);

sector(x-8, y-8, random(360), random(360), 15, 15);

delay(25);

until keypressed;

closegraph

end.

Есепті шешу алгоритмі:

1. Бағдарлама денесін айнымалыларды сипаттаудан бастаймыз.

2. graph модулін іске қосамыз.

3. Әртүрлі түстегі секторлар қиып алатын, оларды экранда кез-келген перне басылғанша кездейсоқ орналастыратын цикл ұйымдастырамыз.

Айнымалылар:

x, y – келесі шеңбер центрінің координатасы; driver – графикалық драйвердің типі; mode – графикалық адаптердің жұмыс режимі.

6-есеп. Экран периметрін бойлай әртүрлі түстегі квадраттар, ал ортасында әртүрлі түстегі көптеген нүкте салыңдар.

program prog_6;

uses graph, crt;

var driver, mode, x, y, i : integer;

begin

driver := detect;

initgraph(driver, mode, ‘ ‘);

і := 1; x := 60; y :=60;

repeat

setfillstyle(1, succ(random(15)));

bar(і, 1, і+50, 50);

bar(і, 400, і+50, 450);

bar(1, і, 50, і+50);

bar(590, і, 640, і+50);

delay(100);

putpixel(x, y, succ(random(15)));

і :=і+30;

x := x+10;

y := y+10;

until і > = getmaxx;

repeat

until keypessed;

closegraph

end.

Есепті шешу алгоритмі:

1. Бағдарлама денесін айнымалыларды сипаттаудан бастаймыз.

2. Graph модулін іске қосамыз.

3. Квадраттар мен нүктелердің координаталары үшін алғашқы мәндерді белгілейміз.

4. Әртүрлі түстегі квадраттар салып, оларды экран периметрін бойлай орналастыратын және кез-келген перне басылғанша экран ортасында кездейсоқ нүктелер шығаратын цикл ұйымдастырамыз.

Айнымалылар:

х, у – келесі нүктенің координатасы;

і – әрбір келесі квадраттың координатасы;

driver - графикалық драйвердің типі;

mode - графикалық адаптердің жұмыс режимі.

9-есеп. «Мен ұшқыш боламын!» сөзі орналасқан, жылжып бара жатқан екі тіктөртбұрыш пен дөңгелектің бейнесін салыңдар.

program prog_9;

uses graph, crt;

var driver, mode, x, y, x1, y1, r : integer;

begin

r := 80;

x := r*2;

x1 := r*3;

y := r*2;

y1 :=r*3;

driver := detect;

initgraph(driver, mode, ' ');

setcolor(1);

settextstyle(0, 0, 3);

repeat

x := x+random(10);

y := y+random(10);

setfillstyle(1, 13);

bar(x, y, x+r, y+r);

outtextxy(x+5, y+15, 'Мен')

setfillstyle(1, 14);

x1 := x1-random(10);

y1 := y1-random(10);

bar(x1, y1+2*r, y1+r);

outtextxy(x1+5, y1+15, 'ұшқыш');

setfillstyle(1, 2)

fillellipse(y, 2*x1, r, r);

outtextxy(y-30, 2*x1-10, ‘боламын!');

delay(1500);

clearddevice;

until (keypressed);

closegraph;

end.

Есепті шешу алгоритмі:

1. Бағдарлама денесін айнымалыларды сипаттаудан бастаймыз.

2. Graph модулін іске қосамыз.

3. Екі тіктөртбұрыш және тексті бар дөңгелек саламыз.

4. Салынған объектілер кез-келген перне басылғанша қозғалатын цикл ұйымдастырамыз.

Айнымалылар:

х, у, х1, у1 – кездейсоқ координаталар;

r- радиус;

driver - графикалық драйвердің типі;

mode - графикалық адаптердің жұмыс режимі.

10-есеп. Жұлдызды аспанда қозғалып бара жатқан НЛО (белгісіз ұшу объекті) бейнесін салыңдар.

program prog_10;

uses graph, crt;

var driver, mode, x, y, r, 1 : integer;

begin

r := 40; x := r*5; y := r*2;

driver := detect;

initgraph(driver, mode, ' ');

setcolor(3);

for і:= 1 to 600 do

putpixel(random(і), random(і), і);

repeat

ellipse(x, y, 0, 360, r, (r, div 3)+2);

ellipse(x, y-4, 190, 357, r, r div 3);

line(x-17, y-16, x-25; y-22);

line(x+17, y-16, x+25, y-22);

circle(x+25, y-25, 2);

circle(x-25, y-25, 2);

setfillstyle(1, 3);

floodfill(x+1, y+4, 3);

delay(150);

clearddevice;

for і := 1 to 600 do

putpixel(random(і), random(і), і);

x :=x+random(10);

y :=y+random(10);

until(keypressed);

closegraph

end.

Есепті шешу алгоритмі:

1. Бағдарлама денесін айнымалыларды сипаттаудан бастаймыз.

2. Graph модулін іске қосамыз.

3. і айнымалысы бойынша шартсыз цикл ұйымдастырамыз және жұлдызды аспан саламыз.

4. Осы циклде екі эллипстің, екі сызықтың және екі кішкентай дөңгелектің көмегімен НЛО саламыз да оны экранда ұстап тұрамыз, сонан соң бейнені cleardevice процедурасының көмегімен өшіреміз.

5. Тағы да жұлдызды аспан саламыз.

6. Келесі НЛО бейнесінің координаталарын кездейсоқ анықтаймыз.

7. Кез-келген пернені басу арқылы графикалық режимді жабамыз.

Айнымалылар:

х, у – кездейсоқ координаталар;

r - радиус;

і – цикл айнымалысы;

driver - графикалық драйвердің типі;

mode - графикалық адаптердің жұмыс режимі.

12-лекция. Деректердің файлдық типтері. Файлдармен жұмыс істеу

Файлдық тип, сыртқы тасымалдаушыда орналасқан бір типтегі компоненттер тізбегінен тұратын Паскаль тіліндегі мәліметтер болып табылады. Ондағы компоненттердің типі файлдық типтен басқа кез-келген бола алады. Паскальда файлдық типтегі айнымалылар ақпаратты енгізу-шығару үшін қолданылады. Ақпаратты енгізу-шығару алдында файлдық айнымалы assign процедурасының көмегімен сыртқы файлмен байланысқан болуы файлды оқу немесе оған жазу үшін ол ашық болуы керек. Сонан соң енгізу-шығаруды орындауға болады.

Файлдардың 3 тобы анықталған: текстік (тип text), типтік (file of <тип>), типтік емес (file). Олармен жұмыс істеу бір-бірінен ерекшеленеді.

Әдетте барлық файлдарды тізбектей, ретпен ену мүмкіндігіне ие файлдар дейді. Көңіл аударыңыз: seek процедурасының көмегімен типтік және типтік емес файлдар үшін ретсіз ену режимін орнатуға болады. Бұл кезде файл компоненттерін нөмірлеу нөлден басталады. Жұмыс аяқталған соң файл close процедурасымен жабылуы тиіс.

Барлық файлдар үшін қолданылатын стандартты процедуралар мен функциялар:

assign (f, name) - Файлдық айнымалы f–ті сыртқы name файлымен байланыстыру.

chdir (path) - Ағымдағы директорияны өзгерту.

close (f) - Ашылған файлды жабу.

erase (f) - Сыртқы файлды жою.

mkdir (path) - Каталог құру.

rename (f, new) - Сыртқы файлдың атын өзгерту.

reset (f[, size]) - Алдын-ала бар файлды ашу.

rewrite (f[, size]) - Бос, жаңа файл ашу. Оған процедурасында көрсетілген атау беріледі. Егер ондай файл бар болса, онда ол файл өшіріледі.

rmdir (path) - Бос каталогты жою.

eof (f) - Файл соңы.

Текстік файлдар жолдарға бөлінген символдар жиынтығынан тұрады. Әрбір жолдың соңында жол соңын білдіретін белгі болады. Текстік файлдармен жұмыс істеу ерекшелігі мынада: мәндері read немесе write процедуралары арқылы енгізілетін және шығарылатын файлдар char немесе string типтерімен қатар жай типтердің бірінде: бүтін, нақты, логикалық (тек жауапқа шығаруда) бола алады.

Бұл процедуралар ASCII –жолдармен де жұмыс істей алады.

Текстік файлдар үшін, программаны іске қосқанда автоматты түрде ашылатын және жұмыс соңында автоматты түрде жабылатын екі стандартты файлдық айнымалы бар. Олар: INPUT -клавиатурамен байланыс; OUTPUT -дисплей экранымен байланыс.

Егер text типіндегі файлдармен жұмыс барысында файлдық айнымалы көрсетілмесе, онда файлдық айнымалы INPUT немесе OUTPUT қолданылуда деп есептейді. Текстік файлды оқу үшін reset процедурасымен, не оған жазу үшін rewrite немесе append процедураларының бірімен ашу керек.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]