Тақырып 6

Python программалау тілінде алгоритмдерді программалау

Спецификация бойынша не тексеріледі:

Алгоритм, оның қасиеттері және блок-сызбаларАйнымалылар, деректер типтері, енгізу және шығаруАрифметикалық амалдар, басымдық және типті түрлендіруТармақталу: if, elif, else; логикалық амалдарwhile циклі және сан цифрларын өңдеуfor циклі, range функциясы, break, continue, elseТиптік алгоритмдер, кірістірілген циклдер және трассировкаТізімдер (бір өлшемді массивтер) және екі өлшемді тізімдер (матрицалар)

Бір минутта мәні

Бұл — ҰБТ информатикасының ең басты тақырыбы: әр нұсқада дерлік «программа не шығарады», «цикл неше рет орындалады», «айнымалы қандай мән қабылдайды» деген тапсырмалар болады. Тақырып алгоритм ұғымынан, оның қасиеттері мен блок-сызбалардан басталып, Python 3 тіліне ауысады: айнымалылар мен деректер типтері, енгізу және шығару, //, % және ** амалдары бар арифметика, if/elif/else шарттары, range арқылы while және for циклдері, break және continue. Жеке бөлім — типтік алгоритмдер: санауыш, жинақтауыш, ең үлкен және ең кіші мәнді табу, санды цифрларға жіктеу. Тақырыпты тізімдер (бір өлшемді массивтер) және екі өлшемді тізімдер (матрицалар) аяқтайды. Басты дағды — мұқият трассировка: программаны жол-жолымен «ойша» орындап, айнымалылардың мәндерін кестеге жазу.

Қарапайым тілмен

Программа — өте тілалғыш, бірақ мүлде тапқыр емес аспазға арналған рецепт: ол жазылғанды ғана, қадам бойынша қатаң орындайды және ештеңені өзі ойлап таппайды.

Айнымалы — жазуы бар қорап

x = 5 — x деп жазылған қорапқа 5 санын салдық. x = x + 1 — 5-ті алып, 1 қосып, қайта 6-ны салдық. Ескі мән жойылады.

Шарт — жолдағы айрық

if «иә ме, жоқ па?» деп сұрайды. Иә болса — бір тармақпен, жоқ болса — else тармағымен жүреміз. Тек бір тармақ қана орындалады.

Цикл — «N рет қайтала»

for i in range(5) — 5 рет қайтала, i мәндері 0, 1, 2, 3, 4. while — «шарт ақиқат болғанша қайтала», «қант еріп кеткенше араластыр» сияқты.

Тізім — нөмірленген шкафтар қатары

a = [7, 2, 9] тізімінде шкафтар нөлден бастап нөмірленеді: a[0] = 7, a[1] = 2, a[2] = 9. Соңынан нөмірлеу: a[-1] = 9.

Басты формулалар

