ohjelmoinnin peruskurssi y1 · print("luvun", x, "neliojuuri on", uusi_arvaus)...

26
Ohjelmoinnin peruskurssi Y1 CSE-A1111 16.9.2015 CSE-A1111 Ohjelmoinnin peruskurssi Y1 16.9.2015 1 / 26

Upload: others

Post on 08-Jul-2020

6 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Ohjelmoinnin peruskurssi Y1 · print("luvun", x, "neliojuuri on", uusi_arvaus) main() CSE-A1111 Ohjelmoinnin peruskurssi Y1 16.9.2015 15 / 26. Tulostuksen muotoilu I Tavallisesti

Ohjelmoinnin peruskurssi Y1

CSE-A1111

16.9.2015

CSE-A1111 Ohjelmoinnin peruskurssi Y1 16.9.2015 1 / 26

Page 2: Ohjelmoinnin peruskurssi Y1 · print("luvun", x, "neliojuuri on", uusi_arvaus) main() CSE-A1111 Ohjelmoinnin peruskurssi Y1 16.9.2015 15 / 26. Tulostuksen muotoilu I Tavallisesti

Mahdollisuus antaa luentopalautetta

I Goblinissa vasemmassa reunassa olevassa valikossa on valinta”Luentopalaute”. Tata kautta on mahdollisuus antaa nimettomanapalautetta luennosta.

I Jos jokin asia on jaanyt palautteen perusteella epaselvaksi, palataansiihen mahdollisuuksien mukaan seuraavalla luennolla.

CSE-A1111 Ohjelmoinnin peruskurssi Y1 16.9.2015 2 / 26

Page 3: Ohjelmoinnin peruskurssi Y1 · print("luvun", x, "neliojuuri on", uusi_arvaus) main() CSE-A1111 Ohjelmoinnin peruskurssi Y1 16.9.2015 15 / 26. Tulostuksen muotoilu I Tavallisesti

Oppimistavoitteet: taman luennon jalkeen

I Osaat kirjoittaa ohjelman, joka toistaa haluttua kaskya tai kaskyjonoaniin, etta kaskyjono tarvitsee kirjoittaa vain yhteen kertaan. Viimekerralla opittujen asioiden lisaksi:

I Osaat kayttaa myos for-kaskya while-kaskyn lisaksi.I Tiedat, miten voit kayttaa toistokaskya hyvaksi, jos haluat ratkaista

jonkin yhtalon iteroimalla.

I Osaat muotoilla tulostusta niin, etta ohjelmasi tulostaa esimerkiksidesimaaliluvuista vain halutun maaran desimaaleja tai tulostaaallekkain desimaalilukuja samoihin sarakkeisiin.

CSE-A1111 Ohjelmoinnin peruskurssi Y1 16.9.2015 3 / 26

Page 4: Ohjelmoinnin peruskurssi Y1 · print("luvun", x, "neliojuuri on", uusi_arvaus) main() CSE-A1111 Ohjelmoinnin peruskurssi Y1 16.9.2015 15 / 26. Tulostuksen muotoilu I Tavallisesti

Kertausta: lampotilojen keskiarvo while-kaskyn avulla

def main():

rivi = input("Montako lampotilaa annat?\n")

lkm = int(rivi)

i = 0

summa = 0.0

while i < lkm:

rivi = input("Anna seuraava lampotila.\n")

lampotila = float(rivi)

summa = summa + lampotila

i = i + 1

if lkm > 0:

keskiarvo = summa / lkm

print("Lampotilojen keskiarvo on", keskiarvo)

else:

print("Et antanut yhtaan lampotilaa.")

main()

CSE-A1111 Ohjelmoinnin peruskurssi Y1 16.9.2015 4 / 26

Page 5: Ohjelmoinnin peruskurssi Y1 · print("luvun", x, "neliojuuri on", uusi_arvaus) main() CSE-A1111 Ohjelmoinnin peruskurssi Y1 16.9.2015 15 / 26. Tulostuksen muotoilu I Tavallisesti

If-kasky toistokaskyn sisalla

def main():

HELLERAJA = 25.0

print("Anna lampotiloja, lopeta -300:lla.")

hellepaivien_lkm = 0

rivi = input("Anna ensimmainen lampotila.\n")

lampotila = float(rivi)

while lampotila > -300.0:

if lampotila >= HELLERAJA:

hellepaivien_lkm += 1

rivi = input("Anna seuraava lampotila.\n")

lampotila = float(rivi)

print("Hellepaivia oli", hellepaivien_lkm, "kpl.")

main()

