2. Styrstrukturer

Programmeringsteknik

(Skillnad mellan versioner)
Hoppa till: navigering, sök
(Flera villkor)
Nuvarande version (28 januari 2015 kl. 09.42) (redigera) (ogör)
 
(15 mellanliggande versioner visas inte.)
Rad 1: Rad 1:
-
''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.''
+
{| border="0" cellspacing="0" cellpadding="0" height="30" width="100%"
 +
| style="border-bottom:1px solid #797979" width="5px" |  
 +
{{Mall:Vald flik|[[2. Styrstrukturer|Teori]]}}
 +
{{Mall:Ej vald flik|[[2. Övningar|Övningar]]}}
 +
{{Mall:Ej vald flik|[[2. Inlämningsuppgift 1 Kaprekar|Kaprekar]]}}
 +
| style="border-bottom:1px solid #797979" width="100%"|  
 +
|}
-
==Inläsning==
+
 
 +
 
 +
==Styrstrukturer==
 +
 
 +
''Problem: I Kims sovrum så finns det inget fönster. Eftersom Kim tycker om att ligga och dra sig om morgnarna så vore det bra att ha ett program som läser in väderinformation som temperatur och föreslår lämpliga kläder så att längsta möjliga tid kan ägnas åt snoozning.
 +
 
 +
Kunde vi mer om programmering skulle vi kunna skriva ett program som läser temperaturinformation från någon vädersajt, men i denna kurs (och som en första version av programmet) nöjer vi oss med att läsa informationen från tangentbordet. Sådana förenklingar är vanliga när man programmerar: man börjar med att förenkla problemet och löser det varefter man tar sig an allt svårare problem.
 +
 
 +
För att kunna skriva första versionen av 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
För att läsa från tangentbordet använder man en input-sats, t ex
Rad 9: Rad 25:
Efter denna sats kommer variablen temperatur att innehålla den sträng som den som körde programmet skrev på tangentbordet (och avslutade med returtangenten).
Efter denna sats kommer variablen temperatur att innehålla den sträng som den som körde programmet skrev på tangentbordet (och avslutade med returtangenten).
-
Vill man att variabeln temperatur ska vara ett tal istället omvandlar man med funktionen '''float'''.
+
Vill man att variabeln temperatur ska vara ett tal istället omvandlar man med funktionen <code>float</code> för decimaltal eller <code>int</code> för heltal.
<pre>temperatur = float(input())</pre>
<pre>temperatur = float(input())</pre>
Rad 26: Rad 42:
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).
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===
-
'''Vad får a för värde om inmatningen från tangentbordet är 22 <retur> 42 <retur>?
+
-
<pre>a = float(input())</pre>
+
-
'''Svar:'''<span style="color:white"> 22</span>
+
-
 
+
-
 
+
-
'''Vad får a för värde om inmatningen från tangentbordet är 17 <retur> 12 <retur>?
+
-
<pre>a = float(input())
+
-
a = float(input())</pre>
+
-
'''Svar:'''<span style="color:white"> 12</span>
+
-
 
+
-
 
+
-
'''Vad får a för värde om inmatningen från tangentbordet är 22 <retur> 35 <retur>?
+
-
<pre>a = float(input())
+
-
b = float(input())</pre>
+
-
'''Svar:'''<span style="color:white"> 22</span>
+
-
 
+
-
 
+
-
'''Vad får a för värde om inmatningen från tangentbordet är 19 <retur> 67 <retur>?
+
-
<pre>b = float(input())
+
-
a = float(input())</pre>
+
-
'''Svar:'''<span style="color:white"> 67</span>
+
-
 
