2. Styrstrukturer

Programmeringsteknik

(Skillnad mellan versioner)
Hoppa till: navigering, sök
Versionen från 20 juni 2007 kl. 16.25 (redigera)
KTH.SE:u1xsetv1 (Diskussion | bidrag)
(While-slingor)
← Gå till föregående ändring
Versionen från 20 juni 2007 kl. 16.27 (redigera) (ogör)
KTH.SE:u1xsetv1 (Diskussion | bidrag)
(Hur exekveras programmet?)
Gå till nästa ändring →
Rad 171: Rad 171:
==Hur exekveras programmet?== ==Hur exekveras programmet?==
 +
 +<div class="codebox"><div class="title">Python</div><pre>antal_varv=0
 +while antal_varv &lt;5 :
 + print "Python"
 + antal_varav += 1</pre></div>
 +
 +<p>I f&ouml;rsta raden av programmet f&aring;r variabeln <span class="code">antal_varv</span> v&auml;rdet 0. D&auml;refter exekveras uttrycket <span class="code">antal_varv &lt;5</span> och eftersom att 0 &auml;r mindre &auml;n 5 &auml;r villkoret uppfyllt (True) vilket f&aring;r till f&ouml;ljd att while-slingan startar. Det f&ouml;rsta som h&auml;nder i den &auml;r att <span class="code">print "Python"</span> exekveras. D&auml;refter exekveras <span class="code">antal_varav += 1</span> och d&auml;rmed &auml;ndrar <span class="code">antal_varv</span> v&auml;rde till 1. Nu &auml;r slingan slut och d&auml;rf&ouml;r exekveras uttrycket <span class="code">antal_varv &lt;5</span> igen och eftersom att 1 &auml;r mindre &auml;n 5 g&aring;r vi ett varv till i while-slingan. D&auml;r exekveras <span class="code">print "Python"</span> och <span class="code">antal_varav += 1</span>. Ovanst&aring;ende tre satser upprepas ytterligare tre g&aring;nger tills <span class="code">antal_varv</span> f&aring;r v&auml;rdet 5. N&auml;r d&aring; uttrycket <span class="code">antal_varv &lt;5</span> exekveras, till skillnad mot alla tidigare g&aring;nger, blir v&auml;rdet falskt (False) eftersom att 5 inte &auml;r mindre &auml;n 5. Och d&auml;rf&ouml;r avslutas exekvering av while-satsen och i det h&auml;r fallet avslutas &auml;ven programmet d&aring; det inte finns n&aring;gra fler satser kvar att exekvera.</p>
 +
==En oändlig while-slinga== ==En oändlig while-slinga==
==Struktur på while-sats== ==Struktur på while-sats==
==När ska man använda en while-sats?== ==När ska man använda en while-sats?==

Versionen från 20 juni 2007 kl. 16.27

Innehåll

Villkor

Problem: Mamma ska resa till mormor över helgen. Hon är orolig för att lille Lasse, som ska vara alldeles ensam hemma, kommer att klä sig för tunt och vill därför ha ett program som hjälper honom med klädseln.

För att kunna skriva ett sådant program behöver vi lära oss två saker: hur man läser inmatning från tangentbordet och hur man jämför tal.

Inläsning

För att läsa från tangentbordet använder man en input-sats, t ex


Python
temperatur = input()

Efter denna sats kommer variablen temperatur att innehålla det som den som körde programmet skrev på tangentbordet (och avslutade med returtangenten). Tyvärr är det svårt för den som kör programmet att fatta att det är just temperatur som ska matas in eftersom programmet inte frågar efter något. Det fixar man lätt med en print-sats:


Python
print "Ge utetemperatur: "
temperatur = input()

Den här konstruktionen (skriv ut fråga och läs in svar) är så vanlig att man ordnat ett förkortat skrivsätt för den:


Python
temperatur = input("Ge utetemperatur: ")