CSE-A1111 Ohjelmoinnin peruskurssi Y1 16.9.2015 5 / 26

Page 6: Ohjelmoinnin peruskurssi Y1 · print("luvun", x, "neliojuuri on", uusi_arvaus) main() CSE-A1111 Ohjelmoinnin peruskurssi Y1 16.9.2015 15 / 26. Tulostuksen muotoilu I Tavallisesti

Toistokasky for

I For-kaskyn avulla voidaan kayda jonkun rakenteen alkiotjarjestyksessa.

I Funktion range avulla voidaan generoida lukujono (ei tasmallisestioikea termi), jonka kaikki alkiot voidaan kayda lapi for-kaskyn avulla.

I Esimerkiksi range(11) generoi lukujonon, joka sisaltaa luvut 0:sta10:een asti.

I Voidaan kirjoittaa toistokasky

for i in range(11):

tee jotain arvolle i

jossa i saa vuorotellen arvot 0–10.

CSE-A1111 Ohjelmoinnin peruskurssi Y1 16.9.2015 6 / 26

Page 7: Ohjelmoinnin peruskurssi Y1 · print("luvun", x, "neliojuuri on", uusi_arvaus) main() CSE-A1111 Ohjelmoinnin peruskurssi Y1 16.9.2015 15 / 26. Tulostuksen muotoilu I Tavallisesti

Esimerkki: kertotaulu for-kaskyn avulla

def main():

for i in range(11):

tulos = i * 6

print(i, "* 6 =", tulos)

main()

CSE-A1111 Ohjelmoinnin peruskurssi Y1 16.9.2015 7 / 26

Page 8: Ohjelmoinnin peruskurssi Y1 · print("luvun", x, "neliojuuri on", uusi_arvaus) main() CSE-A1111 Ohjelmoinnin peruskurssi Y1 16.9.2015 15 / 26. Tulostuksen muotoilu I Tavallisesti

Lisaa range-funktiosta

I Lukujonoja generoidessa voi antaa myos jonon ensimmaisen alkion,esimerkiksi range(1, 11) generoi lukujonon, jonka ensimmainenalkio on 1 ja viimeinen 10.

I On myos mahdollista antaa jonon kahden perakkaisen alkion vali,esimerkiksi range(1, 11, 2) generoi lukujonon, joka sisaltaa luvut1, 3, 5, 7 ja 9.

I Vali voi olla myos negatiivinen, jolloin lukuja generoidaan ylhaaltaalaspain. Esimerkiksi range(10, 1, -2) generoi lukujonon, jokasisaltaa luvut 10, 8, 6, 4 ja 2.

CSE-A1111 Ohjelmoinnin peruskurssi Y1 16.9.2015 8 / 26

Page 9: Ohjelmoinnin peruskurssi Y1 · print("luvun", x, "neliojuuri on", uusi_arvaus) main() CSE-A1111 Ohjelmoinnin peruskurssi Y1 16.9.2015 15 / 26. Tulostuksen muotoilu I Tavallisesti

Kertotaulu uudelleen

def main():

for i in range(1, 11):

tulos = i * 6

print(i, "* 6 =", tulos)

main()

CSE-A1111 Ohjelmoinnin peruskurssi Y1 16.9.2015 9 / 26

Page 10: Ohjelmoinnin peruskurssi Y1 · print("luvun", x, "neliojuuri on", uusi_arvaus) main() CSE-A1111 Ohjelmoinnin peruskurssi Y1 16.9.2015 15 / 26. Tulostuksen muotoilu I Tavallisesti

Hellepaivien lukumaara for-kaskyn avulla

def main():

HELLERAJA = 25.0

rivi = input("Montako lampotilaa annat?\n")

lkm = int(rivi)

hellepaivien_lkm = 0

for i in range(lkm):

rivi = input("Anna seuraava lampotila.\n")

lampotila = float(rivi)

if lampotila >= HELLERAJA:

hellepaivien_lkm += 1

print("Hellepaivia oli", hellepaivien_lkm, "kpl.")

main()

CSE-A1111 Ohjelmoinnin peruskurssi Y1 16.9.2015 10 / 26

Page 11: Ohjelmoinnin peruskurssi Y1 · print("luvun", x, "neliojuuri on", uusi_arvaus) main() CSE-A1111 Ohjelmoinnin peruskurssi Y1 16.9.2015 15 / 26. Tulostuksen muotoilu I Tavallisesti

Valitehtava

I Miten muuttaisit aikaisemmin annettua lampotilojen keskiarvonlaskevaa ohjelmaa, jos sen ei pitaisikaan laskea lampotilojenkeskiarvoa, vaan niiden maksimi?

