Delphi жүйесінде ойын құрастыру



Мазмұны

1. Кiрiспе ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...3

2. Есептiң математикалық қойылымы ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...5

3. Есептi шығарудың тәсiлдерiн баяндау ... ... ... ... ... ... ... ... ... ... ... ... ... ..6
3.1. Iздеу алгоритмдерi ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ..6
3.1.1. Сызықты iздеу ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 6
3.1.2. Тосқауылы бар iздеу ... ... ... ... ... ... ... ... ... ... ... ... ... ... .6
3.1.3. Екiлiк (бинарлы) iздеу ... ... ... ... ... ... ... ... ... ... ... ... ... ...8
3.2. Сорттау алгоритмдерi ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ..9
3.2.1. Таңдау арқылы сорттау ... ... ... ... ... ... ... ... ... ... ... ... ... ..9
3.2.2. Айырбаспен сорттау (“көбiкше” тәсiлiмен) ... ... ... ... ..10
3.2.3. Шейкерлi сорттау ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ..11
3.2.4. Қосу арқылы сорттау ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... .11
3.2.5. Хоар сорттауы ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 13

4. Алгоритмнiң негiзгi ойын баяндау ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ..14
5. Логикалық құрылымның баяндалуы (Паскаль тiлiндегi программа үшiн).16
6. Блок.схема ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ..20
7. Қолданылған техникалық жабдықтар ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ..26
8. Бағдарламаны шақыру және жүктеу ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 26
9. Есептi шығару алгоритмнiң программалық жазбасы (Паскаль тiлiнде) ... ..27

10. Пайдаланылған әдебиеттер тiзiмi ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
1. Кiрiспе

Ойын деген – ойын сауық, демалыс, спорттық жарысқа негiзделген жұмыс түрi. Ойын адамның көңiлiн өсiрiп, ойын сергiтiп қана қоймай, сонымен қатар оның таным-түсiнiгiн арттырады.
Қазір компьютерлік ойындарды жасау кең ауқымды болып отыр. Қазiргi кездегi бағдарламалау тiлдерi көмегiмен бағдарламаларда ойындарды санаулы сағаттар ішінде жасауға болады, көптегкн компьютерлiк ойындарды жасайтын фирмалар бар. Бұл бағдарламалар осындай мақсаттарға арналған құралдары жақсы дамытылған. Онда ойын жасап жүрген шеберлер өздерінің барлық мүмкіндіктерін көрсете алады, ал жас бағдарламалаушылардың үйренуіне болады.
Бүгінгі күнде компьютерлік ойындардың көптеген түрлері бар. Олар типіне, әдістеріне қарай бірнеше топқа бөлiнедi.
Лабиринт ойындары ең ежелгі ойындардың бірі болып табылады. Олардың мағынысын қысқартылған түрде келтірсек: сіз лабиринт бойынша жүресіз, бір жерлерде кедергілер болады т.с.с. Олардың алғашқылары екі өлшемді графика жабдықтарымен жасалса, ал қазір үш өлшемді ойындарға айланып отыр.
Үстелдегі ойындарды жасаудың алғашқы кезеңінде оны жасаушылар бір мақсат көздеді. Ол – жасанды интеллекті ойнату. Кейін барып олардың үш өлшемді түрлері пайда болды. Мұндай ойындар типiне шахмат, дойбы, домино, «Морской бой», «Бильярд» ойындары және т.б. жатады.
Карталық ойындар да үстелдік ойындар сияқты өзінің пайда болу кезінен бері көп өзгере қойған жоқ. Тек ойнаушылар саны арттырылды және колодты таңдау сияқты әртүрлі мүмкіндіктер пайда болды. Бұл ойындарға атақты «Дурак», «Преферанс», «Покер» және басқалары жатады.
Викториналық ойындар әдетте көп орын алады, бірақ жаңадан шыққан көптеген бағдарламалрдың көмегімен оларды жасау қиын емес. Бұл жерде сұрақтар және олардың жауабы мүмкін болатын варианттар беріледі. Ойынның мақсаты – мейлiнше көп сұраққа жауап берiп, ойынның түбiне жету. Бұған мысал ретінде «Поле чудес», «О,счастливчик!», «Угадай мелодию», «Лимпопо» ойындарын жатқызуға болады.
Атқыштар - ойындарда сіз космостық кемені басқарып, әртүрлі нысаналарды атасыз немесе жаудың самолеттарын жаруға тырысасыз, әйтпесе су асты кемелерден теңіз бетіндегі кемелерді бомбылайсыз. Әдетте бұл ойындар екі өлшемді болып келеді.
Жүргіштер (бродилки) - ойындарында басты кейіпкер болады, оны, әрине, сіз басқарасыз. Ол жүгіріп отырып (ойын уақыты маңызды болса) немесе жүріп отырып әртүрлі кедергілерден өтеді, берiлген шарттарды орындауға тырысадыжәне т.с.с.
Стратегиялар – ұзақ уақытты және ойыншыдан белгiлi бiр қабiлеттердi талап етедi. Негiзгi ой – дұрыс ұйымдастырушылық, жылдам ойлау.
Симуляторлар – компьютер көмегiмен автокөлiк, ұшақ, тiкұшақ, танк, мотоцикл және т.б. көлiк түрiн айдауға негiзделген.
Басауыртпа ойындары (головоломки). Оларға «Тетрис» ойынын жатқызуға болады. Бұл ойының мақсаты - түскен денелерді тығызырақ орналастыру және толған қатарлардан құтылу. Ойын барысында денелер күрделірек бола бастайды және олардың түсу жылдамдықтары артады. Ойын мақсаты – логика көмегiмен ойынды жеңiп шығу. Негiзiнен бұл ойындар типiне әртүрлi пазлдар, кросвордтар, логикалық және т.б. жатады.
10. Пайдаланылған әдебиеттер тiзiмi