Viktigt att förstå är att input-satser läser inmatningen i den ordning den kommer. Det går inte att hoppa över någon del av inmatningen. Om någon skriver t ex 17[retur]42[retur] och du endast vill läsa det andra talet (42) måste man först läsa det första (17).

Villkor

När vi väl vet temperaturen kan vi kolla om den är för låg genom att skriva:


Python
temperatur = input("Ge utetemperatur: ")
if temperatur<5:
    print "Ta på dej en halsduk, lille vän!"

Detta program kommer att se ut så här på skärmen:


Python
Ge utetemperatur: 1
Ta på dej en halsduk, lille vän!

eller


Python
Ge utetemperatur: 17

Detta program kommer alltså att skriva ut texten "Ta på dig en halsduk, lille vän" endast om (svaret på frågan om) utetemperaturen är mindre än 5. Strukturen på en if-sats är:


Python
if &lt BOOLESKT UTTRYCK> :
	&lt EN ELLER FLERA SATSER SOM SKA EXEKVERAS>

En if-sats startar med reserverade ordet if, efter ordet if ska ett uttryck som resulterar ett booleskt värde (True eller False) komma. Efter uttrycket kommer tecknet kolon (:). Efter kolon kommer de satser som ska exekveras om värdet blir True. Dessa satser ska indenteras med mellanslags- eller tabulator-tangenten. För att undvika problem bör du inte blanda indentering gjord med mellanslag och tabbar i samma fil.

Konstanter

Programmerare och andra nördar är kända för sin torra humor. Ett sätt att införa det i programmet är att införa en konstant. En konstant i Python är precis som en variabel, men som en konvention skriver man variabelnamnet med versaler, t ex:


Python
MAMMAS_FRYSPUNKT=5
temperatur = input("Ge utetemperatur: ")
if temperatur < MAMMAS_FRYSPUNKT:
    print "Ta på dej en halsduk, lille vän!"

En konstant ändrar inte funktionen i ett program från användarens sida, men det gör programmet lättare att modifiera för programmeraren (ffa om programmet är stort) och rätt använd kan den också göra programmet tydligare.

Else-del i if-sats

Om villkoret temperatur < MAMMAS_FRYSPUNKT är False händer ingenting alls när man kör programmet. Det är trist programmering. Mamma vill gärna ha en uppmuntrande utskrift då och bygger ut if-satsen så här:


Python
MAMMAS_FRYSPUNKT=5
temperatur = input("Ge utetemperatur: ") 
if temperatur < MAMMAS_FRYSPUNKT:
    print "Ta på dej en halsduk, lille vän!"     
else:
    print "Mammas gullgubbe slipper halsduk!"

Detta program kommer att se ut så här på skärmen:


Python
Ge utetemperatur: 2
Ta på dej en halsduk, lille vän!

eller


Python
Ge utetemperatur: 17
Mammas gullgubbe slipper halsduk!

Satserna efter else kommer alltså att utföras när villkoret i if-satsen är False.

Flera villkor

Plötsligt kommer mamma på att det kan bli ännu kallare och vill ha en tredje utskrift om temperaturen är under noll.


Python
MAMMAS_FRYSPUNKT = 5
CELSIUS_FRYSPUNKT = 0
temperatur = input("Ge utetemperatur: ")
if temperatur < CELSIUS_FRYSPUNKT:
    print "Ta på dej halsduk och mössa!"
elif temperatur < MAMMAS_FRYSPUNKT:
    print "Ta på dej en halsduk!"
else:
    print "Mammas gullgubbe slipper halsduk!"

Detta program kommer att se ut så här på skärmen:


Python
Ge utetemperatur: 3
Ta på dej en halsduk!

eller


Python
Ge utetemperatur: 17
Mammas gullgubbe slipper halsduk!

eller


Python
Ge utetemperatur: -2
Ta på dej halsduk och mössa!