CSE-A1111 Ohjelmoinnin peruskurssi Y1 16.9.2015 11 / 26

Page 12: Ohjelmoinnin peruskurssi Y1 · print("luvun", x, "neliojuuri on", uusi_arvaus) main() CSE-A1111 Ohjelmoinnin peruskurssi Y1 16.9.2015 15 / 26. Tulostuksen muotoilu I Tavallisesti

Iterointiesimerkki

I Insinoorimatematiikassa pitaa usein ratkaista jokin yhtalo iteroimalla:I Arvataan yhtalolle jokin ratkaisu.I Jos arvaus ei ole tarpeeksi hyva, sijoitetaan edellinen arvaus johonkin

kaavaan ja saadaan talla tavalla uusi arvaus.I Tata jatketaan, kunnes arvaus on tarpeeksi hyva tai todetaan, etta

ratkaisua ei loydy talla tavalla.

CSE-A1111 Ohjelmoinnin peruskurssi Y1 16.9.2015 12 / 26

Page 13: Ohjelmoinnin peruskurssi Y1 · print("luvun", x, "neliojuuri on", uusi_arvaus) main() CSE-A1111 Ohjelmoinnin peruskurssi Y1 16.9.2015 15 / 26. Tulostuksen muotoilu I Tavallisesti

Neliojuuri Newtonin iteraatiollaI Haetaan luvun x neliojuuri.I Newtonin iteraatio: jos funktion f (y) nollakohdalle on arvaus yn, niin

parempi arvaus saadaan kaavalla

yn+1 = yn −f (yn)

f ′(yn)

I Tassa tapauksessa lasketaan funktion f (y) = y2 − x nollakohtaa,jolloin kaavaksi saadaan

yn+1 =1

2(yn +

x

yn)

I Pitaa viela paattaa, koska saatu ratkaisu on tarpeeksi hyva. Tassaesimerkissa lopetetaan, kun kahden perakkaisen arvauksen erotuksenitseisarvo on korkeintaan 0.0001.

I Huomautus: neliojuuren laskemiseen loytyy Pythonista myos valmisfunktio, mutta samalla periaatteella voidaan ratkaista monia muitayhtaloita.

CSE-A1111 Ohjelmoinnin peruskurssi Y1 16.9.2015 13 / 26

Page 14: Ohjelmoinnin peruskurssi Y1 · print("luvun", x, "neliojuuri on", uusi_arvaus) main() CSE-A1111 Ohjelmoinnin peruskurssi Y1 16.9.2015 15 / 26. Tulostuksen muotoilu I Tavallisesti

Neliojuuri iteroimalla, koodi

def main():

TARKKUUS = 0.0001

rivi = input("Minka luvun neliojuuri lasketaan? ")

x = float(rivi)

if x <= 0:

print("Ohjelma toimii vain positiivisilla luvuilla.")

CSE-A1111 Ohjelmoinnin peruskurssi Y1 16.9.2015 14 / 26

Page 15: Ohjelmoinnin peruskurssi Y1 · print("luvun", x, "neliojuuri on", uusi_arvaus) main() CSE-A1111 Ohjelmoinnin peruskurssi Y1 16.9.2015 15 / 26. Tulostuksen muotoilu I Tavallisesti

Neliojuuri iteroimalla, koodi jatkuu

else:

arvaus = 1.0

uusi_arvaus = 0.5 * (arvaus + x / arvaus)

while abs(uusi_arvaus - arvaus) > TARKKUUS:

arvaus = uusi_arvaus

uusi_arvaus = 0.5 * (arvaus + x / arvaus)

print("luvun", x, "neliojuuri on", uusi_arvaus)

main()

CSE-A1111 Ohjelmoinnin peruskurssi Y1 16.9.2015 15 / 26

Page 16: Ohjelmoinnin peruskurssi Y1 · print("luvun", x, "neliojuuri on", uusi_arvaus) main() CSE-A1111 Ohjelmoinnin peruskurssi Y1 16.9.2015 15 / 26. Tulostuksen muotoilu I Tavallisesti

Tulostuksen muotoilu

I Tavallisesti print-kasky kayttaa Pythonin oletustarkkuuksia esim.desimaalilukuja tulostaessaan.

I Usein ohjelmoija haluaisi kuitenkin vaikuttaa desimaalilukujentulostusten tarkkuuteen.

I Lisaksi tulostuskenttien leveyksia saatamalla voidaan vaikuttaa siihen,etta paallekkaisilla riveilla toisiaan vastaavat asiat saadaantulostumaan omiin sarakkeihinsa.

