Alıştırma - Örnek verileri kullanarak C# konsol uygulamasını gözden geçirme ve test etme
Bu alıştırmada Starter projesindeki kodu gözden geçirip test edin, bir mantık sorununu yalıtıp düzeltin ve güncelleştirilmiş uygulamanızın beklendiği gibi çalıştığını doğrulayın.
Bu alıştırma sırasında aşağıdaki görevleri tamamlarsınız:
Kod incelemesi: Program.cs dosyasının içeriğini gözden geçirin.
Program.cs aşağıdaki kod bölümlerini içerir:
- Üst düzey deyimler: En üst düzey deyimler, rastgele oluşturulan veya daha fazla sayıda işlemin dizisini
testDatakullanarak bir dizi işlemin benzetimini gerçekleştirir. - LoadTillEachMorning:
LoadTillEachMorningyöntemi, kasayı her bir payda önceden tanımlanmış sayıda faturayla yapılandırılana kadar yapılandırmak için kullanılır. - MakeChange:
MakeChangeyöntemi, satın alma işlemleri sırasında nakiti yönetmek için kullanılır. - LogTillStatus:
LogTillStatusyöntemi, şu anda till içinde bulunan her bir metemin fatura sayısını görüntülemek için kullanılır. - TillAmountSummary:
TillAmountSummaryyöntemi kullanılır, kasadaki nakit miktarını gösteren bir ileti görüntüler.
- Üst düzey deyimler: En üst düzey deyimler, rastgele oluşturulan veya daha fazla sayıda işlemin dizisini
İlk test: İşlem simülasyonu yapmak için diziyi kullanana
MakeChangekadar parayı başarıyla dengelediğinitestDatadoğrulayın.Kod hata ayıklama: Rastgele oluşturulan veriler kullanılırken ortaya çıkan bir mantık sorununu yalıtıp düzeltin.
Doğrulama testi: Bu alıştırmada geliştirdiğiniz kod üzerinde bir doğrulama testi gerçekleştirin.
Program.cs dosyasının içeriğini gözden geçirme
Bu görevde, Starter proje kodunun kılavuzunu tamamlaacaksınız. Program.cs dosyası, günlük işlemler için koşulların benzetimini gerçekleştiren bir uygulama içerir. Uygulama, her işlem sırasında kadar parayı yönetmek için yöntemini çağırır MakeChange . Diğer yöntemler till başlatmak ve raporlama iletileri oluşturmak için kullanılır.
GuidedProject klasörünün Visual Studio Code'da açık olduğundan emin olun.
EXPLORER görünümünde GuidedProject ve Starter klasörlerini genişletin.
Starter klasörü bu Destekli proje modülü için örnek uygulamayı içerir.
Visual Studio Code Düzenleyicisi'nde Program.cs dosyasını açın.
Görünüm menüsünde Komut Paleti'ni seçin.
Komut istemine .net: g yazın ve .NET: Derleme ve Hata Ayıklama için Varlık Oluştur'u seçin.
Başlatacak projeyi seçin isteminde Başlangıç projesini seçin.
Oluşturulan launch.json dosyası Starter projesi için bir yapılandırma içerir.
Bu uygulamanın en üst düzey deyimlerini gözden geçirmek için birkaç dakika bekleyin:
/* 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);Üst düzey deyim kodu aşağıdaki görevleri tamamlar:
- Yöntemini test etmek için kullanılan uygulama verilerini ve ortam değişkenlerini yapılandırıyor
MakeChange. -
LoadTillEachMorning()Parayı hazırlamak veLogTillStatus()durum iletilerini konsola yazdırmak için ,TillAmountSummary()ve yöntemlerini çağırır. - Bir
whiledizi işlemin benzetimini yapmak için bir döngü kullanır. -
MakeChangeyöntemini döngünün kod bloğununwhileiçinden çağırır. - Her işlemden sonraya kadar paranın durumunu bildirir.
Not
Üst düzey deyimler bir
Console.ReadLine()deyimi içerir. Hatalaunch.jsonayıklamadan önce dosyanın güncelleştirilmiş olması gerekir.- Yöntemini test etmek için kullanılan uygulama verilerini ve ortam değişkenlerini yapılandırıyor
Yöntemini gözden geçirmek
LoadTillEachMorning()için biraz bekleyin.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]; }Yöntemi gözden geçirmek
MakeChange()için birkaç dakika sürebilir.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; }yöntemi,
MakeChangeher satın alma işlemine kadar parayı yönetir. İşlem işlemi aşağıdaki kaynaklara ve koşullara dayanır:Nakit işlemi:
MakeChangeYöntem, müşteriden bir nakit ödeme kabul eder ve ardından her bir meteliğe ait kaç faturanın değişiklikte müşteriye iade edilmesi gerektiğini belirler.MakeChangeönce müşterinin işlemi karşılamak için yeterli para sağladığından emin olmalıdır. Ödeme yeterliyse, "değişiklik yapma" işlemi en büyük fatura payıyla başlar ve en küçük payda çalışır. Her aşamada,MakeChangegeçerli payın borçlu olunan değişiklikten daha az olmasını sağlar.MakeChangeayrıca, müşteriye döndürülen değişikliğe eklemeden önce, gerekli payın faturasını till içinde kullanılabilir olmasını sağlar.Giriş parametreleri:
MakeChangeyöntemi aşağıdaki giriş parametrelerini kullanır:- Satın alınan öğenin maliyetini temsil eden tamsayı:
itemCost - Her bir payda için till içindeki fatura sayısını içeren bir tamsayı dizisi:
cashTill - Müşteri tarafından sunulan ve her bir payda için fatura sayısının ayrı olarak belirtildiği ödeme:
paymentTwenties, ,paymentTens,paymentFives,paymentOnes
- Satın alınan öğenin maliyetini temsil eden tamsayı:
Ödemeye kadar nakit: Müşteri tarafından ödeme olarak sunulan faturalar, değişiklik yapmak için mevcut olan her bir paydanın faturalarında yer almalıdır.
Müşteriye borçlu olan değişiklik: Müşteriye borçlu olunan değişiklik, müşterinin ödediği tutardan öğenin maliyeti çıkarılarak hesaplanır.
Eksik ödeme: Müşteri yeterli ödeme sağlamadıysa,
MakeChangeaçıklayıcı bir ileti döndürür ve işlem iptal edilir.Süre yetersiz: Till tam değişiklik yapamıyorsa,
MakeChangeaçıklayıcı bir ileti döndürür ve işlem iptal edilir.
Yöntemini gözden geçirmek
LogTillStatus()için biraz bekleyin.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(); }yöntemi,
LogTillStatustill öğesinincashTillgeçerli içeriğini raporlamak için dizisini kullanır.Yöntemini gözden geçirmek
TillAmountSummary()için biraz bekleyin.static string TillAmountSummary(int[] cashTill) { return $"The till has {cashTill[3] * 20 + cashTill[2] * 10 + cashTill[1] * 5 + cashTill[0]} dollars"; }yöntemi,
TillAmountSummarytill içindecashTillkullanılabilen geçerli nakit bakiyesini hesaplamak için dizisini kullanır.
Bu, mevcut kod projesini gözden geçirmenizi tamamlar.
MakeChange Diziyi kullanırken parayı başarıyla yönettiğini testData doğrulayın
Bu görevde, dizisini kullanarak işlemlerin benzetimini testData yapıp parayı tasdik edene kadar başarılı bir şekilde dengelendiğini MakeChange doğrularsınız.
Visual Studio Code Çalıştır menüsünde Hata Ayıklamayı Başlat'ı seçin.
Bir
IOExceptionhata oluştuğuna dikkat edin.HATA AYıKLAMA KONSOLU veya
Console.Clear()yöntemlerini desteklemezConsole.ReadLine(). Hata ayıklamadan önce launch.json dosyasını güncelleştirmeniz gerekir.Hata ayıklama araç çubuğunda Durdur'u seçin.
launch.json dosyasını açmak için EXPLORER görünümünü kullanın.
launch.json dosyasında özniteliğini aşağıdaki gibi güncelleştirin
console:// For more information about the 'console' field, see https://aka.ms/VSCode-CS-LaunchJson-Console "console":"integratedTerminal",özniteliği için
consolevarsayılan değer, HATA AYıKLAMA KONSOLU paneline hizalanan değeridirinternalConsole. Ne yazık ki HATA AYıKLAMA KONSOLU paneli bazı konsol yöntemlerini desteklemez. AyarintegratedTerminal, konsol girişini ve çıkışını destekleyen TERMINAL paneline hizalanır.Değişikliklerinizi launch.json dosyasına kaydedin.
Visual Studio Code Çalıştır menüsünde Hata Ayıklamayı Başlat'ı seçin.
TERMINAL panelinde uygulama tarafından oluşturulan çıkışı gözden geçirin.
Çıkışı gözden geçirmek için HATA AYıKLAMA KONSOLU panelinden TERMINAL paneline geçin.
MakeChangeİşlemlerin benzetimini yapmak için dizi kullanılırken till değerinintestDatabaşarıyla dengelendiğini fark edin.Bildirilen çıkışın altında aşağıdaki satırların listelendiğini görmeniz gerekir:
The till has 551 dollars Expected till value: 551 Press the Enter key to exitBildirilen ve beklenen till değerlerinin her ikisi de 551 olduğuna dikkat edin.
Uygulamadan çıkmak için Enter tuşuna basın.
Mantık sorunlarını tanımlama ve düzeltme
Bu görevde, bir kod mantığı sorununu ortaya çıkarmak için sanal işlemler kullanırsınız ve ardından sorunu yalıtmak ve düzeltmek için Visual Studio Code hata ayıklayıcı araçlarını kullanırsınız.
Kodu rastgele oluşturulan işlemleri kullanarak çalıştırmak için olarak atanan
useTestDatafalsedeğeri değiştirin.Değişkeni en
useTestDataüst düzey deyimlerin en üstünde bulabilirsiniz.Program.cs dosyasını kaydedin ve ardından uygulamayı hata ayıklayıcıda çalıştırın.
TERMINAL panelinde çıkışı gözden geçirin.
Till bakiyesindeki tutarsızlığı dikkate alır.
Tarafından hesaplanan
MakeChangeson kasa bakiyesi ve en üst düzey deyimlerde tutulan bakiye çıkışın en altında bildirilir. Örneğin:Transaction successfully completed. The till has 379 dollars Expected till value: 434 Press the Enter key to exitNot
Uygulama, satın alma öğelerinin maliyetini rastgele oluşturur. Bu nedenle, çıkışınızda bildirilen till değerleri farklıdır.
Uygulamadan çıkmak için Enter tuşuna basın.
TERMINAL panelini kapatın.
Kodda hata ayıklama
Bu görevde Visual Studio Code hata ayıklayıcı araçlarını kullanarak mantıksal sorunu yalıtıp düzelteceksiniz.
Üst düzey deyimlerin sonuna yakın bir şekilde aşağıdaki kod satırını bulun:
Console.WriteLine();Seçili kod satırında bir kesme noktası ayarlayın.
Visual Studio Code Çalıştır menüsünde Hata Ayıklamayı Başlat'ı seçin.
Kod yürütmenin kesme noktasında duraklatıldığını görebilirsiniz.
Hata ayıklama denetimleri araç çubuğunda Adımla'yı seçin.
TERMINAL panelinde çıkışı gözden geçirin.
Bildirilen ve beklenene kadar değerleri eşitse, Hata ayıklama denetimleri araç çubuğunda Devam'ı seçin.
Bildirilen ve beklenen bitiş değerleri arasında bir tutarsızlık görene kadar önceki adımı yineleyin.
Bir tutarsızlık gördüğünüzde işlemin ayrıntılarını incelemek için bir dakikanızı alır.
Alınan bildirilen nakit ve iade edilen değişikliğin doğru olduğuna, ancak kasanın beş dolar kısa olduğuna dikkat edin.
Bu yetersizlik, raporlama doğru olsa bile dizinin yanlış güncelleştirildiğini gösterir
cashTill.Hata ayıklama oturumunu durdurun ve TERMINAL panelini kapatın.
Yönteminin en altına
MakeChangekaydırın.while"Değişiklik yapmak" için kullanılan deyimleri yönteminMakeChangesonunda bulunur.whileDeğişiklik yapmak için kullanılan deyim kodu bloklarını gözden geçirin.Till beş dolar kapalı olduğundan, sorunun beş dolarlık faturaları iade etmek için kullanılan kod bloğunda
whileolması muhtemeldir.Aşağıdaki koda dikkat edin:
while ((changeNeeded > 4) && (cashTill[1] > 0)) { cashTill[2]--; changeNeeded -= 5; Console.WriteLine("\t A five"); }Dizi
cashTill[], şu anda kullanılabilir olan her bir paydanın fatura sayısını depolamak için kullanılır. Dizi öğesi1, till içindeki beş dolarlık fatura sayısını yönetmek için kullanılır. deyimindekiwhileifade doğru ifadeye başvururcashTill[1]. Ancak, kod içindeki deyimi yerine azaltmalarıcashTill[2]cashTill[1]engeller. dizin değerinin2belirtilmesi, beş dolarlık bir fatura yerine on dolarlık bir faturanın till değerinden kaldırıldığı anlamına gelir.Kod bloğunu
whileaşağıdaki gibi güncelleştirin:while ((changeNeeded > 4) && (cashTill[1] > 0)) { cashTill[1]--; changeNeeded -= 5; Console.WriteLine("\t A five"); }Program.cs dosyasını kaydedin.
Çalışmanızı denetleyin
Bu görevde uygulamanızı çalıştırır ve güncelleştirilmiş kodunuzun amaçlandığı gibi çalıştığını doğrularsınız.
Visual Studio Code Çalıştır menüsünde Tüm Kesme Noktalarını Kaldır'ı seçin.
Çalıştır menüsünde Hata Ayıklamayı Başlat'ı seçin.
TERMINAL panelinde çıkışı gözden geçirin.
Bildirilen till değerinin beklenen till değerine eşit olduğunu doğrulayın:
Tarafından hesaplanan
MakeChangeson kasa bakiyesi ve en üst düzey deyimlerde tutulan bakiye çıkışın en altında bildirilir. Örneğin:Transaction successfully completed. The till has 452 dollars Expected till value: 452 Press the Enter key to exitUygulama, satın alma öğelerinin maliyetini rastgele oluşturur. Bu nedenle, çıkışınızda bildirilen till değerleri farklıdır. İki değer eşit olduğu sürece mantıksal sorunu çözmeyi başardınız.