Arvutiteaduse instituut
  1. Kursused
  2. 2025/26 sügis
  3. Programmeerimine (LTAT.03.001)
EN
Logi sisse

Programmeerimine 2025/26 sügis

  • Üldinfo
  • 1. Muutuja ja avaldis
  • 2. Tingimuslause
  • 3. Funktsioon
  • 4. Korduslause
  • 5. Sõned. Lihtsam failitöötlus
  • 6. Kontrolltöö 1
  • 7. Järjend
  • 8. Järjend 2
  • 9. Kahekordne tsükkel. Failitöötlus
9.1 Kahekordne tsükkel
9.2 Järjend ja funktsioon. Failitöötlus
9.3 Kodutöö
9.4 Harjutused
9.5 Silmaring: NumPy
  • 10. Andmestruktuurid
  • 11. Andmestruktuurid 2
  • 12. Kontrolltöö 2
  • 13. Objektorienteeritud programmeerimine
  • 14. Objektorienteeritud programmeerimine 2
  • 15. Rekursioon
  • 16. Kordamine. Projektide esitlused
  • Viiteid
  • Silmaringimaterjalid
  • Materjalid

Järjend ja funktsioon. Failitöötlus

Järjend funktsiooni argumendina

Programmide kirjutamisel on mõistlik püüda tööd jaotada erinevateks osadeks – alamprogrammideks ehk funktsioonideks.

Pythonis on juba mitmeid defineeritud funktsioone, millele saab anda argumendiks järjendi, näiteks max, min ja len. Ka funktsioonile print saab anda argumendiks järjendi.

a = [2, -3, 5, 1]
print(max(a))
print(min(a))
print(len(a))
print(a)

Järgmine funktsioon kontrollib, kas esimese argumendina antud järjendis on elemente, mis on suuremad teisest argumendist. Kui on, siis tagastatakse tõeväärtus True ja kui pole, siis tõeväärtus False:

def on_suuremaid(jarjend, piir):
    for i in range(len(jarjend)):
        if jarjend[i] > piir:
            return True
    return False

Oluline on tähele panna, et piirist suuremate elementide puudumist (return False) tohib kinnitada alles siis, kui kõik elemendid on läbi vaadatud. Leidumist saame kinnitada kohe, kui sellise elemendi leiame.

Pane tähele, et tegelikult saaks sama ülesannet lihtsamini lahendada funktsiooni max abil. Kui järjendi maksimaalne element on piirist suurem, siis on tulemus True, vastasel juhul False:

def on_suuremaid(jarjend, piir):
    return max(jarjend) > piir

Funktsioonina võime realiseerida ka mõne varemtoodud konstruktsiooni. Tabelit väljastava funktsiooni puhul ei tagastata midagi (täpsemalt tagastatakse None). See-eest toimub funktsiooni sees ekraanile väljastamine:

Näiteprogramm. Funktsiooniga väljastamine

def valjasta_tabel(tabel):
    for i in range(len(tabel)):
        for j in range(len(tabel[i])):
            print(tabel[i][j], end=" ")
        print()


arvude_tabel = [[1, 3, 5], [4, 6, 6], [3, 6, -3]]
valjasta_tabel(arvude_tabel)
print()
arvude_tabel2 = [[-1, 3, 5], [4, -8, 6]]
valjasta_tabel(arvude_tabel2)
print()
riimitabel = [['karu', 'maru', 'taru'], ['haru', 'varu', 'naru']]
valjasta_tabel(riimitabel)

Loomulikult võib funktsioon ka mingi väärtuse tagastada. Näiteks võib loendada, mitu positiivset elementi on etteantud tabeli (esimene argument) etteantud indeksiga (teine argument) veerus:

def positiivsete_arv_veerus(tabel, veeru_indeks):
    loendaja = 0
    for rida in tabel:
        if rida[veeru_indeks] > 0:
            loendaja += 1
    return loendaja

Järjend funktsiooni väärtusena

Funktsioon võib tagastada järjendi, mis võib olla kahemõõtmeline (või rohkemgi).

