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:

  1. Input: Vad behöver programmet få in från användaren eller från data?
  2. Bearbetning: Vilka beräkningar, beslut eller loopar behövs?
  3. Output: Vad ska programmet visa, spara eller returnera?
  4. Datastruktur: Ska informationen lagras i variabler, listor, dictionaries eller tuples?
  5. 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:

  1. Läs in spelarens namn.
  2. Läs in spelarens poäng.
  3. Kontrollera om poängen är över 100 och gratulera spelaren.
  4. Annars, uppmana spelaren att spela igen.
  5. 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

  1. Välj ett vardagsproblem, till exempel planera en måltid eller organisera en packlista, och skriv en plan med rubrikerna i planeringsmallen.
  2. Skapa ett flödesschema för en meny med tre alternativ.
  3. Skriv minst tre testfall till programmet innan du börjar koda.
  4. 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?

Tillbaka till Kapitel 2