תרגיל - סקירה ובדיקה של אפליקציית קונסולת 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 Code.
בתצוגת EXPLORER, הרחב את התיקיות GuidedProjectו- Starter .
התיקיה Starter מכילה את היישום לדוגמה עבור מודול פרוייקט מונחה זה.
פתח את Program.cs בעורך הקוד של Visual Studio.
בתפריט תצוגה, בחר לוח פקודה.
בשורת הפקודה, הזן .net: g ולאחר מכן בחר .NET: צור נכסים עבור גירסת Build ו-איתור באגים.
בהנחיה בחר את הפרוייקט להפעלה , בחר את הפרוייקט 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,paymentTens,paymentFives, ,paymentOnes
- מספר שלם המייצג את העלות של הפריט שנרכש:
מזומנים זמינים עד: יש לכלול את החשבונות המוצעים כתשלום על-ידי הלקוח בשטרות של כל ערך הזמין לביצוע שינויים.
שינוי חייב ללקוח: השינוי המנורש ללקוח מחושב באמצעות הסכום ששולם על-ידי הלקוח פחות עלות הפריט.
תשלום תחתון: אם הלקוח לא סיפק מספיק תשלום,
MakeChangeמחזיר הודעה תיאורית והטרנזקציה מבוטלת.אין די עד: אם ל- till אין אפשרות לבצע שינוי מדויק,
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שגיאה.מסוף איתור הבאגים אינו תומך בפעולות
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. למרבה הצער, החלונית 'מסוף איתור באגים' אינה תומכת בשיטות מסוימות של המסוף. ההגדרהintegratedTerminalמיושרת לחלונית TERMINAL, התומכת בקלט ובפלט של הקונסולה.שמור את השינויים שביצעת בקובץ launch.json הקובץ.
בתפריט הפעלת קוד של Visual Studio , בחר התחלאיתור באגים.
סקור את הפלט שנוצר על-ידי היישום בלוח TERMINAL.
עבור מהלוח 'מסוף איתור באגים' לחלונית TERMINAL כדי לסקור את הפלט.
שים לב
MakeChangeכי מאזן בהצלחה את ה- till בעת שימוש במערךtestDataכדי לדמות עסקאות.אתה אמור לראות את השורות הבאות בחלק התחתון של הפלט שדווח:
The till has 551 dollars Expected till value: 551 Press the Enter key to exitשים לב כי ערכי ה- till שדווחו והצפוי הם שניהם 551.
כדי לצאת מהאפליקציה, הקש Enter.
זיהוי ופתרון של בעיות לוגיקה
במשימה זו, עליך להשתמש בטרנזקציות מדומה כדי לחשוף בעיה בלוגיקה של קוד ולאחר מכן להשתמש בכלי מאתר הבאגים של קוד Visual Studio כדי לבודד ולפתור את הבעיה.
כדי להפעיל את הקוד באמצעות טרנזקציות שנוצרו באופן אקראי, שנה את הערך שהוקצה ל-
useTestDatafalse.באפשרותך למצוא את המשתנה
useTestDataבסמוך לחלק העליון של המשפטים ברמה העליונה.שמור את Program.cs הקובץ ולאחר מכן הפעל את היישום במאתר הבאגים.
סקור את הפלט בלוח המסוף.
שים לב לפער בין היתרה.
יתרת החוב הסופית המחושבת
MakeChangeעל-ידי והיתרה המנוהרת במשפטים ברמה העליונה מדווחת בחלק התחתון של הפלט. לדוגמה:Transaction successfully completed. The till has 379 dollars Expected till value: 434 Press the Enter key to exitהערה
היישום יוצר באופן אקראי את העלות של פריטי רכישה. לכן, ערכי ה- till שדווחו בפלט שלך הם שונים.
כדי לצאת מהאפליקציה, הקש Enter.
סגור את לוח המסוף.
איתור באגים בקוד
במשימה זו, עליך להשתמש בכלי מאתר הבאגים של קוד Visual Studio כדי לבודד ולאחר מכן לפתור את הבעיה הלוגית.
סמוך לסוף המשפטים ברמה העליונה, אתר את שורת הקוד הבאה:
Console.WriteLine();הגדר נקודת עצירה בשורת הקוד שנבחרה.
בתפריט הפעלת קוד של Visual Studio , בחר התחלאיתור באגים.
שים לב שביצוע קוד מושהה בנקודות עצירה.
בסרגל הכלים של פקדי איתור באגים , בחר צעד לתוך.
סקור את הפלט בלוח המסוף.
אם ערכי עד שדווחו והצפויים שווים, בחר המשך בסרגל הכלים של פקדי איתור באגים .
חזור על השלב הקודם עד שתראה אי-התאמה בין ערכי עד שדווחו וצפויים.
לאחר שתראה אי-התאמה, קח דקה כדי לבחון את פרטי העסקה.
שים לב שהמזומנים המדווחים שהתקבלו והשינוי המוחזרים נכונים, אך קופה קצרה בחמישה דולר.
חסרונות אלה מצביעים על
cashTillכך שמערך זה מתעדכן באופן שגוי, למרות שהדיווח נכון.הפסק את הפעלת איתור הבאגים וסגור את לוח המסוף.
גלול לחלק התחתון של השיטה
MakeChange.המשפטים
whileהמשמשים ל"ביצוע שינוי" ממוקמים בסוףMakeChangeפעולת השירות.סקור את
whileבלוקי קוד המשפט המשמשים כדי לבצע שינויים.מאחר שהתשואה מבוטלת בחמישה דולר,
whileייתכן שהבעיה נמצאת בבלוק הקוד שמשמש להחזרת 5 דולר.שים לב לקוד הבא:
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 דולר מחשבון ה-עד במקום מחשבון של חמישה דולר.עדכן את
whileבלוק הקוד באופן הבא:while ((changeNeeded > 4) && (cashTill[1] > 0)) { cashTill[1]--; changeNeeded -= 5; Console.WriteLine("\t A five"); }שמור את Program.cs הקובץ.
בדוק את העבודה שלך
במשימה זו, אתה מפעיל את היישום שלך ואמת שהקוד המעודכן פועל כצפוי.
בתפריט הפעלת קוד של Visual Studio, בחר הסר את כל נקודות החלוקה.
בתפריט הפעלה , בחר התחל איתור באגים.
סקור את הפלט בלוח המסוף.
ודא שערך ה- till שדווח שווה לערך ה- till הצפוי:
יתרת החוב הסופית המחושבת
MakeChangeעל-ידי והיתרה המנוהרת במשפטים ברמה העליונה מדווחת בחלק התחתון של הפלט. לדוגמה:Transaction successfully completed. The till has 452 dollars Expected till value: 452 Press the Enter key to exitהיישום יוצר באופן אקראי את העלות של פריטי רכישה. לכן, ערכי ה- till שדווחו בפלט שלך הם שונים. כל עוד שני הערכים שווים, הצלחת לפתור את הבעיה הלוגית.