Лекция · 5.2

Алгоритмді әзірлеу

Жаңа жиналмалы үстел сатып алдың делік, қорапта қадаммен жазылған нұсқаулық бар: «1-бұранданы алыңыз, 2-тесікке бұраңыз, 3-аяғын бекітіңіз...». Егер нұсқаулықтың бір қадамы түсініксіз немесе жоқ болса — үстел дұрыс жиналмайды. Дәл осындай дәл әрі түсінікті нұсқаулықты компьютерге қалай жазу керектігін, оны қандай формада ұсынуға болатынын осы сабақта үйренеміз — алгоритмді әзірлеу. Бұл тақырып ҰБТ-да теориялық сұрақтар түрінде жиі кездеседі: алгоритмнің қасиеттерін ажырату, блок-сызба белгілерін тану, алгоритмді жазудың формаларын білу.

Алгоритм деген не?

Ойланып көр: досыңа жаңа орынды қалай табуды түсіндіресің делік. «Сол жаққа бұрыласың» дегеннің орнына «біраз жүресің, содан кейін бұрыласың» десең, дос қанша жүру керектігін біле алмайды, адасып кетуі мүмкін.

Сұрақ туады: нұсқаулықты қалай жазсақ, оны орындаушы (дос, не компьютер) еш қателеспей, дәл орындай алады?

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

1️⃣
Қадам 1
2️⃣
Қадам 2
3️⃣
Қадам 3
🎯
Мақсат
Анықтама
Алгоритм — алға қойылған мақсатқа жету немесе берілген есепті шешу үшін орындаушыға қандай әрекеттерді қалай жасау керектігін түсінікті және дәл көрсететін нұсқаулық.

Анықтаманы бөлшектеп көрейік: «Алға қойылған мақсатқа жету немесе есепті шешу» — алгоритм әрқашан бір нақты нәтижеге бағытталған, мақсатсыз алгоритм болмайды. «Орындаушы» — бұл алгоритмді нақты орындайтын тарап, ол адам да, компьютер де, тіпті робот та болуы мүмкін. «Қандай әрекеттерді қалай жасау керектігін» — алгоритм тек НЕ істеу керегін емес, ҚАЛАЙ істеу керегін де көрсетеді. «Түсінікті және дәл» — бұл алгоритмнің ең маңызды талабы: орындаушы қадамды екіұшты түсінбеуі керек.

Неге дәл осылай талап етіледі? Себебі орындаушы (әсіресе компьютер) өзінен ештеңе «болжамайды» — ол тек нақты берілген нұсқауды орындайды. Егер нұсқау түсініксіз немесе толық болмаса, орындаушы қатеге жол береді немесе жұмысты тоқтатады. Мысалы: «дәптерге 2+2 жазып, нәтижесін шығар» — бұл алгоритм, себебі әрекет нақты әрі реттелген. Ал «дәптерге бірдеңе жаз» — бұл алгоритм емес, себебі не істеу керегі анық емес.

Алгоритм — ас рецептіне ұқсас: «300 грамм ұн алыңыз, оны 2 жұмыртқамен араластырыңыз, 180 градуста 25 минут пісіріңіз». Әр қадам нақты сан мен әрекетпен жазылған, реті де белгілі — рецептті дәл осы ретпен орындамасаң, тағам дұрыс шықпайды.

⚠️
Жиі кеткен қате: көп оқушылар кез келген жалпы сипаттаманы алгоритм деп есептейді (мыс. «компьютерді қос, бағдарлама жаз»). Шынайы алгоритм әрбір қадамды нақты, бөлшектеп көрсетуі керек, әйтпесе орындаушы (әсіресе компьютер) оны орындай алмайды.
Алгоритмнің 5 қасиеті

Енді сұрақ туады: кез келген қадамдар тізбегі алгоритм бола ма? Мысалы, «бір сан ойлап тап, оны екі есе ұлғайт» деген нұсқау — алгоритм бола ма?

