Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Алгоритмдеу жане багдарламалау негиздери 4 г.doc
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
2.73 Mб
Скачать

2.3. Зертханалық сабақ жоспарлары

1-2 зертханалық жұмыстар тақырыбы:

Алгоритм. Қасиеттері. Алгоритм қойылымы.

Кез келген адам күнделікті көптеген жұмысқа кезігеді, ал оларды атқарудың жолдарын көрсететін белгілі ережелер (нұсқаулар, ұйғарымдар) болады. Бұл арада компьютерді өшіру жөніндегі ретті әрекеттерден тұратын бізге таныс нұсқаулық үлгі бола алады:

Барлық ашық тұрған қосымша терезелерін жабу.

“Пуск” батырмасын шерту.

Басты менюден “Выключить компьютер” пунктін таңдау.

Диалог терезесінде компьютерді өшіру пунктін таңдау.

“Да” батырмасын шерту.

Ұйғарымның басқа түрлері мынадай:

  1. әдебиет сабағында шығарма жазудың жоспары;

  2. математика сабағында квадратты теңдеуді шешу кезіндегі әрекеттердің бірізділігі;

  3. су құбырындағы суды реттеу схемасы;

  4. орысша мәтіннің орфографиясын тексеру ережелері және т.б.

Мұндай ұйғарымдарды орындаушылар қатарында адамдар да, техникалық құралдар да- автоматтар, роботтар, компьютерлер болуы мүмкін.

Орындаушының белгіленген мақсатқа жетуіне бағытталған түсінікті де дәл ұйғарым алгоритм деп аталады.

Алгоритм ұйғарымдары сондай-ақ команда деп те аталады. Әрбір алгоритм белгілі бір орындаушыға, орындаушының осы осы алгоритм командаларын түсінуіне есептелген. Орындаушының орындауы мүмкін командаларының жиынтығы орындаушының командалар жүйесі деп аталады. Алгоритм орындаушысы дегеніміз – құрастырылған алгоритммен басқарылуға тиісті объект немесе субъект.

Алгоритмді құрастырғанда келесі алгоритмнің қасиеттері ескерілуі керек:

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

Алгоритмнің әр ұйғарымы немесе командасы орындаушыға түсінікті болуға тиіс, яғни олар бір мағынада түсініліп, қайталанатын алғашқы деректер бойынша бірыңғай нәтижелерге әкелуге тиіс. Алгоритмнің бұл қасиеті анықтылығы деп аталады.

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

Нәтижелілігі. Айқын белгіленген әрекеттер тізімінің әрқайсысы нәтижеге жеткізе бермейді. Мысалы, шахматта 10120 жүрістен тұратын ұтылыссыз ойын

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

Алгоритмнің қойылымы әдістері:

Алгоритмдер сипаттамасының, көрсетілімінің әдістері көп. Біздер олардың табиғи тіл, графикалық тіл, алгоритмдік тіл, программалау тіліне тоқталамыз. Көрсетімнің әр түрі алгоритмдерді сипаттаудың өз орындаушысына бағытталған өзіндік құралдары бар:

  1. табиғи тіл (орындаушы-адам) – орыс, қазақ, ағылшын тілінің сөздері;

  2. графикалық тіл (орындаушы - адам) -әрекеттер сипаттамасы бар графикалық схемалар (блок-схема);

  3. алгоритмдік тіл (орындаушы -адам) -әрекет немесе орындаушыға арналған командалар мағынасы берілетін табиғи тілдің белгілі сөздері;

  4. программалау тілі (орындаушы -компьютер) –программалау тілінің командалаоы.

Алгоритмнің құрылымын, құру әдістерін үйрену үш көрсетілімде жүреді: блок-схема, алгоритмдік тіл, программалау тілі.

Блок-схемалар түріндегі алгоритмдер көрсетімі

А лгоритм басы

Алгоритм соңы

Есептеуіш әрекеттер

Деректерді енгізу, деректерді шығару

циклдің басы

шартты тексеру

көмекші алгоритмді шақыру

Алгоритмдерді алгоритм тілінде көрсету

Алгоритм тілі- бұл алгоритмдер мен оларды орындаудың біртекті және дәл жазбаларына арналған белгілермен ережелер жүйесі. Алгоритм тілі бір жағынан кәдімгі тілге жақын, сондықтан әдеттегі мәтін ретінде оқылады және жазылады. Екінші жағынан алгоритм тілі пішіні жөнінен программалау тіліне жақын, бұл ЭЕМ үшін программалау тілін тез үйренуге мүмкіндік береді.Алгоритм тілінің өз сөздігі бар. Оның негізін осы тілдің командасын жеткізетін сөздер құрайды. Алгоритм тілінде сондай-ақ мағынасы мен қолдану әдісі өзгермейтін сөздер пайдаланылады. Олар қызмет етуші сөздер деп аталады. Алгоритмнің жалпы көрінісі мынадай болады:

алг алгоритмнің аты

басы

Алгоритм командалары (серия);

соңы

Алгоритм командалары рет-ретімен жазылады. Бір жолда бірнеше команда жазылуы мүмкін. Мұндай жағдайда олар “;” арқылы ажыратылады. Бірінен кейін бірі орындалатын бірнеше команданың жиынтығы серия деп аталады. Серияның бір командадан да тұруы мүмкін. Алгоритмдерді сипаттауда орындаушыға шамаларға қатысты әрекеттерді орындау және осы әрекет нәтижесі ретінде жаңа шаманы құру ұйғарылады. Алгоритм тілінде шамаларға қатысты әрекеттерді белгілеу үшін “:=” командасы пайдаланылды. Оны меншіктеу белгісі деп атайды.

3-4 зертханалық жұмыстар тақырыбы: Сызықты алгоритмдер. Формулаларды программалау.

Сұрақтар:

Сызықты алгоритм?

Меншіктеу командасы?

Тізбектелген командалар жүйесін сипатта?

Мысалы:

Арксинустың формуласы бойынша есептейтін программа құр:

мұнда . х=0.1234 болсын.

Шешілу жолы.

Программаны жазудың тиімді әдісін қарастыр. Арксинус формуласын түрлендіргеннен кейін мына түрде болады:

Енді х нүтесінде полином мәнін есептеу алгоритмін құрамыз . Ол үшін есептеу үшін 2n-1 көбейтінді және n қосынды қажет.

Полином мәнін бір нүктеде есептеудің тиімді әдістерінің бірі Горнер ережесі:

t=x2 деп белгілеп және арксинус формуласын төмендегі түрге келтіреміз:

.

Оң жағын f(x,t) арқылы белгілейміз.

уприбл –формула арқылы алынған арксинус мәні болсын, уконтр- стандартты arcsin x функциясы арқылы есептелетін, арксинус тың бақылаушы мәні. Алгоритмін жазайық:

алг Арксинус айнымалыны жариялау {зат x, t, yприбл, yконтр

арг х

нәт х

басы

{tx x x арксинустың мәнін есептеу

прибл f(x,t)

контр  arcsin(x)

соңы Программаны тексеру үшін мына мәндерді қоямыз: . саны шығуы керек.

Тапсырма:

Төмендегі сызықты алгоритмдердің алгоритмін, блок-схемасын, программасын жаз. Есепте:

; a=3, b=8

Фибоначчи n санын есепте Бино формуласы бойынша есепте:

Өрнектің мәнін тап:

Ұтымды тәсілмен есептеңіз, яғни операциялардың ең аз саны:

.

Өрнектің мәнін тап:

Өрнектің мәнін тап:

Әдебиеттер:

1. Негізгі – 2, 10-12

2. Қосымша - 4

5-6 зертханалық жұмыстар тақырыбы: Тармақталған алгоритммен жұмыс. Толық және толық емес түрі.

Cұрақтары:

  1. Тармақталудың қандай түрлері бар?

  2. if-then-else операторы қалай орындалады?

  3. case-of-end операторы қалай орындалады?

  4. Тармақталу не үшін қолданылады?

  5. Тармақталу командасының толық және қысқартылған формалары қалай жазылады?

Тапсырма:

        1. Функцияның мәнін есептейтін программа құр.

y = |x - 2| + |x + 5|.

        1. Программа құр.

n/3, егер n 3-ке бөлінсе;

X = n2, егер n 3-ке бөлінгенде 1 қалдық қалса;

n-2, егер n 3-ке бөлінгенде 2 қалдық қалса.

        1. Үш x, y, z нақты саны берілген. Қабырғаларының ұзындығы x, y, z үшбұрыш бола ала ма?.

4. а, b, с үшбұрышының берілген жақтары бойынша оның S алаңын және r1 радиусын және шеңбермен жазылған r2 табыңыз.

5. L айнымалысына бірлік беріңіз, егер п айнымалысы тұтасқа т немесе k бөлінсе, немесе оны 1 бөлген кезде қалдық т немесе k қалса; кері жағдайда L мәні нөлге тең.

Әдістемелік нұсқау:

Анықталу саласын аралықтарға бөлеміз:

(-; -5]  (-5; 2]  (2; +).

Әрбір алынған аралықта модульді ашамыз. Мысалы: егер

х -5, онда у = -х + 2 - х - 5. if оператор қолданамыз.

Бірінші п-ді 3 –ке бөлгендегі қалдықты анықтаймыз (r = n mod 3). Әрі қарай case операторын қолданамыз.

Үшбұрыштың кез келген бір қабырғасы ұзындығы қалған қабырғаларының ұзындығының қосындысынан кіші болады.

Егер жарты периметр р бір қабырғасынан үлкен болса, үшбұрыш бола алады ма?

1 мысал:

program Labor041;

var

X, Y: Real;

begin

Write(‘x-ке мән бер:');

ReadLn(X);

if X <= -5 then Y := -2 * X - 3

else

if (X > -5) and (X <= 2) then Y := 7

else Y := 2 * X + 3;

WriteLn('y =', Y)

end.

2 мысал:

program Labor042;

var

N, X: Integer;

begin

Write(n-бүтін сан бер: ');

ReadLn(N);

case N mod 3 of

0: X := N div 3;

1: X := Sqr(N);

2: X := N - 2;

end;

WriteLn('x = ', X)

end.

7-8 зертханалық жұмыстар тақырыбы: Циклдік алгоритмдермен жұмыс. Циклдік алгоритмдер түрлері.

Сұрақтар:

1. Қандай жағдайларда программада оператор for операторы қолданылуы мүмкін?

2. Егер амалдар тізбегінің қайталамалар саны есептеулер жүрісімен анықталған жағдайда қандай операторлар қолданылады? Олардың айырмашылықтары қандай?

3. goto операторы қолданатын белгі қайда және қалай жарияланады?

4. goto қашан пайдаланған дұрыс және дұрыс емес?

Тапсырмалар:

  1. Жолға 25 "*" жұлдызша шығаратын программа құр. Төмендегі операторларды қолданып:

а) for;

б) repeat;

в) while.

  1. Төмендегі көбейтіндіні есептейтін программа құр:

  1. Қосындыны есепте. Жауабын тексер.

  2. Пернетақтадан енгізілген санның жай сан екенін тексеретін программа құр (үш тәсілмен: for, repeat, while операторларын қолдану арқылы).

Әдістемелік нұсқау:

«*» басу үшін цикл ішінде Write операторын пайдаланыңыз.

і! ілеспе есептеу үшін ізделініп отырған туындыны есептеу үшін қолданатын циклды қолданыңыз.

3-тапсырмада к-е қосылғышы k*(k+2) бөлімін иеленеді. N саны, егер ол тұтастай өзіне және бірлікке бөлінетін болса жай болып табылады. N саны егер бөлгеннен қалған қалдық 0-ге тең болса К-ге тұтастай бөлінеді. N саны егер ол 2-ден бастап [ ] (тұтас бөлік ) дейінгі ешқандай тұтас санға бөлінбесе жай сан болады. Бұл ретте 2- бұл жай сан! қалған жай сандар тақ, сондықтан тек қана тақ бөлгіштер іріктейтін 2 қадамды цикл ұйымдастыруға болады.

2 тапсырма мысалы:

program Labor051;

var

I, N, Fact: LongInt;

P: Real;

begin

Write('n бүтін санын енгіз:'); ReadLn(N);

Fact := 1; P := 1;

for I := 1 to N do

begin

Fact := Fact * I; P := P * (2 + 1 / Fact);

end;

WriteLn('Р =', P)

end.

4 тапсырма мысалы:

program Labor052;

var

I, N, ZN: Integer;

Prost: Boolean;

begin

Write('Бүтін сан енгіз:'); ReadLn(N);

Prost := True;

if N <> 2 then

if Odd(N) then

begin

I := 3; ZN := Trunc(Sqrt(N));

while Prost and (I <= ZN) do

begin

Prost := N mod I <> 0; I := I + 2

end

end

else Prost := False;

if Prost then WriteLn('Жай сан енгізілді')

else WriteLn('құрама сан енгізілді')

end.

While <шарт> do

Әзірге

Оператор;

{немесе BEGIN – END операторлық жақша}

9-10 зертханалық жұмыстар тақырыбы: Символдық айнымалылармен жұмыс, жол.

Сұрақтар:

  1. Жолдық тип? Бейнелеу тәсілдері?

  2. Жолдық тұрақтылар қалай бейнеленеді?

  3. Апостроф символы қалай бейнеленеді?

  4. Жол элементі деген не? Жолдық айнымалының құрылымы қандай?

  5. Қай жағдайда CHAR типі, қай жағдайда STRING типі қолданылады?

Тапсырмалар:

  1. Мәтін берілген

а) берілген жолдағы «!» және «?» символдардың санын сана.

б) жолдағы ең соңғы сөздің әріптерін санайтын;

в) м әрпінен басталатын сөздердің санын анықтайтын;

г) қатар кездесетін н әрпінің санын анықта;

д) Берілген сөздің ұзындығын анықтайтын программа құр.

  1. Клавиатурадан енгізілген жолда жазба орыс алфавитінің жолдық әріптерін құрайтын программа жазыңыз. (UpCase функциясы орыс алфавитінің символдарымен жұмыс жасамайтынын ескеріңіз).

  2. s және s1 жолдары берілген. s оңда s1 бірінші кіруін табу және оны s-дан алып тастау.