1. Шелест В. Программирование. – Санкт-Петербург, BHV, 2001.
2. Роджерс Д. Алгоритмические основы машинной графики. – Москва, “Мир”, 1989.
3. Вирт Н. Алгоритмы + структуры данных = программы. – Москва, “Мир”, 1985.
4. Вирт Н. Алгоритмы и структуры данных. – Москва, “Мир”, 1989.
5. Лахтин А.С., Искакова Л.Ю. Языки и технология программирования. Начальный курс. Учеб. пособие. Екатеринбург, 1998.
6. Бондарев В.М., Гублинский В.И., Качко Е.Г. Основа програмирования – Ростов Н/Д: Феникс, 1997.
7. Турбо Паскаль 7.0 – К.: торгово – издательское бюро BHV, 1996 – 448с.: ил. Т. Рюттяна.
8. Фаронов В.В. Turbo Pascal 7.0. Начальный курс. – Москва, “Нолидж”, 2001.
9. Н.Ы. Омарова, К.У. Тұрмағамбетова, К.Н. Нүриденова. Паскаль тiлiнде программалау негiздерi. Алматы, “Бiлiм”, 1996.
10. Шаметов Ералы Бақтайұлы. Паскаль тiлiн үйренейiк. Шымкент, 1993.
11. Абрамов В.Г., Трифонов Н.П., Трифонова Г.Н. Введение в язык Паскаль.
М.: Наука, 1988.
12. Х.М. Дейтел, П.Дж. Дейтел. Как программировать на С++. Москва,
“Бином”, 2000.
13. Программирование на С и С++ для Windows 95. Киев, BHV, 1996.
14. «Язык программирования для персонального компьютера Си»,
© С.О. Бочков, Д.М. Субботин, М.: Диалог-МИФИ, 1990.
15. Turbo C++ (Version 1.0). Руководство для программиста.

ҚАЗАҚСТАН РЕСПУБЛИКАСЫНЫҢ
БIЛIМ ЖӘНЕ ҒЫЛЫМ МИНИСТРЛIГI

Техникалық кибернетика кафедрасы

Программалау пәнi бойынша

КУРСТЫҚ ЖОБАҒА ТҮСIНIК

Тақырыбы:

Delphi жүйесінде ойын құрастыру

Мазмұны

1.
Кiрiспе ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ..
... ... ... ... ... ... ... ... ... ..3
2. Есептiң математикалық
қойылымы ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 5
3. Есептi шығарудың тәсiлдерiн
баяндау ... ... ... ... ... ... ... ... ... ... ... ... ... ..6
3.1. Iздеу
алгоритмдерi ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
6
3.1.1. Сызықты
iздеу ... ... ... ... ... ... ... .. ... ... ... ... ... ... ... ... ... ..6
3.1.2. Тосқауылы бар
iздеу ... ... ... ... ... ... ... .. ... ... ... ... ... ... ...6
3.1.3. Екiлiк (бинарлы)
iздеу ... ... ... ... ... ... ... .. ... ... ... ... ... ... .8
3.2. Сорттау
алгоритмдерi ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... . ..9
3.2.1. Таңдау арқылы
сорттау ... ... ... ... ... ... ... ... ... ... ... ... ... ..9

3.2.2. Айырбаспен сорттау (“көбiкше”
тәсiлiмен) ... ... ... ... ..10

3.2.3. Шейкерлi
сорттау ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...11
3.2.4. Қосу арқылы
сорттау ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... .11
3.2.5. Хоар
сорттауы ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ..
... 13
4. Алгоритмнiң негiзгi ойын
баяндау ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...14
5. Логикалық құрылымның баяндалуы (Паскаль тiлiндегi программа үшiн).16
6. Блок-
схема ... ... ... ... ... ... ... .. ... ... ... ... ... ... ... ... ... ... ..
... ... ... ... ... ... ... ... ... 20
7. Қолданылған техникалық
жабдықтар ... ... ... ... ... ... .. ... ... ... ... ... ... ... ... ... .26
8. Бағдарламаны шақыру және
жүктеу ... ... ... ... ... ... ... . ... ... ... ... ... ... ... ... ... 26
9. Есептi шығару алгоритмнiң программалық жазбасы (Паскаль тiлiнде) ... ..27
10. Пайдаланылған әдебиеттер
тiзiмi ... ... ... ... ... ... ... . ... ... ... ... ... ... ... ... ... ...

1. Кiрiспе

