M03 Extrauppgifter

På denna sidan kommer det finnas extrauppgifter, ibland är de av svårare karraktär, ibland kan det vara något delvis nytt och ibland är det bara där för att elever skall få fler uppgifter att träna på.

Uppgift: m03e01 - Enkel miniräknare

Skriv ett Python-program som:

  • Ber användaren att mata in två tal.
  • Ber användaren att välja en operation: addition (`+`), subtraktion (`-`), multiplikation (`*`) eller division (`/`).
  • Använder `if`, `elif`, `else` för att utföra den valda operationen och skriver ut resultatet.

Exempel på programköring

Ange första talet: 10
Ange andra talet: 5
Välj operation (+, -, *, /): *
Resultat: 10 * 5 = 50

Utmaning: Lägg till felhantering för att hantera division med noll och ogiltiga operationer.

Uppgift: m03e02 - Tunnebaneplatser

Här kommer en uppgift från programmeringsolympiaden som ni kanske redan har stött på.

Uppgiften är att skriva att program som löser uppgiften, träna gärna på pseudokod när du planerar din lösning.

Du kan testa din lösning med följande testvärden.

Uppgift: m03e03 - Färgbestämning utifrån RGB-värden (svårare)

Introduktion till RGB-färger

I digitala system används RGB-färgmodellen för att representera färger genom att kombinera intensiteterna av Rött (R), Grönt (G) och Blått (B) ljus. Varje färgkomponent kan ha ett värde mellan 0 och 255, där:

  • 0 innebär ingen intensitet av färgen.
  • 255 innebär maximal intensitet av färgen.

Genom att variera dessa värden kan vi skapa en mängd olika färger.

Din uppgift

Skriv ett Python-program som:

  1. Ber användaren att mata in värden för Rött, Grönt och Blått (0-255 för varje färgkomponent).
  2. Bestämmer färgens namn baserat på de inmatade RGB-värdena enligt en given tabell.
  3. Skriver ut färgens namn till användaren.

Färgbestämningstabell

Använd följande tabell för att avgöra vilken färg namnet ska vara baserat på RGB-värdena:

Rött (R) > 200 Grönt (G) > 200 Blått (B) > 200 Färgens namn
JaNejNejRöd
JaJaNejGul
JaNejJaMagenta
JaJaJaVit
NejJaNejGrön
NejJaJaCyan
NejNejJaBlå
NejNejNejSvart

Instruktioner

  1. Analysera tabellen:

    • Varje rad representerar ett unikt kombinationsfall av RGB-värden som motsvarar ett specifikt färgnamn.
    • "Ja" betyder att värdet för den färgkomponenten är större än 200.
    • "Nej" betyder att värdet för den färgkomponenten är mindre än eller lika med 200.
  2. Skriv pseudokod:

    • Innan du börjar koda, skriv en pseudokod som beskriver logiken i ditt program.
    • Bestäm vilka villkor som behöver kontrolleras och i vilken ordning.
    • Fundera över hur du kan använda nästlade if-satser för att kontrollera flera villkor.
  3. Implementera programmet i Python:

    • Börja med att be användaren om RGB-värden och se till att de är inom intervallet 0-255.
    • Använd nästlade if-satser för att jämföra de inmatade värdena med villkoren i tabellen.
    • Skriv ut färgens namn baserat på vilket villkor som uppfylls.
  4. Testa ditt program:

    • Prova med olika RGB-värden för att säkerställa att programmet fungerar korrekt.
    • Testa alla kombinationer från tabellen.

Exempel på programköring

Ange värde för Rött (0-255): 255
Ange värde för Grönt (0-255): 0
Ange värde för Blått (0-255): 0
Färgen är: Röd

Tips

  • Nästlade if-satser:
    • Du kan använda if-satser inuti andra if-satser för att kontrollera flera villkor.
    • Exempel:
      if R > 200:
          if G > 200:
              print("...")
      
  • Logiska operatorer:
    • Alternativt kan du använda and, or för att kombinera villkor i en enda if-sats.
    • Exempel:
      if R > 200 and G <= 200 and B <= 200:
        print("Färgen är: Röd")
  • Kontroll av inmatade värden:
    • Se till att användarens inmatade värden är inom det giltiga intervallet (0-255).
    • Om du vill kan du lägga till kod som hanterar ogiltiga inmatningar.

Behöver du hjälp med villkoren?

Om du tycker att det är svårt att omvandla tabellen till villkorssatser kan du tänka på följande sätt:

  • För varje färg i tabellen:
    • Skriv ner villkoret som måste uppfyllas för att den färgen ska väljas.
    • Använd jämförelseoperatorer (>, <=) för att formulera villkoren.

Exempel:

  • Röd:
    • Villkor: R > 200 och G <= 200 och B <= 200
  • Gul:
    • Villkor: R > 200 och G > 200 och B <= 200

Uppgift: m03e04 - Klassificering av Vätska (svårare)

I kemi är det viktigt att kunna klassificera olika vätskor baserat på deras egenskaper. Du ska skriva ett Python-program som hjälper till att identifiera en vätska baserat på dess pH-värde, temperatur och färg.

Din uppgift

Skriv ett program som:

  1. Ber användaren att mata in följande:
    • pH-värde (float): Ett värde mellan 0 och 14.
    • Temperatur i grader Celsius (float).
    • Färg (sträng): "klar", "grön", "blå" eller "röd".
  2. Analyserar inmatningen och klassificerar vätskan baserat på följande kriterier:
    • pH-värde:

      • Om pH < 7.0:
        • Vätskan är surt/sur.
      • Om pH == 7.0:
        • Vätskan är neutralt.
      • Om pH > 7.0:
        • Vätskan är basiskt.
    • Temperatur:

      • Om temperaturen < 0:
        • Vätskan är frusen.
      • Om temperaturen är mellan 0 och 100:
        • Vätskan är flytande.
      • Om temperaturen > 100:
        • Vätskan är gasformig.
    • Färg och kombination:

      • Om färgen är "klar" och vätskan är neutralt och flytande:
        • Vätskan är sannolikt vatten.
      • Om färgen är "grön" och vätskan är surt:
        • Vätskan kan vara äppeljuice.
      • Om färgen är "blå" och temperaturen > 100:
        • Vätskan är het kopparlösning.
      • Om färgen är "röd" och vätskan är surt och temperaturen < 0:
        • Vätskan kan vara frusen tranbärsjuice.
      • Annars:
        • Vätskan är okänd.
  3. Skriver ut en sammanfattning till användaren som inkluderar alla klassificeringar.

Instruktioner

  1. Skriv pseudokod:
    • Planera programflödet och vilka villkor som behöver kontrolleras.
    • Tänk på ordningen av villkoren och hur du kan använda nästlade if-satser.
  2. Implementera programmet i Python:
    • Använd rätt datatyper för inmatningarna (float för pH och temperatur, str för färg).
    • Använd if, elif, else för att göra jämförelser.
    • När du jämför strängar, använd .lower() för att hantera stora och små bokstäver.
    • Se till att jämförelser med flyttal (float) hanteras korrekt.
  3. Testa ditt program:
    • Prova olika inmatningar för att säkerställa att programmet fungerar korrekt i alla scenarier.
    • Kontrollera att programmet hanterar ogiltiga inmatningar på ett lämpligt sätt. Gör detta utifrån de kunskaper du har för tillfället, i moment04 så kommer vi få fler verktyg att ta hand om felaktiga inmatningar.

Exempel på programkörning

Exempel 1:

Ange pH-värde (0-14): 7.0
Ange temperatur i Celsius: 25.0
Ange färg (klar, grön, blå, röd): klar
Vätskan är: neutralt, flytande
Identifiering: Vätskan är sannolikt vatten.

Exempel 2:

Ange pH-värde (0-14): 3.5 
Ange temperatur i Celsius: -5.0 
Ange färg (klar, grön, blå, röd): röd 
Vätskan är: surt, frusen
Identifiering: Vätskan kan vara frusen tranbärsjuice.

Tips

  • Datatyper:

    • float för pH och temperatur.

    • str för färg.

  • Stränghantering:

    • Använd färg.lower() för att säkerställa att jämförelsen inte är skiftlägeskänslig.

  • Flyttalsjämförelser:

    • Var försiktig när du jämför flyttal för lika med (==). På grund av avrundningsfel är det bättre att kontrollera om värdet är inom ett litet intervall.

    • För denna uppgift kan du anta att användaren matar in exakta värden för pH.

  • Nästlade if-satser:

    • Använd nästlade if-satser för att kontrollera kombinationer av egenskaper.

    • Exempel:

      if färg == "klar": 
        if ph_status == "neutralt" and temp_status == "flytande": 
          print("Vätskan är sannolikt vatten.")

Utmaning

  • Felhantering:
    • Lägg till kod som hanterar ogiltiga inmatningar, t.ex. pH-värden utanför intervallet 0-14 eller temperaturer som inte är realistiska.
  • Utöka klassificeringen:
    • Lägg till fler färger och kombinationer för att identifiera fler vätskor.

Pseudokod Exempel

Här kommer ett exempel på pseudokod skapad av ChatGPT. Den skiljer sig lite från den pseudokod jag normalt skriver men det är bevis på två saker; sättet att skriva är inte standardiserat och det viktigaste är att skriva pseduokod som hjälper dig att planera och lösa uppgiften. Notera också att detta skrivsätt är väldigt likt programkod men inte specifikt för programmeringsspråket python.

* Be användaren mata in pH-värde (float)
* Be användaren mata in temperatur (float)
* Be användaren mata in färg (sträng)

* Om pH < 7.0
  * ph_status = "surt"
* Annars om pH == 7.0
  * ph_status = "neutralt"
* Annars
  * ph_status = "basiskt"

* Om temperatur < 0
  * temp_status = "frusen"
* Annars om temperatur <= 100
  * temp_status = "flytande"
* Annars
  * temp_status = "gasformig"

* färg = färg till små bokstäver

* Om färg == "klar"
  * Om ph_status == "neutralt" och temp_status == "flytande"
    * identifiering = "Vätskan är sannolikt vatten."
* Annars om färg == "grön"
  * Om ph_status == "surt"
    * identifiering = "Vätskan kan vara äppeljuice."
... (fortsätt med resten av villkoren)

* Skriv ut vätskans pH-status och temperaturstatus
* Skriv ut identifieringen

Genom att arbeta igenom denna uppgift kommer du att öva på att:

  • Hantera olika datatyper (strängar och flyttal).
  • Göra jämförelser med både strängar och flyttal.
  • Använda nästlade if-satser för att kontrollera flera villkor.
  • Skriva strukturerad och läsbar kod.

Lycka till med programmeringen!

Aktivitetsdiagram

Detta är ett avsnitt som är borttaget ur moment03 och som behandlar Aktivitetsdiagram.

3.5.2 Aktivitetsdiagram

Aktivitetsdiagram är den grafiska bilden av lösningen och vi kommer använda oss av ett gäng symboler för att visa hur algoritmen fungerar. Alla symboler och aktivitetsdiagram som jag ritar på denna sidan är gjorda med diagrams.net som är en smidig applikation för att rita sådana här saker. Koppla gärna din Google Drive till applikationen så sparas allt du skapar i applikationen. Se också till att dina streck eller pilar verkligen dockar fast i övriga symboler så är det enkelt att förändra ditt aktivitetsdiagram om du behöver.
I boxen med Flowchart hittar du symbolerna som används för aktivitetsdiagram.

Aktivitetsdiagram symbolerTill höger ser du fem symboler och en pil. Jag går kort igenom vad de representerar och hur de skall användas.

Start/stop: Varje aktivitetsdiagram skall börja med en startsymbol och ha minst en stoppsymbol, ibland kan det vara mening att ha flera stoppsymboler om algoritmen har flera utgångar som avslutar den.

In-/output: Denna symbolen används för att visa i flödet att det pågår en inmatning av data eller någon form av output i form av utskrift eller lagring till fil, databas eller något liknande.

Process: Processen är den koden som utför en beräkning eller andra händelser som inte innefattar in-/output eller ett val.

Förbindelse: Förbindelsen är endast användbar i det fall där aktivitetsdiagrammet är för stort att skriva ut på en enda sida, då kan vi använda förbindelsen för att hålla ihop hela flödet över flera dokument. Det är också användbart om flera mindre flödesdiagram på något sätt hänger ihop i ett större sammanhang. Här blir det extra viktigt att vara tydlig med namngivning oavsett om det görs med text, siffror, symboler eller kombinationer av dessa.

Val: Romben symboliserar alla val, beslut eller uttryck som är grunden till selektioner (if/switch) eller iterationer (loopar). Härifrån kan pilarna med val gå åt både höger, vänster eller nedåt. Genom att skriva en tydlig text på vad valet representerar så är det lättare att följa med i programflödet.

Riktning: Pilen används för att visa på riktning genom aktivitetsdiagrammet. Grunden är att riktningen kommer ovanifrån och går nedåt genom hela figuren, ibland är detta inte möjligt då diagrammet blir allt för stort. Jag brukar utgå ifrån att det bästa möjliga läget, när inget går fel eller det mest vanliga valet, skall visas genom en rak linje genom hela aktivitetsdiagrammet och så får vi ta hand om alla fel, avvikelser eller mindre vanliga/positiva händelser utåt sidorna. Tänk om vi skall rita ett aktivitetsdiagram för en bankomat, då är den lyckade kundens aktivitet representerad av en vertikal linje och alla felinmatningar tas om hand på bägge sidor om detta.

På samma sätt som att pseudokod saknar standarder om hur den skall utformas så saknas här också tydliga regler för hur vi skall tänka. De olika symbolerna kan vi anse är standardiserade men hur vi ritar flödet är mer öppet för våra egna beslut. Mitt önskemål är dock att det i möjligaste mån är konsekvent, tydligt, mer raka streck än sneda kors och tvärs samt att inga pilar eller block ligger bakom någon annan symbol så att det är svårt att följa.

Aktivitetsdiagram

Startblocket behöver väl ingen större beskrivning och sedan kommer det ett block där användaren får information om att hens ålder skall matas in. Detta följs av ett inputblock där användaren faktiskt matar in åldern.

Sedan börjar processen där vi gör våra jämförelser, först kollar vi om åldern är mindre än 18, om den är det så skriver vi ut ett meddelande. Är åldern inte mindre än 18 så gör vi en ny jämförelse, denna gången om åldern är större än 64, om den är det så skriver vi ut ett annat meddelande och den inte är det så skriver vi ut ett tredje meddelande. Efter vald utskrift så avslutas programmet.

I vårt exempel så har vi inte/kan vi inte berätta för den som skall koda programmet om vi vill ha en selektion bestående av if/elif/else eller om lösningen görs med if + if/else för hur lösningen sedan kodas det är inte upp till oss att avgöra. Det beslutet måste kodaren få göra baserad på sin kunskap och vilka eventuella begränsningar/features som finns i det programmeringsspråk där lösningen skall göras.

Aktivitetsdiagram - med nästlade selektioner

I avsnitt 3.6.1 så visade jag exempel på hur man med pseduokod kan skapa grunden till nästlade selektioner. Det går även att skapa aktivitetsdiagram där nästlade selektioner ingår. Här kommer exemplet från 3.6.1

Tidigare inlämningsuppgift - moment03

Denna uppgiften har tidigare använts som inlämningsuppgift för detta momentet. I uppgiften så finns det både krav på att jobba med aktivitetsdiagram samt en liten kik på nästa moment som handlar om listor och iterationer.

I Sverige har vi en ganska krånglig beräkningsmodell för hur vi betalar skatt på lön. Du skall nu bygga upp en applikation som beräknar detta (i en förenklad version). I varje del så kommer det tillkomma nya och mer detaljerade regler där tanken är att kunna bygga vidare på den tidigare lösningen.
Tips1: Säkerhetskopiera varje avklarad del så att du enkelt kan gå tillbaka till en fungerande version. Döp gärna dessa efter samma struktur som vi använder, m03a, m03b osv.

Du skall lämna in den uppgift som är den svåraste du har löst. Du skall också bifoga ett aktivitetsdiagram och en pseudokod minst för uppgift b, vill du dokumentera även c och d med aktivitetsdiagram/pseudokod så går det bra.
Tips2: Skapa ett aktivitetsdiagram som du har lärt dig via diagrams.net, exportera aktivitetsdiagrammet som en bild och infoga sedan denna bilden i ett Google document där du skriver pseudokoden. När du är klar så exporterar du detta dokument som en PDF och lämnar in den ihop med koden i Classroom. Glöm inte att döpa denna filen på lämpligt sätt så att ditt namn finns med både i filnamnet och inne i filen.

Jag vill att du iaf gör uppgift a och b innan inlämning för att visa på kunskaper inom momentet.

Regler och siffror för uppgiften

Flera av uppgifterna som används i uppgiften var riktiga år 2018, men det finns också förenklingar och vissa skatter/avdrag som vi inte har med i våra beräkningar. Att göra dessa förenklingar är en förutsättning för att kunna skapa en uppgift som är lösbar.

Uppgift a [klicka för att visa]

Den som arbetar och får ut lön kallas för löntagare. Löntagaren får lön för sitt arbete och denna kallas för bruttolön. Alla löntagare, som tjänar tillräckligt med pengar, skall betala skatt. Denna skatt är egentligen flera olika skatter som går till kommunen, landstinget och staten.

I denna uppgift så skall vi börja beräkna hur mycket skatt som skall betalas.

Varje kommun får själva bestämma hur mycket skatt som deras invånare skall betala och sedan finns det en landstingsskatt som skall betalas. I Alingsås ser det ut på följande sätt under 2018;

Skattetyp Skattesats
Kommunalskatt 21,36%
Landstingsskatt 11,48%

Fråga efter en löntagarens bruttolön i hela kr och skriv ut denna. Beräkna sedan hur mycket löntagaren skall betala i kommunalskatt och landstingsskatt och skriv sedan ut vad löntagaren får kvar efter skatt, samt betalar i kommunal- och landstingsskatt per månad.

Se nedan för beräkningsexempel, utskriften får du gärna göra på annat sätt, tänk bara på att det skall vara tydligt presenterat.

Alla inmatningar och utskrifter görs i heltal men beräkningar behöver hantera decimaler.

Utskrift

Exempelutskrift med 15000kr i bruttolön.
Exempelutskrift med 25000kr i bruttolön.

Avrundningsfel?

Nu kan det vara så att dina utskrifter och exempeldata inte stämmer överrens med mina till 100%, det vanliga är att det diffar på en krona. Detta beror ofta på hur du väljer att avrunda ett tal.

Kodexempel

tal = 12.9
print("Talet är {}".format(int(tal)))       # Talet är 12
print("Talet är {}".format(round(tal)))     # Talet är 13
print("Talet är {:.0f}".format(tal))        # Talet är 13

I koden ser du tre vanligt förekommande avrundningar som programmerare kan göra. Det första alternativet, som i detta fallet blir felaktigt, görs med en så kallad typkonvertering där vi helt enkelt gör om float till int. När detta sker så kommer decimalerna att tas bort och talet 12,9 blir då talet 12. Fråga din mattelärare vad hen gillar det.

De två andra alternativen är att föredra, det första använder sig av metoden round() för att avrunda enligt gängse regler. I round kan vi också ange hur många decimaler vi vill använda i vår avrundning, round(tal, 2) skulle innebeära att vi rundar av det med två decimaler. Det tredje alternativet sköts av format()-metoden (f-stringmetoden fungerar på samma sätt, print(f"Talet är {tal:.0f}")) och används endast vid utskrift. De två tidigare går att använda för att runda av eller göra om tal innan det lagras i en ny variabel.

Uppgift b [klicka för att visa]

Det finns flera olika brytpunkter där olika typer av skatter träder in. Dessa brytpunkter bygger på den lön som löntagaren tjänar över hela året. Därför är det viktigt att veta årsinkomsten.
Beräkna årsinkomst utifrån den angivna månadsinkomsten och skriv ut denna i din applikation.

Dags för första brytpunkten och det är den skattefria brytpunkten. Tjänar en löntagare mindre än 19 247 kr på hela året så betalas det ingen skatt för denna inkomst. I vårt exempel beräknas ingen skatt på denna del även om vi tjänar mera pengar.
Räkna bort den skattefria inkomsten och gör om dina beräkningar från uppgift a. Om hela årsinkomsten är skattefri så skriv ut detta.

Här gäller det att hålla koll på både årslön och månadslön, vilket som skall användas vid beräkningar och vad som skall användas vid utskrifter.

Förklarande modell

Beskrivning av skattesystemet

Utskrift

Exempelutskrift med 1500kr i bruttolön.
Exempelutskrift med 25000kr i bruttolön.

Glöm inte att uppdatera aktivitetsdiagram och pseudokod.

Uppgift c [klicka för att visa]

I Sverige har vi progressiv skatt vilket innebär att du betalar en större skatteandel ju mer pengar du tjänar. För att avgöra när du skall betala mer skatt så finns det olika brytpunkter. Nu skall vi implementera brytpunkterna för statlig skatt. Det finns två brytpunkter;

Belopp Händelse
över 468 700 kr 20% statlig skatt för lön över brytpunkten.
över 675 700 kr 5% ytterligare statlig skatt (värnskatt) för lön över brytpunkten.

Kommunalskatt och landstingsskatt tas ut på hela löntagens lön (bortsett från den skattefria delen) vilket innebär att den som betalar statlig skatt för en del av lönen även betalar kommunal- och landstingsskatt för denna delen.

Förklarande modell

Beskrivning av skattesystemet

Bygg om applikationen så att dessa två brytpunkter beräknas på rätt sätt. Om statlig skatt skall betalas så vill jag att det skrivs ut, skall ingen statlig skatt betalas så skrivs det inte ut.

Utskrift

Exempelutskrift med 25000kr i bruttolön.
Exempelutskrift med 40000kr i bruttolön.
Exempelutskrift med 60000kr i bruttolön.
I redovisningen för statlig skatt så ingår både statlig skatt på 20% och värnskatt på 5%.

Aktivitetsdiagram och pseudokod är ej obligatoriskt för denna uppgiften.

Uppgift d [klicka för att visa]

I denna uppgiften har vi gjort förenklingar för att det skall gå att beräkna skatt på lön utan att göra beräkningar utifrån skattetabeller. Däremot är det ganska tydligt även i vår applikation att den faktiska skatteprocenten en löntagare betalar stiger samtidigt som lönen stiger. Nu skall vi se hur stor andel av bruttolönen som försvinner bort i skatt.

Beräkna och skriv ut den samlade skatten som skall betalas och beräkna också hur stor del av bruttolönen som är skatt. Skriv sedan ut detta.

Utskrift

Exempelutskrift med 25000kr i bruttolön.
Exempelutskrift med 40000kr i bruttolön.
Exempelutskrift med 60000kr i bruttolön.

Aktivitetsdiagram och pseudokod är ej obligatoriskt för denna uppgiften.

Uppgift e [klicka för att visa]

Dags för sista uppgiften och nu skall vi kika lite framåt på tekniker som vi skall lära oss i nästa moment.

Ni har vi byggt upp en bra beräkningsmodell för att ta reda på hur mycket skatt en löntagare betalar utifrån en viss bruttolön. Om vi vill kunna se detta i en tabellform så behöver vi bygga ut, och om, vår applikation.

För att lyckas med detta så behöver vi kika på två tekniker. Det första är en iteration, eller en loop, som kommer upprepa en viss del av koden så länge som vill har bestämt att den skall upprepa sida. Den andra delen är en lista med värden. I nästa kapitel kommer vi kolla på flera olika typer av listor som har olika egenskaper. Den listtrypen vi skall kika på nu kallas för en tuple, eller tupel, på svenska. Det som är speciellt med denna är att den får sina värden när den skapas och sedan kan den inte förändras.

Vi kollar på dessa två tekniker i ett kodexempel.

Kodexempel: iteration med tuple

# skapa tuple med fem tal
tal = (1, 3, 5, 10, 20)

# Loopa igenom vår tuple, låt varje värde lagras i t
# t får nytt värde i varje varv loopen gör
for t in tal:
    print(t);

Dags för uppgiften. Jag vill att du skapar en tuple där det finns ett antal månadsbruttolöner där du skall beräkna skatten enligt de tidigare uppgifterna. Du behöver bygga om dina tidigare uppgifter ganska så rejält, så se till att du har säkerhetskopierat.

Följande tal vill jag att du lagrar i din tuple: [1500, 5000, 10000, 15000, 20000, 25000, 30000, 35000, 40000, 45000, 50000, 55000, 60000]

Bygg en snygg tabell för alla dina värden, samma data som skrivits ut tidigare skall skrivas ut igen, fast nu i tabellformat, kika gärna nedan om du inte vet hur det kan se ut.

Utskrift

Exempelutskrift med tabell genererad från min lista av inkomster.

För denna uppgiften behövs inget förändrat aktivitetsdiagram eller pseudokod då vi inte har förändrat några beräkningar.