Göm menyn

2. Villkor och upprepning

2.1 Inledning

Om du inte gjorde det i samband med första labben, läs igenom sidan Regler för redovisning och komplettering. Syftet med denna laborationsomgång är att vi ska gräva oss djupare in i programmering i allmänhet och i programspråket Python i synnerhet. För dig som behöver lite extra övningar vill vi tipsa om extraövningar till labb 1 som fortfarande kan vara intressanta.

Studiematerial

Innan du börjar arbeta med denna labb bör du ha läst följande:

2.2 Fler matematiska operationer

Förutom de vanliga fyra räknesätten finns det i Python några ytterligare matematiska operatorer. Operatorn // utför heltalsdivision, d.v.s. den gör en division och kastar bort decimaldelen. Besläktad med denna är operatorn % som kallas modulo. Den beräknar resten vid heltalsdivision. De funkar så här:

>>> 10 // 3 3 >>> 10 % 3 1

Övning 201 Definiera två funktioner unit (ental) och ten (tiotal) som givet ett heltal plockar fram entals- och tiotalssiffran. De ska funka så här:

>>> unit(123) 3 >>> ten(123) 2

Övning 202 Definiera en funktion swap_unit_ten som med hjälp av funktionerna från föregående övning byter plats på entalet och tiotalet i ett heltal.

>>> swap_unit_ten(123) 132

2.3 Upprepning med iteration

I de följande övningarna och uppgifterna kommer du att skriva lite längre funktioner. Om du inte redan har börjat med det, kan det vara en god idé att nu skriva dina funktionsdefinitioner i en separat fil, hellre än att definiera dem direkt vid Python-prompten. Det gör det lättare att ändra dem och rätta eventuella fel.

Övning 203 Definiera funktionen "upphöjt till". Kalla den power och låt den ta två heltalsargument. Denna övning ska lösas iterativt.

>>> power(2, 3) 8 >>> power(5, 2) 25

Du kan testa att du gjort rätt genom att jämföra med den inbyggda operatorn ** som beräknar just "upphöjt till". Givetvis får du inte använda dig av den i funktionen power.

Övning 204 Definiera en funktion sum_first som adderar ihop de första n heltalen. Summan av de n första heltalen kan också beräknas med formeln n(n+1)/2 men i den här övningen vill vi att du summerar talen ett i taget med hjälp av någon form av upprepning. Denna övning ska lösas iterativt.

>>> sum_first(6) 21 >>> sum_first(0) 0

Övning 205 Skriv en funktion sum_numbers som summerar de element på en lista som är tal. Allt annat som finns på listan ska ignoreras. Denna övning ska lösas iterativt.

Så här kontrollerar du om något är ett tal:

import numbers def isnumber(x): return isinstance(x, numbers.Number)

Nu kan du testa om saker är tal med anrop som isnumber(5.324). Funktionen sum_numbers är tänkt att funka så här:

>>> sum_numbers(["a", 1, "b", 2, [["b", 4], 2], 3]) 6

Övning 206 Skriv en funktion find_letter som returnerar ett sant värde (True) om en given bokstav (egentligen en sträng) finns i ett ord, annars ett falskt värde (False). Ordet representeras som en lista. Denna övning ska lösas iterativt.

>>> find_letter("u", ["h", "u", "s"]) True >>> find_letter("a", ["b", "i", "l"]) False

Övning 207 Skriv en funktion remove_vowels som tar en lista med bokstäver (egentligen strängar) och returnerar en ny lista med vokalerna borttagna. Det kanske går lättare om du föreställer dig att du ska skapa en ny lista med endast konsonanter snarare än att ta bort vokalerna. Tips: Använd dig av find_letter som du definierat ovan! Denna övning ska lösas iterativt.

>>> remove_vowels(["b", "i", "r", "g", "i", "t", "t", "a"]) ['b', 'r', 'g', 't', 't']

2.4 Uppgift

Titta gärna på Regler för redovisning och komplettering för information om hur du ska redovisa dina resultat från uppgifterna nedan.

Uppgift 2 - Personnummer

Målet med uppgiften är att du ska kunna lösa ett lite större programmeringsproblem genom att dela upp det i mindre delar som vardera löses av en funktion, och att du ska kunna lösa programmeringsproblem som innebär sekvensiell bearbetning genom iteration eller rekursion.

Skriv en funktion check_pnr som tar ett personnummer i form av en lista med tio siffror på formen [å, å, m, m, d, d, x, x, x, k] och kontrollerar att kontrollsiffran, den sista siffran, är korrekt. Dela upp uppgiften i flera mindre funktioner som du kan testköra för sig. Om funktionerna utför någon form av upprepning får du själv välja metod, iteration eller rekursion.

Metoden för att räkna ut kontrollsiffran i personnummer är enligt följande. Multiplicera alla siffror utom den sista med omväxlande 2 och 1. Summera de enskilda siffrorna i produkterna (dvs om produkten är 2*5 = 10 så summerar vi 1 och 0). Kontrollsiffran är skillnaden mellan nästa högre (eller samma) tiotal och summan av siffrorna.

Låt oss som exempel ta det korrekta (fejkade) personnumret 720123-1235. Vi börjar med att behandla alla siffror utom den sista enligt metoden ovan. Det ger oss en siffersumma på 25. Skillnaden till närmast högre (eller samma) tiotal är 5, vilket stämmer överens med kontrollsiffran, så personnumret är därmed bevisat korrekt.

Personnummer: 7 2 0 1 2 3 1 2 3 Viktsiffror: 2 1 2 1 2 1 2 1 2 ------------------------------------- Produkt: 14 2 0 1 4 3 2 2 6 Siffersumma: 1+4+2+0+1+4+3+2+2+6 = 25 Närmast högre tiotal: 30 Kontrollsiffra: 30-25 = 5

Följande körexempel illustrerar hur funktionen ska fungera. I exemplet använder vi det korrekta (fejkade) personnumret 740217-4820. Om vi skickar in det i en lista enligt nedanstående exempel ska funktionen returnera True. Om vi byter ut någon siffra, t.ex. den sista, så ska funktionen returnera False. Observera att det är sanningsvärden som ska returneras, inget annat. Funktionen får inte ändra i den lista som skickas in.

>>> check_pnr([7, 4, 0, 2, 1, 7, 4, 8, 2, 0]) True >>> check_pnr([7, 4, 0, 2, 1, 7, 4, 8, 2, 1]) False

Testning För att se till att din funktion klarar av uppgiften finns det ett program som kör automatisk testning på din kod. Programmet kan antingen hämtas härifrån (test_2.py) om du inte befinner dig i labbsalarna eller köras direkt från filsystemet (/courses/TDDE23/test/test_2.py). Öppna filen och läs instruktionerna för att se hur man kör programmet och kör det sedan för att testa denna uppgift.


Sidansvarig: Peter Dalenius
Senast uppdaterad: 2023-08-08