Introduktionsuppgift
Tärningen är kastad!
Last updated
Tärningen är kastad!
Last updated
För att kuna följa denna guide måste du ha installerat , samt .
Du ska följa ”steg för steg”-instruktionen i denna introduktionsuppgift och skapa en konsolapplikation med C# och Visual Studio Code. Applikationen ska slumpa i det slutna intervallet mellan 100 till 1000 tärningskast och presentera en frekvenstabell över förekomsten av ettor, tvåor, osv.
Öppna ett nytt kommandofönster, gå till katalogen där du vill skapa katalogen för din applikation (i denna guide C:\PlayGround
) och kör följande kommando.
Kommandot dotnet
skapar en ny (new
) applikation av typen console
. Parametern -o
skapar en ny katalog med namnet DieRollsFrequencyTable
där applikationens samtilga kataloger och filer återfinns.
Exempelutskrift
Byt till den nya katalogen DieRollsFrequencyTable
och starta Visual Studio Code genom att köra följande kommandon.
Visual Studio Code öppnar aktuell katalog som innehåller det nya konsolprojekt. Det nya projektet innehåller filerna DieRollsFrequencyTable.csproj
och Program.cs
, samt katalogerna bin
och obj
.
Filer är organiserade i projekt och ett projekt kan innehålla flera filer som tillsammans utgör applikationen.
Filen Program.cs
innehåller klassen Program
med metoden Main
och därmed är minimikraven uppfyllda för att du nu ska kunna köra applikationen.
Program.cs
För att köra applikationen välj menykommandot Debug > Start Without Debugging, eller tryck ner tangentbordkombinationen Ctrl + F5
. (Du kan även köra kommandot dotnet run
i ett kommandofönster.)
Applikationen körs och strängen "Hello World!"
skrivs ut.
Applikationen ska simulera tärningskast. Ett tal mellan 1 och 6 kan representera ett tärningskast. Resultatet av ett tärningskast måste sparas i en variabel vars värde sedan presenteras i konsolfönstret.
Deklarera en variabel, med namnet roll, av typen int och initiera den till värdet 4.
Presentera variabelns värde.
Program.cs
Testa applikationen genom att välj menykommandot Debug > Start Without Debugging, eller tryck ner tangentbordkombinationen Ctrl + F5
. (Gjorda förändringar sparas automatiskt i samband med att ett projekt exekveras).
Resultatet av ett tärningskast slumpas inte på något vis av applikationen utan är vad som kallas ”hårkodat” till värdet 4. För att slumpa ett värde i det slutna intervallet mellan 1 och 6 måste ett objekt av typen Random
användas.
Skapa och initiera en referensvariabel, med namnet die (som betyder tärning på engelska), av typen Random
att referera till ett objekt av typen Random
.
Istället för att tilldela variabeln roll
värdet 4
ska variabeln tilldelas värdet som metoden Next()
returnerar. I detta fall kommer die.Next(1, 7)
att returnera ett värde av typen int
i det slutna intervallet mellan 1 och 6.
Program.cs
Kör applikationen flera gånger och konstatera att värden mellan 1 och 6 skrivs ut i konsolfönstren.
Applikationen kan nu simulera ett tärningskast. Kravet är att mellan 100 och 1000 tärningskast ska kunna simuleras. Hur ska applikationen göra för att simulera t.ex. 273 tärningskast?
Det kan enklast göras genom att låta en ”for”-sats omsluta satserna som slumpar och skriver ut. (Deklarationerna av variablerna die
och roll
placeras lämpligen innan "for"-satsen så att de bara skapas en gång istället för 273 gånger.)
Program.cs
Antalet tärningskast är nu ”hårdkodat” till 273. Användaren av applikationen ska kunna ange ett heltal i det slutna intervallet mellan 100 och 1000.
Deklarera variabeln count
.
Skriv ut ledtexten "Ange antalet tärningskast [100-1000]: ".
Läs in och tolka heltalet användaren matat in och lagra värdet i count
.
Ersätt 273
med count
i ”for”-satsens villkorsuttryck.
Program.cs
Hur många gånger har du hittills sparat de ändringar du gjort? Inte någon gång? Huuu! Hög tid att klicka på knappen Save All (Ctrl + Shift + S
) som sparar alla öppna filer som har osparade ändringar. Ta för vana att spara ofta, t.ex. efter varje sats. Ctrl + S
, som sparar filen som har fokus, ska sitta i ryggmärgen.
Efter att ett antal förändringar är gjorda är det lämpligt att testa applikationen igen.
För att kunna mata in data applikationen efterfrågar måste du se till att applikationen körs i ett konsolefönster (inte DEBUG CONSOLE i Visual Studio Code).
Öppna den integrerade terminalen, aktivera TERMINAL och kör dotnet run
.
Du kan även konfigurera launch.json
i katalogen .vscode
att använda den integrerade terminalen istället för den interna konsolen.
Öppna launch.json
och ersätt "console": "internalConsole"
med "console": "integratedTerminal"
. Kör applikationen som vanligt med CTRL + F5
och välj TERMINAL.
Applikationen kan nu simulera av användaren angivet antal tärningskast. Men hur ska en frekvenstabell över tärningskasten kunna skrivas ut? För att kunna skriva ut en frekvenstabell måste applikationen räkna antalet framslumpade ettor, tvåor, o.s.v. En träning har sex sidor varför en variabel med plats för sex värden behövs, en så kallad array.
Ersätt satsen som deklarerar variabeln roll
med en sats som skapar referensvariabeln frequencyTable
, av typen int[]
, och tilldela den en referens till en array med sex element.
En array har 0-baserat index, d.v.s. det första elementet har index 0, varför tal i det slutna intervallet mellan 0 och 5 nu måste slumpas fram. Satsen som tilldelar roll ett slumpat värde ska ersättas med en sats där det framslumpade värdet leder till att motsvarande elements värde i arrayen ökas med 1.
En ”foreach”-sats är lämplig att använda för att skriva ut elementens värden i arrayen.
Program.cs
Kör applikationen och konstatera att något som kan vara en frekvenstabell skrivs ut i terminalfönstret.
Applikationen uppfyller nu de löst ställda kraven och en frekvenstabell över ett antal tärningskast skrivs ut. Men hur är det med kvalitéten på användargränssnittet?
Användaren uppmanas att mata in ett heltal i det slutna intervallet mellan 100 och 1000. Men vad händer om användaren matar in något som inte kan tolkas som ett heltal? Vad händer om användaren matar in t.ex. 13? Ska det gå?
Presentationen av frekvenstabellen har en del övrigt att önska. Vad betyder 146? Vad betyder 132?
Allvarligaste problemet är första punkten ovan eftersom om användaren matar in något som inte kan tolkas som ett heltal så kraschar applikationen.
Eventuella fel i samband med inläsning av antalet tärningskast som ska göras måste hanteras. Satsen som sköter inläsningen måste ersättas av ”do-while”-satsen, som får omsluta satsen som skriver ut ledtexten.
Program.cs
Testa applikationen och konstatera att applikationen inte längre kraschar. Det går fortfarande att mata in ett tal som inte är i det slutna intervallet mellan 100 och 1000!
I samband med inläsningen måste validering ske av värdet så att det ligger i det slutna intervallet mellan 100 och 1000.
Villkorsuttrycket i ”do-while”-satsen måste kompletteras så att det undersöker om det inlästa värdet är större eller lika med 100 och att det är mindre eller lika med 1000.
Program.cs
Vid test av applikationen ska det nu vara omöjligt att mata in något annat än ett heltal i det slutna intervallet mellan 100 och 1000.
Den första punkten under steg 14 är nu åtgärdad. Återstår att åtgärda den andra punkten, d.v.s. att låta applikationen presentera frekvenstabellen på ett något bättre sätt så att t.ex. tärningssidan framgår:
Applikationen måste känna till vad tärningssidorna kallas. Lämpligt kan då vara att låta en array innehålla de strängar som beskriver tärningens sidor. Då frekvenstabellen sedan presenteras kan respektive sträng skrivas ut tillsammans med resultatet.
Lägg till en sats som skapar referensvariabeln faces
, av typen string[]
, och initiera den med en array innehållande de sex strängar som var och en beskriver tärningens sidor.
Ersätt ”foreach”-satsen med en ”for”-sats som skriver ut varje tärningssida med tillhörande värde i frekvenstabellen.
Program.cs
Det är inte optimalt med en lösning som kräver synkronisering av två olika arrayer. En bättre lösning kan t.ex. vara att använda en associativ array (”dictionary”), men den konstruktionen får vänta till längre fram i kursen.
Kör applikationen på nytt. Nu ska det tydligare framgå hur många ettor, tvåor, o.s.v. som har slumpats fram. Lägg märke till att tabellen är något svår att läsa då en-, tio- och hundratal inte står under varandra.
Värden (strängar, heltal, etc.) som skrivs ut med hjälp av en formatspecificerare kan justeras på olika sätt. Den förändrade WrtiteLine
-satsen ser till att tärningssidan vänsterjusteras med en fältbredd på sex tecken, och resultatet högerjusteras med en fältbredd på fyra tecken.
Program.cs
En körnng av applikationen visar att den nu beträffande användargränssnittet är acceptabel, men har kanske en hel del övrigt att önska, bl.a. saknas felmeddelande vid felaktig inmatning.
Applikationen uppfyller nu det löst ställda kraven bättre beträffande användargränssnittet. Men hur är det med kvalitéten beträffande koden?
All kod är skriven i en och samma metod. Ofta vinner även mindre applikationer på att omstruktureras i flera metoder. Det blir då lättar att förstå och därmed underhålla koden.
Avsaknaden av kommentarer är total vilket försvårar förståelse av koden.
Placera koden som har hand om inläsningen av antal tärningskast som ska simuleras i en separat metod med namnet ReadNumberOfRolls()
. Metoden anropas och värdet metoden returnerar lagras i den lokala variabeln count
.
Program.cs
Även skapandet av frekvenstabellen och presentationen av den kan omstruktureras i två separata metoder.
Trots att koden fortfarande inte innehåller några kommentarer är den lättare att förstå då metodernas namn har valts med omsorg och beskriver väl vad respektive metod har till uppgift.
Program.cs
Då användaren råkar mata in något som inte kan tolkas som ett heltal i det slutna intervallet mellan 100 och 1000 visas inget felmeddelande. Metoden ReadNumberOfRolls()
måste skrivas om så att så sker.
Program.cs - ReadNumberOfRolls
Kör applikationen och att mata in några felaktiga värden. Felmeddelande visas då användaren matar in något som inte kan tolkas som ett heltal i det slutna intervallet mellan 100 och 1000.
Presentationen av frekvenstabellen behöver åtgärdas så den liknar en tabell.
Program.cs - ViewFrequencyTable
Kör applikationen och verifiera att frekvenstabellen nu påminner mer om en tabell än tidigare.
Ange antal tärningskast [100-1000]: 600
Kod ska alltid dokumenteras. Nedan visar hur källkoden blir enklare att förstår när den kompletterats med kommentarer, vilka självklart ska skrivas samtidigt som koden skrivs och inte efter att all kod skrivits klart.
Program.cs