Ойын деген – ойын сауық, демалыс, спорттық жарысқа негiзделген жұмыс
түрi. Ойын адамның көңiлiн өсiрiп, ойын сергiтiп қана қоймай, сонымен қатар
оның таным-түсiнiгiн арттырады.
Қазір компьютерлік ойындарды жасау кең ауқымды болып отыр. Қазiргi
кездегi бағдарламалау тiлдерi көмегiмен бағдарламаларда ойындарды санаулы
сағаттар ішінде жасауға болады, көптегкн компьютерлiк ойындарды жасайтын
фирмалар бар. Бұл бағдарламалар осындай мақсаттарға арналған құралдары
жақсы дамытылған. Онда ойын жасап жүрген шеберлер өздерінің барлық
мүмкіндіктерін көрсете алады, ал жас бағдарламалаушылардың үйренуіне
болады.
Бүгінгі күнде компьютерлік ойындардың көптеген түрлері бар. Олар
типіне, әдістеріне қарай бірнеше топқа бөлiнедi.
Лабиринт ойындары ең ежелгі ойындардың бірі болып табылады. Олардың
мағынысын қысқартылған түрде келтірсек: сіз лабиринт бойынша жүресіз, бір
жерлерде кедергілер болады т.с.с. Олардың алғашқылары екі өлшемді графика
жабдықтарымен жасалса, ал қазір үш өлшемді ойындарға айланып отыр.
Үстелдегі ойындарды жасаудың алғашқы кезеңінде оны жасаушылар бір
мақсат көздеді. Ол – жасанды интеллекті ойнату. Кейін барып олардың үш
өлшемді түрлері пайда болды. Мұндай ойындар типiне шахмат, дойбы, домино,
Морской бой, Бильярд ойындары және т.б. жатады.
Карталық ойындар да үстелдік ойындар сияқты өзінің пайда болу кезінен
бері көп өзгере қойған жоқ. Тек ойнаушылар саны арттырылды және колодты
таңдау сияқты әртүрлі мүмкіндіктер пайда болды. Бұл ойындарға атақты
Дурак, Преферанс, Покер және басқалары жатады.
Викториналық ойындар әдетте көп орын алады, бірақ жаңадан шыққан
көптеген бағдарламалрдың көмегімен оларды жасау қиын емес. Бұл жерде
сұрақтар және олардың жауабы мүмкін болатын варианттар беріледі. Ойынның
мақсаты – мейлiнше көп сұраққа жауап берiп, ойынның түбiне жету. Бұған
мысал ретінде Поле чудес, О,счастливчик!, Угадай мелодию, Лимпопо
ойындарын жатқызуға болады.
Атқыштар - ойындарда сіз космостық кемені басқарып, әртүрлі
нысаналарды атасыз немесе жаудың самолеттарын жаруға тырысасыз, әйтпесе су
асты кемелерден теңіз бетіндегі кемелерді бомбылайсыз. Әдетте бұл ойындар
екі өлшемді болып келеді.
Жүргіштер (бродилки) - ойындарында басты кейіпкер болады, оны, әрине,
сіз басқарасыз. Ол жүгіріп отырып (ойын уақыты маңызды болса) немесе жүріп
отырып әртүрлі кедергілерден өтеді, берiлген шарттарды орындауға
тырысадыжәне т.с.с.
Стратегиялар – ұзақ уақытты және ойыншыдан белгiлi бiр қабiлеттердi
талап етедi. Негiзгi ой – дұрыс ұйымдастырушылық, жылдам ойлау.
Симуляторлар – компьютер көмегiмен автокөлiк, ұшақ, тiкұшақ, танк,
мотоцикл және т.б. көлiк түрiн айдауға негiзделген.
Басауыртпа ойындары (головоломки). Оларға Тетрис ойынын жатқызуға
болады. Бұл ойының мақсаты - түскен денелерді тығызырақ орналастыру және
толған қатарлардан құтылу. Ойын барысында денелер күрделірек бола бастайды
және олардың түсу жылдамдықтары артады. Ойын мақсаты – логика көмегiмен
ойынды жеңiп шығу. Негiзiнен бұл ойындар типiне әртүрлi пазлдар,
кросвордтар, логикалық және т.б. жатады.

Есептi шығарудың тәсiлдерiн баяндау

3.1. Iздеу алгоритмдерi

