1 of 34

Föreläsning 8

Problemlösning, programuppdelning, projektspecifikation, prototyper och versionshantering samt repetition av sammansatta datatyper

2 of 34

Dagens agenda

  1. Labb 3 – installera openpyxl
  2. Problemlösning – tillbaks till telefonboken
  3. Programuppdelning
  4. Projektspecifikation
  5. Prototyper och versionshantering

3 of 34

Installera och importera openpyxl

Installera openpyxl med pip3

För att installera en modul med pip skriver du:

pip3 install modulnamn

Kan vara lite krångligt för det beror på var Python är installerat…

Om det inte funkar: testa att skriva:

sudo pip3 install modulnamn

Jaha, och var tog openpyxl vägen? 🤯

4 of 34

Importera openpyxl

Problem…

Många får problem eftersom openpyxl inte är installerat på samma ställe som python i VS Code.

Lösning: kör programfilen (filen där du importerar openpyxl) från terminalen på din dator (inte terminalen i VS Code och inte genom att använda run-knappen).

Importera modulen som vanligt genom att skriva:

import openpyxl

5 of 34

Så här kan det se ut

Jag har delat min vy mellan min ”vanliga” terminal och VS Code

6 of 34

Större program

7 of 34

Problemlösning

  1. Sätta sig in i problemet och reda ut vad som ska göras.
  2. Dela upp problemet i hanterbara delar.
  3. Gör upp en plan och skissa på en lösning.
  4. Fundera över alternativ till den lösningen som togs fram i steg 3 och förbättra den.
  5. Implementera lösningen. Det är först i detta steg det är dags att koda.
  6. Testa lösningen, åtgärda eventuella problem och revidera lösningen om så behövs.

8 of 34

Telefonboken

Uppgift

Skriv ett program som representerar en telefonbok där användaren kan göra följande:

  1. Lägga till nya kontakter.
  2. Ta bort kontakter.
  3. Uppdatera befintliga kontakter.
  4. Visa alla kontakter inom en kontaktgrupp (tex. familjen)
  5. Öppna en kontakt
    1. Skriv en ny anteckning
    2. Läs alla gamla anteckningar som är sparade på kontakten
  6. Avsluta

Kontaktuppgifter

  • Förnamn
  • Efternamn
  • Telefonnummer
  • Email
  • Födelsedag
  • Kontaktgrupp
  • Anteckningar

Anteckningar

  • Titel
  • Datum
  • Anteckning
  1. Förstå problemet/uppgiften

2. Dela upp problemet

9 of 34

3. Gör upp en plan och skissa på en lösning

  1. Vilka datastrukturer behöver vi?
    1. Vad för typ av data ska vi hantera?
    2. Vilken funktionalitet är viktig?

  • Vad ska hända när programmet körs, hur ser vår algoritm ut?

10 of 34

Hur ska vi strukturera upp all data?

Uppgift

Skriv ett program som representerar en telefonbok där användaren kan göra följande:

  1. Lägga till nya kontakter.
  2. Ta bort kontakter.
  3. Uppdatera befintliga kontakter.
  4. Visa alla kontakter inom en kontaktgrupp (tex. familjen)
  5. Öppna en kontakt
    1. Skriv en ny anteckning
    2. Läs alla gamla anteckningar som är sparade på kontakten
  6. Avsluta

Kontaktuppgifter

  • Förnamn
  • Efternamn
  • Telefonnummer
  • Email
  • Födelsedag
  • Kontaktgrupp
  • Anteckningar

Anteckningar

  • Titel
  • Datum
  • Anteckning

Skapa kontakt-objekt som sparas i ett dictionary

Skapa sedan antecknings-objekt som sparas i ett listattribut (anteckningar) i kontakt-objekten.

11 of 34

Påminnelse: skapa klasser

Varför har jag en __repr__-metod i Anteckningar?

12 of 34

3. Spara kontakt-objekt i ett dictionary

Nyckel: Kalle

-------------------

Värde: Kalle-objekt med attribut:

förnamn = ”Kalle”

efternamn = ”Anka”

telefon = ”123 456 78”

anteckningar = []

Nyckel: Ior

-------------------

Värde: Ior-objekt med attribut:

förnamn = ”Ior”

efternamn = ””

telefon = ” 122 098 83”

anteckningar = []

Nyckel: Mimmi

-------------------

Värde: Mimmi-objekt med attribut:

förnamn = ”Mimmi”

efternamn = ”Pigg”

