Toisto – perustehtävät

Tehtävä 1. Selitä koodin toiminta.

Koodi:

lista = [0,1,2,3,4,5,6,7]
for i in range(len(lista)):
    lista[i] = lista[i] + 1

Ensin alustetaan lista arvoilla 0, 1, 2, 3, 4, 5, 6 ja 7.
Sitten for-silmukka käy listan läpi kasvattaen indeksiä i listan pituuteen asti ja joka kierroksella kasvatetaan listan jäsentä indeksissä i yhdellä.

Tehtävä 2 Kirjoita ohjelma, joka tulostaa luvut väliltä 2-15.

Tulosteena luvut 2-15 allekkain

Koodi:

for i in range(2, 16):
    print(i)

Tehtävä 3. Kirjoita ohjelma, joka tulostaa parilliset luvut väliltä 2-20.

Tulosteena luvut 2, 4, 6, 8, 10, 12, 14, 16, 18 ja 20 allekkain

Koodi:

for i in range(2, 21):
    if i % 2 == 0:
        print(i)

Tehtävä 4. Kirjoita ohjelma, joka tulostaa kolmella jaolliset luvut väliltä 4-25.

Tulosteena luvut 6, 9, 12, 15, 18, 21 ja 24 allekkain

Koodi:

for i in range(4, 26):
    if i % 3 == 0:
        print(i)

Tehtävä 5. Ota syötteenä luku. Tarkista annetusta listasta, kuinka monesti siinä esiintyy syötteenä annettu luku. Tulosta määrä. Jos ei löytynyt, tulosta ”Ei löytynyt.”

Lista: [0,1,2,3,4,5,6,7,8,9,1,3,2,6,2,4,7,2,3,4,5,7,9,5,4,2]

Tulostaa luvun määrän listassa tai ”Ei löytynyt.”

Koodi:

lista = [0,1,2,3,4,5,6,7,8,9,1,3,2,6,2,4,7,2,3,4,5,7,9,5,4,2]
arvo = int(input("Syötä etsittävä arvo: "))
laskuri = 0

for alkio in lista:
    if alkio == arvo:
        laskuri += 1
if arvo not in lista:
    print("Ei löytynyt.")
else:
    print(laskuri)

Tehtävä 6. Ota syötteenä merkkijono ja tarkista, löytyykö siitä kirjain ’a’. Jos löytyy, tulosta ”Löytyi.”, jos ei, tulosta ”Ei löytynyt.”

Tulosteena ”Löytyi.”, jos syötteessä on kirjain a ja ”Ei löytynyt.”, jos ei ole.

Koodi:

syöte = input("Syötä merkkijono: ")

for kirjain in syöte:
    if kirjain == "a":
        print("Löytyi.")
        break
else:
    print("Ei löytynyt.")

Tehtävä 7. Ohjelmissa ei esiinny loputtomia silmukoita kuin vahingossa, sillä ne pysäyttävät ohjelman toiminnan.
Korjaa oheinen koodi siten, että silmukan suoritus lopetetaan joskus.

i = 0
while True:
    i += 1
    print(i)
print("Valmis")

Lisää esim. arvon 67 kohdalle break

Tulostaa luvut 1-67 ja sen jälkeen ”Valmis”.

Koodi:

i = 0
while True:
    i += 1
    print(i)
    if i == 67:
        break
print("Valmis")

Tehtävä 8.

a) Kirjoita ohjelma, joka lisää lukuun luvun 1 10 kertaa ja tulostaa pelkästään lopputuloksen.

Tulosteena lopputuloksena saatu luku, johon on lisätty luku 1 10 kertaa.

Koodi:

luku = 10

for i in range(0,10):
    luku += 1
print(luku)

b) Ota syötteenä jokin sana ja lisää se viestiin 10 kertaa. Tulosta lopuksi viesti.

Tuloste:
Tämä on esimerkki. Sanoja: sanasanasanasanasanasanasanasanasanasana

Koodi:

lisäys = input("Syötä lisättävä sana: ")

