3. Moment03 - Selektioner och operatorer

Info

Till detta moment finns en sida med lösningsförslag och videoklipp.

För de elever som vill utmanas ytterligare med fler och/eller svårare uppgifter hittar dessa här.

I alla programmeringsspråk så är selektioner ett centralt begrepp. Selektioner eller villkorssatser brukar vi kalla det på svenska, Control Structures heter det på engelska. Oavsett vad det kallas så handlar det om val och att tala om för programmet att göra olika saker beroende på ett specifikt villkor.

I detta moment kommer vi lära oss att förstå strukturen kring villkorssatser men också lära oss att skriva de villkor som styr dem.

3.1 if

Den absolut vanligaste selektionen är att bara använda en if-sats. Genom att skriva en if-sats och ett uttryck så får du din kod att utföra en operation. If-sats är grunden till alla selektioner och eftersom if betyder om på svenska så blir det ganska enkelt att förklara vad som skall hända. Om ålder är större än 17 så....

Vi gör ett enkelt exempel;

Kodexempel: enkel if-sats

# Fråga efter ålder och lagra denna i variabeln age
age = int(input("Ange din ålder: "))

# Om age är större än 17 ...
if age > 17:
    # ... Skriv ut meddelande
    print("Du är myndig och får rösta")

# Skrivs ut oavsett om if-satsens villkor är rätt eller ej
print("Programmet avslutas")

Det uttryck som skrivs ihop med en if-sats skrivs alltid på ett sådant sätt att det ger ett svar som är sant eller falskt, true/false, och detta uttryck får datatypen boolean vilket vi snabbt nämnde i förra momentet. Mer om uttryck och operatorer kommer senare i detta moment.

Resultatet beror på vad du matar in, men här kommer två exempelutskrifter.

Utskrift

Ange din ålder: 16
Programmet avslutas

Utskrift

Ange din ålder: 22
Du är myndig och får rösta
Programmet avslutas

Info om utskrifter

Det som skrivs in efter kolon (:) i mina exempel är det som användaren matar in i konsollen.

Som du ser på rad 5 i koden ovanför så bygger vi upp ett villkor med if och sedan skrivs ett uttryck. Efter uttrycket så skriver vi ett kolon och efter detta kolon kommer nu all kod som är indenterad (inflyttad med tab) tillhöra villkoret. Du som har kodat i andra språk tidigare har säkerligen sett andra alternativ för hur man skriver selektioner men i Python är det kolon : och indentering som avgör vad som tillhör en selektion eller inte.

Här kommer två exempel som ser väldigt lika ut men där utskriften blir annorlunda.

Kodexempel: enkel if-sats

# resultatet på ett matteprov
result = 14

# Mindre än 20 poäng var underkänt på provet
if result > 19:
    print("Du är godkänd")
    print("Grattis till ett bra resultat")

I detta fall ges ingen utskrift allt. Vi förändrar koden ytterst lite och tar bort indenteringen på rad sju vilket gör att koden ser ut på följande sätt...

Kodexempel: enkel if-sats

# resultatet på ett matteprov
result = 14

# Mindre än 20 poäng var underkänt på provet
if result > 19:
    print("Du är godkänd")
print("Grattis till ett bra resultat")

... och ger detta resultatet.

Utskrift

Grattis till ett bra resultat

Detta visar hur viktigt det är att vara noggrann i sin kodning när det gäller selektioner.

Innan det är dags att göra två uppgifter med selektioner så skall vi kika på en användbar funktion och det är möjligheten att läsa av datorns/serverns tid. Kika på exemplet nedan.

Kodexempel: localtime

# Importerar localtime från time
from time import localtime, strftime

# localtime() hämtar tiden och skapar en "tuple"
t = localtime()

# Utskrift av hela "tuple" för localtime()
# Denna utskrift är inte användbar för utskrift men visar vad som lagras.
print(t)

# Utskrift av timmar, minuter och sekunder
print(t.tm_hour)   # timmar från t
print(t.tm_min)    # minuter från t
print(t.tm_sec)    # sekunder från t

# Utskrift av datum snyggt formaterat
print(strftime('%Y-%m-%d %H:%M:%S', t))

Tuple

En tuple är en sorts lista som inte går att ändra sedan den är skapad. Vi kan alltså inte manipulera värdet på t.th_hour ovan. Vi återkommer till tuple och andra typer av listor i nästa moment.

Utskriften blir då på följande sätt.

Utskrift

time.struct_time(tm_year=2025, tm_mon=04, tm_mday=21, tm_hour=07,
tm_min=44, tm_sec=34, tm_wday=1, tm_yday=110, tm_isdst=1)
07
44
34
2025-04-21 07:44:34

Vill du läsa mer och lära dig mer om vilka formateringsmöjligheter som finns för datum och tid så kan du läsa det här.