+
-
==Villkor==
+
När vi väl vet temperaturen kan vi kolla om den är för låg genom att skriva:
När vi väl vet temperaturen kan vi kolla om den är för låg genom att skriva:
Rad 55: Rad 48:
<pre>temperatur = float(input("Ge utetemperatur: "))
<pre>temperatur = float(input("Ge utetemperatur: "))
if temperatur < 5:
if temperatur < 5:
-
print("Ta på dej en halsduk, lille vän!")</pre>
+
print("Burr, idag är det kallt!")</pre>
Detta program kommer att se ut så här på skärmen:
Detta program kommer att se ut så här på skärmen:
<pre>Ge utetemperatur: 1
<pre>Ge utetemperatur: 1
-
Ta på dej en halsduk, lille vän!</pre>
+
Burr, idag är det kallt!</pre>
eller
eller
Rad 66: Rad 59:
<pre>Ge utetemperatur: 17</pre>
<pre>Ge utetemperatur: 17</pre>
-
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:
+
Detta program kommer alltså att skriva ut texten "Burr, idag är det kallt!" endast om (svaret på frågan om) utetemperaturen är mindre än 5. Strukturen på en if-sats är:
<pre>if &lt; BOOLESKT UTTRYCK> :
<pre>if &lt; BOOLESKT UTTRYCK> :
Rad 73: Rad 66:
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.
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===
-
'''Vad kommer att skrivas ut av följande program om a = 12 och b = 12?'''
+
En konstant i Python är precis som en variabel, men som en konvention skriver man variabelnamnet med versaler.
-
<pre>if a < b:
+
-
print("X", end=" ")
+
-
print("Y")</pre>
+
-
'''Svar:'''<span style="color:white"> "Y"</span>
+
-
 
+
<pre>KIMS_FRYSPUNKT = 5
-
'''Vad kommer att skrivas ut av följande program om a = 4 och b = 4?'''
+
temperatur = int(input("Ge utetemperatur: "))
-
<pre>if a <= b:
+
if temperatur < KIMS_FRYSPUNKT:
-
print("X", end=" ")
+
print("Burr, idag är det kallt ute!")</pre>
-
print("Y")</pre>
+
-
'''Svar:'''<span style="color:white"> "X Y"</span>
+
-
 
+
-
 
+
-
'''Vad kommer att skrivas ut av följande program om a = 12 och b = 17?'''
+
-
<pre>if a < b:
+
-
print("X", end=" ")
+
-
print("Y", end=" ")
+
-
print("Z")</pre>
+
-
'''Svar:'''<span style="color:white"> "X Y Z"</span>
+
-
 
+
-
 
+
-
'''Vad kommer att skrivas ut av följande program om a = 8 och b = 6?'''
+
-
<pre>if a <= b:
+
-
print("X", end = " ")
+
-
print("Y", end = " ")
+
-
print("Z")</pre>
+
-
'''Svar:'''<span style="color:white"> "Z"</span>
+
-
 
+
-
==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:
+
-
 
+
-
<pre>MAMMAS_FRYSPUNKT = 5
+
-
temperatur = float(input("Ge utetemperatur: "))
+
-
if temperatur < MAMMAS_FRYSPUNKT:
+
-
print("Ta på dej en halsduk, lille vän!")</pre>
+
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.
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==
+
===Else-del i if-sats===
-
Om villkoret temperatur <span class="code">&lt; MAMMAS_FRYSPUNKT</span> ä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:
+
Om villkoret temperatur <span class="code">&lt; KIMS_FRYSPUNKT</span> är False händer ingenting alls när man kör programmet. Det är trist programmering. Kim vill gärna ha feedback även då och bygger ut if-satsen så här:
-
<pre>MAMMAS_FRYSPUNKT=5
+
<pre>KIMS_FRYSPUNKT = 5
-
temperatur = float(input("Ge utetemperatur: "))
+
temperatur = int(input("Ge utetemperatur: "))
-
if temperatur < MAMMAS_FRYSPUNKT:
+
if temperatur < KIMS_FRYSPUNKT:
-
print("Ta på dej en halsduk, lille vän!")
+
print("Burr, det är kallt ute!")
else:
else:
-
print("Mammas gullgubbe slipper halsduk!")</pre>
+
print("Idag är det lagom varmt ute!")</pre>
Detta program kommer att se ut så här på skärmen:
Detta program kommer att se ut så här på skärmen:
<pre>Ge utetemperatur: 2
<pre>Ge utetemperatur: 2
-
Ta på dej en halsduk, lille vän!</pre>
+
Burr, det är kallt ute!</pre>
eller
eller
<pre>Ge utetemperatur: 17
<pre>Ge utetemperatur: 17
-
Mammas gullgubbe slipper halsduk!</pre>
+
Idag är det lagom varmt ute!</pre>
-
Satserna efter else kommer alltså att utföras när villkoret i if-satsen är False.
+
Satserna efter else kommer alltså att utföras när villkoret i if-satsen är False. Strukturen på en if-else-sats är:
-
 
+
<pre>if &lt; BOOLESKT UTTRYCK> :
-
 