viesti = "Tämä on esimerkki. Sanoja: "
for i in range(0,10):
    viesti += lisäys
print(viesti)

c) Tulosta luku ja sana 10 kertaa.

Tulostaa ’8 sana’ kymmenen kertaa allekkain.

Koodi:

sana = "sana"
luku = 8
for i in range(0, 10):
    print(luku, sana)

d) Tulosta luku ja sana siten, että luku kasvaa ja että luvun 1 kohdalla on sanan yksikkö ja seuraavien kohdalla monikko.

Tuloste:

1 Jotain
2 Joitain
3 Joitain
4 Joitain
5 Joitain

Koodi:

sana = "Jotain"
monikko = "Joitain"

for i in range(1,6):
    if i == 1:
        print(i, sana)
    else:
        print(i, monikko)

Tehtävä 9.

a) Tulosta luvut 1-10 ja 10-1 vuorotellen samaan tulostukseen.

Tuloste:

1
10
2
9
3
8
4
7
5
6
6
5
7
4
8
3
9
2
10
1

Eli tulostaa vuorotellen lukuja yhdestä kymmeneen ja kymmenestä yhteen allekkain. 1, 10, 2, 9, jne.

Koodi:

for i in range(1,11):
    print(i)
    print(11-i)

b) Tulosta joka toinen luvuista 1-10.

Voit käyttää apuna askelta, eli for-silmukan viimeistä parametria.

Tulosteena 1, 3, 5, 7 ja 9 allekkain.

Koodi:

for i in range(1,11,2):
    print(i)

c) Tulosta joka toinen luku luvuista 1-10 ja 10-1 vuorotellen samaan tulostukseen.

Tuloste:

1
10
3
8
5
6
7
4
9
2

Koodi:

for i in range(1,11,2):
    print(i)
    print(11-i)

Tehtävä 10.

a) Tulosta parilliset luvut annetulta väliltä.

Tulostaa parilliset luvut annetulta lukuväliltä.

Koodi:

alku = int(input("Anna lukuvälin ensimmäinen luku: "))
loppu = int(input("Anna lukuvälin viimeinen luku: "))

for luku in range(alku, loppu+1):
    if luku % 2 == 0:
        print(luku)

b) Tulosta vain ne parilliset luvut, jotka ovat jaollisia myös kolmella.

Tulostaa ne lukuvälin parilliset luvut, jotka ovat jaollisia myös kolmella, eli lukuvälin kuudella jaolliset luvut.

Koodi:

alku = int(input("Anna lukuvälin ensimmäinen luku: "))
loppu = int(input("Anna lukuvälin viimeinen luku: "))

for luku in range(alku, loppu+1):
    if luku % 2 == 0 and luku % 3 == 0:
        print(luku)

c) Tulosta näiden lukujen summa ja tulo.

Tulostaa vastaavasti kuin edellinen kohta, minkä jälkeen tulostaa vielä lukujen summan arvon sekä tulon arvon.

Koodi:

alku = int(input("Anna lukuvälin ensimmäinen luku: "))
loppu = int(input("Anna lukuvälin viimeinen luku: "))

summa = 0
tulo = 1

for luku in range(alku, loppu+1):
    if luku % 2 == 0 and luku % 3 == 0:
        summa += luku
        tulo *= luku
        print(luku)
print(summa)
print(tulo)

d) Lisää tulosteeseen merkinnät, mitä kukin niistä tarkottaa.

Tulostaa vastaavasti kuin edellinen kohta, mutta ennen summan arvoa tulostetaan ”Summa:” ja ennen tulon arvoa ”Tulo:”.

Koodi:

alku = int(input("Anna lukuvälin ensimmäinen luku: "))
loppu = int(input("Anna lukuvälin viimeinen luku: "))

summa = 0
tulo = 1

for luku in range(alku, loppu+1):
    if luku % 2 == 0 and luku % 3 == 0:
        summa += luku
        tulo *= luku
        print("Luku:", luku)
print("Summa:", summa)
print("Tulo:", tulo)

