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

Programmeerimine 2024/25 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
7.1 Järjendid
7.3 Järjendid ja tsükkel
7.3 Kodutöö
7.4 Harjutused
7.5 Silmaring: graafiliste mängude loomine
  • 8. Järjend 2
  • 9. Kahekordne tsükkel. Failitöötlus
  • 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ärjendid ja tsükkel. Failist järjendisse lugemine

Järjendi üksiku elemendi kasutamine

Tegutseme nüüd järjendi konkreetse elemendiga. Võtame näiteks järjendi a = [12, 23, 34, 45, 56] elemendi, mille indeks on 3. Näeme, et a[3] väärtus on 45. Me võime elementi a[3] (ja samalaadselt kõiki teisi elemente) kasutada küllaltki iseseisvana. Näiteks saame neid kasutada avaldistes või muuta nende väärtusi:

a = [12, 23, 34, 45, 56]
print(a[3])
print(type(a[3]))
print(a[3] - 32)
a[3] = 1
print(a[3])

Me näeme, et indeksi võib leida ka arvutuse tulemusena. Oluline on vaid tagada, et indeks ei jääks järjendi piiridest väljapoole.

Järjend ja while-tsükkel

Järjendi struktuurist on eriti kasu juhul, kui me tahame selle elemente (või mingit osa neist) üheskoos kasutada.

Olgu meil ülesandeks trükkida järjendi kõik elemendid järjestikustele ridadele. Selgelt on see tsükliline tegevus, milleks saame kasutada while-tsüklit:

a = [12, 23, 34, 45, 56]
i = 0
while i < len(a):
    print(a[i])
    i += 1

Kuna viimase elemendi indeks on ühe võrra väiksem kui järjendi pikkus, siis on selline tsükli tingimus sobiv.

Olgu meil uus ülesanne: nullida kõik elemendid, mille väärtus on suurem kui 30:

a = [12, 23, 34, 45, 56]
i = 0
while i < len(a):
    if a[i] > 30:
        a[i] = 0
    i += 1
print(a)

Järjend ja for-tsükkel

Sageli on meil vaja järjendit just elementhaaval töödelda. Selle jaoks on sobiv for-tsükkel, mis võtab igal sammul fookusesse järjendi ühe elemendi.

a = [12, 23, 34, 45, 56]
for el in a:        # el asemel on ka teised nimed lubatud 
    print(el)

Joonis 1. For-tsükliga elementide väljastamine

Muutuja el saab igal tsükli sammul väärtuseks järjendi a järgmise elemendi. Olemuselt on for-tsükkel while-tsükliga sarnane. Esimesel real on päis, mis määrab, millal tsükkel lõpetatakse. Järgneb taandreaga määratud keha (ehk sisu), mida igal sammul täidetakse. Tsüklit korratakse niipalju kordi, kui järjendis on elemente.

Muutuja el kaudu ei saa muuta järjendi elementide väärtusi. Kui püüda teha ülaltoodud teisele while-tsüklile analoogi, siis nii jääb a muutmata:

a = [12, 23, 34, 45, 56]
for el in a:
    if el > 30:
        el = 0
print(a)

Joonis 2. For-tsükkel, mis ei muuda järjendit

Mitmetes programmeerimiskeeltes on for-tsükkel teistsugune ja Pythoni for-tsüklile sarnast nimetatakse hoopis for-each-tsükliks.

Muidugi saab erinevates kohtades kasutada muutujaid. Olgu meil ülesandeks teha programm, mis küsib kasutajalt kaks täisarvu. Seejärel kirjutab ekraanile alates esimesest arvust üle ühe kõik täisarvud kuni teise arvuni (seda mitte kaasates). Lisaks arvutatakse kõigi väljastatud arvude korrutis.

Näiteks kui sisestatakse 4 ja 12, siis ekraanile väljastatakse:

>>>
4 6 8 10 Korrutis on 1920

Üks võimalik lahendus on selline. Korrutise puhul ei sobi algväärtuseks 0, sest korrutamine seda ei muudaks.

Näiteprogramm. Arvude väljastamine ja korrutamine

algus = int(input("Sisestage esimene arv "))
lõpp = int(input("Sisestage teine arv "))
korrutis = 1
for i in range(algus, lõpp, 2):
    print(i)
    korrutis *= i
print("Korrutis on " + str(korrutis))

Failist järjendisse lugemine

Readline ja readlines

Eelmises peatükis õppisime, kuidas for-tsükliga faili lugeda. Veel kaks funktsiooni on readline ja readlines. readline loeb failist ühe rea. See võib kasulik olla, kui teame, mis failis on, et sealt ainult rida lugeda. Veel on käsk readlines, mis loeb kõik failis olevad read ja salvestab nad järjendina.

Kasutame teksitifaili andmed.txt.

Taavi
Mia
Karl
Sirli
314
fail = open("andmed.txt")
andmed = fail.readlines()
print(andmed)
fail.close()

Ekraanile väljastatakse: ['Taavi\n', 'Mia\n', 'Karl\n', 'Sirli\n', '314'] Nagu näeme, siis järjendis on elemendid sõne kujul, kus viimane element on \n, mis tähistab realõppu. Tuleb meeles hoida, et elemente töödeldes realõpumärk eemaldada.

Tsükliga failist järjendisse lugemine

Üks kasulik oskus on failist rida haaval järjendisse lugemine. Oletame, et meil on fail andmed.txt nädala temperatuuridega, kus on igal real vastava päeva keskmine temperatuur (ujukoma arv):

10.5
11.2
12.3
9.5
7.8
10.6
10.7

Kui meil on soov need temperatuurid järjendisse temperatuurid lugeda, siis saame selleks kasutada konstruktsiooni for rida in fail. Seejuures peame arvestama, et kuna failist lugedes on tegemist sõnedega, siis tuleb meil enne järjendisse lisamist käsuga append need read teisendada ujukoma (float) tüüpi.

temperatuurid = []

fail = open("andmed.txt")
for rida in fail:
    temperatuurid.append(float(rida))
fail.close()

print(temperatuurid)

Eelnev programm väljastab ekraanile:

[10.5, 11.2, 12.3, 9.5, 7.8, 10.6, 10.7]

Tsükliga failist rea järjendisse lugemine

Kui meil on ühel real mitu elementi, mida tahaks järjendisse lugeda, siis saame rea tükkideks lõikamiseks kasutada funktsiooni split.

Näiteks, kui meil on failis arvud.txt ühel real päeva miinimum- ja maksimumtemperatuurid:

5.0 15.2
6.2 12.4
7.2 12.3
5.1 10.5
4.8 9.5
4.5 10.8
6.2 12.5

Siis saame lugeda andmed failist programmi sarnaselt eelmisele näitele, aga ühe rea saame tükkideks lüüa ja järjendisse panna käsklusega split(). Kui meil oleks elementide vahel näiteks semikoolon, siis saaksime kasutada käsklust split(";"), aga vaikimis tükeldab see funktsioon sõne tühikute kohalt.

fail = open("arvud.txt")
for rida in fail:
    osad = rida.split()
    print(round(float(osad[1]) - float(osad[0]),1))
fail.close()

Katseta! Püüa aru saada, mis selle programmiga ekraanile väljastatakse?

Järjendi ja funktsiooni video

Enesekontroll

  • 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