ohjelmoinnin peruskurssi y1 · pdf filek asitell a k aytt aj an antamaa sy otett a...

Post on 24-Mar-2018

217 Views

Category:

Documents

3 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Ohjelmoinnin peruskurssi Y1

CSE-A1111

5.10.2015

CSE-A1111 Ohjelmoinnin peruskurssi Y1 5.10.2015 1 / 36

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 5.10.2015 2 / 36

Oppimistavoitteet: taman luennon jalkeen

I Tunnet lisaa erilaisia tapoja kayttaa listoja Python-ohjelmissa.

I Osaat kayttaa totuusarvoja sisaltavia listoja.

I Tunnet erilaisia tapoja kasitella merkkijonoja. Osaat esimerkiksikasitella kayttajan antamaa syotetta monipuolisemmin kuinaikaisemmin.

CSE-A1111 Ohjelmoinnin peruskurssi Y1 5.10.2015 3 / 36

AlilistatI Listasta voi ottaa helposti alilistoja (alkuperaisen listan osia):

>>> lista = [2, 4, 6, 8, 10, 12, 14, 16]

>>> alilista = lista[2:5]

>>> print(alilista)

[6, 8, 10]

Kaksoispisteen jalkeen annettua indeksia ei enaa oteta mukaan.I Ensimmainen tai viimeinen indeksi voidaan myos jattaa

merkitsematta, jolloin alilistaan otetaan alkiot listan alusta lahtien tailistaan loppuun asti:

>>> lista[:5]

[2, 4, 6, 8, 10]

>>> lista[5:]

[12, 14, 16]

I Negatiiviset indeksit tarkoittavat alkioita listan lopusta lahtien:

>>> lista[:-1]

[2, 4, 6, 8, 10, 12, 14]

CSE-A1111 Ohjelmoinnin peruskurssi Y1 5.10.2015 4 / 36

Lisays listaanI Listan loppuun voi lisata uuden alkion append-metodilla:

>>> lista = [2, 4, 6, 8, 10, 12, 14, 16]

>>> lista.append(-3)

>>> print(lista)

[2, 4, 6, 8, 10, 12, 14, 16, -3]

I Sijoituskasky ei lisaa listaan uutta alkota, vaan se korvaa vanhanalkion uudella:

>>> lista[3] = -5

>>> print(lista)

[2, 4, 6, -5, 10, 12, 14, 16, -3]

I Sen sijaan metodilla insert voi lisata halutulle indeksille uudenalkion. Lisayspaikan jalkeen tulevia alkioita siirretaan listan loppuunpain:

>>> lista.insert(3, 22)

>>> print(lista)

[2, 4, 6, 22, -5, 10, 12, 14, 16, -3]

CSE-A1111 Ohjelmoinnin peruskurssi Y1 5.10.2015 5 / 36

Alkion poistaminen listasta

I Metodi remove poistaa ensimmaisen alkion, jolla on parametrinaannettu arvo:

>>> print(lista)

[2, 4, 6, 22, -5, 10, 12, 14, 16, -3]

>>> lista.remove(22)

>>> print(lista)

[2, 4, 6, -5, 10, 12, 14, 16, -3]

I Operaattori del poistaa alkion halutulta indeksilta:

>>> print(lista)

[2, 4, 6, -5, 10, 12, 14, 16, -3]

>>> del lista[5]

>>> print(lista)

[2, 4, 6, -5, 10, 14, 16, -3]

CSE-A1111 Ohjelmoinnin peruskurssi Y1 5.10.2015 6 / 36

Listan jarjestaminen ja kaantaminen

I Metodi sort jarjestaa listan:

>>> lista.sort()

>>> print(lista)

[-5, -3, 2, 4, 6, 10, 14, 16]

I Metodi reverse kaantaa listan jarjestyksen painvastaiseksi.

>>> lista.reverse()

>>> print(lista)

[16, 14, 10, 6, 4, 2, -3, -5]

I Funktio sorted tekee listasta kopion ja jarjestaa taman kopion.Alkuperainen lista jaa entiselleen:

>>> lista2 = sorted(lista)

>>> print(lista2)

[-5, -3, 2, 4, 6, 10, 14, 16]

>>> print(lista)

[16, 14, 10, 6, 4, 2, -3, -5]

CSE-A1111 Ohjelmoinnin peruskurssi Y1 5.10.2015 7 / 36

Listojen yhdistaminen

I Kaksi listaa voidaan yhdistaa kayttamalla operaattoria +:

>>> lista1 = [1, 2, 3]