Әдістемелік нұсқау:

ReadLn көмегімен жол енгізу қалаулы.

Жолда тек қана символдар мен бос жерлер болуы мүмкін.

Сөз деп басқаларынан бір немесе бірнеше бос жерлермен ажыратылатын әріптер тізбегін атайтын боламыз.

2-ші тапсырмада кирилиицаның нақты кодтамасын ескеру қажет (төмендегі мысалда ASCII символдарының кодтамасының кетесі қолданылады).

Pos стандартты функциясы солдан іздеуде, сондықтан 3-тапсырмалар үшін қолайлы емес. Жолдардың соңына s және s1 енгізсе оңтайлы. Нәтижесі егер s-те s1 жол асты болмаса s-те s1[1] немесе 0 позициясының нөмірі болуы тиіс.

2-тапсырмаларды орындау мысалы:

program LabRab07;

var

St: string[80];

N, I: Integer;

begin

WriteLn('Текстің жолын енгізіп, Enter басыңыз');

Write('->');

ReadLn(St);

N := Length(St);

for I := 1 to N do

case St[I] of

'а'..'п': St[I] := Chr(Ord(St[I]) - 32);

'р'..'я': St[I] := Chr(Ord(St[I]) - 80);

'ё': St[I] := Chr(Ord(St[I]) - 1);

end;

WriteLn(өзгертілген жол:');

WriteLn('->', St)

end.

11-12 зертханалық жұмыстар тақырыбы: Бірөлшемді массивпен жұмыс: енгізу, шығару, өңдеу.

Сұрақтар:

1. Тізбектелген тип деген не? Оның басқа реттік типтерден айырмашылығы қандай? Атсыз тип деген не?

2. Программада шектеулі тип қалай жарияланады? Базалық тип деген не? Базалық тип ретінде қандай типтерді қолдануға болады?

3. «Массив» типі деген не? Көп мөлшерлі массив қалай жарияланады?

4. Массив элементі деген не?

5. Масивті енгізу/шығару қалай іске асырылады?

Тапсырмалар:

1. п ретті квадратты матрица берілген. bi=1 болатын b1, b2, …bn, жиымын құру, і-ші бағанда кем дегенде бір теріс элемент бар және кері жағдайда bi=0.

2. m*n өлшемдік матрицасы берілген. Оның жолдары мен бағандарын орын ауыстыра отырып, ең үлкен элемент (олардың бірі) сол жақ жоғары бұрышта орналасуына қол жеткізу.

3. m*n нақты матрицасы берілген. bi элементтері сәйкес бағандардың орташа арифметикалық элементтері сияқты есептелетін b векторын қалыптастырыңыз.

Әдістемелік нұсқау:

1-тапсырмада бағандағы теріс элементтердің санын табу талап етілмейді, онда теріс элементті алғашқы тапқан кезде осы бағанды өңдеуді үзуге және келесісін өңдеуге көшуге болады.

Матрицаны енгізуді ағынды түрде (Read) ұйымдастыруға болады. Матрицаның әрбір жолын шығаруды ағынды түрде (Write) ұйымдастыруға болады, ал жолды шығаруды аяқтағаннан кейін келесі жолға (WriteLn) көшуді шақыруға болады.

1- тапсырмаларды орындау мысалы:

program LabRab06;

label 1;

const MaxN = 100;

var

A: array[1..MaxN, 1..MaxN] of Real;

B: array[1..MaxN] of Byte;

I, J, N: Integer;

begin

Write('n енгізіңіз- матрицаның өлшемділігі: '); ReadLn(N);

WriteLn('Матрицаны жолма-жол енгізіңіз:');

for I := 1 to N do

for J := 1 to N do

Read(A[I, J]);

Write('b =');

for J := 1 to N do {бағандар бойынша сыртқы цикл береміз}

begin

for I := 1 to N do

if A[I, J] < 0 then

begin

B[J] := 1; goto 1 {егер кездессе циклды үзу}

end; {теріс элемент}

B[J] := 0; {егер барлық циклдың интерациялары орындалса, онда bj=0}

1: Write(' ', B[J])

end;

WriteLn

end.

13-14 зертханалық жұмыстар тақырыбы: Процедурамен жұмыс. Стандартты процедуралар.

Сұрақтар:

1. Ішкі программа деген не? Жұмыс жасау механизмі?

2. Нақтылы және формальды параметрлер не үшін қажет және олардың арасында қандай сәйкестік сақталуы тиіс?

3. Ішкі программалар қандай болады, және олар қайда анықталады?

4. Процедураның құрылымы қандай және процедура қалай шақырылады?

5. Паскальда параметрлер берудің қандай түрлері бар, және олардың айырмашылығы қандай?

Тапсырмалар:

1. Бүтін сандардан екі бірөлшемді жиым берілген. а) екі жиымға да; б) бірінші жиымға тиісілі, бірақ екінші жиымға тиесілі емес, элементтерді іздеу процедурасын жазыңыз.

2. x1, y1, x2, y2,…, xN, yN (N>2) нақты сандар берілген. Төбесінің сәйкесінше (x1, y1), (x2, y2), …, (xN, yN) координаттары бар N-бұрыштықтың периметрін табыңыз.

3. Екі үшбұрыштың төбесінің координаттары берілген. Олардың қайсысының алаңы үлкен екенін анықтау.

4. Текстілік файлді жазылған оң және теріс сандардың сомасын есептеңіз және соманың мәні мен басқа сандардың санын басуға шығарыңыз.

Әдістемелік нұсқау:

Ішкі программаның лайықты түрі – процедура немесе функция ма- әрбір есеті нақты қоя отырып анықтаңыз.

2 және 3 тапсырмаларда екі нүктені біріктіретін кесіндінің ұзындығын есептеу функциясы қажет екені анық. 4-тапсырмада тек қана оң және теріс сандарды есептеу, ал нөлдерді елемеу қажет!

4-тапсырмаларды орындау мысалы:

program Labor111;

var

F: Text;

FileName: string;

A: Real;

{Оң және теріс сандардың қосындысы}

SumP, SumN: Real;

{ Оң және теріс сандардың санақтары}

CntP, CntN: Word;

{ Sum сумматорына А қосу және Cnt санағын көбейту}

procedure Counter(A: Real; var Sum: Real; var Cnt: Word);

begin

Sum := Sum + A; Cnt := Cnt + 1

end;

begin

Write('Кіріс файлдың атын енгізіңіз: '); ReadLn(FileName);

Assign(F, FileName);

Reset(F);

SumP := 0; SumN := 0; CntP := 0; CntN := 0;

while not Eof(F) do

begin

Read(F, A);

if A > 0 then

Counter(A, SumP, CntP)

else

if A < 0 then

Counter(A, SumN, CntN)

end;

WriteLn('сомма ', CntP, ' оң сандар =', SumP);

WriteLn('сумма ', CntN, ' теріс сандар =', SumN)

end.

15-16 зертханалық жұмыстар тақырыбы: Функциямен жұмыс. Стандартты функциялар.

Сұрақтар:

1. Функцияның құрылымы қандай және функция қалай шақырылады?

2. Функцияның мәні қалай қайтарылады және ол қандай типте болуы мүмкін?