telefon = ” 123 456 98”

anteckningar = []

13 of 34

3. Spara antecknings-objekt i listor �(i antecknings-attributen)

Nyckel: Mimmi

-------------------

Värde: Mimmi-objekt med attribut:

förnamn = ”Mimmi”

efternamn = ”Pigg”

telefon = ” 123 456 98”

anteckningar = [önskelista, recept]

Anteckning-objekt med attribut:

titel = ”önskelista”

datum = ”10-11-2023”

Anteckning = ”blå rosett & hundvalp”

Anteckning-objekt med attribut:

titel = ”recept”

datum = ”01-03-2010”

Anteckning = ”Maränger: socker + ägg”

14 of 34

3. Lösningsskiss – del 1

Main-funktionen

  1. Läs alla in alla kontakter från textfilen och skapa ett dictionary med kontakt-objekt (namn som nycklar).
  2. Kalla på meny-funktionen och skicka med kontakt-dictionaryt.

Programuppdelning:

Observera – main är ofta inte lång. Den ska abstrahera bort så mycket som möjligt.

15 of 34

3. Lösningsskiss – del 2

Meny-loop

  1. Lägga till nya kontakter.
  2. Ta bort kontakter.
  3. Uppdatera befintliga kontakter.
  4. Visa alla kontakter inom en kontaktgrupp (tex. familjen)
  5. Öppna en kontakt
    1. Skriv en ny anteckning
    2. Läs alla gamla anteckningar som är sparade på kontakten
  6. Avsluta

Funktion: Ta indata från användaren och skapa ett kontakt-objekt som läggs i kontakt-dictionaryt.

Funktion: Ta indata från användaren och ta bort motsvarande kontakt-objekt ur kontakt-dictionaryt.

Funktion: Ta indata från användaren och uppdatera motsvarande kontakt-objekt ur kontakt-dictionaryt.

Funktion: Fråga användaren vilken kontaktgrupp som ska visas och loopa igenom alla kontakter (med keys-metoden) och visa alla kontakter med rätt kontaktgrupp i kontakt-dictionaryt.

Funktion: Skriv över alla kontakter från kontakt-dictionaryt till filen.

Programuppdelning

16 of 34

3. Lösningsskiss – del 2

Meny-loop

  1. Lägga till nya kontakter.
  2. Ta bort kontakter.
  3. Uppdatera befintliga kontakter.
  4. Visa alla kontakter inom en kontaktgrupp (tex. familjen)
  5. Öppna en kontakt
    1. Skriv en ny anteckning
    2. Läs alla gamla anteckningar som är sparade på kontakten
    3. Gå tillbaka
  6. Avsluta

Funktion:

  1. Låt användaren tala om vilken kontakt den vill öppna genom att ange namnet.
  2. Presentera en meny med menyvalen: skriv anteckning eller visa alla anteckningar. �Låt användaren ange vad den vill göra (tala om att den kommer tillbaka till huvudmenyn genom att klicka enter).
    1. Om skriva anteckning:
      1. Låt användaren ange datan som krävs för att skapa ett antecknings-objekt.
      2. Skapa objektet och spara det i kontaktens antecknings-attribut (listan).
    2. Om visa anteckningar: skriv ut alla anteckningar i kontaktens antecknings-lista.

Bra att ha en repr-metod för anteckningarna

17 of 34

Problemlösning

  1. Sätta sig in i problemet och reda ut vad som ska göras.
  2. Dela upp problemet i hanterbara delar.
  3. Gör upp en plan och skissa på en lösning.
  4. Fundera över alternativ till den lösningen som togs fram i steg 3 och förbättra den.
  5. Implementera lösningen. Det är först i detta steg det är dags att koda.
  6. Testa lösningen, åtgärda eventuella problem och revidera lösningen om så behövs.

Fundera över hur du skulle implementera lösningen ett tag, men vänta inte för länge. Ibland är det lättast att starta och se vad som händer.

Om du inser att du krånglat till något, tveka inte att testa en alternativ metod. Se bara till att du sparat orginalet!

18 of 34

Att strukturera kod

När du får kod eller har skrivit kod som är svår att följa:

  1. Dela upp koden så att klasser och metoder är högst upp i filen (eller i egna filer).
  2. Funktioner sedan
  3. Sist huvudfunktionen