Koostame funktsiooni loo_diagonaalmaatriks(n), mille argumendi n väärtus näitab, kui suur ruutmaatriks tehakse. Maatriksi peadiagonaali elementidele anname väärtuse 1 ja kõikjale mujale väärtuse 0. Näiteks väljakutsumine loo_diagonaalmaatriks(3) peaks tagastama 1, 0, 0], [0, 1, 0], [0, 0, 1?. Kasutame ära teadmist, et peadiagonaali element on parajasti selline, mille rea- ja veeruindeks on võrdsed:

def loo_diagonaalmaatriks(n):
    maatriks = []
    for i in range(n):       # välimine tsükkel tekitab ridu
        rida = []
        for j in range(n):   # sisemine hoolitseb iga rea täitmise eest
            if i == j:          # tegemist on peadiagonaali elemendiga
                rida.append(1)
            else:
                rida.append(0)
        maatriks.append(rida)
    return maatriks

Proovi funktsiooni täiendada nii, et sellele antakse ka teine argument, mille väärtus kirjutatakse 1 asemel peadiagonaali elementideks.

Failist järjendisse lugemine

Seni oleme tegutsenud kahemõõtmeliste järjenditega, mille elemendid kirjutasime programmiteksti sisse, näiteks:

tabel = [[1, 2, 4], [-1, 5, 0]]

või otse käsureal funktsioonile argumente andes, näiteks:

>>> on_bingo_tabel([[1, 30, 34, 55, 75], [10, 16, 40, 50, 67], [5, 20, 38, 48, 61], [4, 26, 43, 49, 70], [15, 17, 33, 51, 66]])

Vähegi suuremate mahtude juures on see ebamugav ja praktikas ka tihti võimatu, sest tahame sama programmi abil töödelda palju erinevaid andmeid. Failist lugemist käsitlesime varem. Nüüd vaatame, kuidas failist andmed mugavalt kahemõõtmelisse järjendisse saada.

Olgu näiteks õpilaste saadud (täisarvulised) punktid tühikutega eraldatult failis, igal real ühe õpilase punktid. Näiteks:

1 4 5
3 6 8
2 4 8
10 5 0

Kahemõõtmelisse järjendisse saab need andmed näiteks nii: punktide_tabel = []

for rida in fail:  # iga rea jaoks failist
    op_punktid = []  # kogume ühe õpilase punkte
    osad = rida.split() # tühikute kohalt osadeks
    for osa in osad:  # osade kaupa
        op_punktid.append(int(osa)) # järjekordsed punktid juurde

    punktide_tabel.append(op_punktid) # õpilase punktide järjend juurde

Eraldusmärgid andmetes

Eelmises näites olid ühel real olevad andmed eraldatud tühikutega. Ajalooliselt on eraldajaks olnud näiteks koma. Sellest tuleb ka levinud failiformaadi lühend CSV – ingl Comma-separated values. Tegelikult ei pruugi koma alati hästi eraldajaks sobida, kuna võib andmetes tähendada midagi muud, näiteks komadega arve. Levinumad eraldajad on tabulatsioonimärk "\t" ja semikoolon.


Kasutatud allikad:

  • https://progeopik.cs.ut.ee/
  • https://web.htk.tlu.ee/digitaru/programmeerimine/
  • https://web.htk.tlu.ee/digitaru/tarkvara2/
  • Arvutiteaduse instituut
  • Loodus- ja täppisteaduste valdkond
  • Tartu Ülikool
Tehniliste probleemide või küsimuste korral kirjuta:

Kursuse sisu ja korralduslike küsimustega pöörduge kursuse korraldajate poole.
Õppematerjalide varalised autoriõigused kuuluvad Tartu Ülikoolile. Õppematerjalide kasutamine on lubatud autoriõiguse seaduses ettenähtud teose vaba kasutamise eesmärkidel ja tingimustel. Õppematerjalide kasutamisel on kasutaja kohustatud viitama õppematerjalide autorile.
Õppematerjalide kasutamine muudel eesmärkidel on lubatud ainult Tartu Ülikooli eelneval kirjalikul nõusolekul.
Courses’i keskkonna kasutustingimused