- Kursmaterial
- Planering
- Arbete
- Kunskapsdokument
- Andra kurser
- Om Kursolle
M04 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å.
Loopar
Uppgift: m04e01
Bygg om m04u02 (Ulfs sparade pengar) så att den uppgiften körs med en whileloop.
Uppgift: m04e02
Bygg om m04u05 (råttorna) så att den uppgiften körs med en for-loop.
Uppgift: Kodkalendern lucka 5
I Python används not som en logisk operator för att invertera värdet av ett booleskt uttryck. Om ett uttryck är True
, blir det False
när not
används, och vice versa. Detta är särskilt användbart när man vill växla mellan två tillstånd, som i fallet med variabeln varannan
.
Här är ett enkelt kodexempel som visar hur du kan använda not
för att växla värdet på en boolesk variabel:
Kodexempel: not
varannan = False for i in range(1, 11): varannan = not varannan print(varannan)
Testa nu att göra kodkalendern lucka nr 5 från 2021.
Uppgift: m04e03
OBS: Denna uppgift kan upplevas lite klurig, kika på min punktlista nedan för att bygga ut/om uppgiften steg för steg.
Bygg ut uppgift m04u04 så att du;
- Skriver ut talet och produkten för varje tal.
- Bara multiplicerar jämna tal (använder continue).
- Bryter (break) när produkten är över 500.
Hade detta gått att göra detta utan break & continue?
Listor
Uppgift: Kodkalendern (svårare)
När du nu kan använda listor så finns det oändliga möjligheter att lösa olika problem där listor och loopar är grunden för att hitta lösningen. I kodkalendern 2021 finns följande uppgifer som kan vara lämpliga att lösa;
- lucka 6 (Beräkningar av tal i lista)
- lucka 9 (Beräkningar av tal i lista)
- lucka 10 (Stega igenom en lista beroende på värdet av talet)
- lucka 12 (Tips: hantera strängen som en lista, loopa igenom alla index)
- lucka 13 (Tips: Här kan du använda
break/else
för att avsluta ett test som är felaktigt) - lucka 16 (Palindrom, vända på en sträng som du hanterar som en lista)
Uppgift: m04e04
Här kommer en extrauppgift som du har möjlighet att bygga på hur långt du vill. Yatzy är ett klassiskt spel med fem tärningar, klassisk tärning 1-6, där det gäller att samla poäng genom att samla på olika serier av tärningsslag.
Börja med att att skapa fem slumpade tärningar i en lista. Skriv sedan ut din hand
på valfritt sätt.
Första uppgiften är att kolla om det finns minst ett par bland dina fem tärningar. Använd gärna pseudokod för att planera hur du skall lösa detta.
- Kan du visa vilket värde som blivit yatzy (1:or, 2:or osv..).
- Kan du se om det är flera par?
- Kan du se om det blivit någon triss?
Alla som har spelat yatzy vet att det är en hel del olika typer av slag som kan ge olika antal poäng. Att bygga upp hela detta spelet tar en stund och är väl omfattande för denna kursen. Hur hittar vi då en förenklad version av yatzy? Vi går naturligtvis till barnspelen och kikar på hur barn- och bamse-yatzy fungerar. Utifrån dessa regler så är det enklare att bygga fullt fungerande varianter av yatzy.
Barnyatzy [klicka för regler]

Bamseyatzy [klicka för regler]