3. Жағымсыз эффект деген не?

Тапсырмалар:

1. Сан цифрының қосындысын табу.

2. Саның бірінші цифрын табу.

3. Сан бөлгіштерінің санын табу.

4. А-дан В-ға дейінгі аралықтан ең көп бөлгіші бар санды табу.

5. C(n,m) = Cnm терулер санын есептеу программасын құрыңыз. Fact(n) санының факториалын есептеу функциясын құрыңыз.

6. Үш санның ең үлкен ортақ бөлгішін табу программасын жазыңыз.

7. a, b, c үш берілген нақты мәндері бойынша тану ішкіпрограммасын құрыңыз, олар тік бұрышты үш бұрыштың қабырғалары болып табыла ма? Егер солай болса ішкі программа сондай-ақ оның s алаңын есептеуі де тиіс.

Әдістемелік нұсқау:

6-тапсырмада НОД(a, b): НОД(a, b, c) = НОД (НОД(a, b), c) табу үшін Евклид алгоритмін қолдануға болады.

7-тапсырмада жағымсыз эффект ретінде s алаңының мәнін қайтаруға болады.

6- тапсырмалар:

program Labor112;

var A, B, C: Word;

function NOD(M, N: Word): Word;

var R: Word;

begin

while N > 0 do

begin

R := M mod N; M := N; N := R

end;

NOD := M

end;

begin

Write('Үш натурал сандар енгізіңіз: '); ReadLn(A, B, C);

WriteLn('NOD(a, b, c) = ', NOD(NOD(A, B), C))

end.

7-тапсырмаларды орындау мысалы:

program Labor113;

var

A, B, C, Square: Real;

function PriamTreug(X, Y, Z: Real; var Square: Real): Boolean;

begin

PriamTreug := True;

if (X > 0) and (Y > 0) and (Z > 0) then

if X*X + Y*Y = Z*Z then

Square := 0.5 * X * Y

else

if Y*Y + Z*Z = X*X then

Square := 0.5 * Y * Z

else

if Z*Z + X*X = Y*Y then

Square := 0.5 * Z * X

else

PriamTreug := False

else

PriamTreug := False

end;

begin

Write(' Үш нақты сан енгізіңіз: '); ReadLn(A, B, C);

if PriamTreug(A, B, C, Square) then

WriteLn('площадь =', Square)

else

WriteLn('бұл тік бұрышты үш бұрыш емес')

end.

17-18 зертханалық жұмыстар тақырыбы:

Сызықты тізім. Тізім құру және қарау.

Сұрақтар:

Сызықты тізім деген не?

Тізім элементін қою үшін қандай операцияларды орындау талап етіледі?

Тізім құру үшін бір айнымалыны пайдалануға бола ма?

Тізім неше элементтен тұруы мүмкін? Тізім элементтерін енгізуді қашан тоқтату керек?

Тапсырмалар:

1. Бүтін 3, 5, 1, 9 сандарынан тұратын тізім құру.

2. Кемімеу бойынша реттелген бүтін сандар тізімін құру.

3. Берілген тізімнен ақпараттық бөліктің берілген мәндері бар элементінің барлық кірулерін алып тастау.

4. N бала дөңгелек бойымен орналастырылады. Біріншісінен санауды бастай отырып, әрбір к-ні алып тастайды. Шеңберден балаларды алып тастау ретін анықтау.

Әдістемелік нұсқау:

1-тапсырмаларды шешу кезінде s типті өрістері бар, деректер сипаттамасынан – келесі элементтің мәні және одан кейінгі элементтің адресінен тұратын жазбаны анықтаймыз .

Type EXS = ^S;

S=Record

Data: Integer;

Next: EXS;

End;

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

Тізім болуы үшін оның басының көрсеткішін анқтау қажет. Айнымалыны жазамыз:

Var u, x: EXS;

Бірінші элементті құрамыз:

New(u); { S типті айнымалы үшін жадыда орын бөлеміз}

u^. Next:=nil; {көрсеткіш бос}

u^. Data:=3; {бірінші элементтің ақпараттық өрісі}

Тізім қалыптастыруды жалғастырамыз, бұл үшін тізімнің соңына элемент қосу қажет.

х:=u; {тізімнің соңғы элементін сақтайтын көрсеткіш типті көмекші айнымалыны енгіземіз. қазір тізімнің соңғы элементі оның басымен сәйкес келеді }

Осылайша, жадының аумағына (суретте боялған) екі көрсеткіш арқылы қатынауға болады.

New(х^.Next);

{ тізімнің келесі элементі үшін жадының аумағын бөлеміз}

x:=x^.Next; {х айнымалысы жады аумағында бөлінген адрестің мәнін қабылдайды}

X^.Data:=5; {тізімнің осы элементінің мәнін анықтаймыз}

X^.Next:=Nil;

Процедура түрінде элементтері клавиатурадан (пернетақтадан) енгізілетін тізім құруды ресімдейміз.

procedure Init(Var u: Exs); {и тізімін құру}

Var х, у: Exs;

Digit: Integer; {тізім элементінің ақпараттық бөлімінің мәні}

Begin

Writeln('Тізім енгізу');

u:=Nil; {тізім бос}

WriteLn('Тізім элементін енгізіңіз. О енгізу соңы');

Read(Digit);

While Digit<>0 Do

Begin

New(y); {Тізім элементін қалыптастыру}

y^.Next:=Nil; y^.Data:=Digit;

If u=nil Then u:=y {тізімнің бірінші элементін қоямыз}

Else x^.Next:=y; {тізімнің соңына элемент қоямыз}

х:=у;

{көрсеткіштің мәнін тізімнің соңғы элементіне ауыстырамыз)

Read(Digit);

End;

Writeln;

End.

Біз суретте бейнеленген тізімді алуымыз қажет:

Келесі амалды орындаймыз:

New(x); {жаңа динамикалық айнымалы құру}

х^. data:=7; {құрылған элементтің ақпараттық өрісі}

х^ . next:=u; {тізімнің элементін құрылған элементке қосу }

u:=х; {тізім басы көрсеткішінің мәнін өзгертеміз}

Тізімді қарау. Тізім элементтерін қарау оның басынан тізбектеп бастай отырып жүзеге асырылады. р көрсеткіші барлық элемент қаралып болғанға дейін бірінші, екінші және ары қарай, барлық элементтерге тізбектеліп сілтеме жасайды. Бұл ретте тізімнің әрбір элементімен Ор операциясы орындалады. р-бастапқы мәні - p^ тізімнің бірінші элементінің адресі.

While р D тізімінің соңына емес көрсетеді.

Begin

р^ элементімен Ор операциясын орындау;

келесі элементке өту

End;

Ор(р^) —p^ элементінің экрандағы шығуы делік.

Егер р тізімнің соңын көрсетсе, онда оның мәні NIL тең, яғни:

While p<>Nil Do

Begin

Write(p^, ' ' ) ;

р:=р^. Next;

End;

19-20 зертханалық жұмыстар тақырыбы: Стек және кезек.

Сұрақтар:

Стек деген не?

Кезекке анықтама бер?

Стекке енгізу қалай жүргізіледі?

