Programmering nivå 2
Kap 2.5 – Planera program med algoritmtänk
Bryt ner problem i tydliga steg innan du börjar skriva kod.
Mål med lektionen
När du har arbetat klart med denna lektion ska du:
- Förstå vad algoritmtänkande innebär och varför det är en central del av programmering.
- Kunna analysera ett problem och bryta ner det i delmoment.
- Använda verktyg som pseudokod, flödesscheman och strukturerade listor i din planering.
- Kunna välja rätt datastrukturer och kontrollflöden för en lösning.
Så här lär du dig bäst
Välj ett konkret problem innan du börjar koda. Försök lösa det på papper med pseudokod eller flödesschema. Använd begrepp du redan känner till: funktioner, loopar, villkor och listor. Reflektera över alternativa lösningar innan du sätter dig vid datorn.
Vad är algoritmtänkande?
Algoritmtänkande handlar om att kunna:
- se ett problem som en sekvens av logiska steg,
- identifiera mönster, repetitioner och beslutspunkter,
- göra lösningen oberoende av vilket språk du använder.
Det viktiga är inte att börja med perfekt kod. Det viktiga är att förstå problemet så tydligt att koden nästan blir en översättning av din plan. Om planen är rörig blir koden ofta rörig också.
En enkel arbetsmodell
När du planerar ett program kan du använda samma ordning nästan varje gång:
- Input: Vad behöver programmet få in från användaren eller från data?
- Bearbetning: Vilka beräkningar, beslut eller loopar behövs?
- Output: Vad ska programmet visa, spara eller returnera?
- Datastruktur: Ska informationen lagras i variabler, listor, dictionaries eller tuples?
- Funktioner: Vilka delar kan delas upp i egna funktioner?
Lägg också till testfall i planen. Ett testfall är ett konkret exempel på indata och vilket resultat du förväntar dig. Testfall hjälper dig att upptäcka om planen saknar något innan du skriver mycket kod.
Exempel: poäng i ett spel
Du vill skapa ett program som hanterar användarens poäng i ett spel. Du kan bryta ner problemet så här:
- Läs in spelarens namn.
- Läs in spelarens poäng.
- Kontrollera om poängen är över 100 och gratulera spelaren.
- Annars, uppmana spelaren att spela igen.
- Spara poängen i en lista.
Pseudokod: struktur innan kod
Pseudokod är ett sätt att skriva programidéer utan att följa exakt syntax. Du fokuserar på vad som ska hända, inte hur det skrivs i ett specifikt språk.
START
Fråga efter namn
Fråga efter poäng
OM poängen > 100
Skriv "Grattis!"
ANNARS
Skriv "Försök igen"
SPARA poängen i en lista
STOPP
Från pseudokod till Python
När pseudokoden är tydlig kan du börja översätta den till Python. En möjlig första version kan se ut så här:
scores = []
name = input("Vad heter spelaren? ")
score = int(input("Hur många poäng fick spelaren? "))
if score > 100:
print("Grattis!")
else:
print("Försök igen")
scores.append(score)
print(scores)
Den här koden är inte stor, men den innehåller flera viktiga delar: inmatning, villkor, lista och utskrift. Det är precis sådana delar du letar efter när du planerar.
Flödesscheman: visualisera logiken
Ett flödesschema gör det enklare att se logiken i ett program. Du använder symboler för att visa start, beslut, process och stopp. Det passar särskilt bra när programmet innehåller flera vägval.
Behöver du repetera grunderna? Läs mer i Programmering 1, kapitel 3: flödesscheman.
Vanliga symboler i flödesscheman
| Del | Betyder | Exempel |
|---|---|---|
| Start/stopp | Programmet börjar eller slutar | Starta menyprogrammet |
| Input/output | Programmet läser in eller skriver ut data | Fråga efter temperatur |
| Process | Programmet gör något | Beräkna medelvärde |
| Beslut | Programmet väljer väg | Är poängen över 100? |
Algoritmisk planering i praktiken
Scenario: Skapa en app där användaren skriver in dagens temperatur och får en rekommendation på klädval.
Analys:
- Programmet behöver input från användaren.
- Programmet behöver beslut beroende på temperaturintervall.
- Programmet behöver skriva ut ett lämpligt klädråd.
Pseudokod:
Läs in temperatur
OM temperatur < 0
Skriv "Ta på vinterjacka"
ELSE IF temperatur < 15
Skriv "Ta på en tröja"
ELSE
Skriv "Ta på t-shirt"
Efter planeringen kan du skriva en funktion som bara ansvarar för själva beslutet:
def clothing_advice(temperature):
if temperature < 0:
return "Ta på vinterjacka"
elif temperature < 15:
return "Ta på en tröja"
else:
return "Ta på t-shirt"
temp = float(input("Temperatur: "))
print(clothing_advice(temp))
Fördelen med funktionen är att den går att testa separat. Du kan till exempel kontrollera vad den
returnerar för -5, 10 och 20 utan att ändra resten av
programmet.
Testfall för klädprogrammet
| Input | Förväntat resultat |
|---|---|
-5 |
Ta på vinterjacka |
10 |
Ta på en tröja |
20 |
Ta på t-shirt |
Att välja rätt struktur
När du planerar en algoritm bör du också tänka på:
- Ska jag använda en lista eller en dictionary?
- Behöver jag en loop för att upprepa inmatning?
- Ska jag skapa en funktion eller metod för detta?
Snabb hjälp: vilken struktur passar?
| Behov | Passande struktur | Exempel |
|---|---|---|
| Flera värden i ordning | Lista | Poäng från flera spelrundor |
| Värden som hör till tydliga nycklar | Dictionary | En spelare med namn, nivå och poäng |
| Fasta värden som inte ska ändras | Tuple | Koordinater eller färdiga inställningar |
Planeringsmall
Använd den här mallen innan du börjar koda ett eget program:
Problem:
Vad ska programmet lösa?
Input:
Vilken information behöver programmet?
Bearbetning:
Vilka beslut, loopar och beräkningar behövs?
Output:
Vad ska programmet visa eller spara?
Datastruktur:
Vilka variabler, listor, dictionaries eller tuples behövs?
Funktioner:
Vilka delar bör bli egna funktioner?
Planeringsexempel: menyprogram
Om du ska planera ett menyprogram kan en kort plan se ut så här:
Problem:
Användaren ska kunna lägga till namn, visa alla namn och avsluta.
Input:
Menyval och namn.
Bearbetning:
Upprepa menyn tills användaren väljer avsluta.
Om valet är 1: lägg till namn i listan.
Om valet är 2: skriv ut alla namn.
Om valet är 3: avsluta.
Output:
Meny, bekräftelser och lista med namn.
Datastruktur:
En lista med namn.
Funktioner:
print_menu()
add_name(names)
show_names(names)
Vanliga misstag
- Att börja skriva kod innan problemet är tydligt.
- Att lägga all kod i en lång sekvens utan funktioner.
- Att välja lista när en dictionary hade gjort koden tydligare.
- Att inte testa små delar av programmet innan allt byggs ihop.
Öva själv
- Välj ett vardagsproblem, till exempel planera en måltid eller organisera en packlista, och skriv en plan med rubrikerna i planeringsmallen.
- Skapa ett flödesschema för en meny med tre alternativ.
- Skriv minst tre testfall till programmet innan du börjar koda.
- Analysera ett tidigare program du skrivit och bryt ner det i input, bearbetning, output, datastruktur och funktioner.
När du har försökt själv kan du ladda ner ett lösningsförslag: kap2-5-planera-program-losningsforslag.py
Reflektion
- Vad fick du syn på i problemet när du ritade flödesschemat?
- Hur förändrades lösningen när du skrev den som pseudokod?
- Hur påverkar tydlig planering kvaliteten på din kod?