Тармақталған алгоритмдер
Қазірге дейін жазған бағдарламаларың жоғарыдан төменге қарай, жол-жолымен, ешбір таңдаусыз орындалды. Бірақ өмірде олай емес қой: жаңбыр жауса — қолшатыр аласың, жаумаса — алмайсың. Дәл осындай «жағдайға қарай шешім қабылдау» қабілетін бағдарламаға қалай үйретуге болатынын осы сабақта үйренеміз. Бұл тақырып ҰБТ-да аса жиі кездеседі: сан оң/теріс екенін анықтау, шартқа байланысты есептеу — барлығы дәл осы тақырыпқа негізделген. Сабақ соңында сен шарт деген не екенін, салыстыру операторларын (>, <, ==, !=, >=, <=), толық және толық емес тармақталудың айырмашылығын білесің әрі Python-да if-else құрылымын дұрыс жаза аласың.
Ойланып көр: таңертең үйден шыққанда сен ауа райына қарайсың. Егер сыртта жаңбыр жауып тұрса — қолшатыр аласың. Ал жаумаса — алмайсың. Сенің келесі әрекетің бір ғана жолмен емес, жағдайға қарай екі түрлі болады.
Енді бағдарламаны ойлап көрейік: біз жазған бағдарламалар осы кезге дейін бір ғана жолмен жүрді — бірінші команда орындалды, содан кейін екінші, үшінші, солай жалғасты. Бірақ нақты есептерде көбіне «егер мынадай болса — мынаны істе, болмаса — басқасын істе» деген сұрақ туады. Шешімі — бағдарламаға «таңдау жасау» мүмкіндігін беру: бағдарлама белгілі бір жағдайды тексереді, нәтижесіне қарай екі жолдың қайсысымен жүретінін өзі шешеді. Осындай алгоритмді тармақталған алгоритм дейміз.
Тармақталған алгоритм — орындалу жолы белгілі бір шарттың ақиқат немесе жалған болуына байланысты ажыратылатын алгоритм. «Егер», «онда», «әйтпесе» түйінді сөздері қолданылады.
Анықтаманы бөлшектеп көрейік: «Орындалу жолы ажыратылады» — бағдарлама әрқашан бір ғана сызықпен жүрмейді, ол кейде солға, кейде оңға бұрылады. «Шарттың ақиқат немесе жалған болуы» — алгоритм әрекет таңдау алдында белгілі бір сұраққа жауап іздейді: бұл — рас па, әлде жалған ба? «Егер, онда, әйтпесе» — бұл сөздер тармақталудың тілдік құрылымын көрсетеді: «Егер (шарт) онда (1-әрекет), әйтпесе (2-әрекет)».
Неге дәл осылай ұйымдастырылған? Себебі нақты өмірдегі есептердің көбі бір ғана сценариймен шешілмейді — нәтиже бастапқы жағдайға тәуелді болады. Мысалы: дүкендегі кассалық бағдарлама — егер сатып алынған тауардың бағасы 5000 теңгеден асса, жеңілдік береді, аспаса — бермейді. Бұл — тармақталудың классикалық мысалы.
Бағдаршамды есіңе түсір: егер жасыл жанса — жүресің, қызыл жанса — тоқтайсың. Бағдаршам да дәл осындай «шартқа байланысты екі түрлі әрекет» логикасымен жұмыс істейді.
Тармақталу үшін бағдарламаға бір нәрсе керек — «шешім қабылдау» үшін негіз. Сұрақ: компьютер «жаңбыр жауып тұр ма?» деген сияқты сұраққа қалай жауап табады? Ол ойланбайды, сезінбейді — тек логикалық тексеру жасайды. Шешімі — бағдарламаға тексерілетін бір өрнек беріледі, ол өрнектің нәтижесі тек екі түрлі ғана болады: не рас (Ақиқат), не жалған. Осындай тексерілетін өрнекті шарт дейміз.
Шарт — тексеру нәтижесінде «Ақиқат» (True) немесе «Жалған» (False) мәнін қабылдайтын логикалық өрнек.
Бөлшектеп қарайық: «Тексеру нәтижесі» — шарт әрқашан бір нәрсені салыстырады немесе тексереді, мыс. «a саны 0-ден үлкен бе?». «Ақиқат (True) немесе Жалған (False)» — шарттың жауабы тек осы екі мән ғана болады, үшінші вариант жоқ. «Логикалық өрнек» — бұл қарапайым арифметикалық өрнек емес, нәтижесі әрқашан рас/жалған түрінде болады.
Неге дәл осылай жасалған? Себебі компьютер бит сияқты, шешімді де тек екі мәнмен (рас/жалған) қабылдайды — бұл оған дәл әрі қатесіз тексеру жасауға мүмкіндік береді. Мысалы: a = 5 болса, «a > 0» шарты — Ақиқат (True), өйткені 5 шынымен 0-ден үлкен. Ал «a > 0» шарты a = -3 болғанда — Жалған (False).
Шартты есік алдындағы күзетшіге ұқсатуға болады. Күзетші сұрақ қояды: «билет бар ма?». Жауап тек «иә» немесе «жоқ» болады, үшінші вариант жоқ. Шарт та дәл осылай — әрқашан анық «иә» (True) немесе «жоқ» (False) жауабын береді.
True немесе False, басқа ешқандай мән болмайды — тіпті ол санмен жазылса да (мыс. «a > 0»).Шартты жазу үшін бізге арнайы белгілер керек — сандарды салыстыратын белгілер. Математикада бұған дейін «>», «<», «=» сияқты белгілерді көрген боларсың. Бірақ Python-да олардың кейбірі сәл басқашалау жазылады. Неге олай? Себебі Python-да «=» белгісі бұрыннан басқа мақсатта қолданылады — айнымалыға мән беру үшін (мыс. a = 5). Сондықтан «теңдікті тексеру» үшін Python-ға басқа белгі қажет болды.
Кестеге қарамас бұрын, әр бағанның мағынасын түсінейік: «Амал» — математикадағы әдеттегі салыстыру белгісі. «Python операторы» — дәл сол салыстыруды Python кодында жазу үшін қолданылатын белгі. «Атауы» — амалдың қазақша атауы, есепті оқығанда осы атаулар жиі кездеседі (мыс. «үлкен немесе тең»).
Кестені қарапайым сөзбен қайталайық: «>» мен «<» математикадағыдай қалады. Ал теңдікті тексеру үшін бір «=» емес, қос == жазылады, өйткені жалғыз «=» — мән беру командасы. «Тең емес» үшін != қолданылады. «Үлкен немесе тең» мен «кіші немесе тең» — екі белгінің тіркесімі (>=, <=), олардың арасында бос орын болмайды.
Неге «==» дәл екі рет жазылған? Бұл — Python-ды жасаушылардың саналы шешімі: «=» мен «==»-ні көзбен оңай ажырату үшін, сонымен қатар бағдарламашы кодты жазғанда қателеспеуі үшін.
Салыстыру операторлары — таразыға ұқсас. Таразының екі басындағы заттарды салыстырасың: қайсысы ауыр, қайсысы жеңіл, әлде тең бе. Python операторлары да дәл осылай — екі мәнді «таразыға» салып, нәтижесін айтады.
= жазып қояды (if a = 5:), бірақ бұл — синтаксистік қате, өйткені = мән беру үшін ғана қолданылады. Шартта теңдікті тексеру үшін міндетті түрде == жазу керек (if a == 5:).Қолшатыр мысалына қайта оралайық: жаңбыр жауса — қолшатыр аласың, жаумаса — алмайсың. Бұл жерде екі әрекет те бар. Бірақ кейде керісінше жағдай болады: «егер ұялы телефонның батареясы 20%-дан төмен болса, ескерту көрсет» — мұнда «басқа жағдайда» арнайы бір әрекет жасалмайды, ескерту жай ғана көрсетілмей қалады. Сұрақ туады: тармақталу әрқашан екі жолды да талап ете ме, әлде кейде бір ғана жол жеткілікті ме? Жауабы — жеткілікті.
Тармақталудың екі түрі бар: толық (екі тармақ — «иә» және «жоқ» жағдайлары, if-else) және толық емес (тек «иә» тармағы, else сөзі жазылмайды). Кейбір оқулықта бұл сәйкесінше «толық жазылу түрі» және «қысқа жазылу түрі» деп те аталады — мағынасы бірдей.
Екі түрді бөлек қарастырайық: «Толық тармақталу» — шарт ақиқат болса да, жалған болса да, әрқайсысына сәйкес нақты әрекет орындалады. Екі жол да жазылады. «Толық емес тармақталу» — шарт ақиқат болғанда ғана арнайы әрекет орындалады. Шарт жалған болса, бағдарлама жай ғана сол блокты «секіріп өтеді», ешқандай қосымша әрекет жасамайды.
Неге екеуі де керек? Себебі есептің мәніне қарай таңдау жасалады. Егер екі жағдайда да нақты, әртүрлі әрекет керек болса (мыс. «оң немесе теріс» деп жазу) — толық тармақталу қолданылады. Ал тек бір жағдайда ғана қосымша әрекет керек болса (мыс. «батарея аз болса ғана ескерту көрсету»), толық емес тармақталу жеткілікті. Мысалы: «егер сан жұп болса, оны квадраттау, тақ болса — өзгеріссіз қалдыру» — мұнда «тақ болса» жағдайында «ештеңе істемеу» өзі әрекет болып саналады, бұл әдетте толық емес тармақталу арқылы жазылады.
Дүкенде сатушыдан сұрайсың: «акция бар ма?». Егер бар болса — сатушы саған жеңілдік туралы айтады (қосымша әрекет). Ал жоқ болса, сатушы ештеңе айтпайды, сату жай ғана әдеттегідей жалғаса береді. Бұл — толық емес тармақталудың өмірлік мысалы.
else бөлігін әрқашан жазу керек деп ойлайды. Бұл — қате. Егер шарт жалған болғанда арнайы әрекет қажет болмаса, else бөлігін мүлдем жазбауға болады — бағдарлама дұрыс жұмыс істей береді.Енді тармақталуды нақты Python тілінде қалай жазатынымызды көрейік. Бұған дейінгі сабақтарда фигуралық жақша {} немесе арнайы «соңы» сөзін қолданатын тілдерді көрген болуың мүмкін. Python мүлдем басқаша жолмен жұмыс істейді. Сұрақ: Python қай код қай блокқа тиесілі екенін қалай біледі, егер арнайы жақша қолданылмаса? Жауабы — шегініс (отступ) арқылы. Python-да бір блокқа тиесілі барлық жолдар бірдей шегініспен (әдетте 4 бос орын) жазылады.
Python синтаксисі:
if <шарт>: <оператор 1> else: <оператор 2>Шарттан кейін қос нүкте (:) қойылады, келесі жолда 4 бос орын (немесе Tab) шегініс жасалады. Толық емес тармақталуда
else бөлігі жазылмайды.
Бөлшектеп қарайық: «if <шарт>:» — «if» сөзінен кейін тексерілетін шарт жазылады, соңында міндетті түрде қос нүкте (:) қойылады. «4 бос орын шегініс» — шарт ақиқат болғанда орындалатын барлық код жолдары бірдей шегініспен жазылады, бұл сол кодтың «if» блогына тиесілі екенін көрсетеді. «else:» — «басқа жағдайда» дегенді білдіреді, өзінен кейін де қос нүкте қойылады, астына да шегініспен код жазылады.
Неге дәл шегініс қолданылады? Себебі Python тілін жасаушылар кодты адамға оқуға оңай әрі таза болсын деген мақсатпен жасаған. Шегініс — фигуралық жақшаларсыз-ақ, кодтың құрылымын көзбен бірден көруге мүмкіндік береді. Мысалы:
if a > 0: print("On san") else: print("Teris san")
Мұнда print("On san") жолы — «if» блогына тиесілі, ол тек a > 0 болғанда орындалады. Ал print("Teris san") — «else» блогына тиесілі, ол тек a > 0 жалған болғанда орындалады.
Бұл — дәптердегі тақырыпша мен оның астындағы түсіндірмеге ұқсас. Тақырыпша бір деңгейде тұрады (шегініссіз), ал оның астындағы түсіндірме жолдары бір саты ішкері жазылады — осылайша қай мәтін қай тақырыпқа тиесілі екені бірден көрінеді.
IndentationError қатесін шығарады. Сонымен қатар, қос нүкте (:) қоюды ұмытып кету де жиі кездесетін қате — бұл SyntaxError-ға әкеледі.if <шарт>: жолынан кейін шегінісі бар блок жазылады, ал қажет болса — else: блогы қосылады. Қос нүкте мен шегіністі ұмытпау керек.Мұғалім тақтада қалай шешер еді, дәл солай қадаммен жүрейік.
input() пернетақтадан жолды оқиды, ал int() оны бүтін санға айналдырады.
a = int(input("Kez kelgen sandy engiz:"))
if a > 0: print("On san") else: print("Teris san")
a = int(input()) b = int(input())
% — қалдықпен бөлу операторы; a % 2 — a санын 2-ге бөлгендегі қалдықты табады. Егер қалдық 0-ге тең болса, сан жұп.
if a % 2 == 0: else бөлігі жоқ, өйткені a тақ болса, ештеңе өзгертудің қажеті жоқ.
a = a**2
k = a + b
print(k) Бұл тақырып ҰБТ-да жиі үш түрлі формада кездеседі: (1) санды бір немесе бірнеше шартқа қарай жіктеу (оң/теріс, жұп/тақ); (2) шартқа байланысты есептеу нәтижесін табу (мыс. квадраттау немесе өзгеріссіз қалдыру); (3) дұрыс салыстыру операторын таңдау (мыс. > немесе >=).
Есте сақтау керек негізгі ережелер: шартта теңдікті тексеру үшін әрқашан == жаз; if блогынан кейін қос нүкте мен шегініс міндетті; else тек қажет болғанда ғана жазылады; if блогының сыртындағы код шартқа тәуелсіз әрқашан орындалады.
= мен == шатастыруelse бөлігін қажетсіз жерде міндетті деп есептеу немесе керісінше, қажет жерде қоспай кету>) мен «үлкен немесе тең» (>=) шарттарын шатастыру — нәтижесінде шектік мән дұрыс өңделмей қалады- Тармақталған алгоритм — бағдарламаға бір жолдың орнына, жағдайға қарай таңдау жасау мүмкіндігін береді.
- Шарт — тек
TrueнемесеFalseмәнін қайтаратын логикалық өрнек. - Салыстыру операторлары:
>,<,==,!=,>=,<=— теңдікті тексеру үшін міндетті түрде==қолданылады. - Тармақталудың екі түрі бар: толық (if-else — екі жол да бар) және толық емес (тек if — else жоқ).
- Python-да синтаксис:
if <шарт>:жолынан кейін 4 бос орын шегініспен блок жазылады, қажет болса —else:қосылады.