- •1 Модуль. Алгоритмдеу және программалауға кіріспе
- •1 Тақырып. Кіріспе
- •1 Лекция
- •1.1 „Автоматтандыру есептерін программалау" курсының мақсаттары мен міндеттері.
- •1.2 Есептеуіш техника құралдарын пайдаланып ақпаратты өндеу және басқару жүйелерін әзірлеу. Компьютерлік жүйелердің ақпаратты өндеу және басқару әдістері мен міндеттері
- •2 Тақырып.Дербес компьютерді (дк) программалауды автоматтандырудың программалық құралдары
- •2 Лекция
- •2.1 Дербес компьютердің программалық қамтамасыз етілуі туралы
- •2.2 Программалауды автоматтандыру әдістері. Алгоритмдік тілдер және оларға қойылатын талаптар.
- •2.3 Процедуралы–бағытталған тілдер және объектке–бағытталған программалау туралы түсінік.
- •3.1 Программаларды құру құралдары
- •3.2 Программалаудың біртұтас жүйелері.
- •3.3 Техникалық есептер
- •3 Тақырып. Есептерді алгоритмдеу негіздері.
- •4 Лекция
- •4.1 Алгоритм анықтамасы. Алгоритмдерді бейнелеу тәсілдері.
- •4.2 Алгоритмдердің блок-схемаларын безендіру ережелері.
- •4.3 Алгоритм құрылымдарының түрлері.
- •4 Тақырып Негізгі процедураға бағытталған алгоритмдеу тілінде программалау
- •5 Лекция
- •5.1 Оқылатын алгоритмдеу тілінің негізгі түсініктері
- •5.3 Тілдің негізгі объектілерін жазу ережелері
- •5.4 Деректердің типтері
- •5.5 Деректердің стандартты типтері
- •6 Лекция
- •6.2 Өрнектер. Арифметикалық және логикалық өрнектер
- •7 Лекция Құрылымды деректер (типтер)
- •7.1 Массивтер
- •7.2 Жиындар
- •7.3 Жазбалар
- •Модуль 2 Алгоритмдік тілдерде программалаудың арнайы мәселелері
- •5 Тақырып Программадағы басқару құрылымдар
- •8.1 Алгоритмдік тілдің операторлары.
- •8.3 Басқару операторлары. Құрама және бос операторлар
- •8.4 Деректерді енгізу-шығаруды ұйымдастыру
- •8.5 Программаның құрылымы. Алгоритмнің схемасынан программаға өту
- •9 Лекция
- •9.1 Сызықты құрылымды алгоритмдерді программалау
- •9.2 Тармақталған құрылымды алгоритмдерді программалау
- •9.3 Таңдау операторы (case)
- •10 Лекция
- •10.1 Циклдік құрылымды алгоритмдерді программалау. Кейінгі шартты цикл операторы (repeat)
- •10.2 Алдынғы шартты цикл операторлары (while)
- •10.3 Параметрлі цикл операторлары (for)
- •10.4 Ішкі циклдерді құрастыру (массивтерді өндеу, массив компоненттерін реттеу есептерінің мысалдары негізінде)
- •11 Лекция
- •11.1 Жолдық деректер
- •Var s: string;
- •Var s1: string[40];
- •11.2 Символдық және жазбалар түріндегі деректерді өндеу есептерін программалау
- •12 Лекция
- •12.1 Пайдаланушының ішкі программалары (процедуралар) классификациясы. Ішкі программаларды рәсімдеу тәсілдері және оларды программа құрамында пайдалану.
- •13 Лекция
- •13.1 Сыртқы сақтауыш құрылғыларын (файлдық шамаларды) және динамикалық жадыны пайдалану арқылы программалау
- •14 Лекция
- •14.1 Тілдің графикалық мүмкіндіктерін пайдалану
- •Initgraph(var gd:integer, var gm:integer, pt:string);
- •15 Лекция
- •15.1 Объектке-бағдарлы программалау (обп) негіздері
- •15.2 Объекттер және олардың негізгі қағидалары
- •15.3 Объекттерді құру және оларды пайдалану
- •15.4 Өткен материалға шолу
- •15.5 Алған білімдердің студенттің алдағы оқу барысында және болашақ инженерлік тіршілігіндегі тәжірибелік мағынасы. Программалау тілдері мен технологиялардың даму перспективалары.
- •Өрнектер – тұрақтылар. Паскаль өрнектер-тұрақтыларды пайдалануға мүмкіндік береді. Ол өрнекті программаны орындау қажеттіліксіз компилятор орындайды. Өрнектер-тұрақтылардың мысалдары:
- •Түсініктемелер (комментарий)
- •6 Лекция
- •6.1 Блоктар, локальділік және амал жасау облысы
- •6.5 Типтердің үйлесімділігі
- •7.1 Ординалды типтер
- •7.2 Құрама құрылымдар
- •10.4 Жалғау операторы (with)
12 Лекция
12.1 Пайдаланушының ішкі программалары (процедуралар) классификациясы. Ішкі программаларды рәсімдеу тәсілдері және оларды программа құрамында пайдалану.
Процедуралар және функциялар. Процедуралар мен функциялар негізгі программалық блокқа қосымша блоктарды қосуға мүмкіндік береді. Процедура немесе функцияның әр сипаттауы тақырыпқа ие одан кейін программалық блок ілеседі. Процедура процедураның операторы арқылы белсендіріледі. Функция функцияны шақыруды қамтыған өрнекті есептеу барысында белсендіріледі де функция қайтаратын мән сол өрнекке қойылады.
Паскальда ішкі программалардың екі түрі: процедуралар және функциялар бар. Олардың арасындағы негізгі айырмашылық – функция мәнді қайтарады және өрнектің ішінде пайдаланылуы мүмкін, мысалы: X:= Sin(A); ал процедура бір немесе бірнеше есептерді орындау үшін шақырылады: Writeln('Бұл тексеру'); Функциялардың форматы процедураның форматына ұқсас айырмашылығы олар function тақырыбынан басталады және функцияның қайтаратын мәні үшін деректер типімен аяқталады: function функция_аты (параметрлер) : деерктер типі; Кәдімгі программаның құрылымынан тек екі айырмашылық бар: процедуралар және функциялар program емес procedure немесе function тақырыптарынан басталады, және нүктемен емес нүктелі үтірмен аяқталады. Процедуралар және фукнциялар өздерінің жеке тұрақтыларына, деректер типтеріне, айнымалылар мен жеке өздерінің процедуралары мен функцияларына ие болуы мүмкін. Бырақ, барлық бұл элементтер тек олар анықталған процедуралар мен функциялардың ішінде ғана пайдаланылуы мүмкін.
Процедуралар мен функциялардың параметрлері. Ішкі программаны сипаттау барысында көрсетілетін параметрлер формальды деп аталады. Ішкі программаны шақыру барысында көрсетілетін параметрлер фактілі деп аталады.
Егер формальды параметр var қызметші сөзімен сипатталған болса, онда оны параметр-айнымалы деп атайды да ол сілтеме бойынша жіберіледі деп айтады. Егер параметр var қызметші сөзін пайдаланбай сипатталған болса, онда оны параметр-мән деп атайды да ол мәні бойынша жіберіледі деп айтады
Егер параметр мәні бойынша жіберілетін болса, онда ішкі программаны шақыру барысында фактілі параметрлердің мәндері сәйкесінше формальды параметрлерге меншіктеледі. Мысалы, процедураның келесідей сипатталуы бар болсын:
procedure PrintSquare(i: integer);
begin
writeln(i*i);
end;
Онда PrintSquare(5*a-b) шақырылғанда 5*a-b мәні есептеліп і айнымалыға меншіктеледі, одан кейін процедураның тұлғасы орындалады.
Егер параметр сілтеу бойынша жіберілетін болса, онда ішкі программаны шақырған кезде фактілі параметр процедураның тұлғасындағы оған сәйкес формальды параметрді алмастырады. Нәтижеде формальды параметр-айнымалының процедура ішінде кез келген өзгерулері фактілі параметрдің сәйкесінше өзгерулеріне әкеледі. Мысалы, егер келесі процедура сипатталған болса:
procedure Mult(var a: integer);
begin
a:=a*2;
end;
онда Mult(d) шақырылған кейін d-нің мәні екі есе өседі.
Фактілі параметр-мән ретінде типі формальды параметрдің типімен сәйкес болатын немесе айқын емес түрде соған келтірілетін кез келген өрнек болуы мүмкін. Фактілі параметр-айнымалы ретінде типі формальды параметрдің типімен дәл сәйкес келетін айнымалыны ғана көрсетуге болады.
Параметрді сілтеу бойынша ішкі программаға жіберу барысында фактілі параметрдің адресі жіберіледі. Сондықтан, егер параметр жадыдан көп орын алатын болса (массив, жазба), онда әдетте ол да сілтеу бойынша жіберіледі. Нәтижесінде процедурураға параметрдің өзі емес оның адресі жіберіледі, бұл жадыны және жұмыс жасау уақытын үнемдейді. мысалы:
procedure Print(var a: array [1..10] of integer; n: integer);
var i: integer;
begin
for i:=1 to n do
write(a[i],' ');
writeln;
end;
Сонымен қатар, параметр const қызметші сөзімен сипатталуы мүмкін. Бұл ішкі программаның ішінде оны өзгертуге тыйым салынғандығын білдіреді. Мысалы:
procedure PrintSquare1(i: integer);
begin
i:=i*i; // дұрыс
writeln(i);
end;
procedure PrintSquare2(const i: integer);
begin
i:=i*i; // қате!!!
writeln(i);
end;
Pascal ABC-те тұрақты параметр мәні бойынша жіберіледі (Delphi-де – сілтеу бойынша).
Программаны компиляциялап іске қосқанда программаның тұлғасында бірінші болып GetData(А,В) операторы орындалады. Оператордың бұл түрі процедураны шақыру деп аталады. Бұл шақыруды өндеу барысында программа Х пен Y (формальды параметрлерді) А мен В (фактілі параметрлерге) алмастырып GetData ішіндегі операторларды орындайды. GetData процедурасын шақыру операторындағы Х пен Y –тің алдындағы var кілттік сөзі фактілі параметрлер айнымалы болуы тиіс және айнымалылардың мәндері өзгеріліп және қайтадан шақырушы программаға жіберілуі мүмкін екендігін білдіреді. Сондықтан GetData процедурасына литералдарды, тұрақтыларды, өрнектерді және с.с. жіберуге болмайды. GetData орындалуы аяқталғаннан кейін басқару программаның негізгі тұлғасындағы GetData-ны шақырушыдан кейінгі операторға беріледі. Ол келесі оператор GetRatio функциясын шақыру болып табылады.
Мұндағы кейбір маңызды ерекшеліктерді атап кетейік. Біріншіден, GetRatio мән қайтарады, ол мән кейін бір жерде пайдаланылуы тиіс; бұл жағдайда ол мән Ratio-ға меншіктеледі. Екіншіден, функцияның негізгі тұлғасында мән GetRatio-ға меншіктеледі. Сонымен, функция қандай мәнді қайтару керек екендігін анықтайды. Үшіншіден, бұл жерде I және J формальды параметрлердің алдында var кілттік сөзі жоқ. Ол фактілі параметрлер кез келген бүтінсанды өрнек бола алатындығын білдіреді, мысалы, Ratio:=GetRatio(А+В,300), және тіпті егер формальды параметрлердің мәндері функцияның тұлғасының ішінде өзгертілсе де жаңа мәндер қайтадан шақырушы программаға жіберілмейді. Бұл процедуралар мен функциялардың арасындағы айырмашылық болып табылмайды; параметрлердің екі типін де ішкі программалардың кез келген түрінде пайдалануға болады. Процедураның сипатталуы идентификаторды процедуралық блокпен байланыстыруға мүмкіндік береді. Процедураны одан кейін процедураның операторы арқылы белсендіруге болады. Процедураны іске қосу оның ішінде процедураның аталуы және қажетті параметрлер қамтылған процедураның операторы арқылы жүзеге асырылады. Процедура іске қосылған кезде орындалуы тиіс операторлар процедура модулінің операторлық бөлімінде қамтылған. Егер процедурада қамтылған операторда процедура модулінің ішінде процедураның идентификаторы пайдаланылатын болса, онда процедура рекурсиялы түрде орындалады (орындалу барысында өзіне өзі сілтейді). Процедураны сипаттау мысалы:
program DoRatio;
var
A,B : integer;
Ratio : real;
procedure GetData(var X,Y : integer);
begin
Write('Екі сан енгізіңіз: ');
Readln(X,Y)
end;
function GetRatio(I,J : integer) : real;
begin
GetRatio := I/J
end;
begin
GetData(A,B);
Ratio := GetRatio(A,B);
Writeln('Қатынас тең',Ratio)
end.
procedure NumString(N: integer; var S: string);
var
V: integer; begin
V := Abs(N); S := '';
repeat
S := Chr(N mod 10 + Ord('0')) + S; N := N div 10;
until N = 0;
if N < 0 then S := '-' + S;
end;
Процедураның сипатталуында операторлар блогының алдында үзіліс жасау (interrupt) директивасы көрсетілуі мүмкін. Бұл жағдайда процедура үзіліс жасау процедурасы ретінде қарастырылады. Процедура немесе функцияның сипатталуында операторлар блогының орнына алға кететін сипаттау (forward), сыртқы сипаттау (external) немесе ішкі сипаттауды (inline) жазуға болады.
Функцияның сипатталуы оның ішінде мән есептеліп және қайтарылатын программаның бөлімін анықтайды. Функцияның тақырыбында функцияның идентификаторы, формальды параметрлер (бар болса) және функция нәтижесінің типі анықталады.
Функция оны шақырған кезде белсендіріледі. Функцияны шақыру барысында функцияның идентификаторы және функцияны есептеу үшін қажет болатын кейбір параметрлер көрсетіледі. Функцияны шақыру өрнектің ішіне операнд ретінде енгізілуі мүмкін. Өрнек есептелетін кезде функция орындалады да операндтың мәні функция қайтаратын мән болып қалады.
Функция блогының операторлық бөлімінде функция белсендірілген кезде орындалуы тиіс болатын операторлар беріледі. Модульде кемінде бір меншіктеу операторы болуы тиіс, оның ішінде функцияның идентификаторына мән меншіктеледі. Функцияның нәтижесі ең соңғы меншіктеу болып табылады. Егер ондай меншіктеу операторы болмаса немесе ол орындалмаған болса, онда функция қайтаратын мән анықталмаған. Егер функцияның идентификаторы функцияны модуль-функцияның ішінен шақыру барысында пайдаланылатын болса, онда функция рекурсиялы түрде орындалады. Функцияны сипаттау мысалдары:
function Max(a: Vector; n: integer): extended;
var
x: extended;
i: integer;
begin
x := a(1);
for i := 2 to n do if x < a[i] then x := a[i];
Max := x; end;
function Power(x: extended; y: integer): extended;
var
z: extended;
i: integer;
begin
z := 1.0; i := y;
while i > 0 do
begin
if Odd(i) then z := z*x;
x := Sqr(x);
end;
Power := z;
end;
Процедура немесе функцияны сипаттауда формальды параметрлер тізімі беріледі. Формальды параметрлер тізімінде сипатталған әр параметр сипатталатын процедура немесе функцияға қатысты локальды болып табылады да берілген процедура немесе функциямен байланысты модульдің ішінде оған оның идентификаторы бойынша сілтеуге болады.
Программаның тақырыбы программаның аталуын және оның параметрлерін анықтайды. Егер uses сөйлемі пайдаланған болса ол программа пайдаланатын барлық модульдерді идентификациялайды.
Локальды және глобальды айнымалылар. Ішкі программаның сипаттау бөлімінде сипатталған айнымалылар оның локальды айнымалылары деп аталады. Ішкі программадан тыс сипатталған айнымалылар оған қатысты глобальды айнымалылар деп аталады.
Ішкі программаның параметрлері оның локальды айнымалылары болып саналады. Егер локальды айнымалының аталуы глобальды айнымалының аталуымен сәйкес болса, онда локальды айнымалы глобальды айнымалыны жасырады, сондықтан ішкі программаның ішінен глобальды айнымалыға сілтеуге болмайды. Мысалы:
var i: real;
procedure p;
var i: integer;
begin
// глобальды i айнымалыға процедураның ішінде сілтеуге мүмкін емес
i:=5; // локальды i айнымалыға меншіктеу; ...
end;
Процедуралар, функциялар, сыртқы библиотекалар.
Программа Р30, символдар жолы арқылы экранды екі бөлімге бөліп 1, 2,..., 10 сандар үшін квадрат түбірлері кестесін және 1, 2,..., 5 сандар үшін натурал логарифмдерінің кестесін құрады. Символдар жолын экранға шығару line процедурасы ретінде ұйымдастырылған. Процедурадан программаға ешқандай ақпаратты жіберу қажет болмағандықтан процедураның аргументтері (символдардың түрі және саны) мән-параметрлер ретінде сипатталған. Бұл программада процедура бес рет орындалады.
Программа Р31, берілген төрт натуральных а, b, с, d сандар үшін сандардың бірінші және екінші паралардың ең үлкен ортақ бөлгіштерін (ЕҮОБ) экранға шығарып оларды мәні бойынша салыстырады. Программада nod(x,y) рекурсиялы функция анықталған, ол келесі ережені жүзеге асырады:
21 және 15 санларға nod(x,y) –ті ретімен қолданып, табамыз:
nod(21,15) = nod(6,15) = nod(15,6) = nod(3,6) = nod(6,3) = nod(0,3) = nod(3,0) = 3.
Сыртқы библиотекалар. Ішкі программалар (процедуралар мен функциялар) программаларда оларды құрылымдау мақсатында, сонымен қатар, программаның кейбір бөліктерін бірнеше рет қайталау барысында пайдаланылады. Процедуралар мен функциялар программалық бірліктердің ішкі программаларды сипаттау бөлімінде сипатталады. Олар бұл программалық бірліктер үшін ішкі болып табылады. Бірдей бір ішкі программалар түрлі программаларда пайдаланылған жағдайлар кездеседі. Мұндай жағдайларда оларды қажетті моментте кез келген программаларға қосуға болатын сыртқы ішкі-программаларды құрған дұрыс. Әдетте, сыртқы ішкі-программаларды жеке пакеттерге біріктіреді, оларды сыртқы ішкі-программалардың библиотекалары деп атайды. Кірістірілген библиотекалар компиляциялау барысында кез келген программаға автоматты түрде қосылады.
Сыртқы ішкі-программалар жеке файл немесе файлдар түрінде кәдімгідей құрылады. Сыртқы ішкі-программаларды қосу үшін тұтынушының программасында сипаттау бөлімінде $і файл аталуы директивасы міндетті түрде қойылады. Осы моменттен бастап сыртқы файлдың барлық процедуралары мен функциялары программа үшін ішкі болып қалады, және оның құрамына кіретін барлық процедуралары мен функцияларына локальды және глобальды айнымалылар ережесі таралады.
Келесі мысалда екі процедурадан және бір функциядан тұратын сыртқы библиотека құрылады. Бірінші процедура privet экранды тазартады, сәлемдемені шығарады, одан кейін бос орын клавишасы басылғаннан кейін қайтадан экранды тазартады. Екінші stepen процедурасы а санды b санға дәрежелейді. Үшінші ішкі-программа-функция mexp Тейлор қатарының негізінде жуық шамамен экспонента мәнін есептейді.
procedure PRIVET;
var a:char;
begin
clrscr; gotoxy(20,10);
write('Сәлеметсіз бе, сау болыңыз !'};
repeat {цикл экранды алмастыруға }
gotoxy(35,50);write('пробел');{мүмкіндік береді }
read(kbd,a); {бос орынды басу бойынша }
until а=' ';
clrscr;
end;
procedure STEPEN(a,b:real;var y:real);
begin
y:=exp(b*ln(a));
end;
function MEXP(x:real):real;
begin
mexp:=l+x+x*x/2+x*x*x/6+x*x*x*x/24;
end;
Осы үш ішкі-программалар lab.pas атаулы файлға жазылған болсын. Р32 программасы құрылған сыртқы библиотеканы пайдалану мысалын көрсетеді:
program Р32;
{$i lab} {библиотеканы қосу директивасы}
var a,b: real;
begin
PRIVET;
STEPEN(2,4,a);writeln('2 –нің 4 дәрежесі »',a);
b:=MEXP(l);
write('машинаның есептегені exp(1)=',EXP(1):6:4,'менің есептегенім ехр(1)=',b:6:4);
end.
Модульдер. Модульдерді библиотекаларды құру және үлкен программаларды логиикалы түрде байланысқан бір-біріне тәуелсіз құрамдас бөліктерге бөлу үшін пайдаланады. Модуль деректер типтерін, айнымалыларды және басқа объекттерді сипаттауды, сонымен қатар, түрлі программаларда пайдаланылатын ішкі-программаларды қамтиды. Модульдің сипаттауларына, функциялары мен процедураларына қол жеткізуді оның ішінде модульдің аталуы көрсетілген uses операторы қамтамасыз етеді. Бұл оператор тікелей тақырыптан кейін программаның сипаттаулар бөлімінде орналасады. Егер программада бір емес бірнеше модульдер пайдаланылатын болса, онда үтір арқылы ажыратып барлық модульдердің атауларын көрсету керек. System модуліне сілтеу міндетті емес.
Модуль құрамына келесі бөлімдер кіреді:
тақырып (unit <модуль аталуы> түрінде) модульге сілтеу үшін керек. Модульді қамтитын файл аталуы модуль аталуымен бірдей болуы тиіс;
интерфейс, ол interfase сөзінен басталады да тақырыптар тізімі арқылы бейнеленген және оларға негізгі программа тұлғасынан қол жеткізуге болатын процедуралар мен функцияларды қоса жариялауларды қамтиды;
жүзеге асыру, ол implementation сөзінен басталады да модульдің интерфейстік бөлімінде санақтап шығарылған процедуралар мен функциялардың тұлғаларын қамтиды;
инициализация, ол бос болып тек end–ты қамтуы мүмкін немесе модульді инициализациялау бойынша қажетті амалдарды орындайтын (мысалы, айнымалыларға бастапқы мәндерді меншіктейтін) операторларды қамтуы мүмкін.
Сонымен, модуль – ол тұрақтылар, деректер типтері, процедуралар мен функциялар жиынтығы. Әр модуль жеке компиляцияланады; компиляциялау нәтижесі – кеңейтпесі tpu (Turbo Pascal Unit) файл. Модульдің әр элементін қосымша жариялаусыз тұтынушының программасында пайдалануға болады, ол үшін тақырыптан кейін программаның басында пайдаланылатын модуль аталуын Uses директивасында жазған жеткілікті. Стандартты Crt, Graph және басқа модульдерді пайдаланады. Бұл модульдерде дисплей экранымен, клавиатурамен, графикалық примитивтермен және с.с. жұмыс жасауға арналған сервистік процедуралар және функциялар қамтылған.
Кешенді сандарға арифметикалық амалдарды қолданумен Паскальдің математикалық мүмкіндіктерін толықтыратын модульді құру мысалын қарастырайық. Кешенді сандарды нақты сандарды (а,b) жұптары арқылы бейнелейміз. Оларға амалдар келесі ережелерге сәйкес қолданылады:
(a,b) + (c,d) = (a+c,b+d),
(a,b)-(c,d) = (a-c,b-d),
(а,b) * (c,d) = (a*c-b*d , a*d+b*c),
(a,b) / (c,d) = ((a*c+b*d)/(c*c+d*d), (b*c-a*d)/(c*c+d*d)).
Құрылатын модуль төрт процедураны қамтиды: Sum - қосынды, Raz - айырым, Proiz – көбейтінді, Chastn – бөлінді. Бұл модуль жеке компиляциялануы мүмкін. Одан кейін кез келген программа Uses CompChisla директива арқылы осы модульдің интерфейстік объекттеріне (бұл жағдайда – процедураларына) қол жеткізе алады. Модульдің интерфейстік бөлімінде процедуралардың тек тақырыптары көрсетіледі, ал «жүзеге асыру» бөлімінде процедуралардың тақырыптарынан тек атаулары қалады.
unit CompChisla;
interface
procedure Sum(a,b,с,d: real; var x,y: real);
procedure Raz(a,b,c,d: real; var x,y; real);
procedure Proiz(a,b,c, d: real; var x,y: real);
procedure Chstn(a,b,c,d; real; var x,y: real);
implementation
procedure Sum;begin x:=-a+c; y:=b+d end;
procedure Raz;begin x:=a-c; y:=b-d end;
procedure Proiz;begin x:=a*c-b*d; y:=a*d+b*c end;
procedure Chastn;
var z:real;
begin z:= c*c+d*d; x: = (a*c-)-b*d) /z; y;= (b*c-a*d) /z
end;
end.