Oefening: een C#-consoletoepassing controleren en testen met voorbeeldgegevens
In deze oefening controleert en test u de code in het Starter-project, isoleert en lost u een logisch probleem op en controleert u vervolgens of uw bijgewerkte toepassing werkt zoals verwacht.
Tijdens deze oefening voert u de volgende taken uit:
Codebeoordeling: controleer de inhoud van het Program.cs-bestand.
De Program.cs bevat de volgende codesecties:
- Instructies op het hoogste niveau: met de instructies op het hoogste niveau wordt een reeks transacties gesimuleerd met behulp van een matrix van
testDataof een groter aantal willekeurig gegenereerde transacties. - LoadTillEachMorning: de
LoadTillEachMorningmethode wordt gebruikt om de kassa te configureren tot een vooraf gedefinieerd aantal facturen in elke benaming. - MakeChange: de
MakeChangemethode wordt gebruikt voor het beheren van het geld tot tijdens aankooptransacties. - LogTillStatus: de
LogTillStatusmethode wordt gebruikt om het aantal facturen van elke benaming weer te geven die momenteel in de till staan. - TillAmountSummary: de
TillAmountSummarymethode wordt gebruikt om een bericht weer te geven met de hoeveelheid geld in de kassa.
- Instructies op het hoogste niveau: met de instructies op het hoogste niveau wordt een reeks transacties gesimuleerd met behulp van een matrix van
Initiƫle tests: controleer of
MakeChangehet geld goed wordt gesaldi totdat u detestDatamatrix gebruikt om transacties te simuleren.Code-foutopsporing: een logicaprobleem isoleren en corrigeren dat wordt weergegeven bij het gebruik van willekeurig gegenereerde gegevens.
Verificatietest: voer een verificatietest uit op de code die u in deze oefening ontwikkelt.
De inhoud van het Program.cs-bestand controleren
In deze taak voltooit u een overzicht van de Starter-projectcode. Het bestand Program.cs bevat een toepassing waarmee de voorwaarden voor dagelijkse transacties worden gesimuleerd. De toepassing roept de MakeChange methode aan voor het beheren van het geld tot elke transactie. Andere methoden worden gebruikt om de till te initialiseren en rapportageberichten te genereren.
Zorg ervoor dat de map GuidedProject is geopend in Visual Studio Code.
Vouw in de VERKENNER-weergave de mappen GuidedProject en Starter uit.
De map Starter bevat de voorbeeldtoepassing voor deze begeleide projectmodule.
Open het Program.cs-bestand in de Visual Studio Code-editor.
Selecteer Opdrachtpalet in het menu Beeld.
Voer bij de opdrachtprompt .net in: g en selecteer vervolgens .NET: Assets genereren voor build en foutopsporing.
Selecteer het Starter-project in de prompt Het project selecteren om te starten.
Het launch.json-bestand dat wordt gemaakt, bevat een configuratie voor het Starter-project.
Neem enkele minuten de tijd om de instructies op het hoogste niveau voor deze toepassing te bekijken:
/* 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);Met de instructies op het hoogste niveau worden de volgende taken uitgevoerd:
- Hiermee configureert u de toepassingsgegevens en omgevingsvariabelen die worden gebruikt om de
MakeChangemethode te testen. - Roept de
LoadTillEachMorning(),LogTillStatus()enTillAmountSummary()methoden aan om het geld voor te bereiden tot en statusberichten af te drukken naar de console. - Maakt gebruik van een
whilelus om een reeks transacties te simuleren. - Roept de
MakeChangemethode aan vanuit het codeblok van dewhilelus. - Rapporteert de status van het geld tot na elke transactie.
Notitie
De instructies op het hoogste niveau bevatten een
Console.ReadLine()instructie. Hetlaunch.jsonbestand moet worden bijgewerkt voordat er fouten worden opgespoord.- Hiermee configureert u de toepassingsgegevens en omgevingsvariabelen die worden gebruikt om de
Neem even de tijd om de
LoadTillEachMorning()methode te controleren.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]; }Neem een paar minuten de tijd om de
MakeChange()methode te controleren.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; }De
MakeChangemethode beheert het geld tot tijdens elke aankooptransactie. Het transactieproces is afhankelijk van de volgende resources en voorwaarden:Contante transactie: De
MakeChangemethode accepteert een contante betaling van de klant en bepaalt vervolgens hoeveel facturen van elke benaming moeten worden geretourneerd aan de klant in wijziging.MakeChangemoet eerst ervoor zorgen dat de klant voldoende geld heeft verstrekt om de transactie te dekken. Als de betaling voldoende is, begint het proces "wijziging aanbrengen" met de grootste factuurbenomining en werkt het af op de kleinste benaming. In elke faseMakeChangezorgt u ervoor dat de huidige benaming kleiner is dan de verschuldigde wijziging.MakeChangezorgt er ook voor dat een factuur van de vereiste benaming beschikbaar is in de till voordat deze wordt toegevoegd aan de wijziging die aan de klant is geretourneerd.Invoerparameters: De
MakeChangemethode gebruikt de volgende invoerparameters:- Een geheel getal dat de kosten vertegenwoordigt van het item dat wordt gekocht:
itemCost - Een matrix met gehele getallen met het aantal facturen in de till voor elke benaming:
cashTill - De betaling die door de klant wordt aangeboden, waarbij het aantal facturen voor elke benaming afzonderlijk wordt opgegeven:
paymentTwenties,paymentTens, , ,paymentFivespaymentOnes
- Een geheel getal dat de kosten vertegenwoordigt van het item dat wordt gekocht:
Contant geld dat beschikbaar is tot: De rekeningen die als betaling door de klant worden aangeboden, moeten worden opgenomen in de rekeningen van elke benaming die beschikbaar zijn voor het aanbrengen van wijzigingen.
Wijziging die aan de klant is verschuldigd: de wijziging die aan de klant is verschuldigd, wordt berekend met behulp van het bedrag dat door de klant wordt betaald, minus de kosten van het artikel.
Onderbetalen: Als de klant onvoldoende betaling heeft verstrekt,
MakeChangeretourneert u een beschrijvend bericht en wordt de transactie geannuleerd.Onvoldoende tot: Als de till geen exacte wijziging kan aanbrengen,
MakeChangeretourneert u een beschrijvend bericht en wordt de transactie geannuleerd.
Neem even de tijd om de
LogTillStatus()methode te controleren.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(); }De
LogTillStatusmethode gebruikt decashTillmatrix om de huidige inhoud van de till te rapporteren.Neem even de tijd om de
TillAmountSummary()methode te controleren.static string TillAmountSummary(int[] cashTill) { return $"The till has {cashTill[3] * 20 + cashTill[2] * 10 + cashTill[1] * 5 + cashTill[0]} dollars"; }De
TillAmountSummarymethode gebruikt de matrix voor hetcashTillberekenen van het huidige cash balance dat beschikbaar is in till.
Hiermee voltooit u uw beoordeling van het bestaande codeproject.
MakeChange Controleer of het geld goed wordt beheerd bij het gebruik van de testData matrix
In deze taak simuleert u transacties met behulp van de testData matrix en controleert u of MakeChange het geld in balans is gebracht totdat.
Selecteer in het menu Uitvoeren van Visual Studio Code start de foutopsporing.
U ziet dat er een
IOExceptionfout optreedt.De FOUTOPSPORINGSCONSOLE biedt geen ondersteuning
Console.Clear()voor ofConsole.ReadLine()methoden. U moet het launch.json-bestand bijwerken voordat u fouten opspoort.Selecteer Stoppen op de werkbalk Foutopsporing.
Gebruik de EXPLORER-weergave om het bestand launch.json te openen.
Werk in het launch.json-bestand het
consolekenmerk als volgt bij:// For more information about the 'console' field, see https://aka.ms/VSCode-CS-LaunchJson-Console "console":"integratedTerminal",De standaardwaarde voor het
consolekenmerk isinternalConsole, die wordt uitgelijnd op het paneel DEBUG CONSOLE. Helaas biedt het deelvenster DEBUG CONSOLE geen ondersteuning voor sommige consolemethoden. DeintegratedTerminalinstelling wordt uitgelijnd op het TERMINAL-deelvenster, dat ondersteuning biedt voor consoleinvoer en -uitvoer.Sla uw wijzigingen op in het launch.json-bestand.
Selecteer in het menu Uitvoeren van Visual Studio Code start de foutopsporing.
Controleer de uitvoer die door de toepassing is gegenereerd in het TERMINAL-deelvenster.
Schakel over van het paneel DEBUG CONSOLE naar het TERMINAL-deelvenster om de uitvoer te controleren.
U ziet dat
MakeChangehet saldo van de till met succes wordt afgeslagen bij het gebruik van detestDatamatrix om transacties te simuleren.De volgende regels worden onder aan de gerapporteerde uitvoer weergegeven:
The till has 551 dollars Expected till value: 551 Press the Enter key to exitU ziet dat de gerapporteerde en verwachte till-waarden beide 551 zijn.
Druk op Enter om de toepassing af te sluiten.
Logische problemen identificeren en oplossen
In deze taak gebruikt u gesimuleerde transacties om een probleem met codelogica beschikbaar te maken en gebruikt u vervolgens de hulpprogramma's voor foutopsporingsprogramma's van Visual Studio Code om het probleem te isoleren en op te lossen.
Als u de code wilt uitvoeren met behulp van willekeurig gegenereerde transacties, wijzigt u de waarde die is toegewezen aan
useTestDatafalse.U vindt de
useTestDatavariabele bovenaan de instructies op het hoogste niveau.Sla het Program.cs-bestand op en voer de toepassing uit in het foutopsporingsprogramma.
Controleer de uitvoer in het TERMINAL-deelvenster.
Let op de discrepantie in de till balance.
Het uiteindelijke saldo dat wordt berekend door
MakeChangeen het saldo dat in de instructies op het hoogste niveau wordt bewaard, worden onder aan de uitvoer gerapporteerd. Bijvoorbeeld:Transaction successfully completed. The till has 379 dollars Expected till value: 434 Press the Enter key to exitNotitie
De toepassing genereert willekeurig de kosten van aankoopitems. Daarom zijn de till-waarden die in uw uitvoer zijn gerapporteerd, verschillend.
Druk op Enter om de toepassing af te sluiten.
Sluit het TERMINAL-deelvenster.
Fouten opsporen in de code
In deze taak gebruikt u de hulpprogramma's voor foutopsporingsprogramma's van Visual Studio Code om het logische probleem te isoleren en vervolgens op te lossen.
Zoek aan het einde van de instructies op het hoogste niveau de volgende coderegel:
Console.WriteLine();Stel een onderbrekingspunt in op de geselecteerde coderegel.
Selecteer in het menu Uitvoeren van Visual Studio Code start de foutopsporing.
U ziet dat de uitvoering van code wordt onderbroken op het onderbrekingspunt.
Selecteer Stap in op de werkbalk Besturingselementen voor foutopsporing.
Controleer de uitvoer in het TERMINAL-deelvenster.
Als de gerapporteerde en verwachte waarden gelijk zijn, selecteert u Doorgaan op de werkbalk Besturingselementen voor foutopsporing.
Herhaal de vorige stap totdat u een discrepantie ziet tussen de gerapporteerde en verwachte waarden.
Zodra u een discrepantie ziet, neemt u een minuut de tijd om de details van de transactie te bekijken.
U ziet dat de gerapporteerde contanten die zijn ontvangen en gewijzigd correct zijn, maar de till is kort met vijf dollar.
Dit tekort geeft aan dat de
cashTillmatrix onjuist wordt bijgewerkt, ook al is de rapportage juist.Stop de foutopsporingssessie en sluit het TERMINAL-deelvenster.
Schuif naar de onderkant van de
MakeChangemethode.De
whileinstructies die worden gebruikt om wijzigingen aan te brengen, bevinden zich aan het einde van deMakeChangemethode.Controleer de codeblokken van de
whileinstructie die worden gebruikt om wijzigingen aan te brengen.Omdat de till met vijf dollar is uitgeschakeld, bevindt het probleem zich waarschijnlijk in het
whilecodeblok dat wordt gebruikt om vijf dollar rekeningen te retourneren.Let op de volgende code:
while ((changeNeeded > 4) && (cashTill[1] > 0)) { cashTill[2]--; changeNeeded -= 5; Console.WriteLine("\t A five"); }De
cashTill[]matrix wordt gebruikt om het aantal facturen op te slaan van elke benaming die momenteel beschikbaar is. Matrixelement1wordt gebruikt om het aantal facturen van vijf dollar in de till te beheren. De expressie in dewhileinstructie verwijst naar de juiste maniercashTill[1]. De instructie in het codeblok wordt echter afgebouwdcashTill[2]in plaatscashTill[1]van . Het opgeven van een indexwaarde betekent2dat een factuur van tien dollar wordt verwijderd uit de tot en met een factuur van vijf dollar.Werk het
whilecodeblok als volgt bij:while ((changeNeeded > 4) && (cashTill[1] > 0)) { cashTill[1]--; changeNeeded -= 5; Console.WriteLine("\t A five"); }Sla bestand Program.cs op.
Controleer uw werk
In deze taak voert u uw toepassing uit en controleert u of de bijgewerkte code werkt zoals bedoeld.
Selecteer In het menu Uitvoeren van Visual Studio Code alle onderbrekingspunten verwijderen.
Selecteer in het menu Uitvoeren de foutopsporing starten.
Controleer de uitvoer in het TERMINAL-deelvenster.
Controleer of de gerapporteerde till-waarde gelijk is aan de verwachte till-waarde:
Het uiteindelijke saldo dat wordt berekend door
MakeChangeen het saldo dat in de instructies op het hoogste niveau wordt bewaard, worden onder aan de uitvoer gerapporteerd. Bijvoorbeeld:Transaction successfully completed. The till has 452 dollars Expected till value: 452 Press the Enter key to exitDe toepassing genereert willekeurig de kosten van aankoopitems. Daarom zijn de till-waarden die in uw uitvoer zijn gerapporteerd, verschillend. Zolang de twee waarden gelijk zijn, hebt u het probleem opgelost.