+
&lt; EN ELLER FLERA SATSER SOM SKA EXEKVERAS>
-
'''Vad kommer att skrivas ut av följande program om a = 13 och b = 7?'''
+
-
<pre>if a <= b:
+
-
print("A", end=" ")
+
-
print("B", end=" ")
+
-
else:
+
-
print("C", end=" ")
+
-
print("D")</pre>
+
-
'''Svar:'''<span style="color:white"> "C D"</span>
+
-
 
+
-
 
+
-
'''Vad kommer att skrivas ut av följande program om a = 36?'''
+
-
<pre>MITTEN = 42
+
-
if a <= MITTEN:
+
-
print("A", end=" ")
+
-
print("B", end=" ")
+
else:
else:
-
print("C", end=" ")
+
<EN ELLER FLERA SATSER SOM SKA EXEKVERAS></pre>
-
print("D")</pre>
+
-
'''Svar:'''<span style="color:white"> "A B D"</span>
+
-
==Flera villkor==
+
===Flera villkor===
-
Plötsligt kommer mamma på att det kan bli ännu kallare och vill ha en tredje utskrift om temperaturen är under noll.
+
Plötsligt kommer Kim på att det kan bli ännu varmare och vill ha en tredje utskrift om temperaturen är över 20 och det därmed är badväder.
<pre># Ett program som visar hur if-elif-else fungerar
<pre># Ett program som visar hur if-elif-else fungerar
-
MAMMAS_FRYSPUNKT = 5
+
KIMS_FRYSPUNKT = 5
-
CELSIUS_FRYSPUNKT = 0
+
KIMS_GLASSPUNKT = 20
-
temperatur = float(input("Ge utetemperatur: "))
+
temperatur = int(input("Ge utetemperatur: "))
-
if temperatur < CELSIUS_FRYSPUNKT:
+
if temperatur < KIMS_FRYSPUNKT:
-
print("Ta på dej halsduk och mössa!")
+
print("Burr, idag är det kallt ute!")
-
elif temperatur < MAMMAS_FRYSPUNKT:
+
elif temperatur > KIMS_GLASSPUNKT:
-
print("Ta på dej en halsduk!")
+
print("Idag är det sommar ute!")
else:
else:
-
print("Mammas gullgubbe slipper halsduk!")</pre>
+
print("Idag är det lagom varmt ute!")</pre>
Detta program kommer att se ut så här på skärmen
Detta program kommer att se ut så här på skärmen
<pre>Ge utetemperatur: 3
<pre>Ge utetemperatur: 3
-
Ta på dej en halsduk!</pre>
+
Burr, idag är det kallt ute!</pre>
eller
eller
<pre>Ge utetemperatur: 17
<pre>Ge utetemperatur: 17
-
Mammas gullgubbe slipper halsduk!</pre>
+
Idag är det lagom varmt ute!</pre>
eller
eller
-
<pre>Ge utetemperatur: -2
+
<pre>Ge utetemperatur: 25
-
Ta på dej halsduk och mössa!</pre>
+
Idag är det sommar ute!</pre>
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.
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.
 +
Strukturen på en if-else-sats är:
-
'''Vad kommer min, max och b att ha för värden efter följande satser om a = -2?'''
+
<pre>if <BOOLESKT UTTRYCK>:
-
<pre>min = 5
+
<EN ELLER FLERA SATSER SOM SKA EXEKVERAS>
-
max = 10
+
elif <BOOLESKT UTTRYCK>:
-
b = 0
+
<EN ELLER FLERA SATSER SOM SKA EXEKVERAS>
 +
else:
 +
<EN ELLER FLERA SATSER SOM SKA EXEKVERAS></pre>
-
if a < min:
+
===Likhet===
-
min = a
+
-
elif a > max:
+
-
max = a
+
-
else:
+
-
b += 1</pre>
+
-
'''Svar:''' min =<span style="color:white"> -2 </span>, max =<span style="color:white"> 10 </span>samt b =<span style="color:white"> 0</span>
+
-
 
