Övning – Granska och testa ett C#-konsolprogram med hjälp av exempeldata
I den här övningen granskar och testar du koden i Startprojektet, isolerar och åtgärdar ett logikproblem och kontrollerar sedan att det uppdaterade programmet fungerar som förväntat.
Du utför följande uppgifter under den här övningen:
Kodgranskning: granska innehållet i filen Program.cs.
Program.cs innehåller följande kodavsnitt:
- Toppnivåinstruktioner: toppnivåinstruktionerna simulerar en serie transaktioner med antingen en matris med
testData
eller ett större antal slumpmässigt genererade transaktioner. - LoadTillEachMorning:
LoadTillEachMorning
metoden används för att konfigurera kassan till med ett fördefinierat antal fakturor i varje valör. - MakeChange:
MakeChange
metoden används för att hantera kassan under köptransaktioner. - LogTillStatus:
LogTillStatus
metoden används för att visa antalet fakturor för varje valör som för närvarande finns i kassan. - TillAmountSummary: metoden
TillAmountSummary
används visar ett meddelande som visar mängden kontanter i kassan.
- Toppnivåinstruktioner: toppnivåinstruktionerna simulerar en serie transaktioner med antingen en matris med
Inledande testning: Kontrollera att
MakeChange
pengarna balanseras tills när matrisentestData
används för att simulera transaktioner.Kodfelsökning: isolera och korrigera ett logikproblem som exponeras när slumpmässigt genererade data används.
Verifieringstest: Utför ett verifieringstest på koden som du utvecklar i den här övningen.
Granska innehållet i filen Program.cs
I den här uppgiften slutför du en genomgång av startprojektkoden. Filen Program.cs innehåller ett program som simulerar villkoren för dagliga transaktioner. Programmet anropar MakeChange
metoden för att hantera pengarna till under varje transaktion. Andra metoder används för att initiera kassan och generera rapporteringsmeddelanden.
Kontrollera att mappen GuidedProject är öppen i Visual Studio Code.
I EXPLORER-vyn expanderar du mapparna GuidedProject och Starter .
Mappen Starter innehåller exempelprogrammet för den här guidade projektmodulen.
Öppna filen Program.cs i Visual Studio Code-redigeraren.
På menyn Visa väljer du Kommandopalett.
I kommandotolken anger du .net: g och väljer sedan .NET: Generate Assets for Build and Debug (Generera tillgångar för build och felsökning).
I kommandotolken Välj projektet som ska startas väljer du Projektet Starter.
Filen launch.json som skapas innehåller en konfiguration för Starter-projektet.
Det tar några minuter att granska toppnivåinstruktionerna för det här programmet:
/* This application manages transactions at a store check-out line. The check-out line has a cash register, and the register has a cash till that is prepared with a number of bills each morning. The till includes bills of four denominations: $1, $5, $10, and $20. The till is used to provide the customer with change during the transaction. The item cost is a randomly generated number between 2 and 49. The customer offers payment based on an algorithm that determines a number of bills in each denomination. Each day, the cash till is loaded at the start of the day. As transactions occur, the cash till is managed in a method named MakeChange (customer payments go in and the change returned to the customer comes out). A separate "safety check" calculation that's used to verify the amount of money in the till is performed in the "main program". This safety check is used to ensure that logic in the MakeChange method is working as expected. */ string? readResult = null; bool useTestData = true; Console.Clear(); int[] cashTill = new int[] { 0, 0, 0, 0 }; int registerCheckTillTotal = 0; // registerDailyStartingCash: $1 x 50, $5 x 20, $10 x 10, $20 x 5 => ($350 total) int[,] registerDailyStartingCash = new int[,] { { 1, 50 }, { 5, 20 }, { 10, 10 }, { 20, 5 } }; int[] testData = new int[] { 6, 10, 17, 20, 31, 36, 40, 41 }; int testCounter = 0; LoadTillEachMorning(registerDailyStartingCash, cashTill); registerCheckTillTotal = registerDailyStartingCash[0, 0] * registerDailyStartingCash[0, 1] + registerDailyStartingCash[1, 0] * registerDailyStartingCash[1, 1] + registerDailyStartingCash[2, 0] * registerDailyStartingCash[2, 1] + registerDailyStartingCash[3, 0] * registerDailyStartingCash[3, 1]; // display the number of bills of each denomination currently in the till LogTillStatus(cashTill); // display a message showing the amount of cash in the till Console.WriteLine(TillAmountSummary(cashTill)); // display the expected registerDailyStartingCash total Console.WriteLine($"Expected till value: {registerCheckTillTotal}\n\r"); var valueGenerator = new Random((int)DateTime.Now.Ticks); int transactions = 10; if (useTestData) { transactions = testData.Length; } while (transactions > 0) { transactions -= 1; int itemCost = valueGenerator.Next(2, 20); if (useTestData) { itemCost = testData[testCounter]; testCounter += 1; } int paymentOnes = itemCost % 2; // value is 1 when itemCost is odd, value is 0 when itemCost is even int paymentFives = (itemCost % 10 > 7) ? 1 : 0; // value is 1 when itemCost ends with 8 or 9, otherwise value is 0 int paymentTens = (itemCost % 20 > 13) ? 1 : 0; // value is 1 when 13 < itemCost < 20 OR 33 < itemCost < 40, otherwise value is 0 int paymentTwenties = (itemCost < 20) ? 1 : 2; // value is 1 when itemCost < 20, otherwise value is 2 // display messages describing the current transaction Console.WriteLine($"Customer is making a ${itemCost} purchase"); Console.WriteLine($"\t Using {paymentTwenties} twenty dollar bills"); Console.WriteLine($"\t Using {paymentTens} ten dollar bills"); Console.WriteLine($"\t Using {paymentFives} five dollar bills"); Console.WriteLine($"\t Using {paymentOnes} one dollar bills"); // MakeChange manages the transaction and updates the till string transactionMessage = MakeChange(itemCost, cashTill, paymentTwenties, paymentTens, paymentFives, paymentOnes); // Backup Calculation - each transaction adds current "itemCost" to the till if (transactionMessage == "transaction succeeded") { Console.WriteLine($"Transaction successfully completed."); registerCheckTillTotal += itemCost; } else { Console.WriteLine($"Transaction unsuccessful: {transactionMessage}"); } Console.WriteLine(TillAmountSummary(cashTill)); Console.WriteLine($"Expected till value: {registerCheckTillTotal}\n\r"); Console.WriteLine(); } Console.WriteLine("Press the Enter key to exit"); do { readResult = Console.ReadLine(); } while (readResult == null);
Koden för toppnivåinstruktioner slutför följande uppgifter:
- Konfigurerar programdata och miljövariabler som används för att testa
MakeChange
metoden. LoadTillEachMorning()
Anropar metoderna ,LogTillStatus()
ochTillAmountSummary()
för att förbereda pengarna till och skriva ut statusmeddelanden till konsolen.- Använder en
while
loop för att simulera en serie transaktioner. MakeChange
Anropar metoden inifrån kodblocket i loopenwhile
.- Rapporterar status för pengarna till efter varje transaktion.
Kommentar
De översta instruktionerna innehåller en
Console.ReadLine()
-instruktion. Filenlaunch.json
måste uppdateras innan du felsöker.- Konfigurerar programdata och miljövariabler som används för att testa
Ta en stund att granska
LoadTillEachMorning()
metoden.static void LoadTillEachMorning(int[,] registerDailyStartingCash, int[] cashTill) { cashTill[0] = registerDailyStartingCash[0, 1]; cashTill[1] = registerDailyStartingCash[1, 1]; cashTill[2] = registerDailyStartingCash[2, 1]; cashTill[3] = registerDailyStartingCash[3, 1]; }
Det tar några minuter att granska
MakeChange()
metoden.static string MakeChange(int cost, int[] cashTill, int twenties, int tens = 0, int fives = 0, int ones = 0) { string transactionMessage = ""; cashTill[3] += twenties; cashTill[2] += tens; cashTill[1] += fives; cashTill[0] += ones; int amountPaid = twenties * 20 + tens * 10 + fives * 5 + ones; int changeNeeded = amountPaid - cost; if (changeNeeded < 0) transactionMessage = "Not enough money provided."; Console.WriteLine("Cashier Returns:"); while ((changeNeeded > 19) && (cashTill[3] > 0)) { cashTill[3]--; changeNeeded -= 20; Console.WriteLine("\t A twenty"); } while ((changeNeeded > 9) && (cashTill[2] > 0)) { cashTill[2]--; changeNeeded -= 10; Console.WriteLine("\t A ten"); } while ((changeNeeded > 4) && (cashTill[1] > 0)) { cashTill[2]--; changeNeeded -= 5; Console.WriteLine("\t A five"); } while ((changeNeeded > 0) && (cashTill[0] > 0)) { cashTill[0]--; changeNeeded--; Console.WriteLine("\t A one"); } if (changeNeeded > 0) transactionMessage = "Can't make change. Do you have anything smaller?"; if (transactionMessage == "") transactionMessage = "transaction succeeded"; return transactionMessage; }
Metoden
MakeChange
hanterar pengarna tills under varje köptransaktion. Transaktionsprocessen förlitar sig på följande resurser och villkor:Kontanttransaktion: Metoden
MakeChange
accepterar en kontant betalning från kunden och avgör sedan hur många fakturor av varje valör som måste returneras till kunden i förändring.MakeChange
måste först se till att kunden har tillhandahållit tillräckligt med pengar för att täcka transaktionen. Om betalningen är tillräcklig börjar processen "gör ändring" med den största fakturabeteckningen och fungerar ner till den minsta valören. I varje stegMakeChange
ser du till att den aktuella valören är mindre än den ändring som är skyldig.MakeChange
säkerställer också att en faktura för den obligatoriska valören är tillgänglig i kassan innan den läggs till i ändringen som returneras till kunden.Indataparametrar: Metoden
MakeChange
använder följande indataparametrar:- Ett heltal som representerar kostnaden för den artikel som köps:
itemCost
- En heltalsmatris som innehåller antalet fakturor i kassan för varje valör:
cashTill
- Den betalning som erbjuds av kunden, där antalet fakturor för varje valör anges separat:
paymentTwenties
,paymentTens
,paymentFives
,paymentOnes
- Ett heltal som representerar kostnaden för den artikel som köps:
Kontanter som är tillgängliga i kassan: De fakturor som erbjuds som betalning av kunden måste ingå i räkningarna för varje valör som är tillgängliga för att göra ändringar.
Ändring som kunden är skyldig: Ändringen som kunden är skyldig beräknas med hjälp av det belopp som kunden betalar minus kostnaden för artikeln.
Underbetalning: Om kunden inte har tillhandahållit tillräcklig betalning
MakeChange
returnerar ett beskrivande meddelande och transaktionen avbryts.Otillräckligt till: Om kassan inte kan göra någon exakt ändring
MakeChange
returnerar du ett beskrivande meddelande och transaktionen avbryts.
Ta en stund att granska
LogTillStatus()
metoden.static void LogTillStatus(int[] cashTill) { Console.WriteLine("The till currently has:"); Console.WriteLine($"{cashTill[3] * 20} in twenties"); Console.WriteLine($"{cashTill[2] * 10} in tens"); Console.WriteLine($"{cashTill[1] * 5} in fives"); Console.WriteLine($"{cashTill[0]} in ones"); Console.WriteLine(); }
Metoden
LogTillStatus
använder matrisencashTill
för att rapportera det aktuella innehållet i kassan.Ta en stund att granska
TillAmountSummary()
metoden.static string TillAmountSummary(int[] cashTill) { return $"The till has {cashTill[3] * 20 + cashTill[2] * 10 + cashTill[1] * 5 + cashTill[0]} dollars"; }
Metoden
TillAmountSummary
använder matrisencashTill
för att beräkna det aktuella kontantsaldot som är tillgängligt i till.
Det slutför din granskning av det befintliga kodprojektet.
Kontrollera att MakeChange
hanterar pengarna när du använder matrisen testData
I den här uppgiften simulerar du transaktioner med matrisen testData
och kontrollerar att MakeChange
pengarna har balanserats tills.
På Menyn Kör i Visual Studio Code väljer du Starta felsökning.
Observera att ett
IOException
fel inträffar.FELSÖKNINGSKONSOLen stöder
Console.Clear()
inte ellerConsole.ReadLine()
metoder. Du måste uppdatera filen launch.json innan du felsöker.I verktygsfältet Felsök väljer du Stoppa.
Använd EXPLORER-vyn för att öppna filen launch.json.
Uppdatera attributet enligt
console
följande i filen launch.json:// For more information about the 'console' field, see https://aka.ms/VSCode-CS-LaunchJson-Console "console":"integratedTerminal",
Standardvärdet för
console
attributet ärinternalConsole
, som justeras till PANELEN FELSÖKNINGSKONSOL. Tyvärr stöder felsökningskonsolpanelen inte vissa konsolmetoder. InställningenintegratedTerminal
justeras mot TERMINAL-panelen, som stöder konsolens indata och utdata.Spara ändringarna i filen launch.json.
På Menyn Kör i Visual Studio Code väljer du Starta felsökning.
Granska utdata som genererats av programmet i TERMINAL-panelen.
Växla från panelen FELSÖKNINGSKONSOL till TERMINAL-panelen för att granska utdata.
Observera att
MakeChange
balanserar kassan när matrisentestData
används för att simulera transaktioner.Du bör se följande rader längst ned i de rapporterade utdata:
The till has 551 dollars Expected till value: 551 Press the Enter key to exit
Observera att både rapporterade och förväntade till-värden är 551.
Om du vill avsluta programmet trycker du på Retur.
Identifiera och åtgärda logikproblem
I den här uppgiften använder du simulerade transaktioner för att exponera ett kodlogikproblem och använder sedan felsökningsverktygen i Visual Studio Code för att isolera och åtgärda problemet.
Om du vill köra koden med slumpmässigt genererade transaktioner ändrar du värdet som tilldelats till
useTestData
false
.Du hittar variabeln
useTestData
längst upp i toppnivåinstruktionerna.Spara filen Program.cs och kör sedan programmet i felsökningsprogrammet.
Granska utdata i terminalpanelen.
Observera avvikelsen i kassabalansen.
Det slutliga till-saldot som beräknas av
MakeChange
och saldot som upprätthålls i de översta satserna rapporteras längst ned i utdata. Till exempel:Transaction successfully completed. The till has 379 dollars Expected till value: 434 Press the Enter key to exit
Kommentar
Programmet genererar slumpmässigt kostnaden för inköpsartiklar. Därför skiljer sig till-värdena som rapporteras i dina utdata.
Avsluta programmet genom att trycka på Retur.
Stäng terminalpanelen.
Felsöka koden
I den här uppgiften använder du felsökningsverktygen i Visual Studio Code för att isolera och sedan åtgärda logikproblemet.
Leta upp följande kodrad i slutet av de översta satserna:
Console.WriteLine();
Ange en brytpunkt på den valda kodraden.
På Menyn Kör i Visual Studio Code väljer du Starta felsökning.
Observera att kodkörningen pausar brytpunkten.
I verktygsfältet Felsökningskontroller väljer du Stega in.
Granska utdata i terminalpanelen.
Om de rapporterade och förväntade tills-värdena är lika väljer du Fortsätt i verktygsfältet Felsökningskontroller .
Upprepa föregående steg tills du ser en avvikelse mellan de rapporterade och förväntade till-värdena.
När du ser en avvikelse tar det en minut att undersöka detaljerna i transaktionen.
Observera att de rapporterade kontanter som mottagits och den returnerade ändringen är korrekta, men kassan är kort med fem dollar.
Den här bristen tyder på att matrisen
cashTill
uppdateras felaktigt, även om rapporteringen är korrekt.Stoppa felsökningssessionen och stäng terminalpanelen.
Rulla längst ned i
MakeChange
metoden.De
while
instruktioner som används för att "göra ändringar" finns i slutet avMakeChange
metoden.Granska de instruktionskodblock
while
som används för att göra ändringar.Eftersom kassan är av med fem dollar är problemet sannolikt i kodblocket
while
som används för att returnera fem dollarräkningar.Observera följande kod:
while ((changeNeeded > 4) && (cashTill[1] > 0)) { cashTill[2]--; changeNeeded -= 5; Console.WriteLine("\t A five"); }
Matrisen
cashTill[]
används för att lagra antalet fakturor för varje valör som för närvarande är tillgängliga. Matriselementet1
används för att hantera antalet fem dollarfakturor i kassan. Uttrycket i -instruktionenwhile
refererar tillcashTill[1]
korrekt. Instruktionen i kodblocket minskarcashTill[2]
dock snarare äncashTill[1]
. Om du anger ett indexvärde2
för innebär det att en 10-dollarsedel tas bort från kassan i stället för en femdollarsedel.Uppdatera kodblocket på
while
följande sätt:while ((changeNeeded > 4) && (cashTill[1] > 0)) { cashTill[1]--; changeNeeded -= 5; Console.WriteLine("\t A five"); }
Spara Program.cs-filen.
Kontrollera ditt arbete
I den här uppgiften kör du programmet och kontrollerar att den uppdaterade koden fungerar som den ska.
Välj Ta bort alla brytpunkter på Visual Studio Code Run-menyn.
På menyn Kör väljer du Starta felsökning.
Granska utdata i terminalpanelen.
Kontrollera att det rapporterade till-värdet är lika med det förväntade till-värdet:
Det slutliga till-saldot som beräknas av
MakeChange
och saldot som upprätthålls i de översta satserna rapporteras längst ned i utdata. Till exempel:Transaction successfully completed. The till has 452 dollars Expected till value: 452 Press the Enter key to exit
Programmet genererar slumpmässigt kostnaden för inköpsartiklar. Därför skiljer sig till-värdena som rapporteras i dina utdata. Så länge de två värdena är lika har du lyckats åtgärda logikproblemet.