Лекция · 4.7

Алгоритмнің трассировкасы

Программаң жұмыс істейді, бірақ нәтиже КҮТКЕНІҢДЕЙ шықпайды. Компьютер сені жазаламайды, тек «дұрыс емес сан» береді де қояды — ал НЕГЕ қате екенін өзің табу керек. Қалай? Компьютерге айналып, ӘР ҚАДАМДЫ ӨЗІҢ, ҚОЛМЕН қайталап көресің! Бұл — трассировка: программаны кітап оқығандай емес, ЕСЕПТЕГІШТЕЙ, әр жолды, әр айнымалының мәнін қадағалап отырып оқу өнері.

Трассировка деген не

Ойлан: компьютер программаны қалай «оқиды»? Ол жолды жол артынан, ДӘЛ жазылған ретпен орындайды, әр кезде айнымалылардың мәнін жаңартып отырады. Сен де дәл осылай істей аласың — қағазға.

Анықтама
Трассировка — алгоритмнің жұмысын тексеру үшін программаны ҚАДАМ-ҚАДАММЕН орындау процесі.

Неге бұл маңызды? Себебі компьютерде программаны «сынап көру» әрдайым мүмкін немесе ыңғайлы бола бермейді. Ал трассировка арқылы АДАМНЫҢ ӨЗІ, компьютерсіз-ақ, программаның дұрыс жұмыс істейтінін тексере алады. Бұл — ҰБТ-дағы «код нәтижесін тап» есептерінің ЖАЛҒЫЗ сенімді әдісі.

Анықтама
Трассировка кестесі — процессордың жұмысын модельдейтін кесте: әр бағанда бір айнымалы, әр жолда бір қадам (оператордың орындалуы) көрсетіледі.
Кесте құру алгоритмі

Трассировка кестесін құру алгоритмі қарапайым: 1) кодтағы әр АЙНЫМАЛЫҒА бөлек баған аш; 2) кодты БІРІНШІ ЖОЛДАН бастап, ЖОЛ-ЖОЛМЕН оқы; 3) әр оператор орындалғанда, ӨЗГЕРГЕН айнымалының жаңа мәнін жаз; 4) циклдегі ШАРТТЫ тексерген сайын, «ақиқат/жалған» деп белгіле; 5) шарт жалған болғанда — цикл тоқтайды, қорытынды мәнді ал.

🎞️
Аналогия: трассировка — киноны кадр-кадрмен көру сияқты: жылдам көргенде ештеңе байқамайсың, ал ӘР КАДРДЫ ТОҚТАТЫП қарасаң — қай жерде «актёр құлап кеткенін» (қате пайда болғанын) дәл көресің.
For циклінің трассировкасы
Тапсырма: «1-ден 5-ке дейінгі сандар қосындысын» есептейтін кодты трассировкала.
S = 0
for N in range(1, 6):
    S = S + N
print('Сандардың қосындысы', S)
ОператорNS
S=00
N=110+1=1
N=221+2=3
N=333+3=6
N=446+4=10
N=5510+5=15
цикл аяқталды???

Жауабы: S = 15. Есіңде болсын: цикл аяқталғаннан кейін N-нің нақты мәні кейде «белгісіз» (???) болып қалады — маңыздысы, S қорытынды мәні дұрыс есептелгені.

While циклінің трассировкасы

While циклінің трассировкасы ЕРЕКШЕ мұқият болуды талап етеді — себебі шартты ӘР ИТЕРАЦИЯДА тексеру керек.

Тапсырма:
k=1
s=5
while k<300:
    s=s+10
    k=k*5
print('Қосынды=', s)
ҚадамksШарт (k<300)
бастапқы15
1-итерация5151<300 True
2-итерация25255<300 True
3-итерация1253525<300 True
4-итерация62545125<300 True
тексеру625625<300 False → тоқта

Жауабы: «Қосынды= 45». Назар аудар: k ӘР ИТЕРАЦИЯДА 5-ке КӨБЕЙЕДІ (1→5→25→125→625), ал s ӘРҚАШАН 10-ға АРТАДЫ. Циклдің тоқтау сәтін дәл табу үшін — k-ны 300-мен ӘР ҚАДАМДА салыстыр.

⚠️
Жиі қате: циклдің АЯҚТАЛУ шартын дұрыс тексермеу. Мысалы, «k 300-ге ЖЕТКЕНДЕ тоқтайды» деп ойлау — ЖАРТЫЛАЙ дұрыс емес: k ЕШҚАШАН дәл 300-ге тең БОЛМАДЫ (625-ке секірді)! Шартты ӘРҚАШАН НАҚТЫ САНМЕН тексер, «шамамен» деп ойлама.

Трассировкада екі тәсіл бар: сипаттамалық (сөзбен) және кестелік (сандармен). Кестелік тәсіл дәлірек әрі жылдамырақ тексеріледі — ҰБТ емтиханында уақыт тапшы болса да, КЕСТЕ ЖАЗУ ЖЫЛДАМЫРАҚ ӘРІ ДӘЛ нәтиже береді.

🎯 ҰБТ байланысы
ҰБТ-да «код нәтижесін тап» типті сұрақтардың БАРЛЫҒЫ — трассировка есептері. Алгоритм:
1
Барлық айнымалыға баған аш.
2
Кодты жол-жолмен оқы, әр өзгеруді жаз.
3
Циклдің шартын ӘР ИТЕРАЦИЯДА тексер.
4
Соңғы жолдағы (не print-тегі) мәнді жауап ретінде бер. Жиі қате: айнымалы мәнін «есте сақтап», кестеге жазбай өткізіп жіберу.
Сабақ қорытындысы
  • Трассировка — программаны компьютерсіз, қолмен, қадам-қадаммен «орындау» өнері.
  • Әр айнымалыға баған ашып, кодты жол-жолмен оқып, өзгерістерді кестеге жазасың.
  • Циклдерде — шартты ӘР ИТЕРАЦИЯДА тексеру маңызды.
  • Бұл дағды: (1) программаның қатесін табуға, (2) ҰБТ-дағы «код нәтижесін тап» есептерін дәл шешуге қызмет етеді.