e) Lisää luvun eteen ”Luku 1”, ”Luku 2”, ”Luku n” sen mukaisesti, kuinka mones tulostettu luku on. Tulosta summa ja tulo edellisen kohdan mukaisesti.

Tulostus arvoilla 1 ja 20:

Luku 1: 6
Luku 2: 12
Luku 3: 18
Summa: 36
Tulo: 1296
Koodi:

alku = int(input("Anna lukuvälin ensimmäinen luku: "))
loppu = int(input("Anna lukuvälin viimeinen luku: "))

summa = 0
tulo = 1
indeksi = 1

for luku in range(alku, loppu+1):
    if luku % 2 == 0 and luku % 3 == 0:
        summa += luku
        tulo *= luku
        print(f"Luku {indeksi}:", luku)
        indeksi+=1
print("Summa:", summa)
print("Tulo:", tulo)

Tehtävä 11. Palataan valintarakenteissa esiteltyyn kirjautumismekanismiin.

a) Kirjoita ohjelma, joka kysyy käyttäjältä käyttäjätunnusta ja salasanaa niin kauan, kunnes ne vastaavat ennalta määriteltyjä. Lisää tulosteita, jotta käyttäjä ymmärtää, mitä hänen tulisi tehdä.

Tulosteet:

Tervetuloa kirjautumiseen.
Jos tunnukset väärin:
Yritä uudelleen.
Jos oikein:
Kirjautuminen onnistui!
Tervetuloa järjestelmään!

Koodi:

print("Tervetuloa kirjautumiseen.")
while True:
    käyttäjä = input("Syötä käyttäjätunnus: ")
    salasana = input("Syötä salasana: ")
    if käyttäjä == "Käyttäjä" and salasana == "salasana":
        break
    print("Yritä uudelleen.")
print("Kirjautuminen onnistui!")
print("Tervetuloa järjestelmään!")

b) Lisää toiminnallisuus käyttäjätunnuksen ja salasanan luomiselle. Salasanassa tulee olla vähintään kahdeksan merkkiä pitkä.

Tulosteet:

Luo ensin käyttäjä:
Luo käyttäjätunnus:
Käyttäjätunnuksesi on Käyttäjä.
Luo seuraavaksi salasana.
Salasanassa tulee olla väh. 8 merkkiä

Kaksi ylempää toistetaan, mikäli ehto ei täyty.

Salasana luotu!
Syötä käyttäjätunnus:
Syötä salasana:

Mikäli tunnukset väärin:
Yritä uudelleen.

Kirjautuminen onnistui!
Tervetuloa järjestelmään!

Koodi:

print("Luo ensin käyttäjä: ")
käyttäjä = input("Luo käyttäjätunnus: ")
print("Käyttäjätunnuksesi on", käyttäjä+".")

while True:
    print("Luo seuraavaksi salasana.")
    print("Salasanassa tulee olla väh. 8 merkkiä")
    salasana = input()
    if len(salasana)>=8:
        break
print("Salasana luotu!")

while True:
    käyttäjä = input("Syötä käyttäjätunnus: ")
    salasana = input("Syötä salasana: ")
    if käyttäjä == "Käyttäjä" and salasana == "salasana":
        break
    print("Yritä uudelleen.")
print("Kirjautuminen onnistui!")
print("Tervetuloa järjestelmään!")

Tehtävä 12.

a) Käy läpi seuraava lista [”laiva”, ”auto”, ”nosturi”, ”nalle”, ”omena”] ja tulosta alkion merkkien määrä jokaista alkiota kohden. Esim.

autossa on 4 kirjainta.

Tulostus:

laivassa on 5 kirjainta.
autossa on 4 kirjainta.
nosturissa on 7 kirjainta.
nallessa on 5 kirjainta.
omenassa on 5 kirjainta.

Koodi:

lista = ["laiva", "auto", "nosturi", "nalle", "omena"]
for alkio in lista:
    print(alkio+"ssa on", len(alkio), "kirjainta.")

b) Tulosta lisäksi keskiarvo listan alkioiden merkkien määristä.

Tulostus:

