Паскаль тілінде бағдарламалау II Бөлім Массивтер Массивтің максималь элементі Масситерді өңдеу Массивтерді іріктеу Массивтегі элементті іздеу Символдық жолдар Рекурсивті іріктеу Матрицалар Файлдар
Паскаль тілінде бағдарламалау II Бөлім Тақырып 1. Жиымдар
Жиымдар Массив – бұл бір атаумен белігілеп, біріктірілген біртекті реттелген элементер жиыны. Ерекшеліктері: барлық элементтерінің типі бірдей болады жиымның бір атауы болады жадыда барлық элементтері бірінен соң бірі реттеліп орналасады Мысалдар: сыныптағы оқушылар тізімі үйдегі пәтерлер қаладағы мектептер Бір жылдағы ауа-райының температурасы туралы мәлімет
A[2] 3 15 A Жиымдар 5 10 15 20 25 жиым 1 2 3 4 5 A[1] A[2] A[3] A[4] жиым элементінің НӨМЕРІ (ИНДЕКСІ) A жиым 3 1 2 3 4 5 15 5 10 15 20 25 A[1] A[2] Жиым элементінің МӘНІ A[3] A[4] A[5] Жиым элементінің НӨМЕРІ (ИНДЕКСІ): 2 A[2] Жиым элементінің МӘНІ : 10
Жиымды ұйымдастыру Неге ұйымдастырамыз? жиымның атын анықтау үшін жиымның типін анықтау үшін элементтерінің санын анықтау үшін жадыдан орын бөлу үшін Бүтін сандардың жиымы: Констант арқылы өлшемін көрсету: бастапқы индексі соңғы индексі Элементтер тип аты var A : array[ 1 .. 5 ] of integer ; var A: array[1.. ] of integer; const N=5; N
Жиымды ұйымдастыру Жиымның басқа типтері: Индекстердің басқа диапозоны: Индекстердің басқа типтері: var X, Y: array [1..10] of real; C: array [1..20] of char; var Q: array [0..9] of real; C: array [-5..13] of char; var A: array ['A'..'Z'] of real; B: array [False..True] of integer; ... A['C'] := 3.14259*A['B']; B[False] := B[False] + 1;
Не дұрыс емес? var a: array[10..1] of integer; [1..10] ... var a: array ['z'..'a'] of integer; ... A['B'] := 15; ['a'..'z'] A['b'] var a: array [0..9] of integer; ... A[10] := 'X';
? жиымдар неге write? Ұйымдастыру: Пернетақтадан енгізу: Элементермен орындалатын әрекеттер: Экранға шығару: const N = 5; var a: array[1..N] of integer; i: integer; a[1] = a[2] = a[3] = a[4] = a[5] = 5 12 34 56 13 for i:=1 to N do begin write('a[', i, ']='); read ( a[i] ); end; неге write? ? for i:=1 to N do a[i]:=a[i]*2; writeln(' A жиымы:'); for i:=1 to N do write(a[i]:4); A жиымы : 10 24 68 112 26
Тапсырмалар "4": Перентақта арқылы 5 элементтен тұратын элементерді енгізіп, жиымның барлық элементердің орташа арифметикалық мәнін табыңдар. Мысалы: бес сан енгізіңдер: 4 15 3 10 14 орташа арифметикалық мәні: 9.200 "5": Пернетақтадан 5 элемент енгізіп, жиымның ең кіші элементін табыңдар. бес сан енгізіңдер : 4 15 3 10 14 минимальный элемент 3 N-нің мәні өзгерген кезде программа өзгермеуі керек! !
Паскаль тілінде бағдарламалау II Бөлім 2 тақырып. Жиымның максималь элементі
? Максималь элемент Есеп: жиымның максималь элементін табу. Алгоритм: Есеп: жиымның максималь элементін табу. Алгоритм: код: {әзірше, максималь мән- бірінші элемент деп есептейік} for i:=2 to N do if a[i] > {максимальдан} then {a[i] жаңа максималь элементті есте сақта} неліктен цикл i=2-ден басталып тұр? ?
? Максималь элемент Қосымша: максималь элементтің нөмерін табу? max := a[1];{бірінші элемент – максималь деп есептейік} iMax := 1; for i:=2 to N do {қалғандарын тексерік} if a[i] > max then {жаңа максимальді таптық} begin max := a[i]; {a[i] есте сақта} iMax := i; {i есте сақтау} end; a[iMax] қысқаша қалай жазуға болады? ? iMax элемент номері арқылы әрқашан оның мәнін a[iMax]-ті табуға болады. Сондықтан max-ті a[iMax]-пен алмастырамыз да max айнымалысын алып тастаймыз.
[50,150) аралықтағы кез-келген сан Программа program qq; const N = 5; var a: array [1..N] of integer; i, iMax: integer; begin writeln(‘берілген жиым:'); for i:=1 to N do begin a[i] := random(100) + 50; write(a[i]:4); end; iMax := 1; {бірінші элемент– максималь деп есептейік} for i:=2 to N do { қалғандарын тексеру } if a[i] > a[iMax] then { жаңа максималь мән } iMax := i; { I еске сақтау } writeln; {жаңа жолға өту} writeln('Максималь элемент a[', iMax, ']=', a[iMax]); [50,150) аралықтағы кез-келген сан for i:=1 to N do begin a[i] := random(100) + 50; write(a[i]:4); end; Максимальді іздеу iMax := 1; {бірінші элемент – максималь деп есептейік} for i:=2 to N do { қалғандарын тексерйік } if a[i] > a[iMax] then { жаңа максималь мәні } iMax := i; {i-ді еске сақтау }
Тапсырма "4": [-10..10] аралықтағы сандармен 10 элементтен тұратын жиымды толтыру және оның максималь және минималь элементтерін және нөмерін табыңдар. Мысалы: Берілген жиым: 4 -5 3 10 -4 -6 8 -10 1 0 максималь мәні a[4]=10 минималь мәні a[8]=-10 "5": [-10..10] аралықтағы сандармен 10 элементтен тұратын жиымды толтыру және оның екі максималь мәні және нөмерлерін табыңдар. максималь мәндер a[4]=10, a[7]=8
Паскаль тілінде бағдарламалау II Бөлім 3 тақырып. Жиымды іріктеу
N+1-индекстер қосындысы жиым реверс Есеп: жиымның элементерін кері ретпен орналастыру керек. Алгоритм: Орындарын ауыстыру A[1] и A[N], A[2] и A[N-1], … код: 1 2 … N-1 N 1 2 … N-1 N 3 5 … 9 7 7 9 … 5 3 N+1-индекстер қосындысы for i:=1 to N do { орындарын ауыстыру A[i] и A[N+1-i] } N div 2 do қандай қателік? ?
? Элементердің орнын қалай ауыстырады? x y 6 4 4 6 4 ? c Элементердің орнын қалай ауыстырады? 2 Есеп: екі кесе ішіндегілерінің орнын ауыстыру 1 3 Есеп: жадының екі ұяшығының ішіндегілердің орнын ауыстыру керек. x y 6 4 2 4 6 c := x; x := y; y := c; x := y; y := x; 3 1 c-ны алып тастауға бола ма? ? 4 ? c
Программа program qq; const N = 10; var A: array[1..N] of integer; i, c: integer; begin { жиымды толтыру } { берілген жиымды енгізу } { жаңа жиымды шығару } end; for i:=1 to N div 2 do begin c:=A[i]; A[i]:=A[N+1-i]; A[N+1-i]:=c; end;
Тапсырма "4": 10 элементтен тұратын массивті [-10..10] аралықтағы кездейсоқ сандармен толтырып және массивтің 1-ші және 2-ші жартысына бөлек-бөлек инверсиялаңдар. Мысал: Берілген массив: 4 -5 3 10 -4 -6 8 -10 1 0 Нәтиже: -4 10 3 -5 4 0 1 -10 8 -6 "5": 12 элементен тұратын массивті [-10..10] аралықтағы кездейсоқ сандармен толтырып және массивтің әр бір үшінші бөлігін жартысына инверсиялаңдар. Мысалы: Берілген массив : 4 -5 3 10 -4 -6 8 -10 1 0 5 7 Нәтиже : 10 3 -5 4 -10 8 -6 -4 7 5 0 1
Циклдік ығысу Есеп: Массивтің бірінші элементі соңғы элементтің орнына ауысатындай,элементтерді оңға қарай 1 ұяшыққа ығыстыру керек. Алгоритм: A[1]:=A[2]; A[2]:=A[3];… A[N-1]:=A[N]; Цикл: 1 2 3 4 … N-1 N 3 5 8 1 … 9 7 5 8 1 … 9 7 3 Неге N емес? for i:=1 to N-1 do A[i]:=A[i+1]; Не дұрыс емес? ?
Программа program qq; const N = 10; var A: array[1..N] of integer; i, c: integer; begin { массивті толтыру } {берілген массивті шығару } {жаңа массивті шығару } end; c := A[1]; for i:=1 to N-1 do A[i]:=A[i+1]; A[N] := c;
Тапсырмалар "4": 10 элементтен тұратын массивті [-10..10] аралықтағы кездейсоқ сандармен толтырып және оңға қарай циклдік ығысуды орындаңдар. Мысал: Берілген массив: 4 -5 3 10 -4 -6 8 -10 1 0 Нәтиже: 0 4 -5 3 10 -4 -6 8 -10 1 "5": 12 элементтен тұратын массивті [-12..12] аралықтағы кездейсоқ сандармен толтырып және 4 элементке оңға қарай циклдік ығысуды орындаңдар. 4 -5 3 10 -4 -6 8 -10 1 0 5 7 -4 -6 8 -10 1 0 5 7 4 -5 3 10
Паскаль тілінде бағдарламалау II Бөлім 4 Тақырып. Массивті іріктеу
Іріктеу Іріктеу – бұл массив элементтерін берілген рет бойынша орналастыру. (өсуі бойынша, кемуі бойынша, соңғы цифрі бойынша, еселіктерінің қосындысы бойынша, …). Есеп: Массивтің элементтерін өсу реті бойынша орналастыру. Алгоритмдер: Қарапайым және түсінікті, бірақ үлкен масситер үшін эффективті емес. Көпіршікті әдіс Таңдау әдісі Күрделі, бірақ эффективті «шапшаң іріктеу" (Quick Sort) «үйме» іріктеу (Heap Sort) сортировка слиянием пирамидалық іріктеу қиындық O(N2) қиындық O(N·logN) уақыт N O(N2) O(N·logN)
Көпіршікті әдіс Идея –ауа көпіршігі стакандағы судың түбінен жоғары көтеріледі. Массив үшін – ең кішкентай («жеңіл") элементі жоғары қарай жылжиды («қалқып шығады."). . 1-ші жүріс Төменгі жағындағы екі көршілес элементтерді салыстырамыз; егер дұрыс тұрмаса онда олардың орындарын ауыстырамыз. 1 жүріс бойынша бір (ең кішкетай) 5 2 1 3 5 2 1 3 5 1 2 3 1 5 2 3 2-ші жүріс жүріс 1 5 2 3 1 5 2 3 1 2 5 3 1 2 5 3 1 2 3 5 N элементтен тұратын массив үшін N-1 жүріс қажет (N-1 элементті өз орнына орналастырса болғаны).
! Программа A[1] өз орнында! i 1-ші жүріс: A[j] и A[j+1] 1 2-ші жүріс Жұптар салыстырылады A[N-1] и A[N], A[N-2] и A[N-1] … A[1] и A[2] A[j] и A[j+1] 1 2 … N-1 N 5 2 … 6 3 for j:=N-1 downto 1 do if A[j] > A[j+1] then begin c:=A[j]; A[j]:=A[j+1]; A[j+1]:=c; end; 1 2-ші жүріс A[1] өз орнында! ! 1 2 … N-1 N 1 5 … 3 6 for j:=N-1 downto 2 do if A[j] > A[j+1] then begin c:=A[j]; A[j]:=A[j+1]; A[j+1]:=c; end; 2 I-ші жүріс for j:=N-1 downto i do ... i
A[i] –ден жоғары элемент Программа program qq; const N = 10; var A: array[1..N] of integer; i, j, c: integer; begin {массивті толтыру } {берілген массивті шығару } {жаңа массивті шығару } end; Неліктен цикл i –ден N-1 дейін? ? A[i] –ден жоғары элемент for i:=1 to N-1 do begin for j:=N-1 downto i do if A[j] > A[j+1] then begin с := A[j]; A[j] := A[j+1]; A[j+1] := с; end; i
? Жалаушалы көпіршік әдісі Қалай жақсарту? Идея – егер көпіршікті әдісте орын ауыстыру болмаса, онда массив іріктелген және басқа жолдар керек емес. Іске асыру: орын ауыстыру туралы көрсетіп тұратын жалауша-айнымалы. 2 1 4 3 1 2 3 4 var flag: boolean; repeat flag := False; { жалаушаны қосу } for j:=N-1 downto 1 do if A[j] > A[j+1] then begin с := A[j]; A[j] := A[j+1]; A[j+1] := с; flag := True; { жалаушыны көтеру } end; until not flag; {flag=Falseб-да шығу } flag := False; Қалай жақсарту? ? flag := True; not flag;
Жалаушалы көпіршік әдісі i := 0; repeat i := i + 1; flag := False; {жалаушаны тастау} for j:=N-1 downto 1 do if A[j] > A[j+1] then begin с := A[j]; A[j] := A[j+1]; A[j+1] := с; flag := True; { жалаушаны көтеру } end; until not flag; {flag=False б-да шығу} i := 0; i := i + 1; i
Таңдау әдісі Идея: Ең кіші элементті тауып, бірінші орынға орналастыру. (A[1] элементпен орын ауыстыру) қалғандарынан ең кіші элементті тауып, екінші орынға орналастыру (A[2]) элементпен орын ауыстыру, т.с.с. 4 3 1 2 1 3 4 2 1 2 4 3 1 2 4 3
? Таңдау әдісі If-ті алып тастауға бола ма? for i := 1 to N-1 do begin nMin = i ; for j:= i+1 to N do if A[j] < A[nMin] then nMin:=j; if nMin <> i then begin c:=A[i]; A[i]:=A[nMin]; A[nMin]:=c; end; N-1 A[i] -ден A[N]-дейін минимальді іздеу i i+1 N Қажет болса, ауыстырамыз If-ті алып тастауға бола ма? ?
Тапсырмалар "4": 10 элементтен тұратын массивті [-10..10] аралықтағы кездейсоқ сандармен толтырып және соңғы цифрлары бойынша іріктеу. Мысал: Берілген массив: 14 25 13 30 76 58 32 11 41 97 Нәтиже: 30 11 41 32 13 14 25 76 97 58 "5": 10 элементтен тұратын массивті [0..100] аралықтағы кездейсоқ сандармен толтырып және бірінші жартысын өсуі бойынша келесі жартысын кемуі бойынша іріктеу. 13 14 25 30 76 97 58 41 32 11
Паскаль тілінде бағдарламалау II Бөлім 5тақырып. Массивтегі іздеу
Массив элементін іздеу Тапсырма –массивте х –ке тең элемент бар немесе жоқтығын анықтау. Шешуі: массив үшін: сызықтық іздеу (іріктеу) кемшілігі: жылдамдығы төмен Қалай тездетуге болады? – алдын-ала іздейтін массивті әзірлеу Қалай әзірлейміз? «әзірленген массивті" қалай пайдаланамыз?
nX – қажетті элемент нөмірі Сызықтық іздеу nX – қажетті элемент нөмірі nX := 0; { әзірше табылған жоқ ...} if nX < 1 then writeln(‘табылған жоқ...') else writeln('A[', nX, ']=', X); for i:=1 to N do { цикл} if A[i] = X then { егер табылса, онда ... } nX := i; { ... Номерді еске сақтау} Жақсарту: X-ті тапқан соң, циклден шығамыз. Қандай қиындық? ? nX := 0; for i:=1 to N do if A[i] = X then begin nX := i; break; {циклден шығу} end; nX := 0; i := 1; while i <= N do begin if A[i] = X then begin nX := i; i := N; end; i := i + 1; i := N; break;
Екілік іздеу X = 7 A[c] орташа элементін тауып және X-пен салыстыру. 4 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 4 X > 4 X > 6 6 X < 8 8 A[c] орташа элементін тауып және X-пен салыстыру. Егер X = A[c], табылды (шығу). Егер X < A[c], келесі жартысынан іздеу. Егер X > A[c], екінші жартысынан табу.
орташа элементтің номері Екілік іздеу 1 L c R N nX := 0; L := 1; R := N; {шекара: A[1]-ден A[N] дейін } if nX < 1 then writeln(‘табылған жоқ...') else writeln('A[', nX, ']=', X); while R >= L do begin c := (R + L) div 2; if x < A[c] then R := c - 1; if x > A[c] then L := c + 1; end; орташа элементтің номері if X = A[c] then begin nX := c; R := L - 1; { break; } end; табылды Цикл аяқталды Шекараны жылжытамыз while R > L do begin … end; неге қолдануға болмайды ? ?
Іздеу әдістерін салыстыру Сызықтық Екілік Әзірлік жоқ іріктеу Қадамдар саны N = 2 2 N = 16 16 5 N = 1024 1024 11 N= 1048576 1048576 21 N ≤ N ≤ log2N+1
Тапсырма "4": X-ке тең элементтерді табатын программа құру керек. (бұл сан пернетақтадан енгізілуі керек). Екілік санды іздеу. "5": [0,100] аралығында 32 элементтен тұратын массивтен екілік іздеудегі қадамның орташа мәнін есептейтін программа құрыңдар. Іздеу үшін осы аралықтағы 1000 кездейсоқ сандарды пайдалану керек.
Паскаль тілінде бағдарламалау II Бөлім 6 тақырып. Символдық жолдар
Әрбір символ – бөлек нысан; Сипаттау бөлімінде көрсетілген Символдық массивпен жұмыстың қиындығы қандай? Символдық массив: var B: array[1..N] of char; Әрбір символ – бөлек нысан; Сипаттау бөлімінде көрсетілген массивтің ұзындығы N—ға тең Не қажет: Символдар тізбегін біртұтас түрде қарастырылуы Жолдың ұзындығы айнымалы болуы
! Символьдық жолдар 6 П р и в е т ! ¤ … Жолдың ұзындығы: Delphi ограничение снято! ! var s: string; Жол ұзындығы s[3] s[4] 1 255 6 П р и в е т ! ¤ … Жұмыс аймағы s[1] s[2] 1 20 var s: string[20]; Жолдың ұзындығы: var i: integer; n := length ( s );
Символдық жолдар Есеп: Символдық жолды пернетақтадан енгізіп, барлық "а" әріпін "б" әріпіне алмастыру керек. program qq; var s: string; i: integer; begin writeln(‘жолды енгізіңдер'); readln(s); for i:=1 to Length(s) do if s[i] = 'а' then s[i] := 'б'; writeln(s); end. Жолды енгізу Жолдың ұзындығы readln(s); Length(s) writeln(s); Жолды шығару
Тапсырма "4": Символдық жолды енгізіп, барлық "а" әріпін "б" әріпіне және кересінше алмастыру керек. Мысал: Жолды енгізіңіз: ааббссААББСС Нәтиже: ббаассББААСС "5": Символдық жолды енгізіп, оның палиндромды екенін анықтаңдар. Мысал: Мысал: Жолды енгізіңіз: Жолды енгізіңіз: АБВГДЕ ҚАЗАҚ Нәтиже: Нәтиже: палиндром емес. Палиндром.
Жолдармен орындалатын әрекеттер var s, s1, s2: string; Жаңа мәндерді жазу: s := 'Вася'; Біріктіру: Бір жолды келесі жолдық соңына біріктіру. s1 := ‘Сәлем'; s2 := ‘Марат'; s := s1 + ', ' + s2 + '!'; ‘Сәлем, Марат!' Қиып алу: Бір жолда басқа жолды қиып алу 3 ші символдан s := '123456789'; s1 := Copy ( s, 3, 6 ); s2 := Copy ( s1, 2, 3 ); 6 дана '345678' '456'
Өшіру және енгізу Жолдың бір бөлігін өшіріп тастау: s := '123456789'; 6 дана s := '123456789'; Delete ( s, 3, 6 ); '123456789' '129' Жол өзгереді! 3-ші символдан Жолды енгізу: 3-ші символдан бастап s := '123456789'; Insert ( 'ABC', s, 3 ); Insert ( 'Q', s, 5 ); '12ABC3456789' Нені қоямыз? Қайда қоямыз '12ABQC3456789'
Жол бөлігін іздеу Жол ішінен іздеу: Ерекшелігі: s[3] var n: integer; s := ‘мектеп-гимназиясы'; n := Pos ( ‘к', s ); if n > 0 then writeln('Буква к – это s[', n, ']') else writeln(‘табылмады'); n := Pos ( ‘мектеп', s ); s1 := Copy ( s, n, 6 ); 3 n = 1 Ерекшелігі: функция возвращает номер символа, с которого начинается образец в строке если слова нет, возвращается 0 поиск с начала (находится первое слово)
Мысалдар 6 ‘Алуа Мырза' ‘Алуа Ұлан Мырза' 15 ‘Алуа' ‘Мырза' ‘Ақан' s := ‘Алуа Ақан Мырза'; n := Pos ( ‘Ақан', s ); Delete ( s, n, 4 ); Insert ( ‘Ұлан', s, n ); 6 ‘Алуа Мырза' ‘Алуа Ұлан Мырза' s := 'Алуа Ақан Мырза'; n := length ( s ); s1 := Copy ( s, 1, 4 ); s2 := Copy ( s, 11, 5 ); s3 := Copy ( s, 6, 4 ); s := s3 + s1 + s2; 15 ‘Алуа' ‘Мырза' ‘Ақан' ' АлуаАқанМырза ' 13
Есептерді шешу мысалдары Есеп: Атын, әкесінің атын және фамилиясын енгізу. «фамилия-инициалы» форматына түрлендіру. Мысал: Атынды, әкеңнің атын және фамилияңды енгіз: Алуа Данияровна Қуанова Нәтиже: Қуанова А.Д. Алгоритм: Бірінші бос орынды тауып, атын бөліп алу Негізгі жолдан атты бос орынмен бірге өшіру Бірінші бос орынды тауып алып әкесінің атын бөліп алу Әкесінің атын өшіріп тастау Фамилияны бірінші әріптермен біріктіру…
Программа program qq; var s, name, otch: string; n: integer; begin writeln('Введите имя, отчество и фамилию'); readln(s); n := Pos(' ', s); name := Copy(s, 1, n-1); { атты ерекшелеу } Delete(s, 1, n); otch := Copy(s, 1, n-1); {әкесінің атын қиып алу} Delete(s, 1, n); {фамилия қалады } s := s + ' ' + name[1] + '.' + otch[1] + '.'; writeln(s); end.
Тапсырма "4": Файлдың атын енгізу (кеңейтілімін жазбауға болады) және кеңейтілімін ".exe“ деп өзгерту. Мысал: Файл атын енгізіңіз: Файлдфң атын енгізіңіз: qqq qqq.com Нәтиже: Нәтиже: qqq.exe qqq.exe "5": Файлға бару жолын енгізу және әр бір қапшықты жаңа жолдан бастап ашып көресету Пример: Файлға бару жолын енгізіңіз: C:\Мои документы\1-Б\Акан\qq.exe Нәтиже: C: Мои документы 1-Б Акан qq.exe
Паскаль тілінде бағдарламалау II Бөлім Тақырып 7. Рекурсивті іріктеу
Әр ұяшықта 4 әріптің кез-келгені болуы мүмкін Рекурсивті іріктеу Есеп: «Тумба-юмба« тілінің алфавиті Ы, Ц, Щ және О. К әріптен тұратын барлық сөздерді экранға шығарып, олардың санын табыңыз. K саны пернетақтадан енгізіледі. Әр ұяшықта 4 әріптің кез-келгені болуы мүмкін 1 K 4 нұсқа 4 нұсқа 4 нұсқа 4 нұсқа Нұсқалар саны:
Рекурсивті іріктеу Ы Ц Щ О Рекурсия: К Рәріптен тұратын сөздер үшін K-1 әріптен тұратын 4 мақсатты шешу. Барлық нұсқаларды 1 K Ы Барлық нұсқаларды 1 K Ц Барлық нұсқаларды 1 K Щ Барлық нұсқаларды 1 K О
? Процедура ● ? s Егер әріптер көп болса? Глобальды айнымалылар : 1 p p+1 K ● ? s Глобальды айнымалылар : var s: string; count, K: integer; procedure Rec(p: integer); begin if p > K then begin writeln(s); count := count+1; end else begin s[p]:='Ы'; Rec ( p+1 ); s[p]:='Ц'; Rec ( p+1 ); s[p]:='Щ'; Rec ( p+1 ); s[p]:='О'; Rec ( p+1 ); end; Рекурсия соңы рекурсивті шақыртулар Егер әріптер көп болса? ?
Барлық әріптер бойынша цикл Процедура procedure Rec(p: integer); const letters = 'ЫЦЩО'; var i: integer; begin if p > k then begin writeln(s); count := count+1; end else begin for i:=1 to length(letters) do begin s[p] := letters[i]; Rec(p+1); end; Барлық әріптер const letters = 'ЫЦЩО'; Локальді айнымалы Барлық әріптер бойынша цикл for i:=1 to length(letters) do begin s[p] := letters[i]; Rec(p+1); end;
Программа program qq; var s: string; Глобальді айнымалылар K, i, count: integer; begin writeln(‘сөздің ұзындығын енгіз:'); read ( K ); s := ''; for i:=1 to K do s := s + ' '; count := 0; Rec ( 1 ); writeln(‘Барлығы ', count, ‘сөз'); end. Глобальді айнымалылар процедура procedure Rec(p: integer); ... end; K пробелден тұратын жол s := ''; for i:=1 to K do s := s + ' ';
Тапсырма «Тумба-юмба» тілінің алфавиті Ы, Ц, Щ и О әріптерінен тұрады. K саны пернетақтадан енгізіледі. "4": К әріптен тұратын Ы әріпі 1 реттен артық кездеспейтін барлық сөздерді экранға шығарып, және олардың санын санау қажет. "5": Қатар тұрған бірдей әріптері бар К әріптен тұратын барлық сөздерді экранға шығарып, (мысал, ЫЩЩО) және олардың санын санау керек.
Паскаль тілінде бағдарламалау II Бөлім Тақырып 8. Матрицалар
Матрицалар Есеп: Шахмат тақтасындағы фигуралардың орнын естеріңе сақтаңдар. 1 2 3 4 5 6 a b c d e f g h 1 2 3 4 5 6 7 8 8 7 6 5 4 3 2 1 8 7 6 5 4 3 2 1 2 3 4 A[6,3] c6
Матрицалар Матрица – бұл, тікбұрышты сандар кестесі. Матрица – бұл әрбір элементі екі индекстен тұратын массив. (жол нөмірі және баған номері). баған 3 A 1 2 3 4 5 1 2 3 1 4 7 3 6 2 -5 15 10 8 9 11 12 20 7 11 баған 2 2 -5 15 10 12 ұяшық A[3,4]
? Матрицалар Сипаттау: Пернетақтадан енгізу: i j A[1,1]= 25 A[1,2]= 14 const N = 3; M = 4; var A: array[1..N,1..M] of integer; B: array[-3..0,-8..M] of integer; Q: array['a'..'d',False..True] of real; Циклдерді орынын ауыстырсақ? ? Пернетақтадан енгізу: i j for j:=1 to M do for i:=1 to N do begin for i:=1 to N do for j:=1 to M do begin write('A[',i,',',j,']='); read ( A[i,j] ); end; A[1,1]= 25 A[1,2]= 14 A[1,3]= 14 ... A[3,4]= 54
? ? Матрицалар Кездейсоқ сандармен толтыру Экранға шығару 12 25 1 13 Жол бойынша цикл қашықтық қандай? ? for i:=1 to N do for j:=1 to M do A[i,j] := random(25) - 10; Баған бойынша цикл Экранға шығару Жолды шығару for i:=1 to N do begin writeln; end; 12 25 1 13 156 447 456 222 23 for j:=1 to M do write ( A[i,j]:5 ); Сол жолда Жаңа жолға өту Циклдерді ауыстырса? ?
Матрицаның элементтерін өңдеу Есеп: 3 жолдан және 4 баған тұратын матрица кездейсоқ сандармен толтырып, экранға шығару керек. Матрица элементтерінің қосындысын табыңыз. program qq; const N = 3; M = 4; var A: array[1..N,1..M] of integer; i, j, S: integer; begin {матрицаны толтырып,экранға шығару} S := 0; writeln(‘элементтердің қосындысы ', S); end; for i:=1 to N do for j:=1 to M do S := S + A[i,j];
Тапсырма [-10,10] аралықтағы кез-келген сандармен 8 жолдан және 5 бағаннан тұратын матрицаны толтырып экранға шығару керек. "4": Матрицаның минималь және максималь элементтерін және олардың нөмірлерін табу керек. Шығару пішіні: Минималь элемент A[3,4]=-6 Максималь элемент A[2,2]=10 "5": Элементтерінің қосындысы максималь болатын жолды экранға шығару керек. Жол 2: 3 5 8 9 8
жол мен баған нөмірінің қосындысы N+1 Матрицамен орындалатын әрекеттер Есеп 1. N жол және N бағаннан тұратын квадрат матрицаның бас диагоналін басып шығару керек. A[1,1] A[2,2] for i:=1 to N do write ( A[i,i]:5 ); A[3,3] A[N,N] Есеп 2. Екінші диагоналді экранға шығару. жол мен баған нөмірінің қосындысы N+1 A[1,N] A[2,N-1] for i:=1 to N do write ( A[i, ]:5 ); N+1-i A[N-1,2] A[N,1]
I жолдың қажет элементерін қосу Матрицалармен орындалатын әрекеттер Есеп 3. Бас диагоналда орналасқан элементтердің қосындысы Бір цикл ме әлде кіріктірілген бе? ? жол 1: A[1,1] жол 2: A[2,1]+A[2,2] ... жол N: A[N,1]+A[N,2]+...+A[N,N] жол бойынша цикл S := 0; for i:= 1 to N do I жолдың қажет элементерін қосу for j:= 1 to i do S := S + A[i,j];
Матрицамен орындалатын әрекеттер Есеп 4. Жолдың немесе бағандардың орнын ауыстыру. N жол мен M баған тұратын матрицаның 2-ші және 4-ші жолдарын ауыстыру. j A[2,j] for j:=1 to M do begin c := A[2,j]; A[2,j] := A[4,j]; A[4,j] := c; end; 1 2 5 7 3 2 4 A[4,j] Есеп 5. 3-ші бағанға алтыншыны қосу. for i:=1 to N do A[i,3] := A[i,3] + A[i,6];
Тапсырма 7 жол және 7 баған тұратын матрицаны [-10,10] аралығындағы кездейсоқ сандармен толтырып, экранға шығару. Жаслы түспен ерекшеленген аймақтағы элементерді нөлге айналдырып экранға шығару. "4": "5":
Паскаль тілінде бағдарламалау II Бөлім Тақырып 9. Файлдар
Файлдар Файлдар Мәтіндік Екілік Қапшықтар (каталог) Файл – дискідегі аты бар аймақ. Файлдар Мәтіндік Екілік Қапшықтар (каталог) Безенділімеген мәтін, басқару символдары жоқ (кодтары < 32) символы кодтық кестенің кез-келген символы *.doc, *.exe, *.bmp, *.jpg, *.wav, *.mp3, *.avi, *.mpg ACSII (1символ=1 байт) UNICODE (1символ =2 байт) *.txt, *.log, *.htm, *.html
Айнымалы типі «мәтіндік файл": var f: text; Сэндвичтің принципі Айнымалы типі «мәтіндік файл": var f: text; I этап. Файл ашу : f айнымалыны файлмен байланыстыру Файлды ашу (оны белсенді жасап жұмысқа әзірлеу) assign(f, 'qq.dat'); reset(f); {оқу үшін} rewrite(f); {жазу үшін} II этап: файлдармен жұмыс read ( f, n ); {n-ді енгізу } write ( f, n ); {n-нің мәнін жазу } writeln ( f, n );{жаңа жолға шығу } III этап: файлды жабу close(f);
Файлдармен жұмыс Ерекшеліктері: файл аты assign командасында ғана айтылады, файлды шақыру файлдық айнымалы арқылы жүреді оқығанда ашылатын файл бар болуы керек жазу үшін ашылатын файл бар болса, ескі мазмұны өшіріледі мәліметтер файлға мәтін түрін жазылады программа аяқталғанда барлық файлдар авторматты түрде жабылады. файл жабылған соң f айнымасын басқа файлмен жұмыс істеу үшін пайдалануға болады.
Тізбектелген Файл ашылғанда меңзер файл басында орналасады меңзер тұрған жерден бастап оқылады оқыған соң меңзер келесі оқылмаған символға қарай қозғалады. assign ( f, 'qq.dat' ); reset ( f ); Файл соңы (end of file, EOF) 12 5 45 67 56● read ( f, x ); 12 5 45 67 56●
Тізбектелген 12 5 45¤ 36 67¤ 56● Жол соңына дейін оқу Қалай кері қайтуға болады? readln ( f, x ); конец строки (end of line, EOL) 12 5 45¤ 36 67¤ 56● close ( f ); reset ( f ); { басынан бастау }
цикл с условием "пока есть данные" Мысал Есеп: input.txt файлында сандар (бағанға) жазылған, нешеу екені белгісіз. output.txt файлына олардың қосындысын жазу керек. Алгоритм: Файлды ашу input.txt оқу үшін. S := 0; Егер сан қалмаса, 7 қадамға көшу. Келесі x айнымалыны оқу. S := S + x; 3 қадамға көшу. input.txt файлын жабу. Жазу үшін output.txt файлын ашу. S-тің мәнін файлға жазу. output.txt файлды жабу. Можно ли обойтись без массива? ? цикл с условием "пока есть данные"
Программа егер файлдың соңы болса логикалық функция, True болады, program qq; var s, x: integer; f: text; begin assign(f, 'input.txt'); reset(f); s := 0; close(f); end. f: text; егер файлдың соңы болса логикалық функция, True болады, while not eof(f) do begin readln(f, x); s := s + x; end; eof(f) output.txt файлына нәтижені жазу assign(f, 'output.txt'); rewrite(f); writeln(f, 'Сумма чисел ', s); close(f);
Тапсырма input.txt файлында сандар жазылған, нешеу екені белгісіз. "4": output.txt файлына барлық сандардың орташа арифметикалық мәндерін жазу керек. "5": output.txt файлына максималь және минималь сандарды тауып жазыңдар.
? Массивтерді өңдеу Можно ли обойтись без массива? Есеп: input.txt файлында сандар жазылған (бағандап), саны – белгісіз, бірақ 100-ден артық емес. Өсуі бойынша output.txt. файлында жазу керек Қиындықтар: Іреіктеу үшін барлық сандарды жадыда массив түрінде ұстау керек; Қанша сан екені белгісіз. Шешімі: 100 элементі бар массивке жадыдан орын әзірлейміз; Оқылған сандарды массив түрінде жазып және олардың санын N айнымалысы арқылы санаймыз; массивтің алғашқы N элементін сорттаймыз; файлға жазамыз. Можно ли обойтись без массива? ?
Егер файл соңына жеткенсек немесе100 сан оқылса, цикл аяқталады Массивтен берілгендерді оқу Ауқымды айнымалылар: var A: array[1..100] of integer; f: text; Функция: массивті енгізу, элементтер санын шақырады function ReadArray: integer; var i: integer; begin assign(f, 'input.txt'); reset(f); i := 0; close(f); ReadArray := i; end; Егер файл соңына жеткенсек немесе100 сан оқылса, цикл аяқталады while (not eof(f)) and (i < 100) do begin i := i + 1; readln(f, A[i]); end; ReadArray := i;
сортталған массивмассивті файлға жазып шығару Программа program qq; var A: array[1..100] of integer; f: text; N: integer; Begin N := ReadArray; { сортировка первых N элементов } end. function ReadArray: integer; ... end; assign(f, 'output.dat'); rewrite(f); for i:=1 to N do writeln(f, A[i]); close(f); сортталған массивмассивті файлға жазып шығару
Тапсырма input.txt файлында сандар жазылған (бағанға),, саны 100 артық емес екені белгілі. "4": Кемуі бойынша массивті іріктеп және оны output.txt. файлына жазу керек "5": Массивті цифрларының қосындысының өсуі бойынша сорттап және оны output.txt. файлына жазу керек
Мәтіндік мәліметтерді өңдеу Есеп: input.txt файлында жолдар жазылған, олардың арасында «қысқаша» деген қыстырма-сөз бар. Мәтінді тазартып output.txt. файлына жазу керек. input.txt файлы : қысқасы, кеше, қысқасы, мамам, қысқасы, үй, қысқасы тазалады. Шеше қысқасы кеше қысқасы неше қысқасы кесе қысқасы сынды Роза қысқасы тікенді қысқасы гүл. Нәтиже - output.txt файлында : Кеше мамам үй тазалады. Шеше кеше неше кесе сынды Роза тікенді гүл.
мәліметтер аяқталған жоқ Мәтіндік мәліметтерді өңдеу мәліметтер аяқталған жоқ Алгоритм: файлдан (readln) жолды оқу. ", қысқасы," деген сөзді алып таста (Pos, Delete). 1-ші қадамға өту. s жолын өңдеу : Ерекшелігі: Бір уақытта екі файлдыда ашық қою. (оқу режимінде, екінші – жазу режимінде). ", қысқасы,» іздеу repeat i := Pos(', короче,', s); if i <> 0 then Delete(s, i, 9); until i = 0; 9 символды өшіру
Бір уақытта екі файлмен жұмыс істеу program qq; var s: string; i: integer; fIn, fOut: text; begin assign(fIn, 'input.txt'); reset(fIn); assign(fOut, 'output.txt'); rewrite(fOut); {файлды өңдеу } close(fIn); close(fOut); end. Файлдық айнымалылар fIn, fOut: text; оқу файлын ашу жазу файлын ашу
Әзірше файлдың соңы емес Файлды өңдеудің толық циклі Әзірше файлдың соңы емес while not eof(fIn) do begin readln(fIn, s); writeln(fOut, s); end; Жолды өңдеу repeat i := Pos(', короче,', s); if i <> 0 then Delete(s, i, 9); until i = 0; «тазарған" жолды жазу
Тапсырма input.txt файлында жолдар жазылған, саны– белгісіз. "4": «қысқасы" сөзін «жалпы» сөздеріне ауыстырып, және output.txt. файлына жазу керек. "5": output.txt файлына 5 сөз артық жолдарды шығару (сөздер бір бос орынмен бөлінген).
Конец фильма