localtime vs datetime

I exemplet ovan så använder vi oss av localtime vilket skapar en tuple som innehåller data om ett specifikt tillfälle. Denna tuple går inte att förändra så om vi vill göra mer avancerade saker med datum och tid så behöver vi använda en annan modul som heter datetime. Datetime skapar ett objekt (en annan konstruktion som inte ingår i kursen, men som vi ändå kommer stöta på vid senare tillfällen) och detta objekt kan vi påverka på ett helt annat sätt genom att ge det specifika värden, addera, eller subtrahera, både andra datum eller specifikt antal timmar, dagar osv.

Här kommer ett exempel på hur man kan använda datetime.

Kodexempel: datetime

from time import localtime, strftime            # Skapar en tuple
from datetime import datetime, date             # Skapar ett objekt av typen datetime

t = localtime()
print("\nt: localtime")
print(t)
print(type(t))

d = datetime.now()
print("\nd: datetime")
print(d)
print(type(d))

d1 = date.fromisoformat("2012-06-24")
d2 = date.fromisoformat("2014-09-25")

print("\nd: Specifikt datum")
print(d1)
print(d1.strftime('%Y-%m-%d %H:%M:%S'))
print(type(d1))

print(d2 - d1)

Utskrift

t: localtime
time.struct_time(tm_year=2025, tm_mon=04, tm_mday=21, tm_hour=07,
tm_min=44, tm_sec=34, tm_wday=1, tm_yday=110, tm_isdst=1)
<class 'time.struct_time'>

d: datetime
2025-04-21 07:44:34.866
<class 'datetime.datetime'>

d: Specifikt datum
2012-06-24
2012-06-24 00:00:00
<class 'datetime.date'>
823 days, 0:00:00

Uppgift: m03u01

Skapa en variabel som du döper till timme, i den lagrar du värdet från funktionen localtime() vad timvisaren står på just nu. Skriv sedan en if-sats som kollar om värdet är större än 16, om det är fallet så skriver du ut att skoldagen är slut.

När användaren skall mata in något till programmet så är det viktigt att vi är tydliga vad som förväntas. Om vi ställer en fråga som skall besvaras med ja så kommer det bli skillnad om användaren skriver ja, Ja eller JA. Några jobbade med denna typ av uppgifter i förra momentets inlämningsuppgift men det är dags att ta det en gång till. Det exempel som visades då kommer här igen.

Kodexempel: Ta hand om svar

# Inmatning från användaren
svar = "  ja "

# Tar bort ev whitespace i början och slutet av inmatningen
svar = svar.strip()

# Tar fram första bokstaven i svaret
# 0 står för indexet/positionen för den bokstav vi letar efter
svar = svar[0]

# Gör om första bokstaven till versal (stor bokstav)
svar = svar.upper()

# Skriver ut svaret
print(svar)

Det som är viktigt här är att bearbeta svaret så att vi minskar möjligheten för användaren att göra fel. När detta är gjort så blir det mycket enklare för oss att låta programmet styras av den inmatning som gjordes av användaren.

Kodexempel: Ta hand om svar vid int

All inmatning från Konsollen sker i datatypen string. Det vi har gjort tidigare är att vi direkt i inmatningen har gjort om inmatningen till en int. Om vi vill hjälpa användaren och ta hand om inmatningen och tvätta den innan vi gör om det till en int så behöver vi skriv koden lite annorlunda, se exempel nedan.

# Tar emot en inmatning
age = input("Ange hur gammal du är: ")      # datatyp str

# ta bort felaktiga white-space
age = age.strip()                           # datatyp str

# gör om age till int
age = int(age)                              # datatyp int

# utskrift
print(f"Din ålder är {age} år.")

# Det går också att göra i en enda rad,
# först inmatning, sedan strip() och slutligen typkonvertering
# använd denna om du förstår hur den fungerar och kan använda den
age = int(input("Ange hur gammal du är: ").strip())

# utskrift
print(f"Din ålder är {age} år."))

Uppgift: m03u02

Fråga nu användaren efter hens namn och ålder. Skriv sedan ut användarens namn, vilken namnets första bokstav är och om personen är myndig skall även detta skrivas ut. Viktigt att tvätta bort alla WhiteSpaces innan selektioner och utskrifter görs.

3.2 else

När vi nu kan få programmet att göra någonting om ett villkor gäller så behöver vi ju kunna göra något annat om villkoret inte gäller. Det är då vi lägger till vår else-sats. Vi kan läsa ut det som annars vilket då skulle innebär att att Om något gäller så gör detta, annars gör detta.

Vi bygger vidare på vårt tidigare exempel.

Kodexempel: if-else-sats

# Fråga efter ålder och lagra denna i variabeln age
age = int(input("Ange din ålder: "))

