Тізімдерге практикалық есептер
Тізімдерді үйрендік, әдістерді білеміз, алгоритмдерді меңгердік — енді бәрін БІР ЕСЕПТЕ біріктіретін кез. Нағыз есептер «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...
Есеп: «Кезекте 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) — тек КЕРЕКТІ бөлікті аралайды. Есепті мұқият оқу керек: «Қожаға дейінгілер» дегенді «бүкіл тізім» деп шатастырса, жауап қате шығады.
- Қаңқа: енгізу (n → бос тізім → append) → өңдеу → шығару.
- Сұрақ алгоритмді айтады: «қосынды» — sum, «нешеу» — санақ, «ең» — max/min, «бөліп ал» — сүзгі, «ретте» — sort.
- Үлкен есеп = ұсақ сұрақтарға бөлінген бірнеше алгоритм.
- Тіркескен есептер: алдымен сүзгі, сосын есептеу.
- Ішінара қосынды: тізімнің тек бір бөлігін range(...) шегімен аралау.
- Шектік жағдайларды тексер: бос тізім, нөлге бөлу.