a=b⋅(a // b)+a % ba = b \cdot (a\,//\,b) + a\,\%\,b
Бүтін бөлік пен қалдықтың байланысы. Python-да қалдық әрқашан бөлгіштің таңбасымен болады: −17 // 5=−4-17\,//\,5=-4, −17 % 5=3-17\,\%\,5=3, себебі 5⋅(−4)+3=−175\cdot(-4)+3=-17.
N=⌈b−ak⌉N=\left\lceil \dfrac{b-a}{k} \right\rceil
k>0k>0 және b>ab>a болғанда range(a, b, k) қанша сан беретіні (әйтпесе 0). Мысалы, range(3, 20, 4): ⌈17/4⌉=5\lceil 17/4 \rceil = 5 сан (3, 7, 11, 15, 19). k<0k<0 үшін: a>ba>b болғанда N=⌈(a−b)/∣k∣⌉N=\lceil (a-b)/|k| \rceil.
d=n % 10,n=n // 10d = n\,\%\,10,\quad n = n\,//\,10
Санның соңғы цифры және соңғы цифрды «қиып тастау». Мұны while n > 0 циклінде қайталап, барлық цифрларды оңнан солға қарай аралаймыз.
r=r⋅10+dr = r\cdot 10 + d
r санының оң жағына d цифрын тіркеу — кері жазылған сан (реверс) осылай құрылады.
N=N1⋅N2N = N_{1}\cdot N_{2}
Сыртқы цикл N1N_1 рет, ал ішкі цикл (сыртқысына тәуелсіз) N2N_2 рет орындалса, ішкі циклдің денесі N1⋅N2N_1\cdot N_2 рет орындалады.
a[−k]=a[len(a)−k]a[-k]=a[\text{len}(a)-k]
Теріс индекс соңынан саналады: a[-1] — соңғы элемент. n×n матрицада бас диагональ: i=ji=j, қосалқы диагональ: i+j=n−1i+j=n-1.

Ұғымдар мен терминдер

Алгоритм
Орындаушыға берілетін, бастапқы деректерден нәтижеге жеткізетін нақты командалардың шектеулі тізбегі.
Блок-сызба
Процесті, жүйені немесе алгоритмді графикалық түрде бейнелейтін арнайы фигуралардың жиынтығы (сопақша — басы/соңы, параллелограмм — енгізу/шығару, тіктөртбұрыш — әрекет, ромб — шарт).
Айнымалы
Екі атрибуты бар жад ұяшығы: аты және мәні.
Деректер типі
Мүмкін мәндер мен оларға қолданылатын амалдар жиыны: int — бүтін сандар, float — нақты сандар, str — жолдар, bool — логикалық (True/False).
Шартты оператор
Шарттарға байланысты бірнеше әрекеттер тізбегінен бір әрекеттің орындалуын қамтамасыз ететін программаның маңызды құрылымы (Python-да: if, elif, else).
Цикл
Шарт ақиқат болған жағдайда қандай да бір кодты бірнеше рет орындауға арналған программа үзіндісі.
while (әзірше)
Алғышартты цикл операторы: шарт әр қайталау алдында тексеріледі, ол ақиқат болғанша цикл денесі орындалады.
Массив (тізім)
Бір атаумен біріктірілген, бір типтегі деректерден тұратын айнымалылардың жиынтығы; элементке индекс арқылы қол жеткізіледі. Python-да массив list тізімімен жүзеге асырылады.
Индекс
Тізімдегі немесе жолдағы элементтің нөмірі; Python-да нөмірлеу 0-ден басталады, теріс индекстер соңынан саналады.
Трассировка
Алгоритмді қолмен қадам бойынша орындап, әр командадан кейін барлық айнымалылардың мәндерін кестеге жазу.

Тақырыпты талдау

Алгоритм, оның қасиеттері және блок-сызбалар 5–8 сынып

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

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

Алгоритмді жазу тәсілдері: сөздік (табиғи тілде), графиктік (блок-сызба), псевдокод, программалау тілінде (программа).

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

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

Айнымалылар, деректер типтері, енгізу және шығару 6 сынып

Айнымалы меншіктеу арқылы құрылады: x = 5. = белгісі теңдікті емес, «оң жақтағы мәнді сол жақтағы айнымалыға салу» дегенді білдіреді. x = x + 1 жазбасы x-ті 1-ге арттырады (қысқаша: x += 1). Аттары: латын әріптері, цифрлар және _, цифрдан басталмайды, регистр маңызды (A мен a — әртүрлі айнымалылар), қызметтік сөздерді (if, for, while...) қолдануға болмайды.

Негізгі типтер: int — бүтін сандар (5, -12, 0), float — нақты сандар (3.14, 2.0, 1e3), str — тырнақшадағы жолдар ('hi', "5"), bool — логикалық True және False. Типті білу: type(x). Python типті мәніне қарап өзі анықтайды (динамикалық типтеу).

Көптік меншіктеу: a, b = 3, 7. Үшінші айнымалысыз мәндерді алмастыру: a, b = b, a. Үшінші айнымалы арқылы классикалық тәсіл: t = a; a = b; b = t.

Енгізу: input() әрқашан жол қайтарады. Сондықтан сандар үшін: n = int(input()), x = float(input()). Бір жолдағы бірнеше сан: a, b = map(int, input().split()).

Шығару: print(a, b, c) мәндерді бос орын арқылы басып шығарып, жаңа жолға көшеді. sep параметрі мәндер арасындағы ажыратқышты, end — соңында не басылатынын береді (әдепкі бойынша жаңа жол '\n').

print(1, 2, 3, sep='-')        # 1-2-3
print('a', end='')
print('b')                     # ab
print(5, 6, sep='', end='!')   # 56!

Аргументсіз print() бос жол шығарады. f-жолдар: print(f'x = {x}') айнымалының мәнін мәтінге қояды.

Арифметикалық амалдар, басымдық және типті түрлендіру 6–7 сынып

Амалдар: +, -, *; / — кәдімгі бөлу, нәтижесі әрқашан float (6 / 2 = 3.0); // — бүтін бөлу (төменге, кіші санға қарай дөңгелектеу); % — бөлгендегі қалдық; ** — дәрежеге шығару.

Мысалдар: 17 // 5 = 3, 17 % 5 = 2, 2 ** 10 = 1024. Теріс сандарда // төменге дөңгелектейді: -17 // 5 = -4 (-3 емес!), -17 % 5 = 3 (қалдық бөлгіштің таңбасымен). 7.5 // 2 = 3.0 — операндтың бірі float болса, нәтиже де float.

Басымдық (жоғарыдан төменге): жақшалар () → ** → унарлы минус -x → *, /, //, % → +, - → салыстырулар <, >, ==, !=, <=, >= → not → and → or. Басымдығы бірдей амалдар солдан оңға қарай орындалады, тек ** оңнан солға қарай: 2 ** 3 ** 2 = 2 ** 9 = 512. Сондай-ақ -2 ** 2 = -4, себебі дәреже минустан бұрын орындалады.

Есептеу мысалы: 2 + 3 * 4 ** 2 // 5 → алдымен 4 ** 2 = 16, содан кейін солдан оңға 3 * 16 = 48, 48 // 5 = 9, соңында 2 + 9 = 11.

Типті түрлендіру: int('12') = 12; int(3.99) = 3 және int(-3.99) = -3 — бөлшек бөлігі жай ғана алынып тасталады (нөлге қарай); float('2.5') = 2.5; str(7) = '7'; round(3.5) = 4, бірақ round(2.5) = 2 (Python «жартыларды» жұп санға қарай дөңгелектейді). bool(0), bool(''), bool([]) — False, кез келген нөлден өзге сан және бос емес жол (тіпті '0') — True.

Жолдарды да «қосуға» және «көбейтуге» болады: '2' + '3' = '23' (біріктіру), 'ab' * 3 = 'ababab'. Ал '2' + 3 — TypeError қатесі: жол мен санды қосуға болмайды.

Пайдалы кірістірілген функциялар: abs(x) — модуль, max(a, b, c) және min(...), round(x, 2) — 2 таңбаға дейін дөңгелектеу, len(s) — ұзындық. math модулі: import math, math.sqrt(16) = 4.0, math.ceil(2.1) = 3, math.floor(2.9) = 2.

Тармақталу: if, elif, else; логикалық амалдар 7 сынып

Құрылымы: if шарт: кейін қос нүкте қойылады, дене 4 бос орын шегініспен жазылады. elif (әйтпесе егер) тармағы алдыңғы шарттардың бәрі жалған болғанда ғана тексеріледі; else барлығы жалған болса орындалады. Бүкіл тізбектен дәл бір тармақ орындалады (else болмаса, бірде-бірі орындалмауы мүмкін).

if score >= 90:
    grade = 5
elif score >= 75:
    grade = 4
elif score >= 50:
    grade = 3
else:
    grade = 2

elif реті маңызды: score = 95 болғанда бірінші тармақ орындалады, дегенмен 95 >= 75 те ақиқат. Егер тексерулер кішіден үлкенге қарай жүрсе (алдымен >= 50), барлық жақсы бағалар қате түрде «3» болып кетер еді.

Салыстыру амалдары: == (тең; жалғыз = — меншіктеу!), != (тең емес), <, >, <=, >=. Python тізбектерге рұқсат береді: 0 < x < 10 дегеніміз 0 < x and x < 10.

Логикалық амалдар: and (ЖӘНЕ) — екі шарт та ақиқат болғанда ғана ақиқат; or (НЕМЕСЕ) — кем дегенде біреуі ақиқат болса ақиқат; not (ЕМЕС) — мәнді қарама-қарсыға ауыстырады. Басымдық: not, содан кейін and, содан кейін or. Мысал: x % 2 == 0 and x > 10 — x жұп және 10-нан үлкен. Бөлінгіштікті тексеру: n % k == 0.

Кірістірілген шарттар — if ішіндегі if; тармаққа тиесілілік шегініспен анықталады. Құрама шарттар көбіне кірістіруді алмастырады: екі кірістірілген if орнына if a > b and a > c:.

Тернарлы жазба: m = a if a > b else b — бір жолдағы қысқа тармақталу.

while циклі және сан цифрларын өңдеу 8 сынып

while шарт: — алғышартты цикл: шарт әр итерация алдында тексеріледі; ол бірден жалған болса, дене бірде-бір рет орындалмайды. Дененің ішінде шартты өзгертетін бір нәрсе міндетті түрде болуы керек, әйтпесе цикл шексіз болады.

n = 4728
s = 0
while n > 0:
    s += n % 10   # соңғы цифрды қостық
    n //= 10      # оны алып тастадық
print(s)          # 21

Цифрларға арналған стандарт есептер: цифрлар саны (әр итерацияда k += 1), цифрлар қосындысы (s += n % 10), цифрлар көбейтіндісі (p *= n % 10, бастапқы p = 1), ең үлкен цифр, кері сан (r = r * 10 + n % 10), жұп цифрлар саны (if n % 10 % 2 == 0: k += 1).

Маңызды: цикл n-ді «бұзады» (соңында n = 0), сондықтан бастапқы сан кейін керек болса, көшірмесін сақтаңыз: m = n. n = 0 үшін while n > 0 циклі бірде-бір рет орындалмайды — цифрлар саны 1 емес, 0 болып шығады.

while қайталау саны алдын ала белгісіз болғанда ыңғайлы: «қосынды 100-ден кіші болғанша», «0 енгізілгенше», Евклид алгоритмі: while a != b: if a > b: a -= b else: b -= a (немесе тезірек while b: a, b = b, a % b), ЕҮОБ шығады.

Санды екілік жүйеге аудару да while арқылы жасалады: while n > 0: s = str(n % 2) + s; n //= 2.

for циклі, range функциясы, break, continue, else 8 сынып

for i in range(...) — параметрлі цикл: i айнымалысы ауқымдағы мәндерді кезекпен қабылдайды. range түрлері: range(n) — 0, 1, ..., n-1 (n сан); range(a, b) — a-дан b-1-ге дейін; range(a, b, k) — a-дан k қадаммен, b-ға жетпей.

Оң шекара ешқашан кірмейді: range(1, 5) → 1, 2, 3, 4. Теріс қадам — кері санау: range(10, 0, -3) → 10, 7, 4, 1. Бос ауқымдар: range(5, 1) (қадам +1, ал төмен жүру керек) және range(1, 5, -1) — цикл бірде-бір рет орындалмайды.

for тек сандарды ғана емес, жолдың немесе тізімнің элементтерін де аралайды: for ch in 'abc': — ch = 'a', 'b', 'c'; for x in [3, 8, 1]: — x = 3, 8, 1. Цикл аяқталғаннан кейін i айнымалысы соңғы мәнді сақтайды (range(5) үшін ол 4).

break — бүкіл циклді бірден тоқтатады. continue — ағымдағы итерацияның қалған бөлігін өткізіп жіберіп, келесісіне көшеді. Екеуі де өздері тұрған ең ішкі циклге ғана әсер етеді.

Циклдің else бөлігі цикл break-сіз, «табиғи» аяқталса орындалады. Классика — жай санға тексеру:

n = 29
for d in range(2, n):
    if n % d == 0:
        print('құрама')
        break
else:
    print('жай')

break арқылы шығатын шексіз цикл: while True: ... if шарт: break — тексеру дененің ортасында керек болғанда ыңғайлы.

Типтік алгоритмдер, кірістірілген циклдер және трассировка 8–9 сынып

Санауыш: цикл алдында k = 0, ішінде if шарт: k += 1. Қосындылағыш (жинақтауыш): s = 0, ішінде s += x. Көбейтінді: бастапқы мән p = 1 (0 емес, әйтпесе әрқашан 0 болады!). Факториал: f = 1; for i in range(1, n + 1): f *= i.

Ең үлкенін іздеу: бастапқы мән ретінде бірінші элементті аламыз mx = a[0] (0 емес — барлық сандар теріс болуы мүмкін), содан кейін if x > mx: mx = x. Ең кішісі үшін — < белгісі. Ең үлкенінің индексі: imax сақтаймыз, a[i] > a[imax] салыстырамыз. Қатаң > бірінші максимумды, қатаң емес >= соңғысын береді.

Кірістірілген циклдер: ішкі цикл сыртқы циклдің әр итерациясында толық өтеді. for i in range(3): for j in range(4): — дене 3 · 4 = 12 рет орындалады. Ішкі цикл сыртқысына тәуелді болса (for j in range(i, 4)), жолдар бойынша санаңыз: i = 0, 1, 2, 3 болғанда 4 + 3 + 2 + 1 = 10 қайталау.

for i in range(1, 4):
    for j in range(1, 4):
        print(i * j, end=' ')
    print()     # кестенің әр жолынан кейін жаңа жол

Трассировка — «программа не шығарады» тапсырмаларының басты құралы. Кесте саламыз: бағандар — айнымалылар және тексерілетін шарт, жолдар — қадамдар. Әр командадан кейін жаңа мәндерді жазамыз. Ереже: тек мән меншіктелетін айнымалыны өзгертеміз; цикл шартын денеге кірмес бұрын тексереміз.

Трассировка мысалы s = 0; for i in range(1, 6, 2): s += i * i: i = 1 → s = 1; i = 3 → s = 10; i = 5 → s = 35. Жауабы 35.

Қателер синтаксистік (қос нүкте ұмытылған, шегініс дұрыс емес — программа іске қосылмайды), орындау қателері (нөлге бөлу ZeroDivisionError, тізім шегінен шығу IndexError, тип дұрыс емес TypeError) және логикалық (программа жұмыс істейді, бірақ жауабы дұрыс емес — оларды трассировка мен тестілеу арқылы іздейді) болады.

Тізімдер (бір өлшемді массивтер) және екі өлшемді тізімдер (матрицалар) 9 сынып

Тізім — элементтердің реттелген жиыны: a = [5, 3, 8, 1]. Индекстер нөлден: a[0] = 5, a[3] = 1, a[-1] = 1 (соңғысы), a[-2] = 8. len(a) = 4, рұқсат етілген индекстер 0..3; a[4]-ке жүгіну — IndexError қатесі. Элементті өзгертуге болады: a[1] = 10.

Қиықтар a[start:stop:step] — range сияқты: stop кірмейді. a[1:3] → индекстері 1 және 2 элементтер; a[:2] — алғашқы екеуі; a[2:] — 2-индекстен соңына дейін; a[::2] — біреуін аттап; a[::-1] — кері тізім. Қиық жаңа тізім құрады және ешқашан IndexError тудырмайды.

Әдістер: a.append(x) — соңына қосу; a.insert(i, x) — x-ті i орнына қою (қалғандары оңға жылжиды); a.pop() — соңғысын жойып, қайтару, a.pop(i) — i индексті элементті; a.remove(x) — x мәнінің бірінші кездесуін жою; a.index(x) — бірінші x-тің индексі; a.count(x) — x неше рет кездеседі; a.sort() — өсу бойынша сұрыптау (reverse=True — кему бойынша), a.reverse() — кері айналдыру. Функциялар: len(a), sum(a), max(a), min(a), sorted(a) (жаңа сұрыпталған тізім), x in a тексеруі.

Құру: [0] * 5 → [0, 0, 0, 0, 0]; list(range(1, 6)) → [1, 2, 3, 4, 5]; енгізу: a = list(map(int, input().split())). Тізім генераторы (list comprehension): [i * i for i in range(1, 6)] → [1, 4, 9, 16, 25]; шартпен: [x for x in a if x > 0] — тек оң сандар.

for i in range(len(a)): индекстер бойынша аралау орын маңызды болғанда немесе элементтерді өзгерту керек болғанда қажет; for x in a: мәндер бойынша аралау — тек мәндер керек болғанда. Екі элементті алмастыру: a[i], a[j] = a[j], a[i].

Екі өлшемді тізім — тізімдердің тізімі: m = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]. m[i][j] — i жолы мен j бағанындағы элемент: m[1][2] = 6. Жолдар саны len(m), бағандар саны len(m[0]). Аралау — i және j бойынша екі кірістірілген цикл.

