Skip to content

Koldioxidutsläpp för studenter

Nu lämnar vi Marvin bakom oss och tyglarna blir lite friare.

Du har jobbat allt material i “kmom05

Du ska utveckla program som kan analysera studenters koldioxidutsläpp. Programmet ska kunna hantera flera kategorier av utsläpp, till exempel transport, mat och energi, och ge användaren möjlighet att:

  • Visa totalutsläpp per student
  • Visa den “grönaste” studenten
  • Visa utsläpp per kategori
  • Rangordna studenter per kategori
  • Lägg till eller uppdatera studenters utsläpp
  • Ta bort studenter från systemet

Programmet ska funka på liknande sätt som Marvin, en meny loop.

Se hur det kan se ut när uppgiften är klar:

Play

Lösningar som använder konstruktionerna list/dict comprehension eller lambda funktioner godkänns inte i denna kurs.

Varje uppgift ska lösas med grundläggande Python konstruktioner som vi går igenom i kursen.

  1. Ditt program ska utgå från filen main.py i mappen src/kmom05/emissions. I main.py ska funktionen main() ligga och starta ditt program.

    • Strukturera main.py på liknande sätt som Marvin fungerar.
    • Ditt program ska inte starta om man importerar filen main.py. Man måste anropa main() för att starta programmet.
  2. Du ska strukturera din kod i passande moduler. Du måste skapa minst en modul utöver main.py.

  3. Utgå ifrån följande datatset i din kod. students_data är en dictionary där studenternas namn tillsammans med ID är en tuple och funkar som nyckel för att komma åt deras utsläppsdata.

    students_data = {
    ("Bob", 102): {"transport": 5, "food": 15, "energy": 20},
    ("Dana", 104): {"transport": 40, "food": 10, "energy": 15},
    ("Alice", 101): {"transport": 15, "food": 25, "energy": 30},
    ("Charlie", 103): {"transport": 10, "food": 13, "energy": 25, "waste": 5},
    }
    • students_data får inte vara en global variabel i din kod. Lägg den i din main() funktion.
    • När du skriver din kod behöver du tänka på att det kan finnas studenter som inte har alla kategorier.
  4. Programmet ska ha en följande menyval: Utförlig förklaring av menyvalen hitta du under Menyvalen

    1. Visa totalutsläpp per student
    2. Visa den grönaste studenten
    3. Visa utsläpp per kategori
    4. Rangordna studenter per kategori efter störst utsläpp
    5. Lägg till eller uppdatera student
    6. Ta bort student
    q. Avsluta programmet
    • Efter varje menyval ska du be användaren om en tom input() så att utskriften pausas till användaren vill gå vidare. Precis som i Marvin.
  5. Felhantering

    • Ogiltiga menyval ska ge ett tydligt felmeddelande.
    • Programmet ska inte krascha.
    • Du kan anta att alla input har rätt datatyp.
  6. Bedömning

    • Programmet fungerar enligt specifikationen (alla menyval fungerar).
    • Koden är korrekt strukturerad med funktioner och moduler
    • Koden ska vara DRY (don’t repeat yourself).
    • Felhantering och edge cases hanteras korrekt.
    • Onödigt komplicerade lösningar kan ge komplettering.
  7. Koden ska validera med Ruff.

    Terminal window
    # Kommandot funkar oavsett var du står i ditt repo
    uv run ruff check
  8. Testerna som finns ska passera.

  9. Ladda upp din kod till ditt repo på GitHub. Gör flera små commits när du jobbar med uppgiften!

Rätta eventuella fel som dyker upp och ladda upp igen. När det ser grönt ut så är du klar.

  • 1: Summera de totala utsläppen i alla kategorier för varje student och skriv ut hur mycket varje student släpper ut. Formatera utskriften enligt <namn> (<id>): <x> kg CO2. T.ex. blir det Alice (101): 70 kg CO2 för Alice.
  • 2: Skriv vilken student som har minst totala utsläpp. Formatera utskriften enligt <namn> (<id>): <x> kg CO2. T.ex. blir det Bob (102): 40 kg CO2 för Bob.
    • Om det inte finns några studenter ska du skriva ut Ingen studentdata tillgänglig..
  • 3: Summera och skriv ut hur mycket utsläpp som görs i varje kategori. Formatera enligt <kategori>: <x> kg CO2. T.ex. blir det waste: 5 kg CO2 för waste i originaldatan.
  • 4: Rangordna studenterna efter vem som släpper ut mest koldioxid inom en kategori och skriv ut dem. Formatera enligt <rank>. <namn> (<id>): <x> kg CO2 från <kategori>.
    • Menyvalet ska använda ett input() för att fråga användaren om vilken kategori som ska sammanställas.
    • sortera studenterna på mängden utsläpp i första hand och namn i andrahand.
      • T.ex. om två studenter ha samma mängd utsläpp ska de sorteras baserat på deras namn i bokstavsordning.
    • Om en student saknar kategorin ska den fortfarande finnas med i utskriften med 0 kg utsläpp.
    • Exempel med originaldatan och kategori waste.
      1. Charlie (103): 5 kg CO2 från waste
      2. Alice (101): 0 kg CO2 från waste
      3. Bob (102): 0 kg CO2 från waste
      4. Dana (104): 0 kg CO2 från waste
  • 5: Lägg till eller uppdatera en student i datan. Om en student med samma namn och ID redan finns i datan ska du uppdatera eller lägg till utsläppen för kategorin.
    • Menyvalet ska ta fyra input()
      • namn
      • ID
      • kategori
      • mängd utsläpp
    • När du har lagt till datan ska du skriva ut Data uppdaterad för <namn> (<id>)
    • Det kan se ut så här:
      Välj ett alternativ: 6
      Studentnamn: Bob
      Student-ID: 102
      Kategori: waste
      Utsläppsvärde (kg CO2): 10
      Data uppdaterad för Bob (102).
  • 6: Ta bort en student från datan. Namn och ID används tillsammans för att identifiera en student.
    • Menyvalet ska ta två input():
      • namn
      • ID
    • Om användaren finns och tas bort ska du skriva ut <name> (<id>) har tagits bort
    • Om användaren inte finns ska du skriva ut Student <namn> (<id>) hittades inte.
  • q: Avsluta programmet
  • Ogiltig input: Gör en fin utskrift och återgå till menyn
  • Börja med att implementera datasetet och menyn med några grundläggande val, t.ex. visa totalutsläpp.
  • Bygg sedan ut valen steg för steg: lägg till/uppdatera, rangordna, ta bort.
  • Testa programmet ofta för att säkerställa att alla menyval fungerar.
  • Kommentera koden tydligt för att underlätta läsbarhet.
  • I testerna har varje menyval sin siffra som tag, om du vill kontrollera vilka tester som körs.