# Om age är större än 17 ...
if age > 17:
    # ... Skriv ut meddelande
    print("Du är myndig och får rösta")
else:               # ... annars
    print("Du är minderårig och får inte rösta")

# Skrivs ut oavsett om if-satsens villkor är rätt eller ej
print("Programmet avslutas")

Resultatet beror på vad du matar in, men här kommer två exempelutskrifter.

Utskrift

Ange din ålder: 16
Du är minderårig och får inte rösta
Programmet avslutas

Utskrift

Ange din ålder: 22
Du är myndig och får rösta
Programmet avslutas

Det är viktigt att tänka på att if-satsen skall ha ett uttryck medan else-satsen inte har något uttryck. Detta beror på att else tar hand om alla alternativ som inte är godkända för if-satsens uttryck. Om du vill ställa många uttryck så skall vi kika på det i nästa avsnitt.

Uppgift: m03u03

Bygg vidare på m03u01, där du har skrivit ut att skoldagen är slut när klockan är 17 eller mer. Lägg till utskriften att skoldagen pågår ifall klockan är mindre än 17, vilket ju inte riktigt är sant eftersom vi inte går i skolan före klockan 8.

3.3 elif

Ibland så räcker det inte endast med en if-sats och en else-sats utan vi behöver få in flera alternativ. I python så heter detta kommando elif som är en ihopdragning av else och if, else if är ett vanligt kommando i de flesta programmeringsspråk.

Vad som är viktigt att tänka på är att en selektion måste bestå av en if-sats, den kan bestå av max en else-sats och kan innehålla hur många elif-satser som helst.

Dags att kika på ett exempel;

Kodexempel: elif-sats

# Fråga efter ålder och lagra denna i variabeln age
age = int(input("Ange din ålder: "))

if age < 18:            # Om age är mindre än 18 ...
    print("Du är minderårig och bör gå i skolan")
elif age > 64:          # ... annars om age är större än 64 ...
    print("Du är troligtvis pensionär")
else:                   # ... annars
    print("Jobba, jobba, jobba")

Troligtvis vet du hur utskriften blir men är du osäker så kopiera koden och testa.

Något att tänka på är att elif-satserna behöver ett uttryck och om vi väljer att bygga stora selektioner så finns det alltid en risk att vi skriver uttryck som tar ut varandra eller överlappar varandra. Det går inte att först fråga om age > 20 och sedan om age >15 eftersom i vår selektion så kan det bara bli ett val som används. Om det är två eller flera uttryck som är korrekta så kommer interpretatorn välja det första uttryck som är sant. För att hitta dessa problem och kunna åtgärda dem så är det viktigt att testa dina program innan du är klar. Speciellt viktigt är det att testa gränserna för dina uttryck. I exemplet ovan så hade jag iaf testat åldrarna 17, 18, 64 och 65, då bör jag ha fått med mig alla alternativ och kunnat se att programmet fungerar som det skall. I nästa moment så kommer vi kolla på hur vi kan upprepa denna koden med en massa olika åldrar och då hade vi med några rader kod kunnat testa alla åldrar från 0 till 100 för att se att vårt program beter sig som vi vill.

Vi tar ett större exempel med flera elif-satser så att du får se hur det kan se ut.

Kodexempel: multipla elif-satser

# Fråga efter ålder och lagra denna i variabeln age
age = int(input("Ange din ålder: "))

# Skriv ut
print(f"Du är {age} år gammal, ", end="")

if age < 2:                 # om age < 2 ...
    print("du är nog hemma med dina föräldrar.")
elif age < 6:               # ... annars om age < 6
    print("du går på förskolan.")
elif age < 12:              # ... annars om age < 12
    print("går i skolan och har förhoppningsvis många läxor.")
elif age < 20:              # ... annars om age < 20
    print("tonåring och läser på högstadie, gymnasie eller högskolan.")
elif age > 64:              # ... annars om age större än 64
    print("du är troligtvis pensionär.")
else:                       # ... annars
    print("jobba, jobba, jobba!")

Det viktigaste här är att vi kollar åldrarna i rätt ordning. Matar jag in åldern 1 år så skulle de fyra första uttrycken vara korrekta men Python väljer det som är först. Hade vi då blandat ordningen så hade vilken av de fyra första kunnat vara ok, så min ettåring skulle kunna vara tonåring och läsa på högstadiet, gymnasiet eller högskolan om vi inte hade varit noggranna.

Uppgift: m03u04

Bygg vidare på m03u01 och m03u03 så att det finns tre möjliga utskrifter beroende på vad klockan är.

  1. kl. 8 - 16, skoldagen pågår
  2. kl. 0 - 7, skoldagen har inte börjat
  3. kl. 17 - 23, skoldagen är slut

Testa genom att ställa om tidsvariabeln men återställ så att den hämtas automatiskt från servern när du är klar.

3.4 Operatorer