for i in range(len(m)):
    for j in range(len(m[0])):
        print(m[i][j], end=' ')
    print()

n×n квадрат матрицада: бас диагональ — m[i][i] элементтері (i == j), қосалқы диагональ — m[i][n-1-i] (i + j == n - 1); бас диагональдан жоғары i < j, төмен — i > j. i жолының қосындысы: sum(m[i]); j бағанының қосындысы: sum(m[i][j] for i in range(n)). Нөлдер матрицасын дұрыс құру: [[0] * m for i in range(n)]; [[0] * m] * n жазбасы бір жолға n сілтеме жасайды, сонда бір элементті өзгерту бүкіл бағанды өзгертеді.

Шешімі бар есеп мысалдары

Есеп 1Программа не шығарады?
print(2 + 3 * 4 ** 2 // 5 - 7 % 3)
print(-17 // 5, -17 % 5)
  1. Бірінші жол, басымдық бойынша: алдымен дәреже 4 ** 2 = 16.
  2. Содан кейін *, //, % солдан оңға: 3 * 16 = 48, 48 // 5 = 9 (9 · 5 = 45, 3 қалдығын тастаймыз), 7 % 3 = 1.
  3. Соңында қосу мен азайту: 2 + 9 − 1 = 10.
  4. Екінші жол: −17 / 5 = −3,4; // төменге, кіші санға қарай, яғни −4-ке дөңгелектейді.
  5. Қалдық: −17 − 5 · (−4) = −17 + 20 = 3. Тексеру: 5 · (−4) + 3 = −17.
Жауабы 10, содан кейін -4 3
Есеп 2Трассировка жасап, программа не шығаратынын анықтаңыз:
n = 4728
s = 0
r = 0
while n > 0:
    d = n % 10
    s = s + d
    r = r * 10 + d
    n = n // 10
print(s, r)
  1. Басы: n = 4728, s = 0, r = 0. n > 0 шарты ақиқат.
  2. 1-итерация: d = 8, s = 8, r = 0 · 10 + 8 = 8, n = 472.
  3. 2-итерация: d = 2, s = 10, r = 8 · 10 + 2 = 82, n = 47.
  4. 3-итерация: d = 7, s = 17, r = 827, n = 4.
  5. 4-итерация: d = 4, s = 21, r = 8274, n = 0.
  6. Шартты тексеру: 0 > 0 жалған — циклден шығу. Цикл 4 рет орындалды (цифрлар саны бойынша). s — цифрлар қосындысы, r — кері сан.
Жауабы 21 8274
Есеп 3Цикл денесі неше рет орындалады және программа не шығарады?
s = 0
for i in range(10, 0, -3):
    s = s + i
print(s, i)
  1. Қадам теріс, демек 10-нан төмен қарай 0-ге жетпей жүреміз: 10, 7, 4, 1 (келесісі −2 болар еді, ол 0 шекарасынан тыс).
  2. Формула бойынша итерациялар саны: ⌈(10 − 0) / 3⌉ = ⌈3,33⌉ = 4.
  3. Трассировка: i = 10 → s = 10; i = 7 → s = 17; i = 4 → s = 21; i = 1 → s = 22.
  4. Циклден кейін i соңғы мәнді сақтайды — 1.
Жауабы 4 рет; шығады: 22 1
Есеп 4Программа не шығарады?
a = 8
b = 3
if a % b == 0 or a > 10:
    print(1)
elif not (a < b) and b % 2 == 1:
    print(2)
else:
    print(3)
  1. Бірінші шарт: 8 % 3 = 2, демек a % b == 0 — False; a > 10 — False. False or False = False, if тармағы өткізіледі.
  2. elif шарты: a < b → 8 < 3 → False, not False = True; b % 2 == 1 → 3 % 2 = 1 → True.
  3. True and True = True — elif тармағы орындалып, 2 басылады. else тармағы енді тексерілмейді.
Жауабы 2
Есеп 5Программа не шығарады?
a = [4, 7, 1, 9]
a.append(a[1] + a[2])
a.insert(0, a.pop())
a.remove(7)
print(a[1:3], a[-1], len(a))
  1. a[1] + a[2] = 7 + 1 = 8, append соңына қосады: [4, 7, 1, 9, 8].
  2. a.pop() соңғы 8 элементін жойып, қайтарады: тізім [4, 7, 1, 9]; содан кейін insert(0, 8) 8-ді басына қояды: [8, 4, 7, 1, 9].
  3. remove(7) 7 мәнін (индексті емес!) жояды: [8, 4, 1, 9].
  4. a[1:3] — 1 және 2 индекстер: [4, 1]; a[-1] = 9; ұзындығы 4.
Жауабы [4, 1] 9 4
Есеп 6Программа не шығарады?
k = 0
for i in range(1, 4):
    for j in range(i, 4):
        k = k + i * j
print(k)
  1. Ішкі цикл i-ге тәуелді, сондықтан сыртқы циклдің жолдары бойынша трассировка жасаймыз.
  2. i = 1: j = 1, 2, 3 → 1 + 2 + 3 = 6 қосамыз, k = 6.
  3. i = 2: j = 2, 3 → 4 + 6 = 10 қосамыз, k = 16.
  4. i = 3: j = 3 → 9 қосамыз, k = 25.
  5. Барлығы дене 3 + 2 + 1 = 6 рет орындалды.
Жауабы 25

Күрделі есептер: қадам-қадаммен

Есеп 1Программа не шығарады?
x = 0
y = 1
while y < 50:
    x = x + 1
    y = y * 2 + x
print(x, y)

Идея: Итерациялар саны алдын ала белгісіз — трассировка кестесін құрып, шартты әр итерация алдында тексереміз. Маңыздысы: y жаңа x арқылы есептеледі.

  1. Трассировка кестесі
    Басы: x = 0, y = 1; 1 < 50 — кіреміз.
    1-итерация: x = 1, y = 1 · 2 + 1 = 3.
    2-итерация: x = 2, y = 3 · 2 + 2 = 8.
    3-итерация: x = 3, y = 8 · 2 + 3 = 19.
    4-итерация: x = 4, y = 19 · 2 + 4 = 42; 42 < 50 — тағы бір рет.
    5-итерация: x = 5, y = 42 · 2 + 5 = 89.
  2. Шығу
    89 < 50 тексеруі жалған, цикл аяқталады. Циклден кейінгі мәндер бір рет басылады.
Жауабы 5 89
Есеп 2Программа не шығарады?
s = 0
for i in range(1, 20, 2):
    if i % 3 == 0:
        continue
    if s > 20:
        break
    s = s + i
print(i, s)

Идея: continue тек ағымдағы i мәнін өткізіп жібереді, break бүкіл циклді аяқтайды; s > 20 тексеруі қосудан бұрын тұр.

  1. i мәндері
    range(1, 20, 2) тақ сандарды береді: 1, 3, 5, ..., 19.
  2. Трассировка
    i = 1: 3-ке еселі емес, s = 0 ≤ 20 → s = 1.
    i = 3: 3-ке еселі → continue.
    i = 5: s = 6. i = 7: s = 13.
    i = 9: 3-ке еселі → continue.
    i = 11: s = 13 ≤ 20 → s = 24.
    i = 13: 3-ке еселі емес, бірақ s = 24 > 20 → break. Қосу орындалмады.
  3. Нәтиже
    break-тен кейін i айнымалысы 13-ке тең болып қалды, s = 24.
Жауабы 13 24
Есеп 3Программа не шығарады?
m = [[i * 3 + j for j in range(3)] for i in range(3)]
s = 0
for i in range(3):
    for j in range(3):
        if i > j:
            s = s + m[i][j]
print(s, m[2][::-1])

Идея: Алдымен генератор бойынша матрицаны құрамыз, содан кейін бас диагональдан төмен жатқан элементтерді (i > j) іріктейміз.

  1. Матрицаны құрамыз
    m[i][j] = 3i + j элементі. 0-жол: [0, 1, 2], 1-жол: [3, 4, 5], 2-жол: [6, 7, 8].
  2. Бас диагональдан төмен элементтер
    i > j шарты (1,0), (2,0), (2,1) үшін орындалады: бұлар m[1][0] = 3, m[2][0] = 6, m[2][1] = 7.
    s = 3 + 6 + 7 = 16.
  3. Жол қиығы
    m[2] = [6, 7, 8], [::-1] қиығы оны кері айналдырады: [8, 7, 6].
Жауабы 16 [8, 7, 6]

ҰБТ-дағы жиі қателіктер

  • / әрқашан float береді: 6 / 2 = 3.0, 3 емес. Бүтін бөлінді — тек //.
  • Теріс сандарда // төменге дөңгелектейді: -7 // 2 = -4, -7 % 2 = 1. Ал int(-3.5) = -3 — нөлге қарай алып тастау. Шатастырмаңыз.
  • range пен қиықтың оң шекарасы кірмейді: range(1, 5) — 1..4, a[1:3] — екі элемент. Теріс қадамсыз range(5, 1) бос.
  • input() жол қайтарады: int()-сіз '2' + '3' = '23' болады. Сондай-ақ 2 ** 3 ** 2 = 512 (дәреже оңнан солға), -2 ** 2 = -4.
  • a.remove(x) мән бойынша, a.pop(i) индекс бойынша жояды. Индекстер 0-ден басталады, соңғы элемент — a[len(a) - 1] немесе a[-1]; a[len(a)] — қате.

Есте сақта

// — төменге, % — бөлгіштің таңбасымен, range пен қиықтар оң шекарасыз, индекстер нөлден, input — жол; күмәндансаң — трассировка кестесін жаса.

Өзіңді тексер

1. Программа не шығарады?
print(17 // 5, 17 % 5, 2 ** 4)
  1. 3 2 16
  2. 3.4 2 16
  3. 3 2 8
  4. 2 3 16
Жауабын көрсету

3 2 16 17 // 5 = 3 (бүтін бөлігі), 17 % 5 = 2 (қалдық), 2 ** 4 = 16.

2. Программа не шығарады?
print(-7 // 2, -7 % 2)
  1. -3 -1
  2. -4 1
  3. -3 1
  4. -4 -1
Жауабын көрсету

-4 1 −3,5 төменге қарай −4-ке дөңгелектенеді; қалдық −7 − 2 · (−4) = 1.

3. Программа не шығарады?
s = 0
for i in range(2, 11, 3):
    s += i
print(s)
  1. 26
  2. 18
  3. 15
  4. 10
Жауабын көрсету

15 i = 2, 5, 8 (11 кірмейді): 2 + 5 + 8 = 15.

4. Программа не шығарады?
a = [3, 8, 1, 6, 4]
print(a[1:4], a[-2])
  1. [3, 8, 1] 4
  2. [8, 1, 6, 4] 6
  3. [8, 1] 6
  4. [8, 1, 6] 6
Жауабын көрсету

[8, 1, 6] 6 [1:4] қиығы — 1, 2, 3 индекстер: [8, 1, 6]; a[-2] — соңғысының алдындағы 6 элементі.

5. Программа не шығарады?
print(1, 2, 3, sep='-', end='!')
print(4)
  1. 1 2 3!4
  2. 1-2-3!4
  3. 1-2-3-!4
  4. 1-2-3! және жаңа жолда 4
Жауабын көрсету

1-2-3!4 sep='-' мәндер арасына сызықша қояды, end='!' жаңа жолды алмастырады, сондықтан 4 сол жолда басылады.

6. Программа не шығарады?
n = 2024
s = 0
while n > 0:
    s += n % 10
    n //= 10
print(s)
  1. 8
  2. 4202
  3. 2024
  4. 4
Жауабын көрсету

8 Цикл цифрларды қосады: 4 + 2 + 0 + 2 = 8.

Байланысты тақырыптар

Деңгейіңді біл: ҰБТ-ға тегін диагностика