>>> lista2 = [4, 5, 6]

>>> yhteislista = lista1 + lista2

>>> print(yhteislista)

[1, 2, 3, 4, 5, 6]

CSE-A1111 Ohjelmoinnin peruskurssi Y1 5.10.2015 8 / 36

Totuusarvoja sisaltava lista

I Lista voi sisaltaa myos bool-tyyppisia arvoja eli arvoja True ja False

I Seuraavassa esimerkkiohjelmassa on kaytetty tallaista listaakuvaamaan jonkin salin (esim. elokuvateatteri, teatteri taikonserttisali) varaustilannetta.

I Oletetaan, etta paikat on numeroitu nollasta alkaen.

I Listassa on indeksilla i arvo True, jos paikka on varattu, ja arvoFalse, jos paikka on vapaa.

I Ohjelmassa on funktiot halutun paikan varaamiseen, senselvittamiseen, onko maaratty paikka vapaa, kaikkien vapaidenpaikkojen selvittamiseen seka varattujen paikkojen maaranselvittamiseen.

I Ohjelmassa on vain lyhyt esimerkkipaaohjelma nayttamaan sita,miten eri funktioita voidaan kutsua. Jotta jarjestelmaa voisi oikeastikayttaa, tarvittaisiin selvasti pitempi kayttoliittymaohjelma.

CSE-A1111 Ohjelmoinnin peruskurssi Y1 5.10.2015 9 / 36

Paikanvarausohjelma

def varaa_paikka(varatut, paikka):

if 0 <= paikka < len(varatut) and not varatut[paikka]:

varatut[paikka] = True

return True

else:

return False

def onko_vapaa(paikkalista, nro):

if 0 <= nro < len(paikkalista):

return not paikkalista[nro]

else:

return False

CSE-A1111 Ohjelmoinnin peruskurssi Y1 5.10.2015 10 / 36

Paikanvarausohjelma, jatkoa

def kerro_vapaat_paikat(varauslista):

vapaiden_lista = []

for i in range(len(varauslista)):

if not varauslista[i]:

vapaiden_lista.append(i)

return vapaiden_lista

def montako_varattu(varaukset):

varattuja = 0

for alkio in varaukset:

if alkio:

varattuja += 1

return varattuja

CSE-A1111 Ohjelmoinnin peruskurssi Y1 5.10.2015 11 / 36

Paikanvarausohjelma, jatkoa

def main():

PAIKKAMAARA = 10

paikka_varattu = [False] * PAIKKAMAARA

for i in range(5):

paikkanro = int(input("Mika paikka varataan? "))

if varaa_paikka(paikka_varattu, paikkanro):

print("Paikan varaus onnistui!")

else:

print("Varaus ei onnistunut.")

tutkittava = int(input("Anna paikan numero: "))

if onko_vapaa(paikka_varattu, tutkittava):

print("Paikka", tutkittava, "on vapaa.")

else:

print("Paikka", tutkittava, "ei ole vapaa.")

CSE-A1111 Ohjelmoinnin peruskurssi Y1 5.10.2015 12 / 36

Paikanvarausohjelma, jatkoa

print("Vapaat paikat:")

print(kerro_vapaat_paikat(paikka_varattu))

print("Paikkoja on varattu {:d} / {:d}.".format(

montako_varattu(paikka_varattu),

len(paikka_varattu)))

main()

CSE-A1111 Ohjelmoinnin peruskurssi Y1 5.10.2015 13 / 36

Valitehtava

I Lisaa edella esitettyyn paikanvarausohjelmaan funktiovaraa_ensimmainen_vapaa, joka varaa ensimmaisen vapaan paikan.Funktio palauttaa varatun paikan numeron tai arvon -1, jos kaikkipaikat on jo varattu.

I Jos aikaa jaa, mieti, miten funktiota voi kutsua paaohjelmassa niin,etta siella joko tulostetaan varatun paikan numero tai vaihtoehtoisestitieto siita, etta vapaita paikkoja ei enaa ole.

CSE-A1111 Ohjelmoinnin peruskurssi Y1 5.10.2015 14 / 36

Merkkijonot

I Merkkijonojen avulla ohjelmassa voi esittaa tekstitietoa, esim. nimia,osoitteita ja erilaisia tunnuksia.

I Merkkijonon tyyppi Pythonissa on str.

I Yksittaisia merkkeja varten ei ole omaa tyyppia, vaan ne ovat yhdenmerkin pituisia merkkijonoja.