laivassa on 5 kirjainta.
autossa on 4 kirjainta.
nosturissa on 7 kirjainta.
nallessa on 5 kirjainta.
omenassa on 5 kirjainta.
Listan keskiarvo on: 5.2

tai
Listan keskiarvo on: 5.2.

Koodi:

lista = ["laiva", "auto", "nosturi", "nalle", "omena"]
lista2 = []
for alkio in lista:
    print(alkio+"ssa on", len(alkio), "kirjainta.")
    lista2.append(len(alkio))
print("Listan keskiarvo on:", sum(lista2)/len(lista2))

# Vaihtoehtoinen tapa tulostaa keskiarvo
print(f"Listan keskiarvo on: {sum(lista2)/len(lista2)}.")

c) Entäpä mediaani?

Voit järjestää listan lista.sort() -metodin avulla suuruusjärjestykseen.

Tulosteet:

laivassa on 5 kirjainta.
autossa on 4 kirjainta.
nosturissa on 7 kirjainta.
nallessa on 5 kirjainta.
omenassa on 5 kirjainta.
Listan keskiarvo on: 5.2
Listan mediaani on: 5.

Koodi:

lista = ["laiva", "auto", "nosturi", "nalle", "omena"]
lista2 = []
for alkio in lista:
    print(alkio+"ssa on", len(alkio), "kirjainta.")
    lista2.append(len(alkio))
print("Listan keskiarvo on:", sum(lista2)/len(lista2))
lista2.sort()
mediaani = lista2[int(len(lista2)/2)]
print("Listan mediaani on:", mediaani)

Tehtävä 13. Luo Eratostheneen seula. Ota kokonaislukusyöte n.

Voit luoda seulan seuraavalla tavalla:
Ensin luo lista, jossa on n+1 määrä nollia. seula = [0]*(n+1)
Sitten tarkista ja merkitse kahdesta eteenpäin, mitkä luvuista ovat jaollisia kahdella, sitten kolmella, sitten seuraavalla merkitsemättömällä luvulla. Tämän voi tehdä seuraavalla tavalla:

for i in range(2,n+1):
    for j in range(2*i, n+1, i):
        seula[j] = 1

Merkitään siis ykkösellä ei-alkuluvut.
Lopuksi voidaan käydä lista läpi ja tarkistaa, minkä indeksien kohdalla arvo on 0.

a) Käytetään syötteenä saatua arvoa n ja tulostetaan kaikki alkuluvut nollasta n:ään.

Tulosteet:

Syötä lukuvälin yläraja: 10
Tulostaa:
2
3
5
7

Koodi:

n = int(input("Syötä lukuvälin yläraja: "))
seula = [0]*(n+1)

for i in range(2,n+1):
    for j in range(2*i, n+1, i):
        seula[j] = 1

for i in range(2, n+1):
    if seula[i] == 0:
        print(i)

b) Tulosta alkulukujen määrä annetulla välillä.

Tulosteet:

Syötä lukuvälin yläraja: 10
Tulostaa: 4

Koodi:

määrä = 0
n = int(input("Syötä lukuvälin yläraja: "))
seula = [0]*(n+1)

for i in range(2,n+1):
    for j in range(2*i, n+1, i):
        seula[j] = 1

for i in range(2, n+1):
    if seula[i] == 0:
        määrä += 1

print(määrä)

c) Tulosta alkulukujen summa annetulla välillä.

Tulosteet:

Syötä lukuvälin yläraja: 10
Tulostaa: 17

Koodi:

summa = 0
n = int(input("Syötä lukuvälin yläraja: "))
seula = [0]*(n+1)

for i in range(2,n+1):
    for j in range(2*i, n+1, i):
        seula[j] = 1

for i in range(2, n+1):
    if seula[i] == 0:
        summa += i

print(summa)

d) Kaksi alkulukua, joiden erotus on kaksi, muodostavat alkulukuparin. Tulosta alkulukuparit annetulta väliltä.

Tulosteet:

Syötä lukuvälin yläraja: 10
Tulostaa:
3 5
5 7