Genomgång [klicka för att visa]

I våra selektioner ovan så har vi skrivit uttryck. Alla uttryck som vi skapar måste ge svaret SANT eller FALSKT. Inga andra svar kommer fungera. För att kunna skriva enkla eller svårare uttryck så behöver vi kunna använda olika operatorer.

3.4.1 Jämförelseoperatorer

Jämförelseoperatorer känner du igen från matematiken. Dessa operatorer gör precis vad de säger, de används för att jämföra olika värden.

Operator Namn Exempel Resultat av uttrycket
== Lika med tal == 12 Sant om tal är lika med 12, annars falskt.
!= Inte lika med, skiljt ifrån tal != 12 Sant om tal inte är lika med 12, annars falskt.
< Mindre än tal < 12 Sant om tal är mindre än 12.
> Större än tal > 12 Sant om tal är större än 12.
<= Mindre än eller lika med tal <= 12 Sant om tal är mindre än eller lika med 12.
>= Större än eller lika med tal >= 12 Sant om tal är större än eller lika med 12.

Kodexempel: operatorer

tal = 14

print(tal == 12)   # False
print(tal != 12)   # True
print(tal < 12)    # False
print(tal > 12)    # True
print(tal <= 12)   # False
print(tal >= 12)   # True

Som du ser i exemplet så går det att skriva ut svaret för uttrycket men oftast så vill vi ju att något skall ske i samband med ett uttryck.

3.4.2 Logiska operatorer

Logiska operatorer används för att kunna skapa sammansatta uttryck där vi vill göra flera jämförelser.

Operator Namn Exempel Resultat av uttrycket
and och uttryck1 and uttryck2 Sant om uttryck1 och uttryck2 båda är sanna, annars falskt.
or eller uttryck1 or uttryck2 Sant om uttryck1 eller uttryck2 är sanna, är uttryck1 sant kollas inte uttryck2 (eftersom det räcker att den ena är sann).
! icke !uttryck1 Sant om uttryck1 inte är sant. (Kallas att negera)

I tabellen står det uttryck1 & 2, det kan lika gärna vara en variabel av datatypen boolean.

3.4.3 Sammansatta exempel

Att lära sig bygga sammansatta uttryck är viktigt för att skriva bra kod. I många fall så går det att komma runt med flera mindre uttryck men vi vill ju skriva effektiv kod och då är detta bra att kunna. Här kommer några exempel;

Kodexempel: Sammansatt exempel 1

# Fråga efter ålder och lagra denna i variabeln age
age = 19

if age < 18 or age > 65:
    print("Du är ungdom eller pensionär")
else:
    print("Du är vuxen")

Sant om age är mindre än 18 eller större än 65. Alltså koll om personen är ungdom eller pensionär.

Du kan göra uttrycken väldigt långa, men ofta stjälper det mer än hjälper. Vi kommer senare i momentet titta på alternativa lösningar.

Kodexempel: Långt uttryck

age = 17
score = 15.5
likeChallange = True

if age > 15 and age < 20 and score > 15 or likeChallange:
    print("Du är redo att läsa på Teknikprogrammet")
else:
    print("Vilket program passar dig?")

Kommentarer:

  • Sist i uttrycket så står det likeChallange utan någon operator. Du är säkert van vid att det står likeChallange == True men det innebär ju bara att om likeChallange redan är True så kommer uttrycket likeChallange == True också bli True och då är det ju onödigt att kolla om True är True när vi redan vet att likeChallenge är True.
  • Om du börjar ändra de tre variablerna så kommer du märka att för att detta uttryck skall vara godkänt så måste alla tre uttryck som hålls ihop av and vara sanna eller så räcker det att variabeln likeChallenge är sann.
  • Det finns en logik i hur detta uttryck är uppbyggt. Egentligen består den av två delar och för att förstärka detta så kan vi välja att lägga in parenteser. De tre uttryck som binds ihop av and hänger ihop och uttrycket som binds ihop av or är ett eget.
    (age > 15 and age < 20 and score > 15) or likeChallange, så ser det egentligen ut.
    Vi kan förändra hela uttrycket genom att lägga in egna parenteser så att vi styr uttrycket på ett annat sätt.
    (age > 15 and age < 20) and (score > 15 or likeChallange), nu blir det helt plötsligt annorlunda då åldern måste vara mellan 16 och 19 samtidigt som score skall vara över 15 ELLER personen skall ha likeChallenge = True.

Kortare skrivning

Om du känner att du har koll på hur det fungerar att skriva uttryck så finns det möjlighet att skriva det med kortare kommandon.

Kodexempel: Kortare skrivning för operatorer [klicka här]

age = 19
score = 20
likeChallange = True

# istället för "age > 15 and age < 20"
if 15 < age < 20 :
    print("Du är redo att läsa på Teknikprogrammet")