Элементті стектен алып тастауды қалай орындайды?

Кезекпен жасалатын қандай екі операция анықталған?

Тапсырмалар:

1. Стекті пайдаланып, арифметикалық өрнектің әдеттегі жазба формасын керіөрістік жазбаға өзгертетін программа әзірлеңіз.

2. Символдар жолында жақшаның уақытылы жабылуын тексеретін программа жазу.

3. Кері өрістік жазбада берілген өрнек мәнін есептеу программасын жазу.

Әдеттегі жазба: Кері өрістік жазба:

(b+c)*d bc+d*

a+(b+c)*d abc+d*+

4. Элементтері нақты сан болып табылатын f файлын қарағанда және қосымша файлдар пайдаланбай оның элементтерін былайша жазу: берілген а-дан кіші барлық сандарды жазу, одан кейін [a,b] кесіндісінен барлық сандарды және сандардың әрбір тобында олардың өзара ретін сақтай отырып қалған барлығын басу.

5. Жолдарға бөлінген текстілік f файлдағыларды, бұл ретте әрбір жолдың соңына оған кіретін барлық цифрларды өзара бастапқы ретін сақтай отырып тасымалдап g текстілік файлына көшіріп жазу.

Әдістемелік нұсқау:

Стек –жаңа элементтер қосу және барын алып тастау стектің төбесі деп аталатын бір соңынан бастап жүргізілетін элементтердің реттелген жиынтығы.

1-мысал. Стек қалыптастыратын программа құру, оған компоненттердің еркін санын қосу, ал одан кейін барлық компоненттерді оқып, оларды дисплейдің экранына шығару. Деректер ретінде символдар жолын алу. Дисплейдің клавиатурасынан бастап деректерді енгізу, енгізудің соңының белгісі – END символдарының жолы.

Шешім:

Program STACK;

uses Crt;

type

Alfa= String[10];

PComp= ^Сотр;

Comp= Record

sD: Alfa;

pNext: PComp

end;

var

pTop: PComp; sC: Alfa;

Procedure CreateStack(var pTop: PComp; var sC: Alfa);

begin New(pTop); pTop^.pNext:=NIL; pTop^.sD:=sC

end;

Procedure AddComp(var pTop: PComp; var sC: Alfa);

var pAux: PComp;

begin NEW(pAux); рАих^.pNext:=pTop; pTop:=pAux;

pTop^.sD:=sC

end;

Procedure DelComp(var pTop: PComp; var sC:ALFA);

begin

sC:=pTop^.sD; pTop:=рТор^.pNext

end;

begin

Clrscr;