+
-
==Likhet==
+
När man vill testa likhet så används dubbla likhetstecken. Enkelt likhetstecken används bara till tilldelning. Exempel:
När man vill testa likhet så används dubbla likhetstecken. Enkelt likhetstecken används bara till tilldelning. Exempel:
Rad 210: Rad 151:
<pre>betyg = 2123
<pre>betyg = 2123
if betyg == 2000:
if betyg == 2000:
-
print "Du har precis kommit in på högskolan"
+
print("Du har precis kommit in på högskolan")
elif betyg > 2000:
elif betyg > 2000:
-
print "Du har kommit in på högskolan"
+
print("Du har kommit in på högskolan")
else:
else:
-
print "Du har inte kommit in på högskolan"</pre>
+
print("Du har inte kommit in på högskolan")</pre>
-
 
+
-
 
+
-
'''Vad skrivs ut om x = 5 och y = 3?'''
+
-
<pre>if x > 2:
+
-
if y > 4:
+
-
print "blå"
+
-
elif x == y:
+
-
print "gul"
+
-
else:
+
-
print "röd"
+
-
else:
+
-
print "grön"</pre>
+
-
'''Svar:'''<span style="color:white"> "röd"</span>
+
-
 
+
==While-slingor==
==While-slingor==
Rad 238: Rad 165:
<pre>1: antal_varv = 0
<pre>1: antal_varv = 0
2: while antal_varv &lt; 5 :
2: while antal_varv &lt; 5 :
-
3:&nbsp; print "Python"
+
3:&nbsp; print("Python")
4:&nbsp; antal_varv += 1</pre>
4:&nbsp; antal_varv += 1</pre>
Rad 262: Rad 189:
"Exekvera alla indragna rader som kommer efter kolon s&aring; l&auml;nge variabeln antal_varv har ett v&auml;rde som &auml;r mindre &auml;n 5"
"Exekvera alla indragna rader som kommer efter kolon s&aring; l&auml;nge variabeln antal_varv har ett v&auml;rde som &auml;r mindre &auml;n 5"
-
Rad nummer 3 (<span class="code">print "Python"</span>) &auml;r en indragen rad och ing&aring;r d&auml;rf&ouml;r i while-slingan. Den skriver ut texten "Python".
+
Rad nummer 3 (<span class="code">print("Python")</span>) &auml;r en indragen rad och ing&aring;r d&auml;rf&ouml;r i while-slingan. Den skriver ut texten "Python".
Rad nummer 4 (<span class="code">antal_varv += 1</span>) ser till att r&auml;knaren &ouml;kar v&auml;rdet med ett.
Rad nummer 4 (<span class="code">antal_varv += 1</span>) ser till att r&auml;knaren &ouml;kar v&auml;rdet med ett.
Rad 268: Rad 195:
Uppdatering av antal_varv &auml;r ett viktig steg i while-satsen som tillsammans med villkoret "<span class="code">antal_varv &lt; 5</span>" (i rad 2) avg&ouml;r om texten "Python" ska skrivas ut ytterligare en g&aring;ng eller inte.
Uppdatering av antal_varv &auml;r ett viktig steg i while-satsen som tillsammans med villkoret "<span class="code">antal_varv &lt; 5</span>" (i rad 2) avg&ouml;r om texten "Python" ska skrivas ut ytterligare en g&aring;ng eller inte.
-
 
+
===Hur exekveras programmet?===
-
'''Vad skrivs ut av följande program?'''
+
-
<pre>i = 0
+
-
v = 1
+
-
while i < 5:
+
-
v = i * v
+
-
print v
+
-
i += 1</pre>
+
-
'''Svar:'''<span style="color:white"> 0 0 0 0 0</span>
+
-
 
+
-
==Hur exekveras programmet?==
+
<pre>antal_varv=0
<pre>antal_varv=0
while antal_varv &lt; 5 :
while antal_varv &lt; 5 :
-
print "Python"
+
print("Python")
antal_varav += 1</pre>
antal_varav += 1</pre>
-
I f&ouml;rsta raden av programmet f&aring;r variabeln <code>antal_varv</code> v&auml;rdet 0. D&auml;refter exekveras uttrycket <code>antal_varv &lt; 5</code> 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 <code>antal_varav += 1</code> och d&auml;rmed &auml;ndrar <code>antal_varv</code> v&auml;rde till 1. Nu &auml;r slingan slut och d&auml;rf&ouml;r exekveras uttrycket <code>antal_varv &lt; 5</code> 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 <code>print "Python"</code> och <code>antal_varav += 1</code>. Ovanst&aring;ende tre satser upprepas ytterligare tre g&aring;nger tills <code>antal_varv</code> f&aring;r v&auml;rdet 5. N&auml;r d&aring; uttrycket <code>antal_varv &lt; 5</code> 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.
+
I f&ouml;rsta raden av programmet f&aring;r variabeln <code>antal_varv</code> v&auml;rdet 0. D&auml;refter exekveras uttrycket <code>antal_varv &lt; 5</code> 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 <code>print("Python")</code> exekveras. D&auml;refter exekveras <code>antal_varav += 1</code> och d&auml;rmed &auml;ndrar <code>antal_varv</code> v&auml;rde till 1. Nu &auml;r slingan slut och d&auml;rf&ouml;r exekveras uttrycket <code>antal_varv &lt; 5</code> 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 <code>print("Python")</code> och <code>antal_varav += 1</code>. Ovanst&aring;ende tre satser upprepas ytterligare tre g&aring;nger tills <code>antal_varv</code> f&aring;r v&auml;rdet 5. N&auml;r d&aring; uttrycket <code>antal_varv &lt; 5</code> 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.
-
 