I Merkkijono esitetaan yksin- tai kaksinkertaisten lainausmerkkienavulla.

mjono = ’appelsiini’

mjono = "appelsiini"

I Useammalle riville jatkuva merkkijono kirjoitetaan kolmenlainausmerkin sisaan.

pitkajono = """Tama merkkijono sisaltaa

useamman kuin yhden

rivin"""

CSE-A1111 Ohjelmoinnin peruskurssi Y1 5.10.2015 15 / 36

Merkkijonojen kasittely

I Merkkijonoja voidaan kasitella monessa tapauksessa samalla tavallakuin listoja, esim.

>>> sana = "sitruuna"

>>> print(sana[3])

r

I Olennainen ero: merkkijonon sisaltoa ei voi muuttaa sen jalkeen, kunmerkkijono on luotu, esim.

>>> sana[3] = ’a’

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

TypeError: ’str’ object does not support item assignment

CSE-A1111 Ohjelmoinnin peruskurssi Y1 5.10.2015 16 / 36

Merkkijonon lapikaynti

I Merkkijonon merkit voi kayda lapi for-kaskyn avulla samalla tavallakuin listan alkiot:

>>> mjono = "matti"

>>> for merkki in mjono:

... print(merkki)

...

m

a

t

t

i

CSE-A1111 Ohjelmoinnin peruskurssi Y1 5.10.2015 17 / 36

Alimerkkijonot

I Merkkijonosta voi ottaa myos alimerkkijonoja samaan tapaan kuinlistoista alilistoja:

>>> mjono = "appelsiini"

>>> print(mjono[2:5])

pel

>>> print(mjono [:4])

appe

>>> print(mjono [:-1])

appelsiin

CSE-A1111 Ohjelmoinnin peruskurssi Y1 5.10.2015 18 / 36

Merkkijonon pituus ja merkin esiintymisen tutkiminen

I Merkkijonon pituuden saa selville funktiolla len.

>>> mjono = "appelsiini"

>>> print(len(mjono))

10

I Operaattorin in avulla voi tutkia, esiintyyko merkki merkkijonossa.

>>> print("i" in mjono)

True

I Operaattorin in avulla voi myos tutkia, esiintyyko pitempi merkkijonoosana toista.

>>> print("else" in mjono)

False

>>> print("elsi" in mjono)

True

CSE-A1111 Ohjelmoinnin peruskurssi Y1 5.10.2015 19 / 36

Merkin esiintymiskohta merkkijonossa

I Metodin index avulla voidaan hakea parametrina annetun merkinensimmainen esiintymispaikka merkkijonosta:

>>> mjono = "appelsiini"

>>> print(mjono.index("i"))

6

I Saman metodin avulla voidaan hakea myos pitempaa merkkijonoa:

>>> print(mjono.index("lsi"))

4

I Ohjelma kaatuu, jos haettua merkkijonoa ei loydy :

>>> print(mjono.index("lse"))

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

ValueError: substring not found

CSE-A1111 Ohjelmoinnin peruskurssi Y1 5.10.2015 20 / 36

Sijoitus merkkijonomuuttujaan

I Merkkijonon sisaltoa ei voi muuttaa sen jalkeen, kun merkkijono onluotu.

I Voidaan kuitenkin tehda uusi merkkijono ja sijoittaa se arvoksivanhalle muuttujalle:

>>> mjono = "mansikka"

>>> print(mjono)

mansikka

>>> mjono = "mustikka"

>>> print(mjono)

mustikka

CSE-A1111 Ohjelmoinnin peruskurssi Y1 5.10.2015 21 / 36

Uusi merkkijono vanhan avullaI Uusi merkkijono voi kuitenkin riippua jotenkin vanhasta

merkkijonosta. Metodi upper luo uuden merkkijonon, joka sisaltaamuuten samat merkit kuin vanha merkkijono, mutta kaikki pienetkirjaimet on muutettu isoiksi:

>>> mjono = "mustikka"

>>> mjono = mjono.upper()

>>> print(mjono)

MUSTIKKA

I Metodi lower luo uuden merkkijonon, joka sisaltaa muuten samatmerkit kuin vanha merkkijono, mutta kaikki isot kirjaimet onmuutettu pieniksi:

>>> print(mjono)

MUSTIKKA

>>> mjono = mjono.lower()

>>> print(mjono)

mustikka

CSE-A1111 Ohjelmoinnin peruskurssi Y1 5.10.2015 22 / 36

Merkkijonojen liittamiset

I Useampi merkkijono voidaan liittaa perakkain +-operaattorilla.