Koodi:

n = int(input("Syötä lukuvälin yläraja: "))
seula = [0]*(n+1)

for i in range(2,n+1):
    for j in range(2*i, n+1, i):
        seula[j] = 1

for i in range(2, n-1):
    if i >= n+1:
        break
    if seula[i] == 0 and seula[i+2] == 0:
        print(i, i+2)

Tehtävä 14. Käännä annettu merkkijono peilikuvakseen ja tulosta alkuperäinen ja peilikuva peräkkäin.

Silmukoilla voi mennä myös taaksepäin.

Viimeisen indeksin saat luvun len(merkkijono)-1 avulla.

Tulosteet:

Syötä merkkijono: Python
Tulostaa:
PythonnohtyP

Koodi:

syöte = input("Syötä merkkijono: ")

kääntö = ""
for i in range(len(syöte)-1,-1,-1):
    kääntö += syöte[i]

print(syöte+kääntö)

Tehtävä 15. Tässä tehtävässä otetaan syötteenä merkkijono ja käydään sitä läpi ja napataan siinä esiintyvien tietyntyyppisten merkkien määriä.

a) Laske merkkijonossa esiintyvät vokaalit ja tulosta niiden määrä esimerkin mukaisesti:

Tässä on 6 vokaalia.

Esimerkkitulosteena:
Tässä on 8 vokaalia.

Koodi:

vokaalit = 0
syöte = input("Syötä merkkijono: ")
for kirjain in syöte:
    if kirjain in "aeiouyåäöAEIOUYÅÄÖ":
        vokaalit += 1
print("Tässä on", vokaalit, "vokaalia.")

b) Laske vokaalien lisäksi nyt konsonantit ja tulosta myös niiden määrä samalla tavalla.

Esimerkkitulosteena:
Tässä on 8 vokaalia.
Tässä on 13 konsonanttia.

Koodi:

vokaalit = 0
konsonantit = 0
syöte = input("Syötä merkkijono: ")
for kirjain in syöte:
    if kirjain in "aeiouyåäöAEIOUYÅÄÖ":
        vokaalit += 1
    elif kirjain in "bcdfghjklmnpqrstvwxzBCDFGHJKLMNPQRSTVWXZ":
        konsonantit += 1
print("Tässä on", vokaalit, "vokaalia.")
print("Tässä on", konsonantit, "konsonanttia.")

c) Laske näiden lisäksi vielä numeroiden määrä ja tulosta se samalla tavalla.

Esimerkkitulosteena:
Tässä on 8 vokaalia.
Tässä on 13 konsonanttia.
Tässä on 3 lukua.

Koodi:

vokaalit = 0
konsonantit = 0
luvut = 0
syöte = input("Syötä merkkijono: ")
for kirjain in syöte:
    if kirjain in "aeiouyåäöAEIOUYÅÄÖ":
        vokaalit += 1
    elif kirjain in "bcdfghjklmnpqrstvwxzBCDFGHJKLMNPQRSTVWXZ":
        konsonantit += 1
    elif kirjain in "0123456789":
        luvut += 1
print("Tässä on", vokaalit, "vokaalia.")
print("Tässä on", konsonantit, "konsonanttia.")
print("Tässä on", luvut, "lukua.")

d) Laske vielä kirjainten ja numeroiden lisäksi välimerkit ja tulosta niiden määrä (voit valita yleisimmin käytetyt välimerkit, kaikkia ei vaadita).

Esimerkkitulosteena:
Tässä on 8 vokaalia.
Tässä on 13 konsonanttia.
Tässä on 3 lukua.
Tässä on 6 välimerkkiä.
Tässä on 0 muita merkkejä.

Koodi:

vokaalit = 0
konsonantit = 0
luvut = 0
välimerkit = 0
muut = 0
syöte = input("Syötä merkkijono: ")
for kirjain in syöte:
    if kirjain in "aeiouyåäöAEIOUYÅÄÖ":
        vokaalit += 1
    elif kirjain in "bcdfghjklmnpqrstvwxzBCDFGHJKLMNPQRSTVWXZ":
        konsonantit += 1
    elif kirjain in "0123456789":
        luvut += 1
    elif kirjain in '".:,;-_!"/()[]+*=><#':
        välimerkit += 1
    else:
        muut += 1

