Introduktionsuppgift
Tärningen är kastad!
Denna instruktion gäller Visual Studio Code och .NET Core SDK 2.2.
För att kuna följa denna guide måste du ha installerat Visual Studio Code, .NET Core SDK samt C#-tillägget för Visual Studio Code.
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.
Steg 1
Ö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
Steg 2
Byt till den nya katalogen DieRollsFrequencyTable
och starta Visual Studio Code genom att köra följande kommandon.
Steg 3
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
Steg 4
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.
Steg 5
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
Steg 6
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).
Steg 7
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 typenRandom
.Istället för att tilldela variabeln
roll
värdet4
ska variabeln tilldelas värdet som metodenNext()
returnerar. I detta fall kommerdie.Next(1, 7)
att returnera ett värde av typenint
i det slutna intervallet mellan 1 och 6.
Program.cs
Steg 8
Kör applikationen flera gånger och konstatera att värden mellan 1 och 6 skrivs ut i konsolfönstren.
Steg 9
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
Steg 10
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
medcount
i ”for”-satsens villkorsuttryck.
Program.cs
Steg 11
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.
Steg 12
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 medCTRL + F5
och välj TERMINAL.
Steg 13
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 referensvariabelnfrequencyTable
, av typenint[]
, 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
Steg 14
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.
Steg 15
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
Steg 16
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!
Steg 17
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
Steg 18
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:
Steg 19
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 typenstring[]
, 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.
Steg 20
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.
Steg 21
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
Steg 22
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.
Steg 23
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
Steg 24
Ä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
Steg 25
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
Steg 26
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.
Steg 27
Presentationen av frekvenstabellen behöver åtgärdas så den liknar en tabell.
Program.cs - ViewFrequencyTable
Steg 28
Kör applikationen och verifiera att frekvenstabellen nu påminner mer om en tabell än tidigare.
Ange antal tärningskast [100-1000]: 600
Steg 29
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
Last updated