
26 Мазмұны
Кіріспе
Менін курстық жұмысымның тақырыбы – “Процедуралар. Параметр-мән және параметр-айнымалы. Параметрсіз процедура”. Мақсатымыз Паскаль тілінде бағдарламалау мен алгоритмдеу тәсілдерін меңгеру, жаңа білім алу және оны жетілдіру. Курстық жұмыста процедуралар түрлері, мүмкіндіктері, артықшылықтары мен кемшіліктері туралы толық мәлімет берілген. Және әр түрлі бағдарламаларды орындайтын мысалдармен толықтырылған.
Паскаль тілінде процедура дегеніміз қайталанбайтын аты бар ерекше өрнектелген бағдарлама бөлігі. Процедураның атын жазу арқылы бағдарламаның кез келген бөлігінде оны шақыруға, яғни іске асыруға болады.
Процедураның іске асырылуынан кейін процедураға кіретін операторлар іске қосылады, соңғы оператордың орындалуынан кейін басқару негізгі бағдарламаға қайтады және шақыру процедурасынан кейінгі тұратын операторлар орындалады.
Турбо Паскальда көптеген стандартты процедуралар мен функциялар бар. Ауқымды кітапхананың болуы қолданбалы бағдарламалардың жасауын жеңілдетеді. Бірақ көпшілік жағдайда қолданбалы бағдарламаларға спецификалық іс-әрекеттер кітапханадағы тура аналогтар болмайды, сондықтан бағдарламалаушыға өзінің бейстандартты процедураларын құруға тура келеді.
Көлемі үлкен жолдардан тұратын күрделі бағдарламаларды бөліп, құрылым ретінде іске асырусыз жасау өте қиын. Сондықтан, көптеген программалау тілдерінде құрылымдарды қолдану тәсілдері пайдаланады. Бұл құрылымдарға процедуралар мен функцияларды жатқызуға болады.
Процедуралар жайлы жалпы түсінік
Мыңдаған, жүздеген жолдардан тұратын күрделі программаларды фрагменттерге бөліп, құрылым көмегінсіз іске асыруға келмейді. Сондықтан, көптеген программалау тілдерінде құрылымдарды қолдану тәсілдері пайдаланады. Олардың ішіне Паскаль тілі де жатады.
Паскаль тілінде процедура дегеніміз қайталанбайтын аты бар ерекше өрнектелген бағдарлама бөлігі. Процедураның атын жазу арқылы бағдарламаның кез келген бөлігінде оны шақыруға, яғни іске асыруға болады.
Процедураның іске асырылуынан кейін процедураға кіретін операторлар іске қосылады, соңғы оператордың орындалуынан кейін басқару негізгі бағдарламаға қайтады және шақыру процедурасынан кейінгі тұратын операторлар орындалады.
Шақыру процедурасы мен бағдарлама арасындағы байланыс.
Негізгі бағдарлама мен процедура арасындағы ақпаратпен алмасу үшін бір немесе бірнеше шақыру параметрлері қолданылады. Процедура мәліметтермен алмасқанда шақыру парметрлерін қолданбаса да болады.
Егер мұндай байқалса, онда процедураның атынан кейін жақшаның ішінде беріледі және процедураның шақыру операторын құрастырады.
Процедуралар мен функциялар мысалдарымен біз кезіккенбіз, олар: стандартты оқу және жазу процедуралары - READ, READLN, WRITE, WRITELN, функциялар - ORD, CHR, математикалық функциялар және тағы басқалары. Стандартты деп аталады, өйткені Турбо Паскаль жүйесімен құрылған және олардың бөлінбес бөлігі болып табылады.
Турбо Паскальда көптеген стандартты процедуралар мен функциялар бар. Ауқымды кітапхананың болуы қолданбалы бағдарламалардың жасауын жеңілдетеді. Бірақ көпшілік жағдайда қолданбалы бағдарламаларға спецификалық іс-әрекеттер кітапханадағы тура аналогтар болмайды, сондықтан бағдарламалаушыға өзінің бейстандартты процедураларын құруға тура келеді.
Бейстандартты процедуралар мен функцияларды бейнелеу керек, себебі компилятор шақыру операторымен және процедураның ішінде қарастырылған іс-әрекеттермен байланысты орнату үшін қолданылады. Процедураны бейнелеу жариялау бөлімінде орналасады және сырттай бағдарлама сияқты көрінеді, бірақ бағдарламаның тақырыпшасы процедураның тақырыпшасын фигурациялайды. Мысал ретінде өзіміздің процедурамызды құрастырып көрейік. Бұл процедурада кейбір символдық жолдар барлық жолдық әріптерді сәйкес кіші әріптермен ауыстыратындай түрленеді. Турбо Паскальда аналогты іс-әрекеттерді бірлік символдарда орындайтын стандартты UPCASE функциясы бар. Біздің процедурамыз (UPSTRING деп атаймыз) барлық жолдың символдарын түрлендіреді, оған қарамастан латындық әріптерді ғана емес орыс алфавитін қамтитындай жасалған.
Программаны екі этапқа бөліп, іске асырамыз. Алдымен бағдарламаның негізгі бөлігін құрамыз. Оның жұмысы өте қарапайым: пернетақтадан енгізілген жолды (Sinp деп атаймыз) енгізуі керек және оны UPSTRING процедурасының көмегімен түрлендіруі қажет. Бұл әрекеттерді бағдарламалау қиын емес:
program CharsConvert;
procedure UpString (si: String; var s2; String);
begin {UpString}
s2 := s1
end; {UpString}
var
Sinp, Sout: String;
begin {Негізгі бағдарламаның басы}
Write('Введите строку: ');
ReadLn(Sinp); {Жолды енгіземіз}
UpString(Sinp,Sout);
WriteLn(' Результат: ',Sout) {Нәтижесін шығарамыз}
end. {Бағдарлама соңы}
Бұл бағдарламада UPSTRING процедурасын "заглушка" деп аталатын процедура көмегімен іске асырамыз. Заглушка бізге екі себеппен қажет. Біріншіден, келтірілген бағдарлама өте қарапайым, процедураның детальді іске асырылуы кездеспейді, сондықтан оның жұмысын анық аңғаруға болады. Екіншіден, бұл мысал көмегімен күрделі бағдарламаларды құрудың универсальды тәсілімен танысуға болады. Бұл тәсілде бағдарламаны құру жоғарыдан, яғни негізгі алгоритмды іске асырудан басталады. Әдетте жоғарғы бөлімде бағдарламаны іске асырудағы біршама детальдар белгісіз, сондықтан бұл бөлімдерді уақытша “заглушка” көмегімен алмастыруға тура келеді.
Процедураны бейнелеу резервтелген Procedure сөзінен басталады, кейін процедура аты және формальды параметрлер тізбегі жазылады. Параметрлер тізбегі жақшаға алынады және параметрлердің типтері көрсетіледі. Мысалда көрсетілгендей, s2 параметрінің алдында резервтелген VAR сөзі жазылған. Оның көмегімен компилятор процедураның есептеп шығаратын параметрлерін өңдейді. Procedure резервтелген сөзі, процедура аты және оның параметрінің тізбегі процедура тақырыбын құрайды. Тақырыптан кейін процедура денесі жазылады, мұнда бейнелеудің жаңа бөлімі мен орындалатын операторлар орналасқан.
Процедура жұмысы:
Procedure UpString(s1: String; var s2: String);
var
i: Integer;
c: Char;
begin {UpString}
s2 := '';
{Бағдарлама басында енгізілетін жолдың мәні бос}
for i := l to Length(s1) do
begin
с := s1[i];
if (с >= 'a') and (с <= 'z') then
с := chr(ord('A')+ord(c)-ord('a')) {A,a – латын әріптері!}
else if (с >= 'а') and (с <= 'п') then
с := chr(ord('А')+ord(c)-ord('а')) {А,а – орыс әріптері!}
else if (с >= 'р') and (с <= 'я') then
с := chr(ord('Р')+ord(c)-ord('р'));
s2 := s2+c
end;
end. {UpString}
Процедураны басында оператор көмегімен s2 := '' мәні жоқ, яғни ұзындығы нольге тең шығару жолы дайындалады. Кейін 1-ден s1 шығару жолының ұзындығының (бұл ұзындық Length процедурасы арқылы өрнектеледі) мәніне дейін цикл қолданылады. Басқа жолдардың символдарына рұқсат алу үшін STRING әдісі қолдануға тура келеді. Бұл әдіс кез келген жолды таңбалар жинағы, яғни масссив ретінде қарастарады. Жол индексі жол атауынан кейін тік жақша арқылы жазылады. Сонымен, s1[i] - s1жолының i-ші символы. Өңделген символ шығару жолының соңына қосылады.
Біздің жазған процедурамыз келесі бағдарламаға түрленеді:
Program CharsConvert;
{Бағдарлама кез келген мәтіндік жолды енгізіп, барлық әріптерді кіші әріптерге түрлендіреді де нәтижесін шығарады}
var
i: Integer;
с: Char;
begin {UpString}
s2 := ''; { Бағдарлама басында енгізілетін жолдың мәні бос }
{Жолдың әр символын тексері циклі}
for i := 1 to Length(s1) do
begin
с := s1[i];
{Символды әр жиыннан іздейміз}
if (с >= 'a') and (с <= 'z') then
с := chr(ord('A')+ord(c)-ord('a'))
else if (с >= 'a') and (с <= 'п') then
с := chr (ord('A')+ord(c)-ord('a'))
else if (с >= 'р') and (с <= 'я') then
с := chr(ord('P')+ord(c)-ord('p'));
s2 := s2+c
end;
end. {UpString}
var
Sinp, Sout: String; {Енгізілетін және өңделетін жолдық қатарлар}
begin {Негізгі бағдарламаның басы}
Write('Введите строку: ');
ReadLn(Sinp); {Жолдық қатарды енгіземіз}
UpString (Sinp, Sout); {Кіші әріптерге түрлендіреміз}
WriteLn(' Результат: ',Sout) {Нәтижесін шығарамыз}
end. {Бағдарлама соңы}
Жоғарыда айтылғандай процедуралар мен функциялар қайталанбайтын атауы бар, өзгеше өңделетін бағдарламаның бөлігі болып табылады. Бағдарлама мәтінінде процедура атауының жазылуы процедураны шақырады, сондықтан бұл процесс процедура шақырылуы деп аталады. Процедуралар мен функциялар подпрограммалар деп аталатын бағдарламалаудың үлкен бөлігін құрады.
Подпрограмма дегеніміз кез-келген бағдарламаны бір-бірінен тәуелсіз бөліктерге бөліп қарастыруға қажетті құрал болып табылады. Бағдарламаны бөліктерге бөлудің бірнеше себебі бар.
Біріншіден, жадыны үнемдеу: кез келген подпрограмма бағдарламада бір рет сипатталады, алайда оның атын жазу арқылы оны бірнеше рет бағдарламаның кез келген бөлігінде шақыруға болады. Процедураны шақырғанда оның ішіндегі операторладың барлығы жұмысын жасап, алгоритм іске асырылады.
Екінші себебі - бағдарламаны құрған кезде жоғарыдан төменге қарай орналастыру тәсілі. Бұл жағдайда алгоритм тізбектелген күрделі подпрограммалар түрінде көрсетіледі. Процедуралар көлемі кіші бағдарламаларға бөлінуі мүмкін. Алгоритм тізбегі бағдарламаның әр бөлігі қысқа әрі қарапайым формаға келгенге дейін жалғаса береді. Бұл бағдарламалауды жеңіл жүргізу үшін өте қажет.
Процедура құрылымының мысалдары. Процедура атауын локалицациялау. Процедураны шақыру үшін бағдарламаның кез-келген бөлігінде процедура атауын жазу керек. Кез келген атауды, оның ішінде процедуралар атауларын да міндетті түрде бағдарламаның сипаттау бөлімінде көрсетіп кету қажет.
Процедураны сипаттау дегеніміз – оның тақырыбы мен параметрлерін жазып шақыру. Тақырыбында процедураның атауы және формальды параметрлері (бар болған жағдайда) көрсетіледі. Тақырыбынан кейін процедура денесі болуы керек. Процедураның денесі кез келген бағдарламаға тән сипаттау бөлімі мен іске асырылатын операторларды сипаттау бөлімінен тұрады. Сипаттау бөлімінде процедураның төменгі деңгейдегі бағдарлама бөлігі кездесуі мүмкін.
Жоғарыда көрсетілген мысалдағы процедураның құрылымы:
Program ...;
Procedure A;
Procedure A1;
. . . . .
begin
. . . . .
end {A1};
Procedure A2;
. . . . .
begin
. . . . .
end {A2};
begin {A}
. . . . .
end {A};
Procedure B;
Procedure В1;
. . . . .
begin
. . . . .
end {В1};
Procedure В2;
Procedure В21;
. . . . .
және т.б.
Кез келген деңгейдегі процедуралар көптеген константа, айнымалылар, типтер және төменгі деңгейдегі бағдарламалардан тұрады.
Процедуралар ішінде суреттелген барлық атаулар локализациядан өтеді, себебі олар бағдарлама сыртында көрінбейді.
Бұл жағдайда процедураға жүгінуді қолданатын операторлар жағынан ол “қара тізім” деген түсінікке ие болады. Мұнда алгоритм қажетті бөлігі орындалады. Бұл іске асырылатын бағдарламаның барлық бөліктері қолданушыдан жасырылған, сондықтан қол жетімсіз болып табылады. Мысалы, жоғарыда көрсетілген мысалда бағдарламаның негізгі бөлігінен А және В процедураларын шақыруға болады, бірақ олардың ішіндегі A1, A2, В1 процедуралын шақыру мүмкін емес. Бұл жазылған ережелер тек процедура атауларына ғана емес, процедурадағы кез келген типтерге, константаларға, белгілерге және айнымалыларға қатысты. Процедура жұмысында қолданылатын барлық атаулар ерекше және процедура атауынан айрықша болуы тиіс.
Төменгі деңгейде орналасқан процедуралардың тек өзінде жарияланған атауларға ғана емес, жоғарғы деңгейдегі процедураның атауларына жүгіну рұқсаты бар. Жалпы айтқанда, процедураның сыртынан біз оның ішіндегі орындалатын бағдарламаны көре алмаймыз, алайда төменгі деңгейдегі процедура арқылы жоғары деңгейдегі подпрограмманың іске асырылуын байқауға болады. Мысал келтіретін болсақ, В21 процедурасы арқылы біз А және оның ішіндегі В, В2 процедураларын шақыра аламыз. Кез-келген процедура өзін-өзі шақыра алады, бұл тәсіл рекурсия деп аталады.
Мысал ретінде келесі бағдарламаны қарастыруға болады:
Program ...;
var V1: ...;
Procedure A;
var V2: ...;
. . . . .
end {A};
Procedure В;
var V3: ...;
Procedure B1;
var V4: ...;
Procedure В11;
var V5;
. . . . .
В11 процедурасының барлық айнымалыларға (V1,...,V5) рұқсаты бар, В1 процедурасы V1,...,V4 айнымалыларын, ал орталық бағдарламадан тек V1 шақыра алады. Бір деңгейде орналасқан процедуралар өзара әрекеттескенде міндетті түрде Турбо Паскалдың негізгі ережесін сақтау керек: кез келген процедура іске асырылмас бұрын жариялануы тиіс. Сондықтан, В процедурасынан А процедурасын шақыруға болады, ал А процедурасынан В процедурасын шақыруға келмейді.