+
-
 
+
-
'''I vilken ordning exekveras följande program?'''
+
-
<pre>A
+
-
while B:
+
-
C
+
-
D</pre>
+
-
Vi antar följande förutsättningar:
+
-
* Programmet går endast tre varv.
+
-
* A är en godtycklig tilldelningssats.
+
-
* B är en godtycklig villkorssats som är sann i tre varv.
+
-
* C och D är godtyckliga utskriftssatser.
+
-
 
+
-
 
+
-
# ABCD
+
-
# ACCCD
+
-
# ABCCCD
+
-
# ABCBCBCD
+
-
# ABCBCBCBD
+
-
# ABCABCABCD
+
-
 
+
-
'''Svar:'''<span style="color:white"> 5. ABCBCBCBD</span>
+
-
 
+
-
==En oändlig while-slinga==
+
===En oändlig while-slinga===
Om man tar bort rad nummer 4 fr&aring;n programmet f&aring;r man f&ouml;ljande:
Om man tar bort rad nummer 4 fr&aring;n programmet f&aring;r man f&ouml;ljande:
Rad 316: Rad 210:
<pre>antal_varv = 0
<pre>antal_varv = 0
while antal_varv &lt; 5 :
while antal_varv &lt; 5 :
-
print "Python"</pre>
+
print("Python")</pre>
Vi ser att variabeln <code>antal_varv</code> inte kommer att &auml;ndras i while-satsen. Detta g&ouml;r att villkoret (<code>antal_varv &lt; 5</code>) kommer f&ouml;rbli sant under hela programmet allts&aring; kommer texten "Python" att skrivas ut om och om igen o&auml;ndligt m&aring;nga g&aring;nger.
Vi ser att variabeln <code>antal_varv</code> inte kommer att &auml;ndras i while-satsen. Detta g&ouml;r att villkoret (<code>antal_varv &lt; 5</code>) kommer f&ouml;rbli sant under hela programmet allts&aring; kommer texten "Python" att skrivas ut om och om igen o&auml;ndligt m&aring;nga g&aring;nger.
Rad 322: Rad 216:
Om du r&aring;kar ut f&ouml;r detta n&auml;r du k&ouml;r ett program kan du avbryta programmet genom att trycka ctrl-c. Det g&ouml;r du genom att f&ouml;rst trycka ner tangenten m&auml;rkt "ctrl" p&aring; tangentbordet och forts&auml;tta h&aring;lla den nere och samtidigt som du ocks&aring; trycker ner "C".
Om du r&aring;kar ut f&ouml;r detta n&auml;r du k&ouml;r ett program kan du avbryta programmet genom att trycka ctrl-c. Det g&ouml;r du genom att f&ouml;rst trycka ner tangenten m&auml;rkt "ctrl" p&aring; tangentbordet och forts&auml;tta h&aring;lla den nere och samtidigt som du ocks&aring; trycker ner "C".
-
 
+
===Struktur på while-sats===
-
'''Hur många gånger skrivs texten "hej" när man kör följande program?'''
+
-
<pre>v = 5
+
-
while v > 5:
+
-
print "hej"
+
-
v += 1
+
-
print "hej"</pre>
+
-
'''Svar:'''<span style="color:white"> En gång</span>
+
-
 
+
-
 