writeln('' ВВЕДИ СТРОКУ ');

readln(sC);

CreateStack(pTop,sC);

repeat

writeln(' ВВЕДИ СТРОКУ ');

readln(sC);

AddComp(pTop,sC)

until sC='END';

writeln('****** НӘТИЖЕЛЕРІН ШЫҒАРУ ****** ‘);

repeat

DelComp(pTop,sC);

writeln (sC);

until pTop = NIL

end.

Кезек – соңының бірінен элементтерді алып тастау, ал екіншісінен жаңа элементтер қосылатын реттелген элементтер жиынтығы.

2-мысал. Кезек қалыптастыратын программа құру, оған компоненттердің еркін санын қосу, ал одан кейін барлық компоненттерді оқу және оларды дисплей экранына шығару. Деректер ретінде символдар жолын алу. Дисплейдің клавиатурасынан бастап деректерді енгізу, енгізудің соңының белгісі – END символдарының жолы.

Шешім:

Program QUEUE;

uses Crt;

type

Alfa= String [10];

PComp= ^Comp;

Comp= record

sD:Alfa;

pNext:PComp

end;

var

pBegin, pEnd: PComp; sC: Alfa;

Procedure CreateQueue(var pBegin,pEnd: PComp; var sC: Alfa);

begin

New(pBegin);

pBegin^.pNext:=NIL;

pBegin^.sD:=sC;

pEnd:=pBegin

end;

Procedure AddQueue(var pEnd:PComp; var sC:Alfa);

var pAux: PComp;

begin

New(pAux);

PAux^.pNext:=NIL;

Pend^.pNext:=pAux;

pEnd:=pAux;

pEnd^.sD:=sC

end;

Procedure DelQueue(var pBegin: PComp; var sC: Alfa);

begin

sС:=рВеgin^.ssD;

pBegin:=pBegin^.pNext

end;

begin

Clrscr;

Writeln (‘ВВЕДИ СТРОКУ ');

readln(sC);

CreateQueue (pB'egin,pEnd, sC) ;

repeat

writeln ( ' ВВЕДИ СТРОКУ ');

readln(sC);

AddQueue(pEnd,sC)

until sC='END';

writeln (‘***** ВЫВОД РЕЗУЛЬТАТОВ *****’);

repeat

DelQueue(pBegin,sC);

writeln (sC);

until pBegin=NIL

end.

21-22 зертханалық жұмыстар тақырыбы: Рекурсивті программалауға мысалдар

Сұрақтар:

Рекурсия деген не?

Рекурсияны қолдануға мысалдар келтір.

Оңтайлы программада рекурсияларды қалай пайдалану керек?

Рекурсия түсінігіне сипаттама бер.

Тапсырмалар:

1. Натурал санның факториалын есептеу.

2. Сандар тізбегін клавиатурадан енгізудің (енгізу соңы-0) және оны кері ретпен экранға шығарудың рекурсивтік программасын құру.

3. Клавиатурадан енгізілетін п и т теріс емес сандар үшін Аккерман функциясының мәндерін есептеу программасын құру.

4. Арифметикалық (геометриялық) прогрессияның бірінші N мүшелерінің қосындысын табу.

5. Берілген натурал сан қарапайым болып табылатынын анықтау.

6. N> 1 берілген натурал саны үшін 2a-1<N<2a теңсіздігі орындалатын а жалғыз натурал санын анықтау.

7. F(n) о функциясы төмендегідей түрде бүтін оң сандар үшін шекті:

n = 5, 6, 7, ..., 20 үшін осы функцияның мәнін есептеу. Шақыруларды суреттеу (бір функциядан осы функцияның біршене шақыруы болуы мүмкін екеніне назар аудару).

Әдістемелік нұсқау:

№1-тапсырмаларды шешу кезінде М-ді есептеу үшін (N-1)! мәнін білу және оны N –ға көбейту қажет, бұл ретте 1!=1. Жалпы түрде мұны былайша жазуға болады:

Function factorial (n: Integer): Longint;

Begin

If n=l Then factorial:=l Else factorial:=n*factorial(n-1);

End;

5! табамыз. Осы санның факториалы қалай есептеледі? Осы функцияның бірінші шақыруы негізгі программадан болады (Мысалы, а: = factorial (5), мұнда а айнымалысына 5! мәнін береміз).

N 1 болғандықтан Else бұтағы бойымен жүреміз және Factorial функциясына n*Factorial (n-1) мәнін береміз, яғни 5-ті Factorial (4) функциясының мәніне көбейту қажет. Сондықтан осы функцияға екінші рет қатынаймыз, бірақ оны –4 параметрінің жаңа мәніне береміз. 1-ге тең мән бергенге дейін осылай жасаймыз. Сонда N = 1, ал сондықтан Factorial функциясының мәні и:=1. Осылайша, N= 1 — бұл келесі рекурсияға ену процесі аяқталатын аяқталатын шарт. Шақыру нүктесіне оралу және беру операторына есептелген функция мәнін алмастыру жүреді. Яғни и=2: Factorial: =n*Factorial (n-1) үшін алдыңғы функцияға ораламыз, демек, Factorial :=2*1, яғни Factorial (2) =2. Ары қарай орааламыз. Осылайша, Factorial (5) =120 мәнін аламыз, бұл мәнді а айнымалысына береміз.

1-мысал. Санаудың ондық жүйесінен натурал санды екілікке ауыстыру.

Шешім. Осы есепті шешу үшін алдымен санаудың ондық жүйесінен натурал санды екілікке қалай ауыстыру керектігін қарастырамыз. 39 саны бар делік, оны екілік жүйеде беру қажет. Бұл үшін оны 2-ге бөлеміз, тұтас бөлік және бөлуден қалған қалдық аламыз. Тұтас бөлікті алдымен 2-ге бөлеміз және тұтас бөлік және қалдық аламыз. Осылайша тұтас бөлікті 2-ге бөлу мүмкін болғанға дейін (яғни ол 1-ге тең болғанға дейін) жасаймыз.

_39

2

38

_19

2

1

18

_9

2

1

8

_4

2

1

4

_2

2

0

2

1

0

Енді осы бірліктен бастай отырып, бөлуден қалған барлық қалдықты кері ретпен жазамыз, бұл 39 санының санаудың екілік жүйесіндегі жазбасы болады: 3910= 1001112.

Осылайша санаудың ондық жүйесінен екілік жүйеге, сондай-ақ басқа да жүйелерге кез келген натурал санды ауыстыруға болады. (мысалы, сегіздік немес алтылық).

Процедураны жазамыз:

Procedure Rec(n: Integer);

Begin

If n>l Then Rec(n Div 2);

Write(n Mod 2) ;

End;

Бірінші сан (1) соңғы шақырудан экранға шығарылады, келесі сан (0) соңғысынан және одан ары қарай және соңғы (1) –біріншіден. Осылайша келесі цифрды шығару осы функциядан шығар алдында жүреді.

23-24 зертханалық жұмыстар тақырыбы: Берілгендердің жиынды типі.

Сұрақтар:1. Жиындық тип деген не?

2. «Жиын» типін жариялаған кезде негізгі ретінде қандай типтер қолданылады?

3. Жиын конструкторы деген не?

4. Жиындармен қандай операциялар анықталған?

5. Жиындар мен жиымдардың ұқсастығы мен айырмашылығ қандай?

Тапсырмалар:

1. 1-ден 30-ға дейінгі бүтін сандар жиынынан келесі жиындарды бөлу программасын құру:

2 еселік сандар жиыны;

3 еселік сандар жиыны;

6 еселік сандар жиыны;

2 және 3 еселік сандар жиыны;

2. Символдардың бос емес тізбегі берілген. Элементтері тізбекте кездесетін төмендегілер болып табылатын жиындар құруды және басу:

а) от «0»-ден «9»-ға дейінгі цифрлар және арифметикалық операциялардың белгілері;

б) «А»-дан «F»-ға дейінгі және «А»-дан «Z»-ға дейінгі әріптер;

в) тыныс белгілері және «E»-ден «N»-ға дейінгі әріптер.

3. Клавиатурадан енгізілген s жолында «+», «—», «*» цифрлар мен белгілердің ортақ санын санау программасын құру.

4. Алфавиттік ретпен осы жиынның элементтерін басу программасын құру.

5. “Мешанина”. Егер алатын болса, онда ортағы, қасықты дәнде не бар, мысықты қосу және жылыға қою, онда құмырысқа алынады. Осылай бола ма? Құмырысқалар мысықтан тұра ма?

6. п натурал саны берілген. Өсу ретімен осы натурал санның ондық жазбасына кірмейтін барлық цифрларды басатын программа құру.

Әдістемелік нұсқау:

№1-тапсырмаларды шешу.

Program Example_1;

Const n = 30;

Type mn=Set Of 1..n;

Var n2, n3, n6, n23: mn; {n2 - сандар жиыны, 2 еселік, n3 - 3 еселік, пб - 6 еселік, n 23 -2 және 3 еселік}

k: Integer;

Procedure Print(m: mn) ;

Var i: Integer;

Begin

For i:=i to n Do If i In m Then Write (i:3);

Writeln;

End;

Begin

n2=[ ]; n3=[ ]; (жиындардың бастапқы мәні)

For k:=l То n Do { n2 және nЗқалыптастыру}

Begin {егер сан 2-ге бөлінсе, онда оны n2 –ға енгізу}

If k Mod 2=0 Then n2:=n2+[k];

If k Mod 3=0 Then n3:=n3+[k]; {егер сан 3-ке бөлінсе, онда оны nЗ-ке қосамыз}

End;

{числа, кратные 6, - это те, которые кратны и 2, и 3, поэтому это - пересечение двух первых множеств, а числа, кратные 2 или 3, - это объединение этих же множеств}

nб:=n2*nЗ; n23:=n2+nЗ;

Writeln('числа, кратные 2'); {вывод множеств}

Print (n2);

Writeln('числа, кратные 3') ;

Print(nЗ);

Writeln('числа, кратные б');

Print (nб);

Writeln('числа, кратные 2 или 3');

Print (n23);

Readln;

End.

Решение Тапсырмалар №5.

Program Example_5;

Var yl, y2, уЗ, у4, х: Set Of Char;

s: Char;

Begin

у1:=[‘б’,’о’,’б’]; у2:=[‘л’,’о’,’ж’ ,’к’,’а’];

у3:=[‘к’,’о’,’т’]; у2:=[‘т’,’е’,’п’ ,’л’,’о’];

Writeln('множество х'); {вывод множества х}

For s: = 'a' То ‘я’ Do If s In x Then Write (s);

Writeln; If y3<=x Then Write('муравей состоит из кота')

{проверка: состоит ли муравей из кота}

Else Write('муравей не состоит из кота');

End.

Программа для решения задачи 6 такова:

Program Example_6;

Type mn = Set Of 0. . 9;

Var s: mn;

n: Longint;

1, k: Integer;

Begin

Writeln ('введите число n'); Readln (n);

s: =[ ];

While n<>0 Do

{формирование множества цифр десятичной записи натурального числа}

Begin

k:=n Mod 10;

n:=n Div 10;

If Not (k In s) Then s:=s+[k};

End;

For k:=0 To 9 Do If Not (k In s) Then Write (k:2);

{вывод цифр в порядке возрастания}

Writeln;

Readln;

End.

25-26 зертханалық жұмыстар тақырыбы: Ағаш.

Сұрақтар:

Ағаш деген не?

Ағашты қалай беруге болады?

Қандай ағаш реттелген болады?

Ішкі ағаш деп нені айтамыз?

Тегі, ұрпақтары деген не?

Жол ұзындығына анықтама беріңіз.

Тапсырмалар:

1. №13-конспектімен танысыңыз.

2. Қалыптастырылған ағашта берілген санның бар-жоғын тексеретін рекурсивті логикалық функцияны суреттеу.

3. Ағаш элементтерінің сомасын санайтын рекурсивті сандқ функцияны суреттеу.

4. Бос емес ағаштың ең үлкен элементін табатын функцияны суреттеу.

Әдістемелік нұсқау:

Граф — Соңы берілген нүктелер жиынына жататын нүктелер жиынын (төбелер) және кесінділер (қабырғалар) жиыны.

Граф егер оның кез келген төбесі жолмен біріктірілген болса байланысты деп аталады.

Циклдарсыз байланысты граф ағаш деп аталады.

Мысал.

Ағаштармен одан әрі жұмыс жасау үшін бірқатар ұғымдарды анықтап алу қажет.

х төбесінен тікелей төмен орналасқан у төбесі, х –тің тікелей ұрпағы деп аталады, ал х төбесі у тегі деп аталады.

Егер төбенің ұрпақтары болмаса, онда ол терминалды төбе немесе жапырақ деп аталады, егер болса ішкі төбе деп аталады.

Ішкі төбенің тікелей ұрпақтарының саны оның дәрежесі деп аталады.

Ағаштардың дәрежесі деп барлық төбелердің ең жоғарғы дәрежесін атайды.

Мысалы:

F, D, Е төбелері являются непосредственными потомками вершины В төбесінің тікелей ұрпақтары болып табылады;

F, D, E төбелері жапырақтар болып табылады;

• С, G, Н — ішкі төбелер;

В — 3 төбесінің дәрежесі, ал төбелері Н — 1;

• ағаштың дәрежесі 3-ке тең.

Екі жақты ағаш - әрбір төбесінен екіден артық емес қабырға шығатын ағаш. Ағаш –бұл ақпараттарды тиімді сақтау үшін қолданылатын деректердің күрделі динамикалық құрылымы. Ағашты сипаттау үшін сілтеме қажеттігі анық. Белгіленген құрылымы бар айнымалылар ретінде төбелердің өзін суреттейміз, сонда ағаштың дәрежесі ішкі ағаштардың төбесін көрсететін сілтемелік компоненттердің санын анықтайтын болады.

Бинарлық ағашта олар екеу- сол және оң.

Type TreeLink =^Тгее;

Tree=Record

Data: <тип данных>;

Left, Right: TreeLink;

End;

Ағаштың тамырын айнымалылардың сипаттамасын бөлімінде суреттейміз:

Var kd: TreeLink;

Ағаштармен негізгі операцияларға мыналар жатады:

• элементті ағашқа енгізу;

• ағашты айналып өту;

• элементті ағаштан алып тастау.

Мысал. Келесі есептің мысалында ағашты енгізу мен айналып өтуді қарастырамыз.

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

Шешім. Ағашқа жаңа төбе қою процедурасын қарастырамыз. Ағашқа төбе қою кезінде бар төбенің ішкі ағашы ретінде, немесе ағаштың жалғыз төбесі ретінде қойылады. Сондықтан жаңа төбенің сол жақ және оң жақ байланыстары Nil тең болуы тиіс. Ағаш бос болғанда параметрлер түрінде берілетін сілтемелердің мәні Nil тең. Бұл жағдайда оны ол түпкі ретінде орнатылған жаңа төбені көрсететіндей етіп өзгерту қажет. Негізгі прогрммадан берілген екінші элементті қойған кезде t параметрі Nil тең болмайды және жаңа төбені қандай ішкі ағашқа қою қажеттілігі туралы шешім қабылдау қажет.

Procedure InsTree(n:Integer; Var t:treelink);

Begin

If t=NIL Then

Begin

new (t) ;

With t^ Do

Begin

left:=NIL; right:=NIL; data:=n

End;

End

Else If n<=t^.data Then InsTree(n, t^.left) Else InsTree(n,t^.right);

End;

Екілік ағаштың элементтері мәндерін экранға шығару процедурасын суреттейміз. Бұл үшін ағашты толық айналып өтуді орындау қажет. Ағашты айналып өту кезінде оның жекелеген төбелеріне белгілі бір ретпен барылады. Екілік ағашты шығаруды әрбір төбе үшін үш амал орындай отырып рекурсивті жүргізуге болады:

• торапта сақталатын санды шығару;

• сол жақ ішкі ағашты аралау;

• оң жақ ішкі ағашты аралау.

Осы амалдарды орындау реті ағашты айналып шығу тәсілін анықтайды. Шығару тәсілі:

• тікелей қорытынды (жоғарыдан төменге);

• кері қорытынды (солдан оңға);

• соңғы қорытынды (төменнен жоғарға).

Ағашты кері қорытындылау процедурасы келесідей ттүрде болады:

Procedure PrintTree(t:treelink);

Begin

If t<>NIL Then Begin

PrintTree(t^.left); Write(t^.data:3); PrintTree(t^.right)

End;

End;

Негізгі программа клавиатурадан сандарды енгізуді жүзеге асырады.

treelink типті nd айнымалысы— ағаштың түбіріне көрсеткіштің мәні; integer типті Digit айнымалысы кезекті енгізілген санды сақтау үшін пайдаланылады.

Begin {Негізгі программа}

Writeln(енгізуді аяқтау - 0'); kd:=Nil; Read(Digit);

While Digit<>0 Do

Begin

InsTree(Digit,kd);

Writeln('кезекті санды енгізіңіз');

Read(Digit);

End;

PrintTree(kd);

End.

Іздеу ағашында түбінен бастап қозғала отырып және сол немесе оң ішкі ағашқа өте отырып кездескен деректердің мәніне қарай әрбір элементтің орнын табуға болады.

Іздеу ағаштарын пайдалану есептерді шешу уақытын едәуір қысқартады. Тізімде элементті табу үшін орта есеппен тізімнің жартысын қарау керек, онда егер тізімде N элемент болса, онда N/2салыстыруларды орындау қажет. Ағаштан берілген элементті іздеу үшін оны дұрыс ұйымдастырған кезде logN артық емес салыстырулар қажет етілуі мүмкін.

27-28 зертханалық жұмыстар тақырыбы: Кестеде іздеу. Жолдан тура іздеу.

Сұрақтар:

Массив (жиым» деген не және ол қандай түрде болады?

Жиымды қалай толтыруға болады?

Жолдық және символдық деректер қалай ресімделеді?

Символдар мен жолдарға қндай операциялар қолданылады?

Тапсырмалар:

1. х массивінде нөлдер санын есептеу.

2. x: array [1..n] of integer; x[1]<=x[2]<=…<=x[n] массиві берілген. Осы массив элементтері арасынан түрлі сандар санын табу.

3. Олардың x[1]…x[n] максимумын табу.

4. Тізбек түрінде біраз текст берілген делік және А және В екі массиві түрінде поездардың сөздердің екі анық емес рейстері бар. Сөз – символдардың шағын массиві, олардың өлшемі үлкен емес және белгіленген. А сөзінің әрбір кіруін сәйкес Вi сөзіне әрбір кіруін ауыстыру арқылы Т текстін S тексіне өзгертетін программаны жазыңыз.

Әдістемелік нұсқау:

Бұл алгоритм алғашқыда мүмкін емес нәрсені жасайды: қалыпты жағдайда ол берілген үлгі ізделетін сөздің барлық әріптерінің азғана бөлігін оқиды. қалайша бұлай болады? Идея қарапайым. Мысалы, біз abcd үлгісін іздеп отырмыз. Сөздің төртінші әрпін қараймыз, мысалға бұл с әрпі, онда алғашқы үш әріпті оқудың қажеттігі жоқ. (Шын мәнінде әріптердің үлгісінде е жоқ, сондықтан ол бесінші әріптен бұрын бсталмайды).

Біз барлық жағдайларда шапшаң жұмысты кепілдендірмейтін бұл алгоритмнің ең қарапайым вариантын келтіреміз.

Пусть x[1]...х[n] - образец, который надо искать. Для каждого символа s найдем самое правое его вхождение в слово X, то есть наибольшее k, при котором х[k]=s. Эти сведения будем хранить в массиве pos[s]; если символ s вовсе не встречается, то нам будет удобно положить pos[s]=0 (мы увидим дальше, почему).

  pos массивін қалай толтырамыз?

Шешімі.

положить все pos[s] равными 0

for i:=1 to n do begin

pos[x[i]]:=i;

end;

В процессе поиска мы будем хранить в переменной last номер буквы в слове, против которой стоит последняя буква образца. Вначале last=n (длина образца), затем last постепенно увеличивается.

last:=n;

{все предыдущие положения образца уже проверены}

while last<= m do begin {слово не кончилось}

if x[m]<>y[last] then begin {последние буквы разные}

last:=last+(n-pos[y[last]]);

{n - pos[y[last]] - это минимальный сдвиг образца,

при котором напротив y[last] встанет такая же

буква в образце. Если такой буквы нет вообще,

то сдвигаем на всю длину образца}

end else begin

если нынешнее положение подходит, т.е. если

x[i]..х[n]=y[last-n+1]..y[last],

онда сәйкестік туралы хабарлау;

last:=last+1;

end;

end;

Знатоки рекомендуют проверку совпадения проводить справа налево, т.е. начиная с последней буквы образца (в которой совпадение заведомо есть). Можно также немного сэкономить, произведя вычитание заранее и храня не pos[s], а n-pos[s],

т.е. число букв в образце справа от последнего вхождения буквы Возможны разные модификации этого алгоритма. Например, можно строку

last:=last+i

заменить на

last:=last+(n-u),

где u - координата второго справа вхождения буквы x[n] в образец.

 

Как проще всего учесть это в программе

Решение. При построении таблицы pos написать

for i:=1 to n-1 do...

(далее как раньше), а в основной программе вместо

last:=last+1

написать

last:=last+n-pos[y[last]];

Приведенный упрощенный вариант алгоритма Бойера - Мура в некоторых случаях требует существенно больше n действий (число действий порядка mn), проигрывая алгоритму Кнута-Морриса-Пратта.

Пример ситуации, в которой образец не входит в слово, но алгоритму требуется порядка mn действий, чтобы это установить.

Решение. Пусть образец имеет вид baaa... aa, а само слово состоит только из букв а. Тогда на каждом шаге несоответствие выясняется лишь в последний момент.

Настоящий (не упрощенный) алгоритм Бойера-Мура гарантирует, что число действий не превосходит C(m+n) в худшем случае. Он использует идеи, близкие к идеям алгоритма Кнута-Морриса-Пратта. Представим себе, что мы сравнивали образец со входным словом, идя справа налево. При этом некоторый кусок Z (являющийся концом образца) совпал, а затем обнаружилось различие: перед Z в образце стоит не то, что во входном слове. Что можно сказать в этот момент о входном слове? В нем обнаружен фрагмент, равный Z, а перед ним стоит не та буква, что в образце. Эта информация может позволить сдвинуть образец на несколько позиций вправо без риска пропустить его вхождение. Эти сдвиги следует вычислить заранее для каждого конца Z нашего образца. Как говорят знатоки, все это (вычисление таблицы сдвигов и ее использование) можно уложить в C(m+ n) действий.

29-30 зертханалық жұмыстар тақырыбы:

Ішкі сұрыптау алгоритмдері таралымы.

Тікелей қосылу көмегімен сұрыптау.

Сұрақтар:

  1. Сұрыптау деген не?

  2. Сұрыптаудың негізгі мақсаты?

  3. Накакие два класса можно разбить методы сортировки?

  4. На какие три категории делятся методы сортировки на том же месте?

  5. Тікелей қосылып сұрыптауы әдісі көбіне қайда қолданылады?

Тапсырмалар:

Ознакомтесь с конспектом лекции №15.

Даны пять попарно различных целых чисел a, b, c, d, e. Упорядочить их по возрастанию, используя для этого не более семи сравнений.

Рассмотрим массив целых или действительных чисел a1, … , an. Пусть требуется переставить элементы этого массива так, чтобы после перестановки они были упорядочены по невозрастанию: . Упорядочить массив методом прямого включения.

Әдістемелік нұсқау:

В качестве примера процесса сортировки рассмотрим задачу включения восьми случайно выбранных чисел. Алгоритм этой сортировки таков:

FOR i := 2 ТО n DO BEGIN

х := a[i];

включение х на соответствующее место среди а[1] ... a[i]

END;

В реальном процессе поиска подходящего места удобно, чередуя Равнения и движения по последовательности, как бы просеивать х, т. е. х сравнивается с очередным элементом aj, а затем либо х вставляется на свободное место, либо aj сдвигается (передается) вправо, и процесс "уходит" влево. Обратите внимание, что процесс просеивания может закончиться при выполнении одного из двух следующих различных условий:

1. Найден элемент aj с ключом, меньшим чем ключ у х.

2. Достигнут левый конец готовой последовательности.

1-кесте. Тікелей қосу көмегімен тікелей қосуды сұрыптау.

Начальные ключи

44

55

12

42

94

18

06

67

i=2

44

55

12

42

94

18

06

67

i=3

12

44

55

42

94

18

06

67

i=4

12

42

44

55

94

18

06

67

i=5

12

42

44

55

94

18

06

67

i=6

12

18

42

44

55

94

06

67

i=7

06

12

18

42

44

55

94

67

i=8

06

12

18

42

44

55

67

94

Екі аяқталу шарты бар қайталамалы процестің мұндай ұқсас жағдайы бізге барьердің (sentinel) жақсы таныс тәсілін пайдалануға мүмкіндік береді. Бұл жерде оны х мәні бар go барьерін қойып оңай қолдануға болады. (бұл үшін а до 0 ... п айнымалысының сипаттамасында индекс диапазонын кеңейту қажет екенін байқаймыз). Толық алгоритм 1 –листингте келтірілген.

Листинг. Тікелей қосудың көмегімен сұрыптау.

PROCEDURE Straightlnsertion;

VAR i, j: index; x: item;

BEGIN

FOR i ;= 2 TO n DO BEGIN

x := a[i]; a[0] := x; j := i;

WHILE x < a[j-1] DO BEGIN a[j] := a[j-1]; ] ;= j-1 END;

a[j] := x

END

END; {Straightlnsertion}