Лекция · 4.4

Тізімдерге практикалық есептер

Тізімдерді үйрендік, әдістерді білеміз, алгоритмдерді меңгердік — енді бәрін БІР ЕСЕПТЕ біріктіретін кез. Нағыз есептер «append қолдан» деп айтпайды: «Дүкеннің апталық түсімін талда» дейді. Қай алгоритм керегін ӨЗІҢ анықтауың керек. Бүгін есеп мәтінінен алгоритмге апаратын жолды үйренеміз — бұл олимпиада мен ҰБТ-ның да, нағыз программалаудың да басты дағдысы.

Есеп шешу қаңқасы

Тізімге қатысты кез келген программа үш бөліктен тұрады:

БөлікКоды
1. Енгізуn оқу → бос тізім → циклмен append
2. ӨңдеуАлгоритм: қосынды/санақ/максимум/сүзгі...
3. Шығаруprint(нәтиже)
# Стандартты енгізу қаңқасы
n = int(input())
a = []
for i in range(n):
    a.append(int(input()))

Бұл қаңқаны жаттап ал — ол әр есептің басында қайталанады. Өзгеретіні — тек ортаңғы «өңдеу» бөлігі.

Алгоритмді қалай таңдау

Есеп мәтініндегі СҰРАҚ алгоритмді өзі айтып тұрады:

Сұрақтағы белгіАлгоритмҚұрал
«қосындысы», «барлығы», «орташасы»Жинақтауышsum(), sum/len
«нешеу?», «саны қанша?»Шартпен санауcount() немесе if+k
«ең үлкен», «ең кіші», «рекорд»Экстремумmax(), min()
«бар ма?», «нешінші орында?»Іздеуin, index()
«бөліп ал», «тек ... көрсет»Сүзгілеуif + append
«ретте», «өсу ретімен шығар»Сұрыптауsort()
🧰
Аналогия: алгоритмдер — құралдар жәшігі: шеге — балға, бұранда — бұрауыш. Есептегі сұрақ — «шеге ме, бұранда ма» деген белгі. Тәжірибелі шебер құралды ойланбай алады — жаттығу осыған жеткізеді.
Мысал: дүкен есебі

Есеп: «Апта бойы сатылған нан саны берілген. Жалпы сатылымды, ең табысты күнді және сатылым 20-дан асқан күндер санын тап».

s = [12, 25, 8, 30, 17, 22, 9]

# 1. «Жалпы» → қосынды
print(sum(s))          # 123

# 2. «Ең табысты» → максимум
print(max(s))          # 30

# 3. «20-дан асқандар нешеу» → шартпен санау
k = 0
for x in s:
    if x > 20:
        k += 1
print(k)               # 3 (25, 30, 22)

Бір тізім — үш сұрақ — үш алгоритм. Әр сұрақты бөлек шешеміз: есептің «үлкендігінен» қорықпа, оны ұсақ бөліктерге бөл.

Мысал: тіркескен алгоритмдер

Есеп: «Температуралар тізімінен ТЕК ОҢ температуралардың орташасын тап». Мұнда бір алгоритм жеткіліксіз — ЕКЕУІ тіркеседі:

t = [-2, 5, 11, -8, 3]

# 1-қадам: сүзгілеу — оң температуралар
on = []
for x in t:
    if x > 0:
        on.append(x)   # [5, 11, 3]

# 2-қадам: орташа
print(sum(on) / len(on))   # 6.33...
⚠️
Абайла: sum(t)/len(t) деп бүкіл тізімнің орташасын тапсаң — есеп ШАРТЫН бұзасың (теріс сандар да кіріп кетеді). Есепті мұқият оқу — код жазудан маңызды! Тағы бір қауіп: тізімде оң сан мүлдем болмаса, len(on) = 0 — нөлге бөлу қатесі. Мықты программа оны if len(on) > 0 деп тексереді.
Мысал: ішінара қосынды

Есеп: «Кезекте N оқушы тұр, әрқайсысына сатушы белгілі минут жұмсайды. Қожа кезекте P-ші болса, ол өз кезегін қанша минут күтеді?» Мұнда бүкіл тізімнің емес, тек БІР БӨЛІГІНІҢ қосындысы керек — Қожаның алдында тұрғандардікі ғана:

t = [7, 5, 6, 3, 7, 8, 4, 2, 6, 9]   # әр оқушыға жұмсалатын уақыт
p = 7                                 # Қожа 7-ші кезекте

kutu = 0
for i in range(p - 1):   # тек алдындағы 0..5 индекстер
    kutu += t[i]
print(kutu)   # 33 — Қожа 33 минут күтеді

Айырмашылығы: жинақтауыш циклі бұл жолы range(n) емес, range(p - 1) — тек КЕРЕКТІ бөлікті аралайды. Есепті мұқият оқу керек: «Қожаға дейінгілер» дегенді «бүкіл тізім» деп шатастырса, жауап қате шығады.

🎯 ҰБТ байланысы
Аралас тізім есептері — ҰБТ программалау блогының «қорытынды бақылауы».
1
Код фрагментінің нәтижесін анықтау — алгоритмді сөзбен емес, қадаммен оқы.
2
Сұрақ пен алгоритмді сәйкестендіру: «нешеу» — санақ, «ең» — экстремум.
3
Тіркескен алгоритмдер: сүзгі + орташа, сұрыптау + индекс.
4
Ішінара қосынды: цикл шегін дұрыс анықтау (range(n) емес, range(p-1)).
Сабақ қорытындысы
  • Қаңқа: енгізу (n → бос тізім → append) → өңдеу → шығару.
  • Сұрақ алгоритмді айтады: «қосынды» — sum, «нешеу» — санақ, «ең» — max/min, «бөліп ал» — сүзгі, «ретте» — sort.
  • Үлкен есеп = ұсақ сұрақтарға бөлінген бірнеше алгоритм.
  • Тіркескен есептер: алдымен сүзгі, сосын есептеу.
  • Ішінара қосынды: тізімнің тек бір бөлігін range(...) шегімен аралау.
  • Шектік жағдайларды тексер: бос тізім, нөлге бөлу.