+
-
'''Kommer följande program skriva ut texten "hej då"? Om inte, varför?'''
+
-
<pre>i = 0
+
-
while i < 10:
+
-
print "hej"
+
-
print "hej då"</pre>
+
-
'''Svar:'''<span style="color:white"> Nej, eftersom while-satsen är en oändlig slinga och print "hej då" är inte en del av while-satsen.</span>
+
-
 
+
-
 
+
-
==Struktur på while-sats==
+
Strukturen p&aring; en while-sats &auml;r exakt som strukturen p&aring; en if-sats om man bara byter ut if mot while i en if-sats.
Strukturen p&aring; en while-sats &auml;r exakt som strukturen p&aring; en if-sats om man bara byter ut if mot while i en if-sats.
Rad 349: Rad 225:
En while-sats startar med reserverade ordet "while", efter ordet "while" ska ett uttryck som resulterar ett booleskt v&auml;rde (True eller False) komma. Efter uttrycket kommer tecknet kolon (:). Efter kolon kommer de satser som ska exekveras flera g&aring;nger.
En while-sats startar med reserverade ordet "while", efter ordet "while" ska ett uttryck som resulterar ett booleskt v&auml;rde (True eller False) komma. Efter uttrycket kommer tecknet kolon (:). Efter kolon kommer de satser som ska exekveras flera g&aring;nger.
-
 
+
===När ska man använda en while-sats?===
-
'''Vad är det som är fel i följande while-sats? Programmet ska skriva ut "hej" oändligt antal gånger.'''
+
-
<pre>i = 1
+
-
WHILE i < 10:
+
-
print "hej"</pre>
+
-
 
+
-
# 'WHILE' och 'print "hej"' måste stå rakt under varandra och ej vara förskjutna.
+
-
# i = 1 ska tas bort.
+
-
# i < 10 ska ändras till i == 1.
+
-
# Ordet 'WHILE' ska stå med små bokstäver.
+
-
 
+
-
'''Svar:'''<span style="color:white"> 4. Ordet 'WHILE' ska stå med små bokstäver
+
-
</span>
+
-
 
+
-
 
+
-
==När ska man använda en while-sats?==
+
En while-sats anv&auml;nds n&auml;r en eller flera rader kod ska exekveras ett best&auml;mt eller obest&auml;mt antal g&aring;nger efter varandra.
En while-sats anv&auml;nds n&auml;r en eller flera rader kod ska exekveras ett best&auml;mt eller obest&auml;mt antal g&aring;nger efter varandra.
Rad 370: Rad 231:
F&ouml;ljande &auml;r exempel p&aring; program d&auml;r antalet upprepningar &auml;r obest&auml;md och beror p&aring; anv&auml;ndarens inmatning:
F&ouml;ljande &auml;r exempel p&aring; program d&auml;r antalet upprepningar &auml;r obest&auml;md och beror p&aring; anv&auml;ndarens inmatning:
-
<pre>tal=input("Gissa ett tal mellan 1 och 100:")
+
<pre>tal=int(input("Gissa ett heltal mellan 1 och 100:"))
while tal != 74 :
while tal != 74 :
-
tal=input("fel, f&ouml;rs&ouml;k igen:")
+
tal=int(input("fel, f&ouml;rs&ouml;k igen:"))
-
print "Grattis du gissade r&auml;tt!"</pre>
+
print("Grattis du gissade r&auml;tt!")</pre>
 +
Observera att funktionen <code>int</code> omvandlar teckensträngen som användaren skriver in till ett heltalsvärde.
-
'''I vilka av följande tillfällen kan man med fördel använda sig av while-satser?'''
 
-
# När man vill att programmet ska skriva ut samma text flera gånger efter varandra.
 
-
# När man vill skriva ut alla tal mellan 5 och 95.
 
-
# När man vill utföra en sak 10 gånger.
 
-
'''Svar:'''<span style="color:white"> Vid alla tre tillfällena!</span>
 
-
 
+
==Test 2==
-
==Test==
+
Nu är det dags för kursens andra test.
Nu är det dags för kursens andra test.
Rad 389: Rad 245:
du samtliga test och inlämningsuppgifter.
du samtliga test och inlämningsuppgifter.
Testet rättas automatiskt och du har möjlighet att göra om
Testet rättas automatiskt och du har möjlighet att göra om
-
testet flera gånger om du inte lyckas på första försöket.
+
testet flera gånger om du inte lyckas på första försöket.
-
 
+
-
 