Iздеу алгоритмдерi мысалы массивте белгiлi қасиеттерi бар
элементтердi табу үшiн қолданылады. Әдетте элементтiң алғашқы және соңғы
кiрулерiн iздеудегi есеп берiлгендерiмен ажыратады. Төменде келтiрiлген
барлық алгоритмдерде N бүтiн санды А массивiнде Х-қа тең элемент iздеу
керек деп есептеледi.
3.1.1. Сызықты iздеу
Сызықты iздеу екi еселi шарты бар циклмен (while немесе repeat -
until) орындалады. Бiрiншi шарт индекстiң массивке тиiстiлiгiн тексередi,
мысалы, (i=N). Екiншi шарт – бұл iздеудiң шарты. Бiздiң жағдайда while
циклiнде бұл iздеудi жалғастыру шарты: (A[i]X), ал repeat – until
циклiнде бұл iздеудi аяқтау шарты: (A[i]=X). Цикл денесiнде әдетте тек
жалғыз оператор: массивтегi индекстiң өзгеруi ғана жазылады.
Циклдан шыққаннан кейiн қай шарт бойынша шыққанымызды тексеруiмiз
керек. Әдетте if операторында циклдiң бiрiншi шартын қайталайды. Бұл шарт
орындалуын while циклi жағдайында шарттың орындалуын, ал repeat – until
циклiмен оның бұзылуы кезiнде сәттi iздеу деп айтуға болады.
Мысалы: Сызықты iздеу.
program Poisk1;
var A:array[1..100] of integer;
N, X, i:integer;
begin
read(N); {N=100}
for i:=1 to N do
writeln('Массивтi енгiзiңiз');
read(A[i]);
writeln('Iзделiнетiн санды енгiзiңiз');
read(X);
i:=1; {i:=0;}
while (i=N) and (A[i]X) do i:=i+1;
{repeat i:=i+1; until (iN) or (A[i]=X);}
if i=N then write(' A массивiне ', i,' орында', X ,' санының бiрiншi
кiруi ')
else write('тапқан жоқпыз');
end.
Соңғы кiрудi iздеу кезiнде енгiзгеннен кейiн келесi операторлар жүру
керек.
i:=N; {i:=N+1;}
while (i=1) and (A[i]X) do i:=i-1;
{repeat i:=i-1; until (i1) or (A[i]=X);}
if i=1 then write(' A массивiне ', i,' орында', X ,' санының соңғы кiруi
')
else write('тапқан жоқпыз');

3.1.2. Тосқауылы бар iздеу
Тосқауылы бар iздеу әрбiр рет массив шекарасымен байланысқан циклдегi
шартты iздей бермеу идеясынан тұрады. Бұны массивке тосқауыл орнату: iздеу
шартын қанағаттандыратын кез-келген элемент орнату арқылы жүзеге асыруға
болады. Бұл жағдайда индекстiң өзгеруiне шек қойылады.
Ендi тек iздеу шарты ғана қалып, табылған элементте немесе тосқауылда
циклдан шығуға болады. Мұндай жағдайда циклдан шыққаннан кейiн бiз
тосқауылды тапқан жоқ па екендiгi тексерiледi. Тосқауылы бар iздеудi
есептеу қиындығы сызықтыға қарағанда төмен, бiрақ сондай тiзбектi өлшемiдi,
N – массив элемент саны бар.
Тосқауылды орнатудың екi тәсiлi бар: қосымша элемент немесе массивтiң
ең шеткi элементiнiң орнына.
Мысалы: Тосқауылы бар iздеу
program Poisk2a;
var A:array[1..101] of integer;
N,X,i:integer;
begin
read(N); {N=100}
for i:=1 to N do
writeln('Массивтi енгiзiңiз');
read(A[i]);
writeln('Iзделiнетiн санды енгiзiңiз');
read(X);
A[N+1]:=X; {қосымша элемент арқылы тосқауыл қою}
i:=1; {i:=0;}
while A[i]X do i:=i+1;
{repeat i:=i+1; until A[i]=X;}
if i=N then write(' A массивiне ', i,' орында', X ,' санының бiрiншi
кiруi ')
else write('тапқан жоқпыз');
end.
program Poisk2b;
var A:array[1..100] of integer;
N,X,i,y:integer;
begin
read(N); {N=100}
for i:=1 to N do read(A[i]);
read(X);
y:=A[N]; {соңғы элементтi сақтау}
A[N]:=X; {тосқауылды массивтiң соңғы орнына орнату}
i:=1; {i:=0;}
while A[i]X do i:=i+1;
{repeat i:=i+1; until A[i]=X;}
if (iN) or (y=X) then
write(' A массивiне ', i,' орында', X ,' санының бiрiншi кiруi ')
else write('тапқан жоқпыз');
A[N]:=y; {массивтiң оңғы элементiн қалпына келтiру}
end.
3.1.3. Екiлiк (бинарлы) iздеу
Екiлiк iздеу алгоритмiн берiлген қасиетi бар элементтi iздеу тек сол
қасиет бойынша реттелген массивтен табуға болады. Сонымен берiлген мәнi бар
элементтi элементтерi өспелi не кемiмелi массивтен табуға болады. Ал,
мысалы, берiлген цифрлар қосындысы бар санды табу үшiн, массив
элеметтерiнiң цифрлары қосындысының өсу не кему ретiмен орналасуы қажет.
Алгоритм идеясы массив әрбiр рет қақ бөлiнiп, берiлген элемент жатуы
мүмкiн бөлiгi алынады. Бөлiну iздеуге арналған массив бөлiгiнiң бiр
элементтен көп болғанша жүрiп, содан кейiн сол қалған элементтi берiлген
iздеу шартына орындалатындығы тексерiледi.
Бұл алгоритмнiң бiрiншi және соңғы кiрулердi iздеуге арналған екi
модификациясы бар. Бұл орташа элемент қалай таңдалынатындығына байланысты:
кiшi не үлкен жаққа қарай дөңгелектенуi. Бiрiншi жағдайда орташа элемент
массивтiң сол жағына, ал екiншi жағдайда оң жағына тиiстi болады.
Екiлiк iздеу алгоритм жұмысы процесiнде iздеу жүргiзiлуi қажеттi
фрагмент бөлiгi әрбiр рет шамамен екi есе азаю керек. Бұл алгоритмнiң
есептеу қиындығы 2 негiзi бар N логарифмдi дәрежеге тең, мұндағы N – массив
элементтерiнiң саны.
Мысалы: Х санының өсу ретiмен орналасқан массивке енуiн iздеу
program Poisk3a;
var A:array[1..100] of integer;
N,X,left,right,i,c:integer;
Begin
Writeln(‘массивтiң өлшемiн енгiз’);
read(N); {N=100}
writeln('өсу ретiмен массив енгiзiңiз');
for i:=1 to N do read(A[i]);
writeln(‘өз элементiңдi енгiз’);
read(X);
left:=1; right:=N;
{iздеуге арналған сол және оң шекара фрагменттерi}
while leftright do
begin
c:=(left + right) div 2;
{кiшi жаққа қарай дөңгелектелiнген орта}
if XA[c] then
{егер массив кему ретiмен енгiзiлсе, онда if XA[c]}
left:=c+1
{left ауыстыра отырып ортасыз оң жағын аламыз}
else right:=c;
{right ауыстыра отырып ортасыз сол жағын аламыз }
end;
if X=A[left] then {мұндағы left = right, бiрақ әрқашан емес = c}
writeln(' A массивiне ', left,' орында', X ,' санының соңғы кiруi ')
else writeln('тапқан жоқпыз');
end.

3.2. Сорттау алгоритмдерi

Сорттаудың ең қарапайым есебi массив элементтерiнiң өсу не кему
ретiмен орналастыру болып табылады. Басқа есеп болып, берiлген белгiлер
бойынша массив элементтерiн реттеу. Әдетте мұндай белгi ретiнде аргументi
массив элементтерi болып табылатын белгiлi функция мәнi болып табылады. Бұл
функцияны реттеушi функция деп атау қабылданған.
Сорттаудың әр түрлi тәсiлдерi бар. Әрбiр тәсiлдi N бүтiн сандардан
өспелi массивтi сорттау мысалында көрсетемiз.

3.2.1. Таңдау арқылы сорттау

Тәсiл идеясы массивтiң максималды элементiн тауып, оны соңғы элемент
(N номерлi) орнымен ауыстырылады. Содан кейiн максималды элемент N-1 орынға
дейiн iзделiп, сол N-1 орынға қойылады және т.с.с. Максимум емес, минимум
элемент iзделiп, оны бiрiншi, екiншi және т.с.с. орынға қоюға болады.
Сонымен қатар бұл әдiстiң модификацияланған түрi – бiр мезетте максимум
және минимум элементтердi iздеу қолданылады. Бұл жағдайда сыртқы циклдың
қадамдар саны N div 2.
Таңдау арқылы сорттаудың есептеу қиындығы - N*N шамасының өлшемi,
әдетте оны O(N*N) деп жазады. Бұл салыстырулар саны бiрiншi максимумды
iздегенде N-1-ге тең, содан кейiн N-2, N-3 және т.с.с. 1-ге дейiн, соымен
N*(N-1)2 болумен түсiндiрiледi.
Мысалы: А массивiнiң N бүтiн сандарының өсуi бойынша таңдау арқылы
сорттау.
program Sort_Vybor1;
var A:array[1..100] of integer;
N,i,m,k,x : integer;
begin
write('Массив элементтерiнiң саны');
read(N);
for i:=1 to n do
writeln('Массивтi енгiзiңiз');
read(A[i]);
for k:=n downto 2 do { k – max-ты iздеуге қажеттi элементтер саны }
begin
m:=1; { m - max орны}
for i:=2 to k do if A[i]A[m] then m:=i;
{ m және k номерлi элементтердi орындарымен ауыстырамыз}
x:=A[m]; A[m]:=A[k]; A[k]:=x;
end;
for i:=1 to n do write(A[i],' '); {реттелген массив}
end.
Мысалы: Жоғарыдағы есеп, бiрақ бiр мезеттегi max пен min таңдау
арқылы.
program Sort_Vybor2;
var A:array[1..100] of integer;
N,i,m,k,x,p : integer;
begin
write('Массив элементтерiнiң саны');
read(N);
for i:=1 to n do
writeln('Массивтi енгiзiңiз');
read(A[i]);
for k:=1 to n div 2 do { k - max және min жұбының орны }
begin
m:=k; { m - max орны }
p:=k; { p – min орны }
{max және min k-дан n-k+1 элементтер арасында iзделедi }
for i:=k+1 to n-k+1 do
if A[i]A[m] then m:=i
else if A[i]A[p] then p:=i;
{ p және k номерлi элементтердi орындарымен ауыстырамыз }
x:=A[p]; A[p]:=A[k]; A[k]:=x;
if m=k then m:=p;
{егер max k орында тұрса, ендi ол p орында тұр }
{ m және n-k+1 номерлi элементтердi орындарымен ауыстырамыз }
x:=A[m]; A[m]:=A[n-k+1]; A[n-k+1]:=x;
end;
for i:=1 to n do write(A[i],' '); {реттелген массив}
end.

3.2.2. Айырбаспен сорттау (“көбiкше” тәсiлiмен)

Тәлiл идеясы рет бойынша массивтiң көршiлес жұптары тексерiлуiнде
құрылған. Егер олар олар керектi реттiлiкте болмаса, онда көршiлес
элементтер жұбын орындарымен ауыстырамыз. Мұндай бiр өтуден кейiн N номерi
орынында максимал элемент орналасады (бiрiншi көбiкше “қалқып” шықты).
Келесi өту N-1 элементке дейiн қарастыру керек және т.с.с. Барлығы N-1 өту
қажет болады. Айырбаспен сорттаудың есептеу қиындығы O(N*N).
Мысалы: А массивiнiң N бүтiн сандарының өсуi бойынша айырбаспен
сорттау. (Негiзгi вариант)
program Sort_Obmen1;
var A:array[1..100] of integer;
N,i,k,x : integer;
begin
write('Массив элементтерiнiң саны');
read(N);
for i:=1 to n do
writeln('Массивтi енгiзiңiз');
read(A[i]);
for k:=n-1 downto 1 do { k – салыстырылатын жұптар саны }
for i:=1 to k do
if A[i]A[i+1] then
{көршiлес элементтердi орындарымен ауыстырамыз}
begin x:=A[i]; A[i]:=A[i+1]; A[i+1]:=x; end;
for i:=1 to n do write(A[i],' '); {реттелген массив}
end.

3.2.3. Шейкерлi сорттау

Бұл алгоритм негiзiнен айырбас арқылы сорттаудың модификациясы болып
табылады. Айырмашылығы айырбас арқылы сорттауда өтулер бiр жақты ғана
болса, мұнда бағыт әрбiр рет сайын өзгерiп отырады. Сонымен қатар шейкерлi
сорттауда айырбас фактi мен айырбастың соңғы орнын анықтауға болады.
Негiзгi алгоритмде екiлiк өтулер саны N div 2-ге теi. Шейкерлi сорттаудың
есептеу қиындығы O(N*N).
Мысалы: N бүтiн сандардан құралған А массивiн Шейкерлi сорттау арқылы
өсу ретiмен орналастыру.
program Shaker;
var A:array[1..100] of integer;
N,i,k,x,j,d : integer;
begin
write('Массив элементтерiнiң саны');
read(N);
for i:=1 to n do
writeln('Массивтi енгiзiңiз');
read(A[i]);
d:=1; i:=0;
for k:=n-1 downto 1 do { k – салыстырылатын жұптар саны }
begin
i:=i+d;
for j:=1 to k do
begin
if (A[i]-A[i+d])*d0 then
{көршiлес элементтердi орындарымен ауыстыру}
begin x:=A[i]; A[i]:=A[i+d]; A[i+d]:=x; end;
i:=i+d;
end;
d:=-d;
{қозғалыс бағытын қарама-қарсыға өзгертемiз}
end;
for i:=1 to n do write(A[i],' '); {реттелген массив}
end.
3.2.4. Қосу арқылы сорттау
Берiлген тәсiлдiң идеясы әрбiр рет К элементтен тұратын реттелген
массивке реттеулiгi өзгермейтiндей етiп тағы бiр элемент қосамыз. Сорттаалу
массив енгiзiлумен қатар жүрiп отыруы мүмкiн.
Сорттау алдында массивтiң реттелген бөлiгi тек бiр ғана элементтен
тұрады, ол бөлек енгiзiледi немесе егер массив бар болса және ол жалғыз
және дұрыс орында тұр деп есептеледi.қосылатын элементке орын iздеудiң
әртүрлi тәсiлдерi қосу арқылы сорттаудың түрлi модификацияларына алып
келедi.
Сызықты iздеудi қолданғанда, қосу арқылы сорттаудыi есептеу қиындығы
O(N*N), ал екiлiк iздеу кезiнде - O(N*LogN) (негiзi 2 болатын логарифм)
болады.
Мысалы: N бүтiн сандардан құралған А массивiн сызықты iздеуi бар қосу
арқылы сорттау арқылы өсу ретiмен орналастыру.
program Sort_Include1;
var A:array[1..100] of integer;
N,i,k,x : integer;
begin
write('Массив элементтерiнiң саны ');
read(N);
writeln('Массивтi енгiзiңiз');
read(A[1]); {for i:=1 to n do read(A[i]);}
{k – массивтiң реттелген бөлiгiндегi элементтер саны}
for k:=1 to n-1 do
begin
read(x); {x:=A[k+1];}
i:=k;
while (i0)and(A[i]x) do
begin
A[i+1]:=A[i];
i:=i-1;
end;
A[i+1]:=x;
end;
for i:=1 to n do write(A[i],' '); {реттелген массив}
end.
Мысалы: N бүтiн сандардан құралған А массивiн екiлiк iздеуi бар қосу
арқылы сорттау арқылы өсу ретiмен орналастыру.
program Sort_Include2;
var A:array[1..100] of integer;
N,i,k,x,c,left,right : integer;
begin
write('Массив элементтерiнiң саны');
read(N);
writeln('Массивтi енгiзiңiз');

read(A[1]); {for i:=1 to n do read(A[i]);}
{k - массивтiң реттелген бөлiгiндегi элементтер саны }
for k:=1 to n-1 do
begin
read(x); {x:=A[k+1];}
left:=1; right:=k;
{iздеуге керектi фрагменттiң оң және сол шекарасы}
while leftright do
{соңғы кiрудiң екiлiк iздеуi}
begin
c:=(left+right+1) div 2;
{ үлкен жаққа дөңгелектенген ортасы }
if x=A[c] then left:=c
{ортасы мен оң жағын аламыз}
else right:=c-1; {ортасыз сол жағын аламыз}
end;
if x=A[left] then left:=left+1;
{х қосылуға орын босата отырып, массивтi 1 орынға оңға жылжытамыз}
for i:=k downto left do A[i+1]:=A[i];
A[left]:=x;
end;
for i:=1 to n do write(A[i],' '); {реттелген массив}
end.
3.2.5. Хоар сорттауы
Бұл сорттауды жылдам сорттау деп те атайды. Әдiстi 1962 жылы Оксфорд
университетiнiң профессоры К.Хоар жасаған болатын. N бүтiн сандардан
құралған А массивiн өсу ретiмен орналастыру принципiнiң жұмысын
қарастырайық.
Қандай да бiр элементтiң мәнi (әдетте ортаңғы) Х айнымалысына
жазылады. Массив элементтерi қарастырылады. Солдан-оңға қарай жылжығанда Х-
тан үлкен не оған тең элемент iздеймiз. Ал оңнан-солға қарай жылжығанда Х-
тан үлкен не тең элемент iздеймiз.Табылған элементтер орындарымен
ауыстырылады және қарама-қарсы iздеу жалғастырылады.
Содан кейiн массив екiге бөлiнедi. Бiрiншiсiнде Х-тан кiшi не тең
элементтер, ал оң жағында Х-тан үлкен не тең элементтер орналасады. А
массивiн сорттаудағы алғашқы есептi алынған массив бөлiктерiн сорттаудағы
екi есепшеге бөлуге болады.
Берiлген рекурсивтi алгоритмнiң бiр шақырылуының есептеу қиындығы
сортталатын массив үзiндiсiндегi элементтер санына пропорционал. Ең жақсы
жағдайда бөлiктерге бөлу қақ ортасынан болады, сондықтан жылдам сорттаудың
бүкiл алгоритмiнiң есептеу қиындығы N*LogN (негiзi 2 болатын логарифм)
өлшемдi болады. Есептеу қиындығы орташа сол мәндi.
Мысалы: N бүтiн сандардан құралған А массивiн жылдам сорттау арқылы
өсу ретiмен орналастыру.
program Quick_Sort;
var A:array[1..100] of integer;
N,i : integer;
{Процедураға сортталатын үзiндiнiң оң және сол шекаралары берiледi}
procedure QSort(L,R:integer);
var X,y,i,j:integer;
begin
X:=A[(L+R) div 2];
i:=L; j:=R;
while i=j do
begin
while A[i]X do i:=i+1;
while A[j]X do j:=j-1;
if i=j then
begin
y:=A[i]; A[i]:=A[j]; A[j]:=y;
i:=i+1; j:=j-1;
end;
end;
if Lj then QSort(L,j);
if iR then QSort(i,R);
end;
begin
write('Массив элементтерiнiң саны');
read(N);
for i:=1 to n do
writeln('Массивтi енгiзiңiз');
read(A[i]);
QSort(1,n); {бiрiншiден n-шiге дейiнгi элементтердi реттеу}
for i:=1 to n do write(A[i],' '); {реттелген массив}
end.

4. Алгоритмнiң негiзгi ойын баяндау
Бұл бағдарлама негiзiнен бiр функция, үш процедура және өзiнiң негiзгi
денесiнен құрылған. Әрқайсысын бөлек-бөлек қарастырайық.
1. Random_ функциясы. Бұл функцияның негiзгi атқаратын қызметi – ол
компьютердiң төрт таңбалы сан жасыруында болып табылады. Функция санның
төрт цифрларын бөлек-бөлек кездейсоқ алады және осы бөлек цифрлар бiр
таңбалы болады. Осы сандарды бiрiнен кейiн бiрiн жолдық өрнекке айналдырып
отырады. Соның нәтижесiнде компьютер жасырған төрт таңбалы сан шығады.
Санды жасыру барысында бiрнеше шарт қойылады және тексерiледi:
а) сан мiндеттi түрде төрт таңбалы болуы керек;
ә) компьютер жасырған санның бiрiншi цифрi 0-ге тең болмауы қажет;
б) жасырылған санның цифрларының арасында бiрдей мәндiлерi болмауы шарт.
2. PrintText процедурасы. Процедураның негiзiнен атқаратын қызметi – келесi
процедурада келтiрiлетiн көмек, ескертулердi экранның төменгi жағындағы
қызыл жолақшада мәтiн түрiнде келтiру.
3. Zastavka процедурасы. Бұл процедура программаның бет-келбетiн, яғни
заставкасын келтiредi, ойынды безендiредi. Процедура негiзiнен CRT, GRAPH
модульдерiнiң (кiтапханаларының) мүмкiншiлiктерiне негiзделген. Экранның
қақ ортасында ойынның аты берiлген және ол қалған сөздерден айрықша үлкен
қарптермен берiлген және оның түсi белгiлi уақыт аралығында өзгерiп
отырады. Әрине жоғарғы және төменгi жағында кiшi қарiптермен, әр түрлi
түстi қосымша ойынға байланысы сөйлемдер келтiрiлген. Берiлген сөйлемдер
қара экран бетiнде әр жерiнен түрлi-түстi жұлдыздар өшiп-жанған фонында
және экранның шетттерi арнайы көгiлдiр түстi оюы бар шекарамен қоршалған.
Мұның барлығы компьютердiң жүйелiк динамигiнен шыққан дыбысымен бiрге
берiледi.
4. ReadPlayerDigits процедурасы. Бұл процедураның негiзгi атқаратын
қызметi – ойыншыға сан енгiзу мүмкiндiгiн беру және осы сандарды тексеру.
Ойыншы сан енгiген кезде процедура PrintText процедурасының көмегiмен
ойыншыға нұсқаулар берiп отырады. Нұсқаудың шығуының бiрнеше шарты бар.
Олар:
а) комппьютердiң ойлаған санын табуға шақырады;
ә) егер енгiзiлген сан төрт таңбалы болмаса, ойыншы бұл жайында хабар
алады;
б) егер енгiзiлген сан болмаса, ойыншыға оның сан енгiзбегендiгi жайында
хабар берiледi.
Сонымен қатар бұл процедура келесi екi жұмысты атқара алады:
а) егер ойыншы ойыннан шыққысы келсе, “end” сөзiн терсе жеткiлiктi;
ә) егер ойыншы компьютер жасырған санды таба алмаса, онда ол “lose” сөзiн
терсе, компьютер жасырған санын хабарлап, ойыннан шығады.
5. Бағдарламаның негiзгi денесi. Бағдарлама ойынның негiзгi шарттарын
ойыншыға жеткiзедi, жоғарыдағы аталған функция мен процедураларды
қолданады. Сонымен қатар ойыншының атын енгiзуге мүмкiндiк бередi, оған
санның қанша цифрiн тапқанын “Бұқа”, қаншасы өз орнын тапқанын “Сиыр” деп
көмек ретiнде астарлап жеткiзiп отырады. Егер ойыншы жеңген болса, оны
құттықтап, қайтадан бастағысы келетiндiгi жайында сұрайды. Ойынның ең
соңында берiлген ойынды жазған автор жайында қысқаша мәлiмет келтiрiледi.
5. Логикалық құрылымның баяндалуы

