Alıştırma - Örnek verileri kullanarak C# konsol uygulamasını gözden geçirme ve test etme

Tamamlandı

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:

  1. 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 testData kullanarak bir dizi işlemin benzetimini gerçekleştirir.
    • LoadTillEachMorning: LoadTillEachMorning yö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: MakeChange yöntemi, satın alma işlemleri sırasında nakiti yönetmek için kullanılır.
    • LogTillStatus: LogTillStatus yöntemi, şu anda till içinde bulunan her bir metemin fatura sayısını görüntülemek için kullanılır.
    • TillAmountSummary: TillAmountSummary yöntemi kullanılır, kasadaki nakit miktarını gösteren bir ileti görüntüler.
  2. İlk test: İşlem simülasyonu yapmak için diziyi kullanana MakeChange kadar parayı başarıyla dengelediğini testData doğrulayın.

  3. Kod hata ayıklama: Rastgele oluşturulan veriler kullanılırken ortaya çıkan bir mantık sorununu yalıtıp düzeltin.

  4. 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.

  1. GuidedProject klasörünün Visual Studio Code'da açık olduğundan emin olun.

  2. 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.

  3. Visual Studio Code Düzenleyicisi'nde Program.cs dosyasını açın.

  4. Görünüm menüsünde Komut Paleti'ni seçin.

  5. Komut istemine .net: g yazın ve .NET: Derleme ve Hata Ayıklama için Varlık Oluştur'u seçin.

  6. 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.

  7. 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 ve LogTillStatus() durum iletilerini konsola yazdırmak için , TillAmountSummary()ve yöntemlerini çağırır.
    • Bir while dizi işlemin benzetimini yapmak için bir döngü kullanır.
    • MakeChange yöntemini döngünün kod bloğunun while içinden çağırır.
    • Her işlemden sonraya kadar paranın durumunu bildirir.

    Not

    Üst düzey deyimler bir Console.ReadLine() deyimi içerir. Hata launch.json ayıklamadan önce dosyanın güncelleştirilmiş olması gerekir.

  8. 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];
    }
    
  9. 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, MakeChange her satın alma işlemine kadar parayı yönetir. İşlem işlemi aşağıdaki kaynaklara ve koşullara dayanır:

    • Nakit işlemi: MakeChange Yö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, MakeChange geçerli payın borçlu olunan değişiklikten daha az olmasını sağlar. MakeChange ayrı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: MakeChange yö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
    • Ö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, MakeChange açıklayıcı bir ileti döndürür ve işlem iptal edilir.

    • Süre yetersiz: Till tam değişiklik yapamıyorsa, MakeChange açıklayıcı bir ileti döndürür ve işlem iptal edilir.

  10. 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, LogTillStatus till öğesinin cashTill geçerli içeriğini raporlamak için dizisini kullanır.

  11. 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, TillAmountSummary till içinde cashTill kullanı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.

  1. Visual Studio Code Çalıştır menüsünde Hata Ayıklamayı Başlat'ı seçin.

  2. Bir IOException hata 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.

  3. Hata ayıklama araç çubuğunda Durdur'u seçin.

  4. launch.json dosyasını açmak için EXPLORER görünümünü kullanın.

  5. 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 console varsayılan değer, HATA AYıKLAMA KONSOLU paneline hizalanan değeridir internalConsole. Ne yazık ki HATA AYıKLAMA KONSOLU paneli bazı konsol yöntemlerini desteklemez. Ayar integratedTerminal , konsol girişini ve çıkışını destekleyen TERMINAL paneline hizalanır.

  6. Değişikliklerinizi launch.json dosyasına kaydedin.

  7. Visual Studio Code Çalıştır menüsünde Hata Ayıklamayı Başlat'ı seçin.

  8. 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.

  9. MakeChange İşlemlerin benzetimini yapmak için dizi kullanılırken till değerinin testData baş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 exit
    

    Bildirilen ve beklenen till değerlerinin her ikisi de 551 olduğuna dikkat edin.

  10. 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.

  1. 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.

  2. Program.cs dosyasını kaydedin ve ardından uygulamayı hata ayıklayıcıda çalıştırın.

  3. TERMINAL panelinde çıkışı gözden geçirin.

  4. Till bakiyesindeki tutarsızlığı dikkate alır.

    Tarafından hesaplanan MakeChange son 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 exit
    

    Not

    Uygulama, satın alma öğelerinin maliyetini rastgele oluşturur. Bu nedenle, çıkışınızda bildirilen till değerleri farklıdır.

  5. Uygulamadan çıkmak için Enter tuşuna basın.

  6. 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.

  1. Üst düzey deyimlerin sonuna yakın bir şekilde aşağıdaki kod satırını bulun:

    Console.WriteLine();
    
  2. Seçili kod satırında bir kesme noktası ayarlayın.

  3. Visual Studio Code Çalıştır menüsünde Hata Ayıklamayı Başlat'ı seçin.

  4. Kod yürütmenin kesme noktasında duraklatıldığını görebilirsiniz.

  5. Hata ayıklama denetimleri araç çubuğunda Adımla'yı seçin.

  6. TERMINAL panelinde çıkışı gözden geçirin.

  7. Bildirilen ve beklenene kadar değerleri eşitse, Hata ayıklama denetimleri araç çubuğunda Devam'ı seçin.

  8. Bildirilen ve beklenen bitiş değerleri arasında bir tutarsızlık görene kadar önceki adımı yineleyin.

  9. Bir tutarsızlık gördüğünüzde işlemin ayrıntılarını incelemek için bir dakikanızı alır.

  10. 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 .

  11. Hata ayıklama oturumunu durdurun ve TERMINAL panelini kapatın.

  12. Yönteminin en altına MakeChange kaydırın.

    while"Değişiklik yapmak" için kullanılan deyimleri yöntemin MakeChange sonunda bulunur.

  13. while Değ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 while olması muhtemeldir.

  14. 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 öğesi 1 , till içindeki beş dolarlık fatura sayısını yönetmek için kullanılır. deyimindeki while ifade doğru ifadeye başvurur cashTill[1] . Ancak, kod içindeki deyimi yerine azaltmaları cashTill[2]cashTill[1]engeller. dizin değerinin 2 belirtilmesi, beş dolarlık bir fatura yerine on dolarlık bir faturanın till değerinden kaldırıldığı anlamına gelir.

  15. Kod bloğunu while aşağıdaki gibi güncelleştirin:

    while ((changeNeeded > 4) && (cashTill[1] > 0))
    {
        cashTill[1]--;
        changeNeeded -= 5;
        Console.WriteLine("\t A five");
    }    
    
  16. 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.

  1. Visual Studio Code Çalıştır menüsünde Tüm Kesme Noktalarını Kaldır'ı seçin.

  2. Çalıştır menüsünde Hata Ayıklamayı Başlat'ı seçin.

  3. TERMINAL panelinde çıkışı gözden geçirin.

  4. Bildirilen till değerinin beklenen till değerine eşit olduğunu doğrulayın:

    Tarafından hesaplanan MakeChange son 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 exit
    

    Uygulama, 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.