I Naihin asioihin voidaan vaikuttaa tulostuksen muotoilulla.

I Seuraavassa ei esiteta laheskaan kaikkia muotoilumahdollisuuksia,vaan vain tarkeimmat perusasiat.

CSE-A1111 Ohjelmoinnin peruskurssi Y1 16.9.2015 16 / 26

Page 17: Ohjelmoinnin peruskurssi Y1 · print("luvun", x, "neliojuuri on", uusi_arvaus) main() CSE-A1111 Ohjelmoinnin peruskurssi Y1 16.9.2015 15 / 26. Tulostuksen muotoilu I Tavallisesti

Miten tulostusta muotoillaan?

I print-kaskyssa kirjoitetaan ensin lainausmerkkien sisalle tulostettavavakioteksti.

I Tekstin keskelle lisataan aaltosulut ja niiden sisaan muotoilumaaresellaiseen paikkaan, johin tulostuksessa halutaan tulevan jokumuotoiltava arvo, esimerkiksi muuttujan arvo.

I Lainausmerkeissa olevan tekstin jalkeen kirjoitetaan piste, kaskyformat ja sen sulkujen sisalle muotoiltavat arvot (esim. muuttujiennimet) toisistaan pilkulla erotettuna.

I Esimerkki:

luku1 = 4.579875

tulo = luku1 * luku1

print("Luku on {:4.3f}".format(luku1))

print("{:4.2f} toiseen on {:6.2f}".format(luku1, tulo))

CSE-A1111 Ohjelmoinnin peruskurssi Y1 16.9.2015 17 / 26

Page 18: Ohjelmoinnin peruskurssi Y1 · print("luvun", x, "neliojuuri on", uusi_arvaus) main() CSE-A1111 Ohjelmoinnin peruskurssi Y1 16.9.2015 15 / 26. Tulostuksen muotoilu I Tavallisesti

Muotoilumaare

I Muotoilukoodi alkaa kaksoispisteella.

I Merkin jalkeen voidaan antaa kokonaislukuna tulostukselle varattavankentan leveys. Jos sita ei anneta, tulostustettavalle arvolle varataantarpeellinen maara tilaa.

I Taman jalkeen desimaaliluvuilla voidaan antaa piste ja sen jalkeenkaytettava tarkkuus (desimaalien maara) kokonaislukuna.

I Lopuksi tulee maarittelykirjain, joka kertoo, millaista arvoa ollaantulostamassa:d kokonaislukuf desimaaliluku ilman eksponenttiosaae desimaaliluku eksponenttiosan kanssaE desimaaliluku eksponenttiosan kanssag desimaalilukus merkkijono

CSE-A1111 Ohjelmoinnin peruskurssi Y1 16.9.2015 18 / 26

Page 19: Ohjelmoinnin peruskurssi Y1 · print("luvun", x, "neliojuuri on", uusi_arvaus) main() CSE-A1111 Ohjelmoinnin peruskurssi Y1 16.9.2015 15 / 26. Tulostuksen muotoilu I Tavallisesti

Huomautuksia muotoilukoodeista

I Maarittelykirjainta g kaytettaessa desimaaliluku tulostetaan jokoilman eksponenttiosaa tai sen kanssa luvun suuruuden mukaan.Muotoilukoodissa annettu tarkkuus ei talloin tarkoita desimaalienmaaraa, vaan merkitsevien numeroiden maaraa.

I Oletusarvoisesti luvut tulostetaan kentan oikeaan reunaan. Joshalutaan tulostus kentan vasempaan reunaan, lisataanmuotoilumaareen alkuun :-merkin jalkeen <

I Merkkijonot tulostetaan oletusarvoisesti kentan vasempaan reunaan.Ne voidaan siirtaa oikeaan reunaan >-merkilla.

CSE-A1111 Ohjelmoinnin peruskurssi Y1 16.9.2015 19 / 26

Page 20: Ohjelmoinnin peruskurssi Y1 · print("luvun", x, "neliojuuri on", uusi_arvaus) main() CSE-A1111 Ohjelmoinnin peruskurssi Y1 16.9.2015 15 / 26. Tulostuksen muotoilu I Tavallisesti

Esimerkki: sijoituksen arvokehitys

I Kayttaja antaa ohjelmalle sijoitettavan paaoman, oletetunvuosituoton ja sijoitusajan.

I Ohjelma laskee ja tulostaa sijoituksen arvon kunkin vuoden lopussaseka vuoden aikana kertyneen koron.

