Granskare: _________________________________ Kurs ________ |
Följande ska finnas tillgängligt vid redovisningen: |
---|---|
![]() | |
![]() | |
![]() | |
Användarvänlighet | |
![]() |
![]() |
![]() | |
Programmerarvänlighet | |
![]() |
![]() |
![]() |
![]() |
Strukturering |
|
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
Följande punkter är nödvändiga |
![]() |
![]() |
Assistenten bör komma ihåg att: |
![]() | |
![]() | |
![]() |
Du som granskar: Var inte för snäll när du går igenom programmet. Granskningen kan underkännas om du inte ens försökt kritisera programmet. Och den som blir granskad är tacksam för alla fel du upptäcker, eftersom dom kan åtgärdas före redovisningen!
Ge tal1 : 26
och tal2 : 54
29 31 37 41 43 47 53
Man ska inte behöva titta i en manual eller ännu värre, i själva programkoden för att förstå vad som händer. Programmet måste vara självinstruerande.
Hej och välkommen till primtalsprogrammet. Programmet
skriver ut alla primtal i ett intervall du definierar.
Ange undre gränsen i intervallet: 26
Ange högre gränsen i intervallet: 54
De primtal som finns mellan 26 och 54 är:
29 31 37 41 43 47 53
Den senare varianten är mycket lättare att förstå när man kör programmet.
...
Förutom att vara väldigt sen med att kläcka ur sig
att det inte finns något flyg den önskade resdagen
så verkar det inte finnas något sätt att boka en mängd
biljetter. Att boka en klassresa med det systemet skulle
vara väldigt enerverande.
Vill du boka en biljett?ja
Varifrån åker du? Arlanda
Vart ska du åka? Kastrup
Vilken månad ska du åka? Mars
Vilken dag ska du åka? 25
Vill du boka returbiljett?ja
Vilken månad ska du tillbaka? April
Vilken dag ska du tillbaka? 5
Det går tyvärr inget flyg den 25 mars.
Försök igen
Vill du boka en biljett?ja
Varifrån åker du? Arlanda
Vart ska du åka? Kastrup
Vilken månad ska du åka? Mars
...
Nedanstående programkod är ganska svår att tyda
namn = 0 kalle = 0 while kalle < len(pelle): if pelle[kalle] > namn: namn = pelle[kalle] kalle = kalle + 1Här följer samma kod med andra variabelnamn.
max = 0 i = 0 while i < len(lista): if lista[i] > max: max = lista[i] i = i + 1
Man ser nu lättare vad koden gör, nämligen sparar undan det högsta värdet i listan till variablen max. Fortfarande är inte namnet på listan optimalt. Vad för slags värden innehåller den? Är det löner, skottstatistik eller vad?
När det gäller en funktion eller metod brukar ett bra namn
oftast vara ett verb som beskriver vad den gör eller
vad den returnerar. Booleska funktioner (som returnerar
True/False) bör ha ett namn som talar om hur läget är
det fall den returnerar True, t ex korrekt()
för en funktion som kontrollerar om ett värde är korrekt.
Namnet på en klass kan vara ett substantiv som beskriver vad objektet representerar. Variabler och attribut är också substantiv. Att komma på bra namn kräver en del arbete!
In- och utdata till funktioner måste kommenteras. Det gäller både returvärden och parametrar. Om funktionen är en metod och den ändrar något attribut ska detta också kommenteras.
Kommentarerna ska inte förklara hur Python fungerar. Förutsättningen är att den som läser källkoden redan vet hur man programmerar. Kommentarer som förklarar t ex att en if-sats gör ett val och att en slinga upprepar något ska inte vara med vid redovisningen. Den som redovisar måste själv veta sådant utan anteckningar.
class EnBraKlass def enMetodSomTarTreParametrar(x, y, z)
Ange täljare: 1000
Ange nämnare: 0
Oj oj, nämnaren får inte vara noll. Försök igen.
Ange nämnare: 10
1000 delat med 10 blir 100
Man kan också behöva lägga till try...except
för att ta hand
om fel som annars skulle ge felavbrott.
Data som hör ihop (t ex namn, födelsedata och adressuppgifter för en person) kan samlas genom att dom får vara attribut i en klass. Funktioner som hör ihop med dessa data får bli klassens metoder. Ett program kan ha flera olika klasser!
Ett riktigt stort program kan man dela upp i flera moduler, där de klasser som hör ihop samlas i en modul.
def lasFranFilen(): filnamn = raw_input("Vad heter filen?") infil = open(filnamn,"r") lista = infil.readLines() lista2 = [] for element in lista: if type(element) == type(0): lista2.add(element) return lista2
Koden ovan gör flera saker; frågar efter en fil, läser in alla data från filen, stoppar in heltalen i en heltalsvektor och returnerar denna. Det vore bättre att dela upp dessa uppgifter på flera funktioner så att funktionsanropen blir:
filnamn = fragaFil() fildata = laesFranFil(filnamn) intresseantaTal = konvertera(fildata)Programmet blir då mer flexibelt: Funktionen
fragaFil
kan skrivas om
till ett grafiskt GUI där man klickar på rätt fil. Funktionen
laesFranFil
kan användas i andra sammanhang då man vill
läsa från fil. Man kan skicka fildatat till en ny metod
som kontrollerar data innan man anropar konvertera.
Funktioner ska om möjligt vara skrivna så att dom går att använda i andra sammanhang. Ett knep är att se till att alla indata ges som parametrar. Ett annat är att specialisera funktionerna, så att varje funktion bara gör en liten del.
Ett vanligt nybörjarfel när man programmerar är att använda taktiken klippa och klistra när samma sak ska göras på flera ställen i programmet. Detta leder dock till kod som är väldigt svår att underhålla. Om man ändrar på ett ställe måste man göra samma ändring på flera parallellställen. Det går i regel att skriva om den upprepade koden till en funktion med parametrar och returvärde.
ANTALSPELARE = 5; PI =3.14;