1, 2. Программаны жүктеу алдында RKKAZ.COM файлын жүктеу керектiгi
жайындағы ескерту.
3. Программаның аты.
4. CRT,GRAPH модульдерiн (кiтапханаларын) қосу.
5-16. Программа жайында қысқаша баяндау.
17. Цифрлары әртүрлi кездейсоқ төрт таңбалы сандар.
18. Random_ функциясы - компьютер жасырған сан.
19. Таңба (метка) қою.
20. Тұрақтыларды баяндау бөлiмi.
21. SetDigit: set of byte=[1,2,3,4,5,6,7,8,9,0]; - 0-9 сандар жиыны.
22. Айнымалыларды баяндау бөлiмi.
23. i - төрт таңбалы сандар iшiндегi әрбiр цифр, k – төрт цифр.
24. Random_Str, S – төрт таңбалы санды жолға жазуға көмектесетiн жолдық
өрнектер.
25. Функцияның басталуы.
26. Randomize процедурасы – кездейсоқ сандарды таңдау генераторы.
27. k:=0 – 4 цифр, әзiрше олардың саны 0.
28. Random_Str – 4-таңбалы сандардың жолдық өрнегi, әзiрше ол бос.
29-39. 4-цифрлы санды таңдайтын цикл.
30. 1: - таңба, i := Random(10) – i-кез-келген 0 мен 9 арасындағы сан.
31. Егер i ( SetDigit онда келесi жолға көшу.
32-38. Циклдың басы.
33. Str(i,S) – S жолға i санын жазу.
34. Егер k=0 және i=0 болса, онда 1:, яғни 30.-ға бару.
35. Random_Str жолдық өрнекке толық төрт цифрдi жазу.
36. SetDigit сандар жиынынан i элементiн алып тастау.
37. k-ны 1-ге арттыру.
38. 32 - циклдың соңы.
39. 29 – цикл k=4 болғанша жүредi.
40. Random_ функциясын Random_Str жолдық өрнек ретiнде бейнелеу.
41. Random_ функциясының соңы.
42-58. PrintText процедурасы – экранның төменгi жағында көмек берiп тұрады.
43. Айнымалыларды баяндау бөлiмi.
44. х, у – курсор координаттары.
45. Процедураның басталуы.
46. Курсордың Х координатын анықтау.
47. Курсордың Ү координатын анықтау.
48. Экранда мәтiн орналасқан терезе (1,25,80,25) координатын анықтау.
49. Фон түсiн анықтау (қызыл).
50. Мәтiн түсiн анықтау (ақ).
51. Активтi терезенi тазарту.
52. Берiлген координат бойынша (WhereX+40-length(Text) div 2,WhereY)
курсорды жылжыту.
53. Берiлген мәтiндi (Text) экранға шығару.
54. Экранда мәтiн орналасқан терезе (1,1,80,24) координатын анықтау.
55. Мәтiн түсiн анықтау (сары).
56. Фон түсiн анықтау (қара).
57. Курсорды (x,y) координатқа орналастыру.
58. PrintText процедурасының аяқталуы.
59-96. Zastavka процедурасы – ойынның заставкасы.
60. n=20 тұрақтысы – түстердiң саны.
61. Айнымалыларды баяндау бөлiмi.
62. grDriver,grMode,ErrorCode - графиканы инициализациялауға қажеттi
айнымалылар.
63. Процедураның басы.
64-72. Графиканы қосып, тексеру.
73-94. Жалпы графиканың циклi.
74. Нұсқа мен түстi толтыратын жиын (6 – нұсқаның түрi, 9 – нұсқасның
түсi,
көгiлдiр).
75. Жоғарғы шекара (рамка қою), координаталары (1-сол жақ шекарасы, 1-
жоғарғы жағы, 640-оң жағы, 15-төменгiсi).
76. Оң жақ шекара (рамка қою), координаталары (640-сол жақ шекарасы, 1-
жоғарғы жағы, 610-оң жағы, 480-төменгiсi).
77. Төменгi шекара (рамка қою), координаталары (640-сол жақ шекарасы, 480-
жоғарғы жағы, 1-оң жағы, 465-төменгiсi).
78. Сол шекара (рамка қою), координаталары (15-сол жақ шекарасы, 480-
жоғарғы жағы, 1-оң жағы, 1-төменгiсi).
79. Мәтiн түсi жасыл.
80. Х осiндегi координаты - 200, Ү осiндегi координаты – 30 болатын
“AttilaSoftGames Present” сөйлемiн шығару.
81. Мәтiн түсiн көкшiлге қою.
82. Х осiндегi ... жалғасы

Сіз бұл жұмысты біздің қосымшамыз арқылы толығымен тегін көре аласыз.
Ұқсас жұмыстар
«Компьютер құрастыру»
Paradox берілгендер қоры
Delphi бағдарламалау тілі
Физика пәнінен интерактивті тапсырмалар жасақтау
Мәліметтер базасы кестелері
Интерактивті тапсырма және оны жасақтауға қолайлы бағдарламалық құралдары
Delphi - жаңа программаны өңдеуге арналған инструменттер жиынтығының интегралданған ортасы
Мәліметтер қорын басқару жүйесінің архитектурасы
Компоненттер, олардың қасиеттері мен әдістері.
Электрондық оқулықтың құрылымы
Пәндер