แบบฝึกหัด - ตรวจสอบและทดสอบแอปพลิเคชันคอนโซล C# โดยใช้ข้อมูลตัวอย่าง
ในแบบฝึกหัดนี้ คุณตรวจทานและทดสอบรหัสในโครงการ Starter แยกและแก้ไขปัญหาตรรกะ และจากนั้นตรวจสอบว่าแอปพลิเคชันที่อัปเดตแล้วของคุณทํางานตามที่คาดไว้หรือไม่
คุณทำงานต่อไปนี้ให้เสร็จสมบูรณ์ระหว่างทำแบบฝึกหัดนี้:
การตรวจทานโค้ด: ตรวจสอบเนื้อหาของไฟล์ Program.cs
Program.cs ประกอบด้วยส่วนโค้ดต่อไปนี้:
- รายงานระดับบนสุด: รายงานระดับบนสุดจะจําลองชุดของธุรกรรมโดยใช้แถวลําดับของ
testDataหรือจํานวนธุรกรรมที่สร้างขึ้นแบบสุ่มจํานวนมาก - LoadTillEachMorning:
LoadTillEachMorningวิธีการ ถูกใช้เพื่อกําหนดค่าการลงทะเบียนเงินสดจนถึงจํานวนใบเรียกเก็บเงินที่กําหนดไว้ล่วงหน้าในแต่ละสกุลเงิน - MakeChange:
MakeChangeวิธีการถูกใช้เพื่อจัดการเงินสดจนถึงระหว่างธุรกรรมการซื้อ - LogTillStatus:
LogTillStatusเมธอด ถูกใช้เพื่อแสดงจํานวนใบเรียกเก็บเงินของแต่ละสกุลเงินในปัจจุบันจนถึง - TillAmountSummary:
TillAmountSummaryวิธีการถูกใช้แสดงข้อความที่แสดงจํานวนเงินสดในลิ้นชักเก็บเงิน
- รายงานระดับบนสุด: รายงานระดับบนสุดจะจําลองชุดของธุรกรรมโดยใช้แถวลําดับของ
การทดสอบเริ่มต้น: ตรวจสอบว่า
MakeChangeมีความสมดุลของเงินได้สําเร็จจนถึงเมื่อใช้testDataอาร์เรย์เพื่อจําลองธุรกรรมการดีบักโค้ด: แยกและแก้ไขปัญหาตรรกะที่เปิดเผยเมื่อใช้ข้อมูลที่สร้างขึ้นแบบสุ่ม
การทดสอบการตรวจสอบ: ทําการทดสอบการตรวจสอบบนรหัสที่คุณพัฒนาในแบบฝึกหัดนี้
ตรวจทานเนื้อหาของไฟล์ Program.cs
ในงานนี้ คุณทําการฝึกปฏิบัติรหัสโครงการ Starter ให้เสร็จสมบูรณ์ ไฟล์ Program.cs มีแอปพลิเคชันที่จําลองเงื่อนไขสําหรับธุรกรรมรายวัน การประยุกต์ใช้เรียกใช้ MakeChange วิธีการ เพื่อจัดการเงินจนถึงในระหว่างการทําธุรกรรมแต่ละครั้ง วิธีการอื่นๆ จะใช้ในการเริ่มต้นจนถึงและสร้างข้อความการรายงาน
ตรวจสอบให้แน่ใจว่าโฟลเดอร์ GuidedProject เปิดอยู่ในรหัส Visual Studio
ในมุมมอง EXPLORER ให้ขยายโฟลเดอร์ GuidedProject และ Starter
โฟลเดอร์ Starter ประกอบด้วยแอปพลิเคชันตัวอย่างสําหรับโมดูลโครงการที่แนะนํานี้
เปิดไฟล์ Program.cs ใน Visual Studio Code Editor
บนเมนู มุมมอง ให้เลือก ชุดคําสั่ง
ที่พรอมต์คําสั่ง ให้ป้อน .net: g จากนั้นเลือก .NET: สร้าง Assets สําหรับการสร้างและดีบัก
ที่พร้อมท์ เลือกโครงการเพื่อเปิดใช้ ให้เลือกโครงการ Starter
ไฟล์ launch.json ที่สร้างขึ้นจะรวมการกําหนดค่าสําหรับโครงการ Starter
ใช้เวลาสักครู่เพื่อตรวจสอบคําสั่งระดับสูงสุดสําหรับแอปพลิเคชันนี้:
/* 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);รหัสคําสั่งระดับบนสุดทํางานต่อไปนี้ให้เสร็จสมบูรณ์:
- กําหนดค่าข้อมูลแอปพลิเคชันและตัวแปรสภาพแวดล้อมที่ใช้เพื่อทดสอบ
MakeChangeวิธีการ -
LoadTillEachMorning()เรียกใช้วิธีการ ,LogTillStatus()และTillAmountSummary()เพื่อเตรียมเงินจนถึงและพิมพ์ข้อความสถานะไปยังคอนโซล - ใช้รอบ
whileเพื่อจําลองชุดของธุรกรรม -
MakeChangeเรียกใช้เมธอด จากภายในบล็อกโค้ดของwhileรอบ - รายงานสถานะของเงินจนถึงหลังจากแต่ละธุรกรรม
หมายเหตุ
รายงานระดับบนสุดรวมถึง
Console.ReadLine()คําสั่ง ไฟล์launch.jsonจะต้องได้รับการอัปเดตก่อนการดีบัก- กําหนดค่าข้อมูลแอปพลิเคชันและตัวแปรสภาพแวดล้อมที่ใช้เพื่อทดสอบ
ใช้เวลาสักครู่เพื่อตรวจทาน
LoadTillEachMorning()วิธีการ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]; }ใช้เวลาสักครู่เพื่อตรวจทาน
MakeChange()วิธีการ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; }วิธีการ
MakeChangeจะจัดการเงินจนถึงระหว่างการซื้อแต่ละครั้ง กระบวนการธุรกรรมอาศัยทรัพยากรและเงื่อนไขต่อไปนี้:ธุรกรรมเงินสด: วิธีการ
MakeChangeยอมรับการชําระเงินสดจากลูกค้า จากนั้นจะกําหนดจํานวนตั๋วแลกเงินของแต่ละหน่วยที่ต้องส่งคืนให้กับลูกค้าตามการเปลี่ยนแปลงMakeChangeก่อนอื่นต้องตรวจสอบให้แน่ใจว่าลูกค้ามีเงินเพียงพอที่จะครอบคลุมการทําธุรกรรม หากการชําระเงินเพียงพอ กระบวนการ "ทําการเปลี่ยนแปลง" จะเริ่มต้นด้วยการกําหนดบิลที่ใหญ่ที่สุดและทํางานลงเป็นสกุลเงินที่เล็กที่สุด ในแต่ละขั้นตอนMakeChangeทําให้แน่ใจว่านิกายปัจจุบันน้อยกว่าการเปลี่ยนแปลงที่เป็นหนี้อยู่MakeChangeนอกจากนี้ ยังช่วยให้มั่นใจได้ว่ามีการเรียกเก็บเงินค่าหารที่จําเป็นจนถึงก่อนที่จะเพิ่มลงในการเปลี่ยนแปลงที่ส่งกลับไปยังลูกค้าพารามิเตอร์การป้อนข้อมูล: เม
MakeChangeธอด ใช้พารามิเตอร์การป้อนข้อมูลต่อไปนี้:- จํานวนเต็มที่แสดงต้นทุนของสินค้าที่กําลังซื้อ:
itemCost - อาร์เรย์จํานวนเต็มที่มีจํานวนบิลในจนถึงสําหรับแต่ละเศษ:
cashTill - การชําระเงินที่เสนอโดยลูกค้า ซึ่งมีการระบุจํานวนของใบเรียกเก็บเงินสําหรับแต่ละสกุลเงิน แยกต่างหาก:
paymentTwenties, ,paymentTenspaymentFivespaymentOnes
- จํานวนเต็มที่แสดงต้นทุนของสินค้าที่กําลังซื้อ:
เงินสดที่มีอยู่จนถึง: ใบเรียกเก็บเงินที่เสนอเป็นการชําระเงินโดยลูกค้าจะต้องรวมอยู่ในใบเรียกเก็บเงินของแต่ละสกุลเงินที่สามารถทําการเปลี่ยนแปลงได้
เปลี่ยนเป็นลูกค้าเป็นหนี้แล้ว: การเปลี่ยนแปลงที่เป็นหนี้ให้กับลูกค้าจะถูกคํานวณโดยใช้ยอดเงินที่ลูกค้าชําระลบด้วยต้นทุนสินค้า
การจ่ายเงินน้อย: หากลูกค้าไม่ได้ระบุการชําระเงินเพียงพอ ให้
MakeChangeส่งกลับข้อความอธิบาย และธุรกรรมจะถูกยกเลิกจนถึง: ถ้ายังไม่สามารถทําการเปลี่ยนแปลงที่แน่นอน ได้ จะ
MakeChangeส่งกลับข้อความที่อธิบายและธุรกรรมจะถูกยกเลิก
ใช้เวลาสักครู่เพื่อตรวจทาน
LogTillStatus()วิธีการ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(); }เม
LogTillStatusธอด ใช้cashTillอาร์เรย์ เพื่อรายงานเนื้อหาปัจจุบันของจนถึงใช้เวลาสักครู่เพื่อตรวจทาน
TillAmountSummary()วิธีการstatic string TillAmountSummary(int[] cashTill) { return $"The till has {cashTill[3] * 20 + cashTill[2] * 10 + cashTill[1] * 5 + cashTill[0]} dollars"; }วิธีการ
TillAmountSummaryใช้cashTillอาร์เรย์ เพื่อคํานวณยอดดุลเงินสดปัจจุบันที่พร้อมใช้งานจนถึง
ที่เสร็จสิ้นการตรวจสอบโครงการรหัสที่มีอยู่ของคุณ
ตรวจสอบว่า MakeChange จัดการเงินได้สําเร็จเมื่อใช้ testData อาร์เรย์
ในงานนี้ คุณจําลองธุรกรรมโดยใช้ testData อาร์เรย์ และตรวจสอบว่า MakeChange มีความสมดุลของเงินได้สําเร็จจนถึง
บนเมนูเรียกใช้รหัส Visual Studio เลือกเริ่มการดีบัก
โปรดสังเกตว่ามีข้อผิดพลาด
IOExceptionเกิดขึ้นDEBUG CONSOLE ไม่สนับสนุน
Console.Clear()หรือConsole.ReadLine()วิธีการ คุณจําเป็นต้องอัปเดตไฟล์ launch.json ก่อนที่จะดีบักบนแถบเครื่องมือแก้จุดบกพร่อง เลือกหยุด
ใช้มุมมอง EXPLORER เพื่อเปิดไฟล์ launch.json
ในไฟล์ launch.json ให้
consoleอัปเดตแอตทริบิวต์ดังนี้:// For more information about the 'console' field, see https://aka.ms/VSCode-CS-LaunchJson-Console "console":"integratedTerminal",ค่าเริ่มต้นสําหรับ
consoleแอตทริบิวต์คือinternalConsoleซึ่งสอดคล้องกับแผง DEBUG CONSOLE น่าเสียดายที่แผงคอนโซล DEBUG ไม่สนับสนุนวิธีการคอนโซลบางอย่าง การตั้งค่าintegratedTerminalจะสอดคล้องกับแผง TERMINAL ซึ่งสนับสนุนอินพุตและเอาต์พุตของคอนโซลบันทึกการเปลี่ยนแปลงของคุณไปยังไฟล์ launch.json
บนเมนูเรียกใช้รหัส Visual Studio เลือกเริ่มการดีบัก
ตรวจสอบเอาต์พุตที่สร้างขึ้นโดยแอปพลิเคชันในแผงเทอร์มินัล
เปลี่ยนจากแผง DEBUG CONSOLE ไปยังแผงเทอร์มินัลเพื่อตรวจสอบเอาต์พุต
โปรดสังเกตว่า มีความ
MakeChangeสมดุลแบบสําเร็จจนถึงขณะใช้testDataอาร์เรย์ เพื่อจําลองธุรกรรมคุณควรเห็นบรรทัดต่อไปนี้แสดงอยู่ที่ด้านล่างของผลลัพธ์ที่รายงาน:
The till has 551 dollars Expected till value: 551 Press the Enter key to exitโปรดสังเกตว่าค่าจนถึงตามที่รายงานและที่คาดไว้คือทั้ง 551
เมื่อต้องการออกจากแอปพลิเคชัน ให้กด Enter
ระบุและแก้ไขปัญหาตรรกะ
ในงานนี้ คุณใช้ธุรกรรมจําลองเพื่อแสดงปัญหาตรรกะโค้ด จากนั้นใช้เครื่องมือตัวแก้ไขจุดบกพร่อง Visual Studio Code เพื่อแยกและแก้ไขปัญหา
เมื่อต้องการรันรหัสโดยใช้ธุรกรรมที่สร้างขึ้นแบบสุ่ม ให้เปลี่ยนค่าที่
useTestDatafalseกําหนดให้กับคุณสามารถค้นหา
useTestDataตัวแปรที่อยู่ใกล้กับด้านบนของคําสั่งระดับบนสุดได้บันทึกไฟล์ Program.cs และจากนั้น เรียกใช้แอปพลิเคชันในโปรแกรมดีบักเกอร์
ตรวจสอบเอาต์พุตในแผงเทอร์มินัล
โปรดสังเกตความขัดแย้งในยอดเงินจนถึงยอดคงเหลือ
ยอดดุลเก็บเงินต้นสุดท้ายที่คํานวณโดย
MakeChangeและยอดดุลที่รักษาไว้ในใบแจ้งยอดระดับสูงสุดจะมีการรายงานที่ด้านล่างของเอาต์พุต เช่น:Transaction successfully completed. The till has 379 dollars Expected till value: 434 Press the Enter key to exitหมายเหตุ
แอพลิเคชันจะสร้างต้นทุนของสินค้าที่ซื้อแบบสุ่ม ดังนั้นค่าลิ้นชักเก็บเงินที่รายงานในเอาต์พุตของคุณจึงแตกต่างกัน
เมื่อต้องการออกจากแอปพลิเคชัน ให้กด Enter
ปิดแผงขั้วต่อ
ดีบักรหัส
ในงานนี้ คุณใช้เครื่องมือตัวแก้ไขจุดบกพร่อง Visual Studio Code เพื่อแยกและแก้ไขปัญหาตรรกะ
ใกล้กับจุดสิ้นสุดของคําสั่งระดับบนสุด ค้นหาบรรทัดโค้ดต่อไปนี้:
Console.WriteLine();ตั้งค่าจุดสั่งหยุดบนบรรทัดรหัสที่เลือก
บนเมนูเรียกใช้รหัส Visual Studio เลือกเริ่มการดีบัก
โปรดสังเกตว่าการดําเนินการโค้ดหยุดชั่วคราวบนจุดสั่งหยุด
บนแถบเครื่องมือตัวควบคุมแก้จุดบกพร่อง ให้เลือกขั้นตอนลงใน
ตรวจสอบเอาต์พุตในแผงเทอร์มินัล
หากค่าจนกว่าที่รายงานและที่คาดไว้เท่ากัน ให้เลือกดําเนินการต่อบนแถบเครื่องมือตัวควบคุมแก้จุดบกพร่อง
ทําซ้ําขั้นตอนก่อนหน้านี้จนกว่าคุณจะเห็นความขัดแย้งระหว่างค่าลิ้นชักระแนงที่รายงานและที่คาดไว้
เมื่อคุณเห็นความขัดแย้ง โปรดใช้เวลาสักครู่ในการตรวจสอบรายละเอียดของธุรกรรม
โปรดสังเกตว่าเงินสดที่ได้รับรายงานและการเปลี่ยนแปลงที่ส่งคืนถูกต้อง แต่เงินจนกว่าจะสั้นห้าดอลลาร์
การขาดแคลนนี้แสดงให้เห็นว่า
cashTillอาร์เรย์กําลังได้รับการอัปเดตอย่างไม่ถูกต้องแม้ว่าการรายงานถูกต้องก็ตามหยุดเซสชันดีบักและปิดแผง TERMINAL
เลื่อนไปที่ด้านล่างของ
MakeChangeวิธีการคําสั่ง
whileที่ใช้ในการ "ทําการเปลี่ยนแปลง" อยู่ที่ส่วนท้ายของMakeChangeวิธีการwhileตรวจสอบบล็อกรหัสใบแจ้งยอดที่ใช้ในการเปลี่ยนแปลงเนื่องจากค่าจนกว่าจะลดลง 5 ดอลลาร์ ปัญหาน่าจะอยู่ใน
whileบล็อกรหัสที่ถูกใช้เพื่อส่งคืนใบเรียกเก็บเงินห้าดอลลาร์โปรดสังเกตโค้ดต่อไปนี้:
while ((changeNeeded > 4) && (cashTill[1] > 0)) { cashTill[2]--; changeNeeded -= 5; Console.WriteLine("\t A five"); }อาร์เรย์
cashTill[]ถูกใช้เพื่อจัดเก็บจํานวนของบิลของแต่ละสกุลเงินที่มีอยู่ในขณะนี้ องค์ประกอบ1อาร์เรย์ใช้เพื่อจัดการตัวเลขห้าดอลลาร์ในลิ้นชักเก็บเงิน นิพจน์ในwhileคําสั่ง อ้างอิงถึงcashTill[1]อย่างถูกต้อง อย่างไรก็ตาม คําสั่งภายในบล็อกรหัสจะลดลงcashTill[2]แทนที่จะcashTill[1]เป็น การระบุค่าดัชนีของ2หมายความว่ามีการลบตั๋วเงิน 10 ดอลลาร์ออกจากช่องทางเก็บเงินดอลลาร์แทนที่จะเป็น 5 ดอลลาร์สหรัฐอัปเดตโค้ด
whileบล็อกดังต่อไปนี้:while ((changeNeeded > 4) && (cashTill[1] > 0)) { cashTill[1]--; changeNeeded -= 5; Console.WriteLine("\t A five"); }บันทึกไฟล์ Program.cs
ตรวจสอบงานของคุณ
ในงานนี้ คุณเรียกใช้แอปพลิเคชันของคุณและตรวจสอบว่ารหัสที่อัปเดตแล้วของคุณทํางานตามที่คุณต้องการหรือไม่
บนเมนูเรียกใช้รหัส Visual Studio เลือกลบจุดสั่งหยุดทั้งหมด
บนเมนูเรียกใช้ เลือกเริ่มการดีบัก
ตรวจสอบเอาต์พุตในแผงเทอร์มินัล
ตรวจสอบว่าค่าลิ้นชักรับของที่รายงานเท่ากับค่าลิ้นชักรับของที่คาดไว้หรือไม่:
ยอดดุลเก็บเงินต้นสุดท้ายที่คํานวณโดย
MakeChangeและยอดดุลที่รักษาไว้ในใบแจ้งยอดระดับสูงสุดจะมีการรายงานที่ด้านล่างของเอาต์พุต เช่น:Transaction successfully completed. The till has 452 dollars Expected till value: 452 Press the Enter key to exitแอพลิเคชันจะสร้างต้นทุนของสินค้าที่ซื้อแบบสุ่ม ดังนั้นค่าลิ้นชักเก็บเงินที่รายงานในเอาต์พุตของคุณจึงแตกต่างกัน ตราบใดที่ค่าทั้งสองเท่ากัน คุณประสบความสําเร็จในการแก้ไขปัญหาตรรกะ