>>> etunimi = "Matti"

>>> sukunimi = "Virtanen"

>>> kokonimi = etunimi + " " + sukunimi

>>> print(kokonimi)

Matti Virtanen

Jos merkkijonoon halutaan liittaa muuntyyppisten muuttujien arvoja,pitaa ensin suorittaa tyypinmuunnos str-operaattorilla.

>>> tunteja = 50

>>> tuntip = 12.5

>>> palkka = tunteja * tuntip

>>> tulosrivi = str(tunteja) + " h * " + str(tuntip) + \

... " eur / h = " + str(palkka)

>>> print(tulosrivi)

50 h * 12.5 eur / h = 625.0

CSE-A1111 Ohjelmoinnin peruskurssi Y1 5.10.2015 23 / 36

Merkkijonojen monistaminen

I Operaattorin * avulla voidaan tehda merkkijono, joka sisaltaapienemman merkkijonon monta kertaa.

I Rivinvaihtomerkin saa tarvittaessa mukaan lisaamalla merkkijonoonerikoismerkin "\n":

>>> merkit = "*!*"

>>> rivi = 5 * merkit

>>> print(rivi)

*!**!**!**!**!*

>>> rivit = 3 * (rivi + "\n")

>>> print(rivit)

*!**!**!**!**!*

*!**!**!**!**!*

*!**!**!**!**!*

CSE-A1111 Ohjelmoinnin peruskurssi Y1 5.10.2015 24 / 36

Erikoismerkkeja

I Merkkijonoihin on mahdollista liittaa erikoismerkkeja (engl. escapecharacters), jotka aiheuttavat tulostuksessa esimerkiksi rivinvaihdontai kursorin siirron seuraavaan tabulointikohtaan.

I Tarkeimpia erikoismerkkeja:\n rivinvaihto\t tabulaattori\’ yksinkertainen lainausmerkki\" kaksinkertainen lainausmerkki\\ yksi kenoviiva

CSE-A1111 Ohjelmoinnin peruskurssi Y1 5.10.2015 25 / 36

Tyhjien merkkien poisto syotteen alusta ja lopusta

I Usein halutaan poistaa kayttajan syotteesta kayttajan mahdollisestivahingossa alkuun tai loppuun kirjoittamat ns. tyhjat merkit(valilyonnit, tabuloinnit, rivinvaihdot).

I Tama on helppo tehda metodin strip avulla:

>>> syote = input("Anna tekstia.\n")

Anna tekstia.

kirjoitetaan jotain

>>> print("*{:s}*".format(syote))

* kirjoitetaan jotain *

>>> muutettu_syote = syote.strip()

>>> print("*{:s}*".format(muutettu_syote))

*kirjoitetaan jotain*

I Jos tyhjat merkit halutaan poistaan vain merkkijonon alusta tailopusta, voidaan kayttaa metodeita lstrip tai rstrip.

CSE-A1111 Ohjelmoinnin peruskurssi Y1 5.10.2015 26 / 36

Merkkijonon jakaminen

I Monesti on tarve jakaa merkkijono osiin jonkun merkin (esimerkiksivalilyonnin kohdalta).

I Esimerkki: halutaan erottaa samalla rivilla annettu etunimi jasukunimi tai sana ja sen kaannos toiselle kielelle toisistaan.

I Merkkijono voidaan jakaa metodilla split. Se palauttaa listan, jokasisaltaa jaetun merkkijonon eri osat.

I Oletusarvoisesti split-metodi jakaa merkkijonon valilyonninkohdalta, mutta metodille voidaan antaa parametrina joku muumerkki, jonka kohdasta jako tehdaan.

I Jaossa kaytetty merkki ei tule mukaan mihinkaan osaan.

CSE-A1111 Ohjelmoinnin peruskurssi Y1 5.10.2015 27 / 36

Merkkijonon jakaminen, esimerkkeja

>>> teksti = "Pitka teksti, joka sisaltaa monta eri sanaa."

>>> osat = teksti.split()

>>> print(osat)

[’Pitka’, ’teksti,’, ’joka’, ’sisaltaa’, ’monta’, ’eri’,

’sanaa.’]

>>> sanarivi = "kirja=book"

>>> kaannokset = sanarivi.split("=")

>>> print(kaannokset)

[’kirja’, ’book’]

CSE-A1111 Ohjelmoinnin peruskurssi Y1 5.10.2015 28 / 36

Valitehtava