Hur många villkor som helst kan kombineras med hjälp av elif. Villkoren kontrolleras i tur och ordning, uppifrån och ned. Det första villkor som blir True får programmet att fortsätta exekveringen på de närmast följande indenterade satserna efter kolon fram till nästa icke-indenterade sats. Därefter hoppas resten av if-satsen över. Om inget villkor blir True (och endast då) utförs de indenterade satserna efter else.

Likhet

När man vill testa likhet så används dubbla likhetstecken. Enkelt likhetstecken används bara till tilldelning. Exempel:


Python
betyg = 2123
if betyg == 2000:
    print "Du har precis kommit in på högskolan"
elif betyg > 2000
    print "Du har kommit in på högskolan"
else:
    print "Du har inte kommit in på högskolan"

While-slingor

När en eller flera satser ska upprepas ett antal gånger är en while-sats ett bra hjälpmedel. Anta att man vill skriva ett program som skriver texten "Python" 5 gånger på skärmen. Detta kan man åstadkomma genom att använda en while-sats enligt nedan. Siffrorna är början på varje rad är för att vi ska kunna referera till raderna i texten. När man programmerar skriver man utan siffror och kolon.


Python
1: antal_varv=0
2: while antal_varv<5 :
3:   print "Python"
4:   antal_varav+=1

Innan vi går igenom programmet presenterar vi idén bakom programkoden.

För att lösa problemet behöver vi en räknare för att hålla reda på antalet gånger texten "Python" skrivits ut så att programmet kan sluta skriva ut texten efter 5:e gången.

Programmet har alltså följande uppgifter att utföra:

  • Skriva ut texten "Python"
  • Skapa en räknare och nollställa den
  • Kontrollera räknarens värde
  • Uppdatera räknarens värde

Nu ska vi gå igenom programmet i detalj.

I rad nummer 1 har vi koden "antal_varv=0". Där har vi valt variabeln antal_varv som ska fungera som räknare och får startvärdet 0.

Resten av program är while-satsen. Syntaxen för en while-sats liknar syntaxen för if-satser som vi har sett tidigare i lektionen om villkor.

Rad nummer 2 är "while antal_varv<5 :" som är följande instruktion för datorn:

"Exekvera alla indragna rader som kommer efter kolon så länge variabeln antal_varv har ett värde som är mindre än 5"

Rad nummer 3 (print "Python") är en indragen rad och ingår därför i while-slingan. Den skriver ut texten "Python".

Rad nummer 4 (antal_varv+=1) ser till att räknaren ökar värdet med ett.

Uppdatering av antal_varv är ett viktig steg i while-satsen som tillsammans med villkoret "antal_varav <5" (i rad 2) avgör om texten "Python" ska skrivas ut ytterligare en gång eller inte.

Hur exekveras programmet?

Python
antal_varv=0
while antal_varv <5 :
  print "Python"
  antal_varav += 1

I första raden av programmet får variabeln antal_varv värdet 0. Därefter exekveras uttrycket antal_varv <5 och eftersom att 0 är mindre än 5 är villkoret uppfyllt (True) vilket får till följd att while-slingan startar. Det första som händer i den är att print "Python" exekveras. Därefter exekveras antal_varav += 1 och därmed ändrar antal_varv värde till 1. Nu är slingan slut och därför exekveras uttrycket antal_varv <5 igen och eftersom att 1 är mindre än 5 går vi ett varv till i while-slingan. Där exekveras print "Python" och antal_varav += 1. Ovanstående tre satser upprepas ytterligare tre gånger tills antal_varv får värdet 5. När då uttrycket antal_varv <5 exekveras, till skillnad mot alla tidigare gånger, blir värdet falskt (False) eftersom att 5 inte är mindre än 5. Och därför avslutas exekvering av while-satsen och i det här fallet avslutas även programmet då det inte finns några fler satser kvar att exekvera.

En oändlig while-slinga

Struktur på while-sats

När ska man använda en while-sats?

Personliga verktyg