I Kaytetaan tulostuksen muotoilua siihen, etta eri vuosien tiedottulostuvat kauniisti paallekkain omiin sarakkeihinsa.

CSE-A1111 Ohjelmoinnin peruskurssi Y1 16.9.2015 20 / 26

Page 21: Ohjelmoinnin peruskurssi Y1 · print("luvun", x, "neliojuuri on", uusi_arvaus) main() CSE-A1111 Ohjelmoinnin peruskurssi Y1 16.9.2015 15 / 26. Tulostuksen muotoilu I Tavallisesti

Sijoituksen arvokehitys, koodi

def main():

print("Ohjelma laskee sijoituksen arvon kehittymisen.")

vastaus = input("Anna sijoitettava paaoma.\n")

paaoma = float(vastaus)

vastaus = input("Anna sijoitusaika.\n")

aika = int(vastaus)

vastaus = input("Anna vuosituotto (%).\n")

tuotto = float(vastaus)

CSE-A1111 Ohjelmoinnin peruskurssi Y1 16.9.2015 21 / 26

Page 22: Ohjelmoinnin peruskurssi Y1 · print("luvun", x, "neliojuuri on", uusi_arvaus) main() CSE-A1111 Ohjelmoinnin peruskurssi Y1 16.9.2015 15 / 26. Tulostuksen muotoilu I Tavallisesti

Sijoituksen arvokehitys, koodi jatkuu

i = 0

print("vuosi vuosikorko paaoma")

print(" vuoden lopussa")

while i < aika:

korko = tuotto / 100.0 * paaoma

paaoma = paaoma + korko

i = i + 1

print("{:4d}. {:10.2f} {:12.2f}".format(

i, korko, paaoma))

main()

CSE-A1111 Ohjelmoinnin peruskurssi Y1 16.9.2015 22 / 26

Page 23: Ohjelmoinnin peruskurssi Y1 · print("luvun", x, "neliojuuri on", uusi_arvaus) main() CSE-A1111 Ohjelmoinnin peruskurssi Y1 16.9.2015 15 / 26. Tulostuksen muotoilu I Tavallisesti

Jatko for-kaskyn avulla

print("vuosi vuosikorko paaoma")

print(" vuoden lopussa")

for i in range(1, aika + 1):

korko = tuotto / 100.0 * paaoma

paaoma = paaoma + korko

print("{:4d}. {:10.2f} {:12.2f}".format(

i, korko, paaoma))

main()

CSE-A1111 Ohjelmoinnin peruskurssi Y1 16.9.2015 23 / 26

Page 24: Ohjelmoinnin peruskurssi Y1 · print("luvun", x, "neliojuuri on", uusi_arvaus) main() CSE-A1111 Ohjelmoinnin peruskurssi Y1 16.9.2015 15 / 26. Tulostuksen muotoilu I Tavallisesti

Sisakkaiset toistokaskyt

I Toistokaskyn sisalla voi olla toinen toistokasky.

I Talloin sisempi toistokasky suoritetaan kokonaan eli sen kaikkikierrokset suoritetaan jokaisella ulomman toistokaskyn kierroksella.

I Seuraavien kalvojen esimerkkiohjelmat tulostavat kellonaikoja (tunnitja minuutit) yhden minuutin valein. Minuutteja muutetaansisemmassa toistokaskyssa ja tunteja ulommassa toistokaskyssa.

CSE-A1111 Ohjelmoinnin peruskurssi Y1 16.9.2015 24 / 26

Page 25: Ohjelmoinnin peruskurssi Y1 · print("luvun", x, "neliojuuri on", uusi_arvaus) main() CSE-A1111 Ohjelmoinnin peruskurssi Y1 16.9.2015 15 / 26. Tulostuksen muotoilu I Tavallisesti

Kello for-kaskyn avulla

def main():

for tunnit in range(24):

for minuutit in range(60):

print(tunnit, ":", minuutit)

main()

CSE-A1111 Ohjelmoinnin peruskurssi Y1 16.9.2015 25 / 26

Page 26: Ohjelmoinnin peruskurssi Y1 · print("luvun", x, "neliojuuri on", uusi_arvaus) main() CSE-A1111 Ohjelmoinnin peruskurssi Y1 16.9.2015 15 / 26. Tulostuksen muotoilu I Tavallisesti

Kello while-kaskyn avulla

def main():

tunnit = 0

while tunnit < 24:

minuutit = 0

while minuutit < 60:

print(tunnit, ":", minuutit)

minuutit += 1

tunnit += 1

main()

CSE-A1111 Ohjelmoinnin peruskurssi Y1 16.9.2015 26 / 26