print("Tässä on", vokaalit, "vokaalia.")
print("Tässä on", konsonantit, "konsonanttia.")
print("Tässä on", luvut, "lukua.")
print("Tässä on", välimerkit, "välimerkkiä.")
print("Tässä on", muut, "muita merkkejä.")

Tehtävä 16.

a) Laske seuraavan geometrisen sarjan 20 ensimmäisen jäsenen summa

1/2n1/2^n

ja tulosta se niin tarkkana kuin Python antaa sen.

Tulostus:

Geometrisen sarjan jäsenet seuraavasti:
0.5 0.75 0.875 0.9375 0.96875 0.984375 0.9921875 0.99609375 0.998046875 0.9990234375 0.99951171875 0.999755859375 0.9998779296875 0.99993896484375 0.999969482421875 0.9999847412109375 0.9999923706054688 0.9999961853027344 0.9999980926513672 0.9999990463256836

Koodi:

summa = 0
for i in range(1, 21):
    summa += 1/2**i
    print(summa)

b) Laske saman sarjan 60 ensimmäisen jäsenen summa. Mitä huomaat?

Tulostus:

60 ensimmäistä jäsentä seuraavasti:
0.5
0.75
0.875
0.9375
0.96875
0.984375
0.9921875
0.99609375
0.998046875
0.9990234375
0.99951171875
0.999755859375
0.9998779296875
0.99993896484375
0.999969482421875
0.9999847412109375
0.9999923706054688
0.9999961853027344
0.9999980926513672
0.9999990463256836
0.9999995231628418
0.9999997615814209
0.9999998807907104
0.9999999403953552
0.9999999701976776
0.9999999850988388
0.9999999925494194
0.9999999962747097
0.9999999981373549
0.9999999990686774
0.9999999995343387
0.9999999997671694
0.9999999998835847
0.9999999999417923
0.9999999999708962
0.9999999999854481
0.999999999992724
0.999999999996362
0.999999999998181
0.9999999999990905
0.9999999999995453
0.9999999999997726
0.9999999999998863
0.9999999999999432
0.9999999999999716
0.9999999999999858
0.9999999999999929
0.9999999999999964
0.9999999999999982
0.9999999999999991
0.9999999999999996
0.9999999999999998
0.9999999999999999
1.0
1.0
1.0
1.0
1.0
1.0
1.0

Koodi:

summa = 0
for i in range(1, 61):
    summa += 1/2**i
    print(summa)

Huomataan, että Pythonin tarkkuus loppuu kesken ja viimeiset jäsenet ”pyöristetään” 1.0:an.
Tämä johtuu siitä, että jos lukua ei voida esittää rajallisella bittimäärällä tarkasti, tietokone tallentaa siitä vain likiarvon.
Useimmissa nykytietokoneissa liukuluvut esitetään likiarvoina binäärimurtolukuina. Sama käytäntö on Pythonissa.
Tämä tarkoittaa sitä, että osoittaja muodostetaan ensimmäisistä 53 bitistä (alkaen merkittävimmästä bitistä) ja nimittäjä on kahden potenssi.

Huomaamme tulosteesta, että kun i:n arvo kasvoi yli 53:n, likiarvoja ei voida enää näyttää.

Tehtävä 17. Ota syötteenä luku n ja näytä n ensimmäistä Fibonaccin lukujonon jäsentä.

Hyödynnä apumuuttujia tallentaaksesi edellisen arvon väliaikaisesti.

Tulosteet:

Syötä lukumäärä: 10

Tulostaa:
0
1
1
2
3
5
8
13
21
34

Koodi:

määrä = int(input("Syötä lukumäärä: "))

eka = 0
toka = 1
temp = 0

for i in range(määrä):
    print(eka)
    temp = toka
    toka = eka + temp
    eka = temp