I Kayttajalta luetaan merkkijono, joka sisaltaa yhden kilpailijan nimenseka taman kilpailijan pisteet kahdelta eri kilpailukierrokselta. Eritiedot on erotettu toisistaan kauttaviivalla /.

I Kirjoita ohjelman osa, joka laskee kilpailijan yhteispisteet (molempienkierrosten pisteet yhteensa). Taman jalkeen ohjelman pitaa tulostaakilpailijan nimi ja hanen yhteispisteensa.

I Esimerkki kayttajan antamasta rivista:

Teemu Teekkari/25/15

CSE-A1111 Ohjelmoinnin peruskurssi Y1 5.10.2015 29 / 36

Merkkijonojen vertailu

I Merkkijonojen sisaltoja voi verrata toisiinsa vertailuoperaattoreilla ==,!=, <=, >=, < ja >.

I Kun katsotaan, onko toinen merkkijono suurempi kuin toinen,verrataan merkkeja keskenaan merkkijonojen alusta lahtien.

I Jarjestyksen maaraa kirjainten arvo kaytetyssamerkkikoodausjarjestelmassa – mita lukuarvoa kukin kirjain vastaa.

I Kaytannossa koodit noudattavat muuten aakkosjarjestysta, mutta isotkirjaimet ovat ennen pienia ja skandinaaviset aakkoset eivat olekeskenaan oikeassa jarjestyksessa.

CSE-A1111 Ohjelmoinnin peruskurssi Y1 5.10.2015 30 / 36

Esimerkkeja merkkijonojen vertailuista

>>> nimi1 = "matti"

>>> nimi2 = "teppo"

>>> nimi1 == nimi2

False

>>>

>>> nimi1 < nimi2

True

>>>

>>> nimi3 = "Teppo"

>>> nimi2 == nimi3

False

>>>

>>> nimi3 < nimi2

True

CSE-A1111 Ohjelmoinnin peruskurssi Y1 5.10.2015 31 / 36

Esimerkkeja merkkijonojen vertailuista, jatkoa

>>> nimi1 = "matti"

>>> nimi4 = "matilda"

>>> nimi1 < nimi4

False

CSE-A1111 Ohjelmoinnin peruskurssi Y1 5.10.2015 32 / 36

Esimerkki: lampotilamuunnos

I Seuraava esimerkkiohjelma muuttaa kayttajan antamia lampotilojafahrenheit-asteista celsius-asteiksi tai painvastoin kayttajan valinnanmukaan.

I Merkkijonojen vertailulla selvitetaan, kumpaan suuntaan kayttajahaluaa tehda muunnoksen ja sen mukaan kutsutaan oikeaa funktiota.

I Lisaksi vertailun avulla selvitetaan, haluaako kayttaja tehda uudenmuunnoksen.

I Kayttajan syotteet muutetaan kokonaan isoiksi tai pieniksi kirjaimiksi,jotta niiden ero ei vaikuttaisi vertailun tulokseen.

CSE-A1111 Ohjelmoinnin peruskurssi Y1 5.10.2015 33 / 36

Lampotilamuunnos: koodi

def muunna_celsiuksiksi(fahr_asteet):

celsius_asteet = (fahr_asteet - 32) * 5.0 / 9.0

return celsius_asteet

def muunna_fahrenheiteiksi(cel_asteet):

fahrenheit_asteet = 9.0/5.0 * cel_asteet + 32

return fahrenheit_asteet

CSE-A1111 Ohjelmoinnin peruskurssi Y1 5.10.2015 34 / 36

Lampotilamuunnos: koodi jatkuu

def main():

jatko = "kylla"

while jatko != "ei":

rivi = input("Anna lampotilan yksikko (C/F): ")

yksikko = rivi.upper()

if yksikko == "C":

asteet = float(input("Lampo celsiuksina: "))

fahrenheit = muunna_fahrenheiteiksi(asteet)

print(asteet, "C on", fahrenheit, "F.")

elif yksikko == "F":

asteet = float(input("Lampo fahrenheiteina: "))

celsius = muunna_celsiuksiksi(asteet)

print(asteet, "F on", celsius, "C.")

CSE-A1111 Ohjelmoinnin peruskurssi Y1 5.10.2015 35 / 36

Lampotilamuunnos: koodi jatkuu

else:

print("Virheellinen yksikko, oikea on C tai F")

rivi = input("Haluatko jatkaa (kylla/ei)? ")

jatko = rivi.lower()

main()

CSE-A1111 Ohjelmoinnin peruskurssi Y1 5.10.2015 36 / 36

top related