+
-
==Inlämningsuppgift 1 (Prat i kvadrat)==
+
-
 
+
-
I den första inlämningsuppgiften ska du skriva och skicka in ditt första pythonprogram.
+
-
Programmet ska skriva ut de första n kvadrattalen: 1*1, 2*2, ... , n*n, där talet n anges
+
-
av den som använder programmet. Programmet ska också skriva ut summan av dessa kvadrattal.
+
-
Här är ett exempel på en körning:
+
-
 
+
-
<pre>Välkommen till prat i kvadrat.
+
-
Hur många kvadrattal vill du skriva ut? 4
+
-
1 * 1 = 1
+
-
2 * 2 = 4
+
-
3 * 3 = 9
+
-
4 * 4 = 16
+
-
Summan av kvadrattalen: 30</pre>
+
-
 
+
-
Programmet ska finnas i en fil med namnet <code>Uppgift1.py</code>. Följ den här mallen:
+
-
 
+
-
<pre># Programmeringsteknik webbkurs KTH inlämningsuppgift 1.
+
-
# <Ditt namn>
+
-
# <Datum>
+
-
# <Kort beskrivning av vad programmet gör>
+
-
<Programkod></pre>
 
-
Innan du skickar in programmet så ska du testa att det fungerar.
+
==Inlämningsuppgift 1==
-
Kontrollera speciellt att programmet fungerar korrekt även om
+
-
användaren skriver in talet 0 eller 1.
+
-
(I den här uppgiften finns det inget krav på vad som ska hända
+
-
om användaren matar in ett negativt tal eller skriver in något
+
-
annat än ett heltal. Om du vill så får du dock gärna försöka
+
-
upptäcka felaktig inmatning och skriva ut lämpliga felmeddelanden.)
+
-
När du har testat ditt program grundligt så går du till kursens förstasida.
+
Se instruktioner här:
-
Under rubriken Examination hittar du Inlämningsuppgift&nbsp;1 och
+
[[2. Inlämningsuppgift 1 Kaprekar|Inlämningsuppgift 1: Kaprekar]]
-
där kan du lämna in filen Uppgift1.py. Observera att filen måste vara i textformat,
+
-
vilket den automatiskt blir om du skapar den med hjälp av IDLE.
+
-
Detta för att vi ska kunna prova och testköra ditt program.
+

Nuvarande version

       Teori          Övningar          Kaprekar      


Innehåll

Styrstrukturer

Problem: I Kims sovrum så finns det inget fönster. Eftersom Kim tycker om att ligga och dra sig om morgnarna så vore det bra att ha ett program som läser in väderinformation som temperatur och föreslår lämpliga kläder så att längsta möjliga tid kan ägnas åt snoozning.

Kunde vi mer om programmering skulle vi kunna skriva ett program som läser temperaturinformation från någon vädersajt, men i denna kurs (och som en första version av programmet) nöjer vi oss med att läsa informationen från tangentbordet. Sådana förenklingar är vanliga när man programmerar: man börjar med att förenkla problemet och löser det varefter man tar sig an allt svårare problem.

För att kunna skriva första versionen av 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

temperatur = input()

Efter denna sats kommer variablen temperatur att innehålla den sträng som den som körde programmet skrev på tangentbordet (och avslutade med returtangenten).

Vill man att variabeln temperatur ska vara ett tal istället omvandlar man med funktionen float för decimaltal eller int för heltal.

temperatur = float(input())

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:

# Exempel som visar hur inläsning går till.
print("Ge utetemperatur: ")
temperatur = float(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:

# Exempel som visar hur inläsning kan göras kortare.
temperatur = float(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:

temperatur = float(input("Ge utetemperatur: "))
if temperatur < 5:
    print("Burr, idag är det kallt!")

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

Ge utetemperatur: 1
Burr, idag är det kallt!

eller

Ge utetemperatur: 17

Detta program kommer alltså att skriva ut texten "Burr, idag är det kallt!" endast om (svaret på frågan om) utetemperaturen är mindre än 5. Strukturen på en if-sats är:

if < BOOLESKT UTTRYCK> :
	< 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

En konstant i Python är precis som en variabel, men som en konvention skriver man variabelnamnet med versaler.

KIMS_FRYSPUNKT = 5
temperatur = int(input("Ge utetemperatur: "))
if temperatur < KIMS_FRYSPUNKT:
    print("Burr, idag är det kallt ute!")

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 < KIMS_FRYSPUNKT är False händer ingenting alls när man kör programmet. Det är trist programmering. Kim vill gärna ha feedback även då och bygger ut if-satsen så här:

KIMS_FRYSPUNKT = 5
temperatur = int(input("Ge utetemperatur: "))
if temperatur < KIMS_FRYSPUNKT:
    print("Burr, det är kallt ute!")    
else:
    print("Idag är det lagom varmt ute!")

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

Ge utetemperatur: 2
Burr, det är kallt ute!

eller

Ge utetemperatur: 17
Idag är det lagom varmt ute!

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

if < BOOLESKT UTTRYCK> :
	< EN ELLER FLERA SATSER SOM SKA EXEKVERAS>
else:
    <EN ELLER FLERA SATSER SOM SKA EXEKVERAS>

Flera villkor

Plötsligt kommer Kim på att det kan bli ännu varmare och vill ha en tredje utskrift om temperaturen är över 20 och det därmed är badväder.

# Ett program som visar hur if-elif-else fungerar
KIMS_FRYSPUNKT = 5
KIMS_GLASSPUNKT = 20
temperatur = int(input("Ge utetemperatur: "))
if temperatur < KIMS_FRYSPUNKT:
    print("Burr, idag är det kallt ute!")
elif temperatur > KIMS_GLASSPUNKT:
    print("Idag är det sommar ute!")
else:
    print("Idag är det lagom varmt ute!")

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

Ge utetemperatur: 3
Burr, idag är det kallt ute!

eller

Ge utetemperatur: 17
Idag är det lagom varmt ute!

eller

Ge utetemperatur: 25
Idag är det sommar ute!

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.

Strukturen på en if-else-sats är:

if <BOOLESKT UTTRYCK>:     
    <EN ELLER FLERA SATSER SOM SKA EXEKVERAS> 
elif <BOOLESKT UTTRYCK>:     
    <EN ELLER FLERA SATSER SOM SKA EXEKVERAS> 
else:      
    <EN ELLER FLERA SATSER SOM SKA EXEKVERAS>

Likhet

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

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 i början på varje rad är för att vi ska kunna referera till raderna i texten. När man programmerar skriver man förstås utan siffror och kolon.

1: antal_varv = 0
2: while antal_varv < 5 :
3:   print("Python")
4:   antal_varv += 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_varv < 5" (i rad 2) avgör om texten "Python" ska skrivas ut ytterligare en gång eller inte.

Hur exekveras programmet?

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

Om man tar bort rad nummer 4 från programmet får man följande:

antal_varv = 0
while antal_varv < 5 :
  print("Python")

Vi ser att variabeln antal_varv inte kommer att ändras i while-satsen. Detta gör att villkoret (antal_varv < 5) kommer förbli sant under hela programmet alltså kommer texten "Python" att skrivas ut om och om igen oändligt många gånger.

Om du råkar ut för detta när du kör ett program kan du avbryta programmet genom att trycka ctrl-c. Det gör du genom att först trycka ner tangenten märkt "ctrl" på tangentbordet och fortsätta hålla den nere och samtidigt som du också trycker ner "C".

Struktur på while-sats

Strukturen på en while-sats är exakt som strukturen på en if-sats om man bara byter ut if mot while i en if-sats.

while <BOOLESKT UTTRYCK> :
  <EN ELLER FLERA SATSER SOM SKA EXEKVERAS>

En while-sats startar med reserverade ordet "while", efter ordet "while" 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 flera gånger.

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

En while-sats används när en eller flera rader kod ska exekveras ett bestämt eller obestämt antal gånger efter varandra.

Följande är exempel på program där antalet upprepningar är obestämd och beror på användarens inmatning:

tal=int(input("Gissa ett heltal mellan 1 och 100:"))
while tal != 74 :
  tal=int(input("fel, försök igen:"))
print("Grattis du gissade rätt!")

Observera att funktionen int omvandlar teckensträngen som användaren skriver in till ett heltalsvärde.


Test 2

Nu är det dags för kursens andra test. Under rubriken Examination på kursens förstasida hittar du samtliga test och inlämningsuppgifter. Testet rättas automatiskt och du har möjlighet att göra om testet flera gånger om du inte lyckas på första försöket.


Inlämningsuppgift 1

Se instruktioner här: Inlämningsuppgift 1: Kaprekar