Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Символдық және жазбалар түріндегі деректерді өндеу есептерін программалау
Жеке символдармен жұ мыс жасау ү шін char типті айнымалылар сипатталады: var ch: char; {... } ch: ='y'; char типтегі бір айнымалы ASCII-символдың бір коды туралы ақ паратты сақ тайды. Мұ ны мысалы, тұ тынушының клавиштерді басу ә рекеттерін бақ ылау ү шін пайдалануғ а болады. Мұ ндай программаның вариантарының біреуіне мысал келтірейік: var ch: char; begin repeat writeln; write ('Жалғ астыру? (Y/N)'); readln (ch); if (ch='Y') or (ch='y') then begin {Бұ л жерде қ ажетті есептеу ү рдісі программаланады} end else if (ch='N') or (ch='n') then halt {Программаның аяқ талуы} else writeln ('Y немесе N басың ыз'); until false; end. Символдардың кодтарымен жұ мыс жасау ү шін негізгі 2 функция бар: function ord(x): char; х символдың ASCII-кодын қ айтарады function chr(x: byte): char; х ASCII-коды кө рсетілген символды қ айтарады. Паскальда пайдаланылатын DOS кодировкасының символдар кестесін шығ ару ү шін соң ғ ы функцияны қ олданайық: var i, j: integer; begin writeln; write ('ASCII-кодтар [32..255]'); for i: =2 to 15 do begin writeln; write (i*16: 3, ' '); for j: =0 to 16 do write(chr(i*16+j), ' '); end; writeln; write ('ENTER шығ у ү шін...'); readln; end. Бұ л жерде кодтары 32 ден 255 дейін болатын символдар ғ ана шығ арылады, себебі кодтары 0 ден 31 дейін болатын алғ ашқ ы 32 символдар – баспағ а шығ арылмайды (мысалы, табуляциялау, жолды қ айтару). Символдың коды мә ндердің кейбір аралығ ына тү сетіндігін анық тау ү шін in операторын қ олданғ ан ың ғ айлы, мысалы келесі программаның фрагментінде: write ('Символ енгізің із: '); readln (ch); if ch in ['A'..'Z'] then write ('Ү лкен латын; ') else if ch in ['a'..'z'] then write ('Кіші латын; ') else if (ch in ['А'..'Я']) then write ('Ү лкен орыс; ') else if (ch in ['а'..'п']) or (ch in ['р'..'я']) then write ('Кіші орыс; ') else if ch in ['0'..'9'] then write ('Цифр; ') else write ('Бұ л алфавитті-цифрлы символ емес; '); write (' Сіздің символың ыздың коды= ', ord(ch)); Алфавиттік символдармен жұ мыс жасағ анда, кіші жә не бас ә ріптерді енгізуді жеке ескеруге мә жбұ р боламыз. Алдымен барлық символдарды upcase функция арқ ылы бас символдарғ а тү рлендіріп алғ ан ың ғ айлы: var ch: char; i: integer; begin repeat for i: =1 to random(72) do write ('*'); writeln; write ('Жалғ астыру? (Y/N)'); readln (ch); until upcase(ch)='N'; end. Ө кінішке орай, бұ л функцияның орыс немесе басқ а ұ лттық символдарымен жұ мыс жасағ анда пайдасы жоқ, оның орнына ө зіміздің ішкі upcase_ru атаулы программамызды жазып тексерейік: procedure upcase_ru (var s: string); var i, l, c: integer; begin l: =length(s); for i: =1 to l do begin c: =ord(s[i]); if (c> =ord('а')) and (c< =ord('п')) then c: =c-32 else if (c> =ord('р')) and (c< =ord('я')) then c: =c-80; s[i]: =Upcase(chr(c)); end; end; var s: string; begin writeln ('Мә тіннің бір қ атарын енгізің із: '); readln (s); upcase_ru (s); writeln ('Тү рленген жол: '); writeln (s); end. Программада DOS кодировкасында кириллицаның символдары ретімен ілескен сандар арқ ылы кодталмағ андығ ы ескерілген. Сонымен қ атар, программада оғ ан деректердің string (жол) типі сә йкес келетін символдар массиві пайдаланылады. Жол - символдар, яғ ни char типтегі элементтер массиві. Жолдағ ы символдарды нө мірлеу ә рдайым бірден басталады. Паскальда жолғ а деректердің string типі сә йкес. Жол келесі тү рдегі оператор арқ ылы сипатталады: var Жол_аталуы: string [ ұ зындық ]; Егер оң таң балы бү тінсанды " ұ зындық " шамасы кө рсетілмесе, ұ зындығ ы 255 символғ а дейін жол ү шін жады бө лінеді. Жолдарды сипаттау мысалдарын келтірейік: var s1: string; s2: string[20]; s3: array [1..20] of string; Мұ ндағ ы s1 – ұ зындығ ы ү нсіз бойынша жол, s2 - 20 символдан тұ ратын жол, s3 - ә рқ айсысы жадыдан 256 байтқ а дейін орын алалатын 20 жолдан тұ ратын массив (қ осымша байт жолдың ұ зындығ ын сақ тау ү шін қ ажет). Жолдарғ а меншіктеу операциясын қ олдануғ а болады: s1: ='А.Т. Апсеметов'; s1 жолғ а жолдық тұ рақ тының мә ні меншіктелген. s1[3]: =’В’; жолдың жеке s1 символына символдық тұ рақ ты меншіктелген. s2: ='2009'; s2 жолғ а бү тін санның жазылуы болып табылатын жол меншіктелген. Мұ ндай жолды кейін стандартты Val процедурасы арқ ылы санғ а тү рлендіруге болады. s3[1]: ='Информатика'; s3[2]: =''; — s3 жолдық массив болып табылады. Оның бірінші элементіне жолдық тұ рақ ты меншіктелген, екінші элементіне – бос жол. Жолдарды клавиатурадан енгізу ү шін readln операторын пайдалану керек, себебі жолды енгізу Enter клавишасын басумен аяқ талуы тиіс: writeln ('Тұ тынушының есімін енгізің із: '); readln (s1); Жолдарды экранғ а немесе принтерге шығ ару ү шін write, жә не writeln операторын пайдалануғ а болады s2: ='SUMMA'; write (s2); — экранғ а " SUMMA" жолы шығ арылады. writeln ('Сумма': 10); — " _____Сумма" жолы шығ арылады (сө здің алдында 5 бос орын) жә не курсор экранның келесі жолына ө ткізіледі. Қ осу " +" операторы жолдар ү шін оларды біріктіру (конкатенациялау) амалын жү зеге асыратындай етіліп қ айта анық талғ ан: s1: ='2010' + ' жыл'; s2: ='б.ғ.'; s3[3]: =s1+' '+s2; Бұ л амалдардан кейін s1 жолдың мә ні ''2010_жыл", ал s3[3] жолдың мә ні - ''2010_жыл_б.ғ.". Егер жолдарды қ осу барысында нә тижелі жолдың ұ зындығ ы максималды ұ зындық тан асып кететін болса, онда артық символдар алынып тасталады. Сонымен қ атар, жолдарды біріктіру ү шін стандартты concat функциясын да пайдалануғ а болады Қ атынас " =" операциясы жолдарды символдары бойынша салыстыруғ а мү мкіндік береді. Бұ л кезде келесі ережелер ә рекет жасайды: • тек символдардың жиынтық тары мен олардың ұ зындық тары бірдей болғ анда ғ ана жолдар бірдей болып саналады; • ә йтпесе символдардың элементтері кодтары бойынша салыстырылады. Бұ л кезде ASCII-код кестесіне сә йкес жеке символдардың ү лкенділігі келесідей: '0' < '1' <... < '9' < 'A' <... < 'Z' < 'a' <... < 'z' < кириллиц а символдары. Қ алғ ан қ атынас операцияларын да жолдарғ а қ олдануғ а болады. Бір қ атар типтік есептерді қ арастырайық: Сө йлемді сө здерге жіктеп ә р сө зді экранның жаң а жолына шығ ару керек. Бұ л программаның жұ мыс жасау алгоритмі ө те қ арапайым - s сө йлемнің ағ ымдағ ы жолында кемінде бір бос орын бар болса, бос орындың алдындағ ы жолдың бө лігі (сө з) жолдық w айнымалығ а кө шіріледі. Егер бос орындар қ алмағ ан болса (немесе басынан бастап жоқ болса), онда бү кіл жол – ол бір сө з болып табылады. Кезекті сө зді ө ндеп болғ аннан кейін (біздің жағ дайда оны writeln операторы арқ ылы экранның жаң а жолына шығ ару) жолдың ө нделген бө лігі бос орында қ оса s-тен алынып тасталады – циклдің келесі қ адамы дә л сол сө зді қ айтадап тауып алмауы ү шін. var s, w: string; {сө йлем жә не сө з} p: integer; {бос орынның позициясы} begin writeln ('Мә тін енгізің із'); readln (s); repeat p: =pos (' ', s); if p> 0 then w: =copy (s, 1, p-1) else w: =s; writeln (w); delete (s, 1, p); until p=0; end. Келтірілген программада бір қ атар кемшіліктер бар. Олардың ішінен ең айқ ын кө рінетің кемшілік – сө здердің арасындағ ы қ осымша бос орындар ескерілмеген, оларды программа артық " бос сө здер" ретінде тү сінеді. Келесі мысал арқ ылы олардан қ ұ тылайық. Сө здердің арасындағ ы артық бос орындарды жою. Бұ лесеп шешімінің алгоритмі де қ арапайым. Жолда қ атар орналасқ ан екі бос орын болса олардың ішінен біреуін жою керек. Одан кейін жолдың басында жә не соң ында бір-бір артық бос орындардың жоқ болғ андығ ын тексеру керек. Программаның негізгі бө лімін ғ ана келтірейік: repeat p: =pos (' ', s); if p> 0 then delete (s, p, 1); until p=0; if s[1]=' ' then delete (s, 1, 1); if s[length(s)]=' ' then delete (s, length(s), 1); writeln (s); Бырақ келтірілген мысалдарда маң ыздылау кемшілік бар – жол бойынша бірнеше рет ө ту қ ажеттілігі, ал сө йлемді сө здерге жіктеуді жолды сканирлеудің бір циклында жү зеге асыруғ а болады. Оны келесі программада жү зеге асырып кө рейік: Жолды сканирлеудің бір циклында сө йлемді сө здерге жіктеуді. Программаның толық мә тіні: var s, word: string; c, c0: char; i, l, start: integer; inword: boolean; begin writeln ('Enter string: '); reset (input); readln (s); s: =' '+s+' '; l: =Length (s); inword: =false; for i: =2 to l do begin c0: =s[i-1]; c: =s[i]; if (c0=' ') and (c< > ' ') then begin inword: =true; start: =i; end; if c=' ' then begin if inword=true then begin word: =copy (s, start, i-start); writeln ('''', word, ''' is word'); end; inword: =false; end; end; end. Негізінде біздің программаның 2 қ алып-кү йі бар – сө здің ішінде жә не одан тыс. Қ алып-кү йлердің айырып-қ осылуын inword жалауша басқ арады. Кезекті сө з басталатын символдың нө мірі start айнымалыда сақ талады. Программа тыныс белгілерін жә не сө здерді бос орыннан басқ а символдар арқ ылы ажыратуғ а болатындық ты ескермейді. Жолдағ ы бос орындардың санын есептеу. Бұ л мысал жолмен жұ мыс жасауды символдар массивімен жұ мыс жасау ретінде жү зеге асырады: var s: string; k, i: integer; begin writeln ('text? '); readln (s); k: =0; for i: =1 to length (s) do if s[i]=' ' then k: =k+1; writeln ('k=', k); end. Лекция Пайдаланушының ішкі программалары (процедуралар) классификациясы. Ішкі программаларды рә сімдеу тә сілдері жә не оларды программа қ ұ рамында пайдалану. Процедуралар жә не функциялар. Процедуралар мен функциялар негізгі программалық блокқ а қ осымша блоктарды қ осуғ а мү мкіндік береді. Процедура немесе функцияның ә р сипаттауы тақ ырыпқ а ие одан кейін программалық блок ілеседі. Процедура процедураның операторы арқ ылы белсендіріледі. Функция функцияны шақ ыруды қ амтығ ан ө рнекті есептеу барысында белсендіріледі де функция қ айтаратын мә н сол ө рнекке қ ойылады. Паскальда ішкі программалардың екі тү рі: процедуралар жә не функциялар бар. Олардың арасындағ ы негізгі айырмашылық – функция мә нді қ айтарады жә не ө рнектің ішінде пайдаланылуы мү мкін, мысалы: 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;
|