4.4 Inlämningsuppgift
Denna uppgiften har tidigare använts som inlämningsuppgift på moment04. Då hade eleverna ca 3 timmars lektionstid på sig att genomföra uppgiften och lämna in den.
Genomgång [klicka för att visa]
Denna uppgift byggs på i flera delar. Du löser så många delar du kan och lämnar in den sista fungerande lösningen. I denna övning kommer jag testa dig på tekniker från detta och tidigare moment men framförallt testas du på problemlösning. Ta hand om en del i taget, klura ut vad jag vill att du gör, dela upp uppgiften i mindre delar och när du är helt klar med den delen så går du vidare till nästa. Du kommer inte vinna på att kika på flera delar åt gången. I de tidigare delarna så får du lite extra hjälp att komma igång medan de senare delarna kräver en del egen problemlösning för att få det att fungera. I varje del så får du se hur min utskrift ser ut när jag har löst programmet, du måste inte härma mig men det kan vara en vägledning för att du skall förstå uppgiften.
I uppgift a ligger fokus på iteration och selektion, i uppgift b ligger fokus på fler iterationer och även listor. Jag vill att du klarar av dessa två innan inlämning för att visa på kunskaper inom de delar som ingår i momentet.
Inlämningsinstruktioner
Innan du lämnar in uppgiften kolla att följande saker är gjorda;
- Filen med källkod har rätt namn, klass_namn_moment04.py.
- Lämna endast in den svåraste uppgiften som du har löst.
- Applikationen körs utan error. Koden är rensad från testdata och ser ok ut att lämna in.
- Källkoden är kommenterad. För din egen del se till att du kommenterar koden eftersom den hela tiden byggs på.
- Skapa ett huvud i källkoden där du som en kommentar skriver ditt namn och klass, vilken uppgift som du har löst och sedan en kort utvärdering av lösningen/ditt arbete. Jag är extra intresserad över hur du har tänkt när du fått ta olika beslut. I denna uppgift så finns det i del b-e en fråga som jag vill att du besvarar. Gör detta i kodhuvudet.
- Är du godkänd på aktivitetsdiagram och pseudokod sedan tidigare så behöver du inte göra det på denna uppgiften. Har du inte lämnat in sedan tidigare, eller inte är godkänd, så är det lämpligt att skapa sådana för någon vald algoritm. Tala om vilken algoritm du har avgränsat och lämnat in lösning för. Lämna in i textformat, bildformat eller pdf och namnge filen med ditt namn och momentets namn.
Exempel på kodhuvud
# Anders Andersson, 18TEx # Moment04, uppgift d # Det var en utmanade uppgift och jag klarade inte av sista tillägget. # Det som var mest utmanande var hur jag skulle konvertera det som matades in... # ....
Inlämningsuppgift moment04
Uppgiften är att bygga en applikation som beräknar olika saker kring en rektangel och ett rätblock. Den matematiska delen skall inte vara svår utan fokus ligger på problemlösning, iterationer och användning av listor.
Läs och lös en uppgift i taget.
Uppgift a [klicka för att visa]
Be användaren ange rektangelns två sidor, vi använder endast heltal. Skriv ut arean på rektangeln och skriv också ut ett meddelande ifall rektangeln är en kvadrat. Slutligen skall du på lämpligt sätt beräkna och skriva ut volymen på rätblock med den angivna rektangeln som bas och alla heltalshöjder mellan 1 och 10. Enhet behöver du inte ange, vill du göra det så går le, ae och ve bra (längdenhet, areaenhet, volymenhet).
Hjälp [klicka för att visa]
Här får du hjälp i form av pseudokod. Använd den gärna som exempel för kommentarer och skriv koden under.
# Be användaren mata in rektangelns två sidor # Beräkna och skriv ut arean på rektangeln # Om bägge sidorna är lika långa... # ... tala om att det är en kvadrat # Loopa höjden från 1 till 10 # Beräkna volymen och skriv ut den
Utskrift
Så här kan resultatet se ut när jag kör mitt program. Du måste inte göra exakt likadant.
Denna applikation gör ett antal beräkningar på en rektangel/rätblock. Ange rektangelns ena sida: 5 Ange rektangelns andra sida: 5 Rektangeln har sidorna 5 och 5 vilket gör att arean är 25 Eftersom bägge sidorna är lika långa så är denna rektangel en kvadrat. Höjden | Volymen ----------------- 1 | 25 2 | 50 3 | 75 4 | 100 5 | 125 6 | 150 7 | 175 8 | 200 9 | 225 10 | 250
Uppgift b [klicka för att visa]
När du har ett fungerande program från uppgift a så vill jag att detta program skall köras om och om igen tills användaren på något sätt, som du väljer, inte vill köra fler beräkningar.
Varje gång du har utfört en areaberäkning vill jag att du i en lista lagrar info om rektangelns sidor, area och ifall det är en kvadrat.
När användaren har valt att inte göra fler beräkningar skall alla beräkningar visas upp innan programmet avslutas.
Berätta i kodhuvudet hur du har löst den stora programloopen (den som styr hur länge användaren vill köra applikationen) och motivera ditt val.
Hjälp [klicka för att visa]
Här får du hjälp i form av pseudokod. Använd den gärna som exempel för kommentarer och skriv koden under.
# Skapa en loop som bryter när användaren inte vill göra fler beräkningar # Be användaren mata in rektangelns två sidor # Beräkna och skriv ut arean på rektangeln samt lagra i listan # Om bägge sidorna är lika långa... # ... tala om att det är en kvadrat och skriv detta i listan # Loopa höjden från 1 till 10 # Beräkna volymen och skriv ut den # Fråga användaren om hen vill göra fler beräkningar # Om inte avryt loopen # Skriv ut alla beräkningar
Utskrift
Så här kan resultatet se ut när jag kör mitt program. Du måste inte göra exakt likadant.
Denna applikation gör ett antal beräkningar på en rektangel/rätblock. Ange rektangelns ena sida: 5 Ange rektangelns andra sida: 5 Rektangeln har sidorna 5 och 5 vilket gör att arean är 25 Eftersom bägge sidorna är lika långa så är denna rektangel en kvadrat. Höjden | Volymen ----------------- 1 | 25 ###### bortklippt ###### 10 | 250 Vill du göra en beräkning till (J/N)? J Ange rektangelns ena sida: 6 Ange rektangelns andra sida: 4 Rektangeln har sidorna 6 och 4 vilket gör att arean är 24 Höjden | Volymen ----------------- 1 | 24 ###### bortklippt ###### 10 | 240 Vill du göra en beräkning till (J/N)? N Rektangeln har sidorna 5 och 5 vilket gör att arean är 25, rektangeln är en kvadrat. Rektangeln har sidorna 6 och 4 vilket gör att arean är 24
Hjälp: Hur skall applikationen fungera? [klicka för att visa]
I denna film så visar jag hur mitt program fungerar och ger även lite tips på vad ni skall tänka på. Det som tillkommer i uppgift b, jämfört med uppgift a, är att det skall till en programloop (oändlig) som skall avbrytas när användaren matar in n
på frågan om hen vill köra programmet en gång till. Dessutom skall en lista läggas till där alla svar skall samlas upp för att sedan skrivas ut. Nyckeln här är att INTE skapa listan inne i programloopen, då kommer den att nollställas varje gång programloopen kör ett varv till.
Hjälp: Johan kodar en liknande uppgift. [klicka för att visa]
Då flera elever tyckte att det var lite lurigt att få ihop inlämningsuppgiftens olika delar så har jag spelat in en film där jag löser en annan uppgift men där alla olika delar (programloop, körtidsfelshantering, inre loopar, listhantering mm) finns med. Genom att följa denna uppgift så har du sedan troligtvis de verktyg som du behöver för att få till inlämningsuppgift B.
Uppgift c [klicka för att visa]
Bygg vidare på uppgift b. Denna gång skall du låta användaren mata in vilka höjder som skall visas i volymuträkningen. Om användaren matar in 5 så skall volymen för alla höjder 1-5 visas. Du skall också hjälpa användaren att göra rätt genom att;
- Om användaren matar in något annat än ett heltal så skall användaren få chansen igen.
- Om användaren matar in ett negativt tal skall höjden sättas till 1
- Om användaren matar in ett större tal än 10 så skall höjden sättas till 10.
Du behöver fortfarande inte ha denna säkerhet/logik kring inmatning av rektangelns två sidor.
Berätta i kodhuvudet hur du har tagit hand om, och hjälpt, användaren med inmatningen och motivera ditt val.
Hjälp [klicka för att visa]
För att mata in korrekta siffor för höjden på rätblocket så har du fått tre regler. Nu behöver du fundera på hur du skall hantera dessa regler. Tips från coachen är att du behöver använda dig av en teknik för att ta hand om eventuella körtidsfel. MEN alla tre reglerna går inte att lösa på detta sättet...
Här är det möjligt att du kan få hjälp med lösningen genom att använda dig av någon teknik för att skissa/rita fram en bra lösning med aktivitetsdiagram eller pseudokod.
Utskrift
Så här kan resultatet se ut när jag kör mitt program. Du måste inte göra exakt likadant.
Denna applikation gör ett antal beräkningar på en rektangel/rätblock. Ange rektangelns ena sida: 5 Ange rektangelns andra sida: 5 Ange rätblockets höjd: tre Du har gjort en felaktig inmatning, ange ett heltal Ange rätblockets höjd: -3 Rektangeln har sidorna 5 och 5 vilket gör att arean är 25 Eftersom bägge sidorna är lika långa så är denna rektangel en kvadrat. Höjden | Volymen ----------------- 1 | 25 Vill du göra en beräkning till (J/N)? N Rektangeln har sidorna 5 och 5 vilket gör att arean är 25, rektangeln är en kvadrat.
Tänk på att höjden skulle sättas till 1.
Uppgift d [klicka för att visa]
Nu är det dags att bygga om applikationen en hel del, kan vara läge att spara en kopia av del c ifall du behöver backa och göra om. Ingen ny funktionalitet skall läggas till men nu vill jag att du i en, eller flera, listor lagrar rektangelns två sidor och den höjden du skall räkna upp till för varje rätblock. Se till att du får inmatningarna på det sätt som du vill. När användaren har matat in sina värden för ett önskat antal rätblock så skall alla uträkningar skrivas ut på samma sätt som förut.
Berätta i kodhuvudet hur du valt att lagra värden för sidorna och höjden samt motivera ditt val.
Utskrift
Utskrifterna kan i princip se ut på samma sätt som tidigare.
Uppgift e [klicka för att visa]
Dags för den sista delen som också är en liten blick in i nästa moment. Vi skall kika på funktioner och hur man kan skapa sina egna funktioner.
En egengjord funktion bygger man av kod som antingen är tydligt avgränsad (för beräkningar av area, omkrets, volym etc) eller för att det är en kodsnutt som återanvänds flera gånger (t.ex. kontroller för inmatning av flera tal). Inom programmeringen, och matematiken, pratar vi om en algoritm som är en begränsad uppsättning instruktioner för att lösa en uppgift. Fokus här är att lösa en uppgift, skall det utföras två uppgifter, beräkna area och omkrets, så kan/bör det skapas två funktioner.
Kodexempel: funktioner
# funktion omkrets # inparameter: sida1 & sida2 # returvärde inget def omkrets(s1, s2): print("Omkretsen av en rektangel med sidorna {} och {} är {}" .format(s1, s2, 2*(s1+s2))) # funktion omkrets_retur # inparameter: sida1 & sida2 # returvärde: omkretsen def omkrets_retur(s1, s2): return 2*(s1+s2) sida1 = 5 sida2 = 5 # ta emot det returnerade värdet o = omkrets_retur(sida1, sida2) # Anropar funktionen omkrets för utskrift omkrets(sida1, sida2) # Anropar funktionen omkrets_retur i utskriften print("Omkretsen av en rektangel med sidorna {} och {} är {}" .format(sida1, sida2, omkrets_retur(sida1, sida2)))
Infoga en eller flera funktioner i din applikation på lämplig algoritm, några exempel finns i presentationstexten för funktioner.
Berätta i kodhuvudet hur du valt att använda funktioner hur det har fungerat.
Innan inlämning, se till att du har fungerande kod, att du har följt inlämningsinstruktionerna och att du har döpt alla filer på rätt sätt.