else:
    print("Vilket program passar dig?")

# & istället för "and"
if 15 < age < 20 & score > 15:
    print("Du är redo att läsa på Teknikprogrammet")
else:
    print("Vilket program passar dig?")

# Tecknet pipe (|, option + 7 i macOS, AltGr + "större än, mindre än" i Windows) istället för "or", 
# lägg märke till att jag måste använda parentes då | har lägre prioritet än or.
# Använd gärna men testa så att det fungerar som du vill.
if (15 < age < 20 & score > 15) | likeChallange:
    print("Du är redo att läsa på Teknikprogrammet")
else:
    print("Vilket program passar dig?")

Så fort vi trixar med uttryck så rekommenderar jag att vi verkligen testar så att det blir som vi vill. Det är lätt att gå bort sig när vi vill skapa avancerade uttryck.

Uppgift: m03u05

Du skall bygga vidare på m03u04 och skriva om den koden på minst tre sätt så att resultatet blir det samma men uttrycken är olika skrivna.

Testa genom att ställa om tidsvariabeln men återställ så att den hämtas automatiskt från servern när du är klar.

Fördjupning m03u05b [klicka för att visa]

Din uppgift är att förändra tiderna för skolan så att skolan börjar klockan 08:15 och slutar 15:45. Hur skriver du om denna selektion och uttryck för att lösa denna uppgiften?

Utgå ifrån att klockan läses av automatiskt av datorn men förbered också för att kunna byta värde på de variabler som du behöver använda för att testa att din applikation fungerar.

Lämpliga tider att testa är;

  • 07:30
  • 08:10
  • 08:15
  • 08:20
  • 09:00
  • 15:30
  • 15:45
  • 15:50
  • 16:00
  • 16:30

Fördjupning m03u05c [klicka för att visa]

Bygg vidare på m03u05b men låt nu användaren själv bestämma vilken tid som skolan börjar och slutar. Meddela sedan ifall skolan inte har börjat, pågår eller har avslutats för dagen.

Testa genom att ställa om tidsvariabeln men återställ så att den hämtas automatiskt från servern när du är klar.

Testa genom att välja tider som ligger runt start och sluttider för att säkerställa att applikationen löser uppgiften.

3.5 Metoder för att underlätta problemlösning

Innan vi börjar skriva kod är det viktigt att planera och strukturera våra program. Detta hjälper oss att förstå problemet bättre och undvika misstag senare. Två vanliga metoder för att göra detta är pseudokod och aktivitetsdiagram.

Pseudokod är ett sätt att beskriva hur ett program ska fungera genom att använda enklare språk och strukturer som liknar programmeringsspråk men utan att följa några specifika syntaxregler. Det fokuserar på logiken och stegen i programmet.

Aktivitetsdiagram är grafiska representationer som visar flödet av aktiviteter eller steg i ett program. De hjälper till att visualisera processen och hur olika delar av programmet hänger ihop.

I det här avsnittet kommer vi att fokusera på pseudokod och hur det kan användas för att planera våra program.

3.5.1 Pseudokod

Pseudokod är ett verktyg som programmerare använder för att planera och beskriva algoritmer innan de skriver den faktiska koden. Det är ett informellt sätt att skriva ned programlogik som är lätt att läsa och förstå, både för programmerare och andra intressenter.

Varför använda pseudokod?

  • Enkelhet: Det låter oss fokusera på logiken utan att oroa oss för syntaxen i ett specifikt programmeringsspråk.
  • Kommunikation: Det är lättare att diskutera och dela idéer med andra när man använder ett gemensamt, enkelt språk.
  • Planering: Hjälper till att identifiera problem och tänka igenom lösningar innan kodningen börjar.

Pseduokod är en skriftlig beskrivning av lösningen där vi med så normalt språk som möjligt skall beskriva lösningen i punktform. Om varje punkt är formulerad så att den endast gör en instruktion så kan pseudokoden vara grunden till en välkommenterad kod.

Jag kommer visa hur pseudokod används genom att beskriva en uppgift som vi har pratat om tidigare. Uppgiften jag vill jobba med är den som vi gick igenom i kapitel 3.3 där vi skapade vår första if-elif-else-sats där vi frågar efter åldern på en person och avgör om denna personen är minderårig, pensionär eller myndig.

Pseudokod kan vi skriva olika detaljerat, det kan vara värt att skriva en mer överskådlig beskrivning av lösningen, speciellt om det är en större applikation som skall skrivas, för att sedan gå in på djupet och skriva den mer detaljerad.

Övergripande

  • Fråga användaren efter hens ålder.
  • Om ålder är mindre än 18, skriv ut att användaren är minderårig.
  • Annars om åldern är större än 64, skriv ut att användaren troligtvis är pensionär.
  • Annars skriv ut att användaren troligtvis jobbar.

Detta sätt att skriva är helt ok, hela lösningen av uppgiften finns bland dessa fyra punkter. Nu visar jag ett annat sätt att skriva samma lösning på. Den är lite mer detaljerad.

Lite mer detaljerat

  • Fråga användaren efter hens ålder.
  • Om ålder är mindre än 18
    • Skriv ut att användaren är minderårig
  • Annars om åldern är större än 64
    • Skriv ut att användaren troligtvis är pensionär
  • Annars
    • Skriv ut att användaren troligtvis jobbar

Nu valde jag att skriva det med punkter där jag indenterade vad som händer om ett villkor gäller, vilket gör att det väldigt mycket liknar vår selektion (if/elif/else), och att det troligtvis känns enklare att bygga en korrekt kod för den som håller på att lära sig.

Hur skriver man effektiv pseudokod?

  • Var tydlig och koncis: Använd enkla meningar och undvik onödig information.
  • Använd nyckelord: Vid selektioner används "om, annars om, annars" och vid iterationer används "för, medan, så länge som", vi återkommer till iterationer i nästa moment.
  • Fokusera på logik: Beskriv vad som ska göras, inte hur det ska göras i kod.

Fördelar med pseudokod

  • Språkoberoende: Kan användas oavsett vilket programmeringsspråk som ska användas senare.
  • Lätt att förstå: Även de som inte är bekanta med programmeringsspråkets syntax kan följa logiken.
  • Flexibilitet: Lätt att ändra och förbättra innan man börjar med den faktiska kodningen.

Om du nu kikar igenom uppgiften i kapitel 3.3 så ser du att kommentarerna i den koden är väldigt lika de punkter som jag skrivit i vår pseudokod. Att lösa uppgiften med pseudokod först och sedan använda dessa punkter som kommentarer under tiden vi bygger vår applikation är ett smidigt sätt att hitta lösningen först och undvika att få problem med själva koden.

Uppgift: m03u06

Du skall nu skapa en pseudokod till m03u04 som du redan har löst.

Uppgift: m03u07

Här ser du pseudokod för en lösning. Kopiera alla punkter och gör dem till kommentarer i ditt program. Sedan skriver du kod till de kommentarer som du har skrivit. Din uppgift blir att koda programmet så att det följer pseudokoden.

  • Fråga användaren efter ett heltal.
  • Fråga användaren efter ytterligare ett heltal.
  • Multiplicera de två heltalen.
  • Om de två heltalen är lika stora
    • Skriv ut sidornas längd och vad "kvadratens area är"
  • Annars
    • Skriv ut sidornas längd och vad "rektangelns area är"

3.6 Nästlade selektioner

En nästlad selektion är ibland något vi behöver använda oss av. Det handlar om att det finns en selektion inne i en annan selektion. Ibland går det att undvika detta genom att skriva om våra uttryck. Men ibland är det inte möjligt att göra det, eller ens önskvärt ifall vi får väldigt komplicerade uttryck som resultat. Vi bygger vidare på några av våra tidigare exempel för att visa hur det fungerar.

Vi gör ett enkelt exempel;

Kodexempel: enkel if-sats

# Fråga efter ålder och lagra denna i variabeln age
age = int(input("Ange din ålder: "))

# if age < 18
if age < 18:            # Alla minderåriga
    print("Du är minderårig ", end="")
    if age < 2:                 # under 2 år
        print("och är nog hemma med dina föräldrar.")
    elif age < 6:               # under 6 år
        print("och du går i förskolan.")
    elif age < 12:              # under 12 år
        print("och går i skolan, förhoppningsvis har du många läxor.")
    else:                       # Övriga minderåriga
        print(" men tonåring och läser på högstadie, gymnasie eller högskolan.")
elif age < 20:          # Alla under 20
    print("Du är myndig, tonåring och läser på gymnaiet eller högskolan.")
elif age > 64:          # Alla över 64
    print("du är troligtvis pensionär.")
else:                   # Alla andra
    print("jobba, jobba, jobba!")

Här gäller det att vara extra noggrann eftersom det enda sätt som vi kan visa vilken kod som tillhör en selektion är att den koden är indenterad ett steg. Det innebär att under vår selektion if age < 18 så flyttar vi in koden ett steg med tab (indenterar) och sedan vid nästa selektion så indenterar vi ett steg till. Det här går att göra i väldigt många steg men det brukar tillslut innebära att koden är näst intill oläslig.

Nästlade selektioner används oftare än vad du kan tro, men du kommer också stöta på andra kontrollstrukturer som kan/bör nästlas och det är inte sällan som en eller flera loopar nästlas och inne i varje sådan loop finns det en eller flera nästlade selektioner. Så det är lika bra att lära sig när det fortfarande är relativt enkelt.

3.6.1 Pseudokod

Hur markerar vi i vår pseudokod att det är en nästlad selektion? Det enklaste sättet är att visa det genom ett extra djup i vår punktlista. Samtidigt så är det inte alltid vi som avgör att det kommer bli en nästlad selektion utan det kan vara något som kodaren vill välja. Hur som helst så har vi nu kontrollen på pseudokoden och själva kodningen så då kan vi visa hur vi tänkte när vi kodade lösningen.

Övergripande

  • Fråga användaren efter hens ålder.
  • Om ålder är mindre än 18, skriv ut Du är minderårig.
    • Om ålder är mindre än 2, skriv ut att och är nog hemma med dina föräldrar.
    • Om ålder är mindre än 6, skriv ut att och du går i förskolan.
    • Om ålder är mindre än 12, skriv ut att och går i skolan, förhoppningsvis har du många läxor.
    • Annars skriv ut men tonåring och läser på högstadie, gymnasie eller högskolan.
  • Annars om åldern är mindre än 20, skriv ut Du är myndig, tonåring och läser på gymnasie eller högskolan..
  • Annars om ålder > 64 skriv ut du är troligtvis pensionär..
  • Annars skriv ut jobba, jobba, jobba!

De punkter som är på nivå två är de punkter som tillhör den nästlade selektionen.

Uppgift: m03u08

Du skall bygga en applikation där elever skall få göra ett val vilken inriktning de vill läsa på sitt program. Det finns två program, som eleven redan har valt och tillhör, och nu skall du fråga vilken inriktning eleven vill läsa. Du skall lösa detta med nästlade selektioner. Fråga eleven efter dess namn och sedan, på lämpligt sätt, vilket program hen läser. När du har fått reda på programmet så skall du fråga vilken av inriktningarna som eleven vill läsa. För det ena programmet finns det två möjliga inriktningar och för det andra programmet finns det tre inriktningar att välja bland.
Skriv sedan ut elevens namn, samt vilken inriktning eleven har valt. Skapa pseudokod till din lösning, använd det gärna som verktyg för att planera lösningen innan du skriver kod.

Följande program och inriktningar är valbara.
NA - Naturvetenskapsprogrammet
NANAS - Naturvetenskap och samhälle
NANAT - Naturvetenskap

TE - Teknikprogrammet
TEDES - Design och produktutveckling
TEINF - Informations- och medieteknik
TETEK - Teknikvetenskap

Tips1: Använd förkortningarna och gör om allt till versaler för att lättare kunna arbeta med det som matas in.

Tips2: Om du vill avsluta programmet innan du har nått slutet så kan du göra det med följande kod;

Kodexempel: Avsluta programmet

# importerar modulen sys
import sys

# funktionen exit() stänger av programmet
sys.exit()

Uppgift: m03u09 (extra)

Om du tidigare har löst uppgift m03u05b så kan du fundera på hur du kan bygga om denna lösning med nästlade selektioner istället för att skriva allt för avancerade uttryck.

Bygg om lösningen på lämpligt sätt och reflektera över skillnader, vilken lösning du föredrar och hur du kan använda detta i senare uppgifter i kursen.

Nytt avsnitt

Avsnittet om Stränghantering i Python har skapats men kommer senare ligga i början av moment03.

3.x Stränghantering i Python

Att kunna hantera strängar är en grundläggande färdighet inom programmering. Strängar används för att representera text, och i många program behöver vi bearbeta och analysera textdata. I detta avsnitt kommer vi att utforska varför stränghantering är viktigt, lära oss några viktiga funktioner i Python för att manipulera strängar, och avsluta med en uppgift där du får tillämpa dessa kunskaper.

3.x.1 Varför är stränghantering viktigt?

  • Interaktion med användaren: Många program tar emot inmatning från användaren i form av text. För att förstå och reagera på denna inmatning behöver vi kunna bearbeta strängar.

  • Datahantering: Mycket data lagras och överförs som text. För att extrahera information från denna data behöver vi kunna söka, dela upp och modifiera strängar.

  • Felhantering: Användare kan mata in oväntade eller felaktiga data. Genom att hantera strängar effektivt kan vi validera och sanera inmatningar för att förhindra fel i programmet.

3.x.2 Viktiga strängfunktioner i Python

Här är några grundläggande strängfunktioner och metoder i Python som är användbara att känna till:

  1. Längd på en sträng med len(): Returnerar antalet tecken i strängen.

    text = "Hej världen"
    print(len(text))  # Output: 11
  2. Åtkomst till tecken med index:

    En sträng kan ses som en sekvens av tecken där varje tecken har en position, kallad index. Indexeringen börjar från 0 för det första tecknet, 1 för det andra, och så vidare. Man kan också använda negativa index för att räkna baklänges från slutet av strängen (-1 för sista tecknet, -2 för näst sista, osv).

    text = "Python"
    print(text[0])    # Output: P (första tecknet)
    print(text[1])    # Output: y (andra tecknet)
    print(text[-1])   # Output: n (sista tecknet)
    print(text[-2])   # Output: o (näst sista tecknet)
    
  3. Konkatenering (sammanfogning) av strängar:

    text1 = "Hej"
    text2 = "världen"
    sammanfogad = text1 + " " + text2
    print(sammanfogad)  # Output: Hej världen
  4. Ändra mellan versaler och gemener med str.lower(), str.upper(), str.capitalize(), str.title():

    • str.lower(): Konverterar alla bokstäver till små bokstäver.
    • str.upper(): Konverterar alla bokstäver till stora bokstäver.
    • str.capitalize(): Gör första bokstaven stor och resten små.
    • str.title(): Gör första bokstaven i varje ord stor och resten små.
    text = "heJ vÄrLdEn"
    print(text.lower())      # Output: hej världen
    print(text.upper())      # Output: HEJ VÄRLDEN
    print(text.capitalize()) # Output: Hej världen
    print(text.title())      # Output: Hej Världen
    
  5. str.strip(): Tar bort inledande och avslutande blanksteg.

    text = "  hej "
    print(text.strip())  # Output: hej
    
  6. str.replace(old, new): Ersätter en del av strängen med något annat.

    text = "Jag älskar programmering"
    print(text.replace("älskar", "gillar"))  # Output: Jag gillar programmering
    
  7. str.find(substring): Söker efter en delsträng och returnerar dess startposition (index), eller -1 om den inte hittas.

    text = "Hej världen"
    position = text.find("världen")
    print(position)  # Output: 4
    

3.x.3 Exempel: Bearbeta en mening

Låt oss använda några av dessa funktioner i ett sammanhang. Antag att vi har följande sträng:

mening = "  Hej och välkommen till Programmering 01!  "

Vi vill bearbeta denna sträng på flera sätt:

  1. Ta bort extra blanksteg:

    mening = mening.strip()
    print(mening)  # Output: Hej och välkommen till Programmering 01!
    
  2. Konvertera till versaler:

    versaler = mening.upper()
    print(versaler)  # Output: HEJ OCH VÄLKOMMEN TILL PROGRAMMERING 01!
    
  3. Ersätta ord:

    ny_mening = mening.replace("Programmering 01", "Python-kursen")
    print(ny_mening)  # Output: Hej och välkommen till Python-kursen!
    
  4. Åtkomst till enskilda tecken:

    första_tecken = mening[0]
    sista_tecken = mening[-1]
    print(f"Första tecknet: '{första_tecken}', Sista tecknet: '{sista_tecken}'")
    # Output: Första tecknet: 'H', Sista tecknet: '!'
    

Uppgift: m03u0x

Grunduppgift:

Skriv ett program som:

  1. Tar emot en mening från användaren.
  2. Tar bort eventuella inledande och avslutande blanksteg.
  3. Räknar antalet tecken i meningen (efter att blanksteg tagits bort).
  4. Skriver ut meningen med första bokstaven i varje ord versal (stor bokstav).

Exempel på körning:

Ange en mening:   jag lär mig att programmera i python!  
Antal tecken i meningen: 37
Meningen med stor bokstav i varje ord:
Jag Lär Mig Att Programmera I Python!

Tips för uppgiften:

  • Använd input() för att ta emot inmatning från användaren.
  • Använd str.lower() för att jämföra strängar oavsett om de är skrivna med stora eller små bokstäver.
  • Funktionen len() kan användas för att räkna antalet tecken.
  • Använd str.title() för att göra första bokstaven i varje ord stor.

Fördjupning

Utöka programmet så att det även:

  1. Frågar användaren efter ett ord att ersätta och vilket nytt ord det ska ersättas med.
  2. Ersätter alla förekomster av det angivna ordet med det nya ordet i meningen.
  3. Skriver ut den nya meningen.

Exempel på körning:

Ange en mening: Jag älskar att programmera. Att programmera är kul!
  Ange ordet du vill ersätta: programmera
  Ange det nya ordet: koda

  Den nya meningen är:
  Jag älskar att koda. Att koda är kul!
  

3.x.5 Sammanfattning

Stränghantering är en viktig del av programmering som låter oss bearbeta och analysera textdata. Genom att behärska grundläggande strängfunktioner kan vi skapa mer interaktiva och robusta program. Uppgiften ovan ger dig möjlighet att öva på dessa färdigheter i praktiken.

3.7 Slutuppgift på momentet

Två stycken diagnoser, teoretisk och praktisk, avrundar momentet.

Vill du förbereda dig inför slutuppgifterna så jobba med uppgifterna i detta moment, kolla på vad du fick som feedback på tidigare inlämningsuppgifter och kika i extramaterialet om du vill träna mer.