Жоқ, бұл толық алгоритм емес, себебі «бір сан ойлап тап» деген қадам әркімде әртүрлі нәтиже береді — бұл анық емес. Алгоритм болу үшін нұсқаулық белгілі бір талаптарды қанағаттандыруы керек. Информатикада мұндай талаптарды алгоритмнің қасиеттері дейміз — олар бес негізгі белгіден тұрады, әрқайсысы алгоритмнің «шынайы» алгоритм болуын қамтамасыз етеді.

ҚасиетСипаттамасы
ТүсініктілікОрындаушы алгоритмді қалай орындау керектігін білуі тиіс
ДискреттілікАлгоритм аяқталған қадамдар тізбегінен тұрады, келесі қадам алдыңғысы аяқталғаннан кейін орындалады
АнықтылықӘр ереже дәл және бірмәнді болуы керек
НәтижелілікБелгілі қадам саны есепті шешуге алып келуі керек
ЖалпылықБір алгоритмді әртүрлі бастапқы деректермен қолдануға болады

Бес қасиетті қарапайым сөзбен қайталайық: Түсініктілік — орындаушы әр қадамды «түсінуі» керек, яғни оны орындай алатын дәрежеде нақты болуы керек. Дискреттілік — алгоритм үздіксіз бір процесс емес, бөлек-бөлек қадамдардан тұрады, олар кезекпен, бірінен соң бірі орындалады. Анықтылық — әр қадамның мағынасы тек бір ғана түрде түсіндірілуі керек, екі түрлі түсіндіруге жол берілмейді. Нәтижелілік — алгоритм шексіз жұмыс істемеуі керек, ол белгілі бір қадам санынан кейін міндетті түрде нәтижеге (немесе тоқтауға) жетуі керек. Жалпылық — жақсы алгоритм тек бір нақты мысалмен ғана емес, сол есептің кез келген ұқсас түрімен (әртүрлі бастапқы деректермен) жұмыс істей алуы керек.

Неге дәл осы бес қасиет таңдалған? Себебі олардың әрқайсысы алгоритмнің бір «осал тұсын» жабады: түсініктілік пен анықтылық — орындаушы қателеспеуін қамтамасыз етеді, дискреттілік — реттілікті сақтайды, нәтижелілік — алгоритмнің «мәңгі жұмыс істемеуін» кепілдейді, ал жалпылық — алгоритмді қайта-қайта пайдалануға мүмкіндік береді. Мысалы: екі санды қосатын бағдарлама — жалпылыққа сай, себебі ол кез келген екі санмен жұмыс істейді, тек 2 мен 3-пен ғана емес. Ал «a = a + 1» дегенді шексіз қайталау — нәтижелілікке қайшы келеді, себебі ол ешқашан тоқтамайды.

Түсініктілік
аспаз әр амалды біледі
Дискреттілік
бөлек қадамдар: «себіңіз», «араластырыңыз»
Анықтылық
«1 шай қасық тұз», «біраз тұз» емес
Нәтижелілік
белгілі уақытта дайын тағам
Жалпылық
екі есе көп ингредиентпен де жұмыс істейді
⚠️
Жиі кеткен қате: көп оқушылар бір нақты мысалға ғана жұмыс істейтін бағдарламаны толыққанды алгоритм деп есептейді (мыс. «тек 5 пен 3-ті ғана қосатын» бағдарлама). Бұл — жалпылық қасиетін бұзады. Шынайы алгоритм айнымалылар арқылы жазылып, кез келген (сол типтегі) бастапқы деректермен жұмыс істей алуы керек.
Алгоритмді жазудың 4 формасы

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

Сұрақ: алгоритмді де осылай әртүрлі формада жазуға бола ма? Жауабы — иә, болады. Алгоритмді жазудың төрт негізгі формасы бар, әрқайсысы әртүрлі орындаушыға немесе мақсатқа сай қолданылады.

Анықтама
Алгоритмді жазудың 4 формасы: ауызша (сөзбен сипаттау), кестелік (қадамдар кестеде), графикалық (блок-сызба), программалық (программалау тілінде). Ауызша және кестелік форма «Адам» орындаушысы үшін, программалық форма «Компьютер» орындаушысы үшін қолданылады. Графикалық тәсіл ықшам әрі көрнекі болғандықтан кең таралған.
💬
Ауызша
📋
Кестелік
🔷
Графикалық
{ }
Программалық

Төрт форманы бөлек қарастырайық: «Ауызша» — алгоритм қарапайым сөйлеммен сипатталады, мыс. «алдымен екі санды ал, оларды қос, нәтижені шығар». «Кестелік» — қадамдар кесте түрінде, әр жолда нөмір мен әрекет көрсетіліп жазылады. «Графикалық» — қадамдар арнайы геометриялық фигуралардан тұратын блок-сызба түрінде сызылады. «Программалық» — алгоритм нақты бағдарламалау тілінде (мыс. Python) кодпен жазылады.

Неге кейбір форма «Адам» үшін, кейбірі «Компьютер» үшін? Себебі адам сөзді, кестені, суретті табиғи түсінеді, ал компьютер тек нақты, синтаксис ережесі бар бағдарламалау тілін «түсінеді». Сондықтан алгоритмді алдымен адамға түсінікті формада (ауызша, кестелік, графикалық) ойластырып, содан кейін ғана оны программалық формаға (компьютер үшін) аударады.

Неге графикалық форма ең көп таралған? Себебі ол ықшам — бір қарағанда алгоритмнің бүкіл құрылымын, тармақталуын, қайталануын көзбен көруге болады, ал ауызша немесе тек кестелік форма ұзақ мәтінге ұласып кетуі мүмкін. Мысалы: «оң немесе теріс сан» алгоритмін ауызша «санды тексер, нөлден үлкен болса оң де, болмаса теріс де» деп те айтуға болады, кесте түрінде де жазуға болады, блок-сызбамен де көрсетуге болады, ал соңында Python кодына да аударуға болады — төртеуі де дәл сол алгоритмді сипаттайды, тек формасы әртүрлі.

Бұл — досыңа жол көрсетудің төрт тәсіліне ұқсас: сөзбен айту (ауызша), бұрылыстарды нөмірлеп тізіп жазу (кестелік), карта сызу (графикалық), немесе GPS қолданбасына дәл координаттарды енгізу (программалық). Мақсат бір — дұрыс жерге жеткізу, бірақ форма әртүрлі.

⚠️
Жиі кеткен қате: кейбір оқушылар тек программалық кодты «нағыз» алгоритм деп есептейді, ал ауызша немесе графикалық сипаттаманы алгоритм емес деп ойлайды. Барлық төрт форма да толыққанды алгоритм болып саналады, тек әртүрлі орындаушыға немесе мақсатқа бейімделген.
Блок-сызба белгілері

Графикалық форма (блок-сызба) ең көп қолданылатын болғандықтан, оны қалай сызу керектігін жақынырақ қарастырайық. Сұрақ: блок-сызбада әртүрлі әрекетті (мыс. «деректі енгізу» мен «шартты тексеру») қалай ажыратамыз, бәрін бір ғана тіктөртбұрышпен сызуға бола ма?

Жоқ, болмайды — әйтпесе блок-сызбаны оқыған адам әрекеттің нақты түрін ажырата алмас еді. Сондықтан блок-сызбада әр әрекет түрі үшін арнайы, белгілі геометриялық фигура қолданылады — бұл, жол белгілері сияқты, барлық адамға бірдей түсінікті «тіл» қалыптастырады.

БелгіСипаттамасы
СопақшаАлгоритм басы және соңы
ТіктөртбұрышӘрекетті орындау процесі
РомбӘрекетті орындау шарты
ПараллелограммДеректерді енгізу және шығару
АлтыбұрышЕсептегіш (цикл санағышы)
Бағыттауыш (көрсеткі)Өту сызығы, орындалу бағыты
Сопақша
Басы / соңы
Тіктөртбұрыш
Әрекет
Ромб
Шарт
Параллелограмм
Енгізу / шығару
Алтыбұрыш
Есептегіш
Көрсеткі
Орындалу бағыты

Кестені қарапайым сөзбен қайталайық: сопақша — алгоритмнің «бастау» немесе «аяқтау» нүктесін көрсетеді, әр блок-сызба міндетті түрде осыдан басталып, осымен аяқталады. Тіктөртбұрыш — қарапайым әрекетті (мыс. есептеу) білдіреді. Ромб — шартты тексеру орны, одан әрқашан екі (иә/жоқ) жол шығады. Параллелограмм — пернетақтадан мән енгізу немесе экранға нәтиже шығару. Алтыбұрыш — қайталанатын әрекеттің санын есептейтін арнайы блок. Көрсеткі — блоктарды бір-бірімен жалғап, орындалу бағытын көрсетеді.

Неге дәл осындай фигуралар таңдалған? Себебі әр фигураның пішіні өзіне сай мағынаны еске түсіреді: ромб — таңдау нүктесін (екі жаққа «ашылатын» пішін) бейнелейді, ал сопақша — шеңбер сияқты, басы да, соңы да жоқ нүктені білдіреді. Бұл — блок-сызбаны түсінуді жеңілдетеді, тіпті алгоритмнің мәтінін оқымай-ақ.

Блок-сызба белгілері — жол белгілеріне ұқсас: дөңгелек белгі бір мағынаны, үшбұрыш белгі басқа мағынаны білдіреді, барлық жүргізуші бір белгіні бірдей түсінеді. Дәл солай, блок-сызба белгілерін білетін кез келген адам, кез келген блок-сызбаны бірдей түсіне алады.

⚠️
Жиі кеткен қате: көп оқушылар шартты тексеруді (ромб орнына) тіктөртбұрышпен сызып қояды. Бұл — қате, себебі тіктөртбұрыштан тек бір ғана жол шығады, ал шарттан міндетті түрде екі жол (иә/жоқ) шығуы керек. Сондықтан шартты әрқашан тек ромбпен сызу керек.
Есепте қолдану: өлшем бірліктерін аудару

Мұғалім тақтада қалай шешер еді, дәл солай қадаммен жүрейік.

Деңгей: қиын
Не белгілі: Пайдаланушы өлшем бірлігін (1-байт, 2-килобайт, 3-мегабайт, 4-гигабайт) және мәнді (x) енгізеді.
Не табу керек: Мәнді қалған өлшем бірліктеріне аударатын программа.
Неге дәл осы әдісті қолданамыз: алдымен формальдау кезеңі маңызды: өлшем бірліктері арасында 2¹⁰ еселік қатынас бар (1 Кб = 2¹⁰ байт, 1 Мб = 2²⁰ байт, 1 Гб = 2³⁰ байт). Пайдаланушы қай бірліктен бастағанына қарай, есептеу бағыты өзгереді: кішіден үлкенге аударғанда бөлу, үлкеннен кішіге аударғанда көбейту қолданылады.
1
Бірлік пен мәнді енгіземіз. k — мәтіндік мән ретінде қабылданады (input() арқылы, int()-сіз), себебі біз оны кейін мәтінмен («'1'», «'2'») салыстырамыз.
k = input("Birlik olshemin tandanyz: 1-baittar, 2-kilobaittar, 3-megabaittar, 4-gigabaittar. P: ")
x = float(input("Mandi engiziniz: "))
2
К=1 (байт) жағдайын тексереміз. Бастапқы мән байтпен берілгендіктен, килобайтқа, мегабайтқа, гигабайтқа аудару үшін бөлу қолданылады (байт — ең кіші бірлік, одан үлкен бірлікке өткенде сан кішірейеді).
if k == '1':
    print('Kilobaittar: %10.3f' % (x / 2**10))
    print('Megabaittar: %10.3f' % (x / 2**20))
    print('Gigabaittar: %10.3f' % (x / 2**30))
3
К=2 (килобайт) жағдайын тексереміз. Байтқа аудару — кішірек бірлікке өту, сондықтан көбейту қолданылады (x * 2**10). Ал мегабайт пен гигабайтқа аудару — үлкенірек бірлікке өту, сондықтан бөлу қолданылады.
elif k == '2':
    print('Baittar: %14d' % (x * 2**10))
    print('Megabaittar: %10.3f' % (x / 2**10))
    print('Gigabaittar: %10.3f' % (x / 2**20))
Тексеру: k='1', x=1048576 болғанда: Килобайт = 1048576 / 2¹⁰ = 1024.000; Мегабайт = 1048576 / 2²⁰ = 1.000; Гигабайт = 1048576 / 2³⁰ ≈ 0.001. Нәтиже күтілгенмен дәл сәйкес келеді. Жауабы: k=1, x=1048576 → Килобайт=1024.000, Мегабайт=1.000, Гигабайт=0.001. Қорытынды идея: өлшем бірліктерін аударғанда бағыт маңызды — кішіден үлкенге өткенде бөлу, үлкеннен кішіге өткенде көбейту қолданылады; ал формальдау кезеңінде осы екі бағытты алдын ала анық белгілеп алу — кодты дұрыс жазудың кілті.
Байт Кб=1024 Мб=1.000 Гб=0.001 ↑ бөлу (кішіден үлкенге)
📝 ҰБТ-мен байланысы

Бұл тақырып ҰБТ-да жиі екі түрлі формада кездеседі: (1) теориялық сұрақтар — алгоритмнің қасиеттерін атау немесе ажырату, блок-сызба белгілерін тану («ромб нені білдіреді?»), жазу формаларын ажырату; (2) практикалық есептер — өлшем бірлігін немесе басқа санатты пайдаланушы таңдауына қарай түрлендіретін бағдарлама құру.

Есте сақтау керек негізгі ережелер: алгоритм — нақты, реттелген, әрі жалпы қолданылатын нұсқаулық; 5 қасиет — түсініктілік, дискреттілік, анықтылық, нәтижелілік, жалпылық; блок-сызбада ромб — тек шарт үшін; өлшем бірлігін аударғанда бағытты (кішіден үлкенге немесе керісінше) дұрыс анықтау маңызды.

Ең жиі кеткен қателер:
!
алгоритмнің бес қасиетін шатастыру (әсіресе түсініктілік пен анықтылықты бір-бірінен ажырата алмау)
!
блок-сызбада шартты ромб орнына тіктөртбұрышпен сызу
!
өлшем бірлігін аудару есептерінде көбейту мен бөлуді шатастыру (кішіден үлкенге — бөлу, үлкеннен кішіге — көбейту)
!
2-ң дәрежесін (2¹⁰, 2²⁰, 2³⁰) дұрыс есептей алмау
Сабақ қорытындысы
  • Алгоритм — орындаушыға не істеу керектігін дәл әрі түсінікті көрсететін нұсқаулық, ол бес қасиетке (түсініктілік, дискреттілік, анықтылық, нәтижелілік, жалпылық) сай болуы керек.
  • Алгоритмді төрт формада жазуға болады: ауызша, кестелік, графикалық (блок-сызба) немесе программалық — алғашқы үшеуі адамға, соңғысы компьютерге арналған.
  • Графикалық форма ерекше танымал, себебі ол алты стандартты белгімен (сопақша, тіктөртбұрыш, ромб, параллелограмм, алтыбұрыш, көрсеткі) алгоритмнің құрылымын бір көзқараста көрсетеді.
5 қасиет
Алгоритмнің сапасын тексеретін критерийлер
4 жазу формасы
Бір алгоритмді әртүрлі тілде айту тәсілдері
Блок-сызба белгілері
Графикалық форманың әмбебап алфавиті