Vad ska vi mer tänka på:

  1. Undvik kodupprepning. Finns liknande kod på flera ställen, gör om till en funktion och anropa den flera gånger.
  2. Inte för långa funktioner, bra att kunna överblicka varje funktion.
  3. Inga globala variabler, ha variabler så lokalt som möjligt.
  4. Undvik rekursion.

19 of 34

Projektspecifikation

20 of 34

Projektspecifikationen ska innehålla beskrivningar av:

  1. Din klass
    1. Attribut i klassen
    2. Metoder i klassen (inklusive parametrar och returvärden)
  2. Alla funktioner i projektet (inklusive parametrar och returvärden)
  3. Den/de viktiga datastruktur(er) som du kommer använda dig av
  4. Design av textfilen

Exempel på ifylld spec

21 of 34

Hur kan vi strukturera vår fil/filer?

Kontaktuppgifter

  • Förnamn
  • Efternamn
  • Telefonnummer
  • Email
  • Födelsedag
  • Kontaktgrupp
  • Anteckningar

Anteckningar

  • Titel
  • Datum
  • Anteckning

Hur många filer tycker du att vi ska använda?

Hur ska vi strukturera datan i filen/filerna?

22 of 34

Det finns flera sätt att strukturera textfilen – exempel 1

Kontaktuppgifter

  • Förnamn
  • Efternamn
  • Telefonnummer
  • Email
  • Födelsedag
  • Kontaktgrupp
  • Anteckningar

Anteckningar

  • Titel
  • Datum
  • Anteckning

kontakter_och_anteckningar.txt

23 of 34

Det finns flera sätt att strukturera textfilen – exempel 2

Kontaktuppgifter

  • Förnamn
  • Efternamn
  • Telefonnummer
  • Email
  • Födelsedag
  • Kontaktgrupp
  • Anteckningar

Anteckningar

  • Titel
  • Datum
  • Anteckning

kontakter.txt

anteckningar.txt

24 of 34

Projektet

25 of 34

Labb 4

Deadline: Onsdagen 13/12

26 of 34

Välj projekt

Att tänka på när du väljer uppgift:

  • Du får inte välja samma uppgift som någon av vännerna som du vill kunna diskutera din uppgift med.
  • Du får inte välja samma uppgift som din/dina labbpartner/labbpartners.

�Om du har en egen uppgiftsidé som du vill arbeta med istället så kan du prata med mig (Camilla). Det är troligtvis lättare att välja en av de givna uppgifterna eftersom du annars måste lyckas komma på en uppgift med likande svårighetsnivå som våra uppgifter (din uppgift får varken vara lättare eller svårare*)

* Vi vill att du blir klar med kursen också…

27 of 34

Projektspecifikationen

Om du lämnar in en projektspec senast den 5/12 så får du återkoppling på den till den 8/12 (eller tidigare).

Återkopplingen kan hjälpa dig att inte hamna på villovägar i onödan, men det är inte obligatoriskt att lämna in specen.

28 of 34

Prototyper

29 of 34

Prototypen – labb 4

En prototyp är en körbar, men inte färdig, version av programmet.

Prototypen i labb 4

Här finns en del funktionalitet. Programmet ska:

  • Ha en klass och objekt ska ha skapats av klassen
  • Läsa från och skriva till en fil.
  • Ha en fungerande meny (men alla val behöver inte vara fullt implementerade)
  • Alla funktioner ska vara skapade, men alla behöver inte göra det som de ska göra.

Komihåg: detta är bara en prototyp, du kan ändra saker senare (tex. Ta bort eller lägga till funktioner).

30 of 34

Versionshantering

31 of 34

Google-docs

Om du ångrar dig så kan du gå tillbaka till en tidigare version av ditt dokument.

32 of 34

Github

Github är programmerares google-docs. Det är ett väldigt smidigt sätt att få versionshistorik på kod!

Git är en lokal variant av versionshantering som funkar bra i programmeringssamanhang. Då finns versionerna på din dator.

33 of 34

Versionshistorik i denna kurs

Spara filerna smart…

Håll koll på vilken version du arbetar på genom att lägga in versionsnummret i filnamnet.

Tex: telefonbok_v1.py

Att testa något som kanske förstör filen

🡪 Spara en kopia av den och indikera att detta är ett försök till en ändring i filnamnet.

Tex: telefonbok_v1_uppdatera_kontaktinformation.py

Om testet var lyckat kan du döpa om filen till: telefonbok_v1_1.py

Om det är en stor ändring kanske det till och med blir version 2.

34 of 34

Labb 3

Katt- och hunddata

Deadline: Fredag 1/12