Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
paskal.pdf
Скачиваний:
89
Добавлен:
17.02.2016
Размер:
544.21 Кб
Скачать

12.Тақ элементтердің санын есептеу.

13.Теріс элементтердің санын есептеу.

14.Берілген А санынан массивтің неше элементі, модулі бойынша үлкен?

15.3-ке және 5-ке еселі барлық элементтерін табу. Олар

нешеу?

16.Берілген массивте көршілес екі оң элементтер бар ма? Бірінші (соңғы) жұп элементтердің нөмірлерін табу.

17.Берілген санға тең элемент бар ма? Егер бар болса, онда біреуінің нөмірін шығару.

18.Бес бүтін сандар арасынан жұп сандардың санын табу (массивті пайдаланбай).

19.Модулі бойынша ең үлкен элементтің таңбасын ауыстыру.

20.Барлық жұп элементтерді өзінің квадраттарымен ауыстыру, ал тақ мүшелерді екі еселеу.

21.Оң мүшелерден, k1 нөмірлі элементті алу, ал теріс элементтерге, k2 нөмірлі элементті қосу, нөлге тең элементтерді өзгеріссіз қалтыру.

22.Екі массив берілген. Әр массивтің элементтерінің арифметикалық орташасын табу және оларды салыстыру.

23.Матрицаның әр жолындағы теріс элементтерінің санын

есептеу.

24.Матрицаның ең үлкен элементін және оның нөмірін табу.

25.Екі А және В квадрат матрицаларының көбейтіндісін

есептеу.

Символдық массивтер

Мүшелері символдық (Char) типтен тұратын бір өлшемді массивтерді символдық массив немесе символдық жол дейді. Жазылу үлгісіне мысалдар:

VAR

S: array[1..13] of char; S2:=’жол мысалы’;

Паскаль тілінде символдық массивтермен жұмыс жасайтын қосымша мүмкіндіктер бар.

Конкатенация амалы

Символдық жолдарды бір-біріне тіркестіру, басқаша айтқанда қосу амалы -деп аталады. Қосу таңбасы (+) амалдың белгісі болады.

Мысалы, төмендегідей сипаттама бөлімі бар болсын: Var

S1: array[1..5] of char; S2: array[1..6] of char;

79

онда келесі амалдар орынды болады: S1:=’жолды’;

S2:=’массив’; Wrіteln(S1+’ ‘+S2);

Сонда, осы программа үзіндісінің орындалу нәтижесінде экранға “жолды массив” деген хабарлама шығады:

Ескертулер:

1.Жолды меншіктеу кезінде,жол ұзұндығы мен массив өлшемі бірдей болу керек.

2.Символдық массивтер үшін, меншіктеу операторының оң жағында конкатенация амалын орындауға болмайды.

Егер S:=S1+’ ‘+S2 -деп жазылған болса,S символдық массивтің өлшеміне қарамай, программаны компиляциялау кезінде қате шығады.Мұндай жағдайда ұзындығы айнымалы болатын жолдарды қолдану керек.

Іріктеу алгоритмдері

Іріктеу – белгіленген ережелерге сәйкес, жиынның элементтерін топтарға бөлу, өспелі немесе кему реттерімен орналастыру.

«Қалқу» әдісімен іріктеу Есеп: Элементтерінің саны онға тең, бүтін типті бір өлшемді

массив берілген.

«Қалқу» әдісін қолданып өспелі түрде іріктеу программасын құру керек. Массив [0,100] аралығынан кездейсоқ сандармен толтырылады.

Шешімі: бұл әдістің идеясын оның аты аңғартады. Ең «жеңіл» элементтер жоғары «қалқиды», ал ең «ауыр» элементтер – «батады».

Массивтің элементтерін басынан аяғына қарай қарап, егер қатар тұрған көрші элементтердің оң жағындағысы, сол жақтағысынан кіші болса, онда олардың орнын ауыстырамыз.

Қалған N-1 іріктелмеген элементтер үшін осы операцияны

қайталаймыз.

 

Program Buble;

{экранның модулін қосу}

Uses crt;

const lens=10;

{массивтің элементтер саны}

diap=100;

{мәндер диапазоны}

Var

{А бүтін типті массиві}

A : array[1..lens] of integer;

mit : integer;

{ауыстыруға арналған айнымалы}

i, j : integer;

{циклдік айнымалылар}

80

begin

 

{экранды тазалау}

clrscr;

 

randomize;

{кездейсоқ сандарды инициализациялау}

for i:=1 to lens do

{массивті толтыру}

A[i]

:= random(diap);

 

for i:=1 to lens do

{массивті шығару}

write(A[i], ‘ ’);

 

writeln;

 

for i:= lens-1 downto 1 do

{орнын ауыстыру циклы}

begin

 

 

j := i;

while (j < lens) AND (a[j] > a[j+1]) do {«қалқу» циклы}

begin

 

if a[j] > a[j+1] then

{егер, оң жағында кіші болса,}

begin

 

mit := a[j];

{онда «қалқып шығады»,}

a[j] := a[j+1]);

a[j+1]) := mit;

{элеметтердің орны ауысады}

end;

 

j:= j + 1;

 

end;

 

end;

for i:=1 to lens do {іріктелген массивті шығару} write(A[i], ‘ ’);

readln;

end.

Программаның орындалу нәтижесі: 2 96 71 46 32 35 10 64 0 15 0 2 10 15 32 35 46 64 71 96

Сызықты іріктеу әдісі Есеп: Элементтерінің саны онға тең, бүтін типті бір өлшемді

массив берілген.

Сызықты іріктеу әдісін қолданып өспелі түрде іріктеу программасын құру керек. Массив [0,100] аралығынан кездейсоқ сандармен толтырылады.

Шешімі: Массивтің әр элементін, бірінші элементпен салыстыра отырып, ең кіші элементті іздейміз. Егер ондай элемент табылса, онда оны бірінші элементпен орнын ауыстырамыз. Осы операцияны қайталаймыз, бірақ енді салыстыруды екінші элементтен бастаймыз, т.с.с.

Program Perebor;

81

Uses crt;

 

{экранның модулін қосу}

const

lens=10;

{массивтің элементтер саны}

diap=100;

{мәндер диапазоны}

Var

 

{А бүтін типті массиві}

A : array[1..lens] of integer;

mit : integer;

{ауыстыруға арналған айнымалы}

i, j : integer;

{циклдік айнымалылар}

min : integer;

{ең кіші элемент}

el : integer;

 

{ең кіші элементтің индексі}

BEGIN

 

{экранды тазалау}

clrscr;

 

randomize;

{кездейсоқ сандарды инициализациялау}

for i:=1 to lens do

{массивті толтыру}

A[i]

:= random(diap);

 

for i:=1 to lens do

{массивті шығару}

write(A[i], ‘ ’);

 

writeln;

 

for i:= 1 to lens – 1 do

{орнын ауыстыру циклы}

begin

 

 

min:= a[i];

 

el := i;

 

for j:= i+1 to lens do

{ең кіші элементті іздеу}

if a[j] < min then

 

 

begin

 

 

min := a[j];

 

 

el := j;

 

 

end;

{ең кіші элемент өз орнына}

mit := a[j];

a[i] := min;

{қойылады}

a[el] := mit;

 

end;

for i:=1 to lens do {іріктелген массивті шығару} write(A[i], ‘ ’);

readln;

END.

Программаның орындалу нәтижесі: 55 58 58 2 22 80 56 70 39 77 2 22 39 55 56 58 58 70 77 80

Ұсақтап бөлу арқылы тез іріктеу әдісі

Жоғарыдағы қарастырылған әдістер қарапайым және қөрнекі болғанымен, жылдамдығы жағынан онша тиімді емес.

82

«Ұсақтап бөлу арқылы іріктеу» деп аталатын, К. Хоордың іріктеу алгортимі көп жағдайда тез жұмыс жасайды.

Алгоритмнің негізіне, массивті тізбекпен ұсақтап бөлу әдісі қолданылады. Осы әдісті іске асырған прорамманың мысалын талдайық.

Program Quck_sort; {ұсақтап бөлу әдісімен өсірілмей іріктеу } Uses Crt;

Const Count = 20;

M : aarray [1..Count] of

Byte = (9,11,12,3,19,1,5,17,10,18,3, 19, 17, 9, 12, 20, 20, 19, 2, 5);

Var

 

 

 

 

I, A : integer;

 

 

 

Procedure QuickS(First, Last : integer);

 

 

Var I, J, X, W,L : integer;

 

 

 

Begin

{массивтің сол жақ шекарасы–1-ші элемент}

I := First;

J := Last;

{массивтің

оң

жақ

шекарасы–соңғы

элемент }

 

 

 

 

X := M[(First + Last) div 2]; {массивтің ортасын табу}

Repeat

 

 

 

 

While M[I] > X do I := I +1;

 

 

While X > M[J] do J := J +1;

 

 

A:+A +1; {эл-ң алмасу итерациясының санын өсіреді}

If I <+ J

then

 

 

 

Begin

{элементтердің орнын ауыстыру}

W :=M[i];

 

 

 

M [I] := M[J];

 

 

 

M[J] := W;

 

 

 

I := I+1;

 

 

 

J := J+1;

 

 

 

{әр алмасудан кейін массивтің ағымдық жағдайын шығару}

for L := 1 to Count do

 

 

 

Write(‘ ‘, M[L]);

 

 

 

Writeln(‘Число итераций =’,A);

 

 

End;

 

 

 

 

Until I > J;

 

 

 

If First < J then QuickS(First, J); {QuickS процедуранын

рекурсивті шақыру}

 

 

 

 

If Last < J then QuickS(I, Last); {QuickS процедуранын

рекурсивті шақыру}

 

 

 

 

End;

{іріктеудің аяғы}

 

 

83

Begin

{негізгі программаның басы}

ClrScr;

Writeln(‘Исходный массив:’); Writeln; For I := 1 to Count do

Write (M[I] :3, ‘ ‘);Writeln; A := 0;

QuickS (1,Count); {QuickS процедуранын шақыру } Writeln(‘Отсортированный масив:’);

Writeln;

For I := 1 to Count do Write (M[I] :3, ‘ ‘);Writeln;

End.

QuickS процедурасы бірінші шақырылғаннан кейін берілген массивтің:

9 11 12 3 19 1 5 17 10 18 3 19 17 9 12 20 20 19 2 5

ортасы анықталып (10-шы элемент), X айнымалысына М[10]-ң мәні, яғни 18 меншіктеледі. Осыдан кейін массив екіге бөлінеді:

19 11 12 3 19 1 5 17 10 18 және 3 19 17 9 12 20 20 9 2 5 Ары қарай алмасу мына ережемен орындалады:

Массивтің сол жақ бөлігіндегі элементтерді солдан оңға қарап, М[І] >Х элементі ізделінеді, одан кейін оң жақтағы бөлімін солдан оңға қарап М[І]< Х элементі ізделеді.

Массивтің ортасынан сол жақтағы М[І]>Х және оң жақтағы М[І]<Х шарттары орындалып болғанша элементтері алмасады.

Нәтижесінде екі бөлімнен тұратын массивтің мына түрін аламыз:

9 11 12 3 19 1 5 17 10 18 3 19 17 9 12 20 20 19 2 5 Число итераций = 1 19 20 12 3 19 1 5 17 10 18 3 19 17 9 12 20 11 9 2 5 Число итераций = 2 19 20 20 3 19 1 5 17 10 18 3 19 17 9 12 12 11 9 2 5 Число итераций = 3 19 20 20 19 19 1 5 17 10 18 3 3 17 9 12 12 11 9 2 5 Число итераций = 4 19 20 20 19 19 18 5 17 10 1 3 3 17 9 12 12 11 9 2 5 Число итераций = 5

Ары қарай рекурсивті сол жақ екіге бөлініп (1-ші элементтен 6-ға дейін), сол жақтың элементтерін іріктеуге процедура шақырылады:

20 20 19 19 19 18 5 17 10 1 3 3 17 9 12 12 11 9 2 5 Число итераций = 7 20 20 19 19 19 18 5 17 10 1 3 3 17 9 12 12 11 9 2 5 Число итераций = 8

Сол жақ іріктеліп болғаннан кейін, тағыда рекурсивті процедура шақырылып тағы осы бөлігінің ортасы анықталады да элементтердің алмасуы орындалады: Массивтің түрі мынадай болады:

20 20 19 19 19 18 5 17 10 1 3 3 17 9 12 12 11 9 2 5 Число итераций = 9 20 20 19 19 19 18 5 17 10 1 3 3 17 9 12 12 11 9 2 5 Число итераций = 10

84

Сол жақтың әр бөлшектерінде бір-бір элемент қалғанша рекурсивті процедура шақырылып іріктелу орындалады.

Одан кейін сол сияқты оң жақтың элементтерін (7-ден 13шіге дейін) іріктеуге тағы рекурсивті процедура шақырылады.

Массивтің нәтижесінің кезеңдерінің тізбекпен шыққан нәтижесінің бейнеленуі:

20 20 19 19 19 18 5 17 10 1 3 3 17 9 12 12 11 9 2 5 Число итераций = 11 20 20 19 19 19 18 17 17 10 1 3 3 5 9 12 12 11 9 2 5 Число итераций = 12 20 20 19 19 19 18 17 17 10 1 3 3 5 9 12 12 11 9 2 5 Число итераций = 13 20 20 19 19 19 18 17 17 10 9 3 3 5 9 12 12 11 1 2 5 Число итераций = 14 20 20 19 19 19 18 17 17 10 9 11 3 5 9 12 12 3 1 2 5 Число итераций = 15 20 20 19 19 19 18 17 17 10 9 11 12 5 9 12 3 3 1 2 5 Число итераций = 16 20 20 19 19 19 18 17 17 10 9 11 12 12 9 5 3 3 1 2 5 Число итераций = 17 20 20 19 19 19 18 17 17 10 9 11 12 12 9 5 3 3 1 2 5 Число итераций = 18 20 20 19 19 19 18 17 17 12 9 11 12 10 9 5 3 3 1 2 5 Число итераций = 19 20 20 19 19 19 18 17 17 12 12 11 9 10 9 5 3 3 1 2 5 Число итераций = 20 20 20 19 19 19 18 17 17 12 12 11 9 10 9 5 3 3 1 2 5 Число итераций = 21 20 20 19 19 19 18 17 17 12 12 11 9 10 9 5 3 3 1 2 5 Число итерадий = 22 20 20 19 19 19 18 17 17 12 12 11 10 9 9 5 3 3 1 2 5 Число итераций = 23 20 20 19 19 19 18 17 17 12 12 11 10 9 9 5 5 3 1 2 3 Число итераций = 24 20 20 19 19 19 18 17 17 12 12 11 10 9 9 5 5 3 1 2 3 Число итераций = 25 20 20 19 19 19 18 17 17 12 12 11 10 9 9 5 5 3 1 2 3 Число итераций = 26 20 20 19 19 19 18 17 17 12 12 11 10 9 9 5 5 3 3 2 1 Число итераций = 27

Берілген массивтің элементтері өсірілмей іріктелуі 27 итерацияда орындалғандығын, соңғы А-ң мәнінен көреміз.

85

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