Latihan - Meninjau dan menguji aplikasi konsol C# menggunakan data sampel

Selesai

Dalam latihan ini, Anda meninjau dan menguji kode dalam proyek Starter, mengisolasi dan memperbaiki masalah logika, lalu memverifikasi bahwa aplikasi yang diperbarui berfungsi seperti yang diharapkan.

Anda menyelesaikan tugas-tugas berikut selama latihan ini:

  1. Ulasan kode: tinjau konten file Program.cs.

    Program.cs menyertakan bagian kode berikut:

    • Pernyataan tingkat atas: pernyataan tingkat atas mensimulasikan serangkaian transaksi menggunakan array testData atau jumlah transaksi yang dihasilkan secara acak yang lebih besar.
    • LoadTillEachMorning: LoadTillEachMorning metode ini digunakan untuk mengonfigurasi mesin kasir dengan jumlah lembaran uang yang telah ditentukan sebelumnya dalam setiap denominasi.
    • MakeChange: metode MakeChange ini digunakan untuk mengelola laci kas selama transaksi pembelian.
    • LogTillStatus: metode LogTillStatus ini digunakan untuk menampilkan jumlah lembaran uang dari setiap denominasi yang saat ini ada di laci kas.
    • TillAmountSummary: metode TillAmountSummary digunakan untuk menampilkan pesan yang menunjukkan jumlah uang tunai di laci kas.
  2. Pengujian awal: verifikasi bahwa MakeChange berhasil menyeimbangkan uang sampai saat menggunakan testData array untuk mensimulasikan transaksi.

  3. Penelusuran kesalahan kode: mengisolasi dan memperbaiki masalah logika yang diekspos saat menggunakan data yang dihasilkan secara acak.

  4. Uji verifikasi: lakukan pengujian verifikasi pada kode yang Anda kembangkan dalam latihan ini.

Tinjau isi file Program.cs

Dalam tugas ini, Anda menyelesaikan panduan kode proyek Starter. File Program.cs berisi aplikasi yang mensimulasikan kondisi untuk transaksi harian. Aplikasi memanggil metode MakeChange untuk mengelola kas selama setiap transaksi. Metode lain digunakan untuk menginisialisasi till dan menghasilkan pesan pelaporan.

  1. Pastikan folder GuidedProject terbuka di Visual Studio Code.

  2. Dalam tampilan EXPLORER, perluas folder GuidedProject dan Starter .

    Folder Starter berisi aplikasi sampel untuk modul proyek Terpandu ini.

  3. Buka file Program.cs di Editor Visual Studio Code.

  4. Pada menu Tampilan, pilih Palet Perintah.

  5. Pada prompt perintah, masukkan .net: g lalu pilih .NET: Hasilkan Aset untuk Build dan Debug.

  6. Pada perintah Pilih proyek yang akan diluncurkan, pilih proyek Starter.

    File launch.json yang dibuat akan menyertakan konfigurasi untuk proyek Starter.

  7. Luangkan beberapa menit untuk meninjau pernyataan tingkat atas untuk aplikasi ini:

    /*
    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);
    

    Kode pernyataan tingkat atas menyelesaikan tugas berikut:

    • Mengonfigurasi data aplikasi dan variabel lingkungan yang digunakan untuk menguji MakeChange metode .
    • Memanggil metode LoadTillEachMorning(), LogTillStatus(), dan TillAmountSummary() untuk menyiapkan laci kas dan mencetak pesan status ke konsol.
    • Menggunakan perulangan while untuk mensimulasikan serangkaian transaksi.
    • Memanggil metode MakeChange dari dalam blok kode perulangan while.
    • Melaporkan status uang sampai setelah setiap transaksi.

    Catatan

    Pernyataan tingkat tinggi termasuk pernyataan Console.ReadLine(). File launch.json perlu diperbarui sebelum debugging.

  8. Luangkan waktu sejenak untuk meninjau metodeLoadTillEachMorning().

    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. Luangkan waktu beberapa menit untuk meninjau MakeChange() metode .

    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;
    }
    

    Metode MakeChange mengelola laci kas selama setiap transaksi pembelian. Proses transaksi bergantung pada sumber daya dan kondisi berikut:

    • Transaksi tunai: Metode MakeChange menerima pembayaran tunai dari pelanggan dan kemudian menentukan berapa banyak tagihan dari setiap denominasi yang harus dikembalikan kepada pelanggan dalam perubahan. MakeChange harus terlebih dahulu memastikan bahwa pelanggan telah memberikan cukup uang untuk menutupi transaksi. Jika pembayaran cukup, proses pengembalian dimulai dengan denominasi uang kertas terbesar dan berlanjut ke denominasi terkecil. Pada setiap tahap, MakeChange memastikan bahwa denominasi saat ini kurang dari kembalian yang harus diberikan. MakeChange juga memastikan bahwa uang kertas dengan denominasi yang dibutuhkan tersedia di laci kasir sebelum menambahkannya ke dalam kembalian yang diberikan kepada pelanggan.

    • Parameter input: Metode ini MakeChange menggunakan parameter input berikut:

      • Bilangan bulat yang mewakili biaya item yang dibeli: itemCost
      • Array bilangan bulat yang berisi jumlah lembaran uang di laci kasir untuk setiap denominasi: cashTill
      • Pembayaran yang ditawarkan oleh pelanggan, di mana jumlah tagihan untuk setiap denominasi ditentukan secara terpisah: paymentTwenties, , paymentTens, paymentFivespaymentOnes
    • Uang tunai yang tersedia di laci: Uang kertas yang ditawarkan sebagai pembayaran oleh pelanggan harus disertakan dalam uang kertas setiap denominasi yang tersedia untuk memberikan kembalian.

    • Perubahan berutang kepada pelanggan: Perubahan yang terutang kepada pelanggan dihitung menggunakan jumlah yang dibayarkan oleh pelanggan dikurangi biaya item.

    • Kurang bayar: Jika pelanggan belum memberikan pembayaran yang memadai, MakeChange mengembalikan pesan deskriptif, dan transaksi dibatalkan.

    • Laci kas tidak mencukupi: Jika laci kas tidak dapat memberikan uang kembalian yang tepat, MakeChange menampilkan pesan deskriptif, dan transaksi dibatalkan.

  10. Luangkan waktu sejenak untuk meninjau metodeLogTillStatus().

    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();
    }
    

    Metode LogTillStatus ini menggunakan larik cashTill untuk melaporkan isi till saat ini.

  11. Luangkan waktu sejenak untuk meninjau metodeTillAmountSummary().

    static string TillAmountSummary(int[] cashTill)
    {
        return $"The till has {cashTill[3] * 20 + cashTill[2] * 10 + cashTill[1] * 5 + cashTill[0]} dollars";
    
    }
    

    Metode ini menggunakan array TillAmountSummary untuk menghitung saldo kas cashTill yang tersedia saat ini di dalam kasir.

Itu menyelesaikan tinjauan Anda tentang proyek kode yang ada.

Verifikasi bahwa MakeChange berhasil mengelola uang saat menggunakan testData array

Dalam tugas ini, Anda mensimulasikan transaksi menggunakan array testData dan memverifikasi bahwa MakeChange berhasil menyeimbangkan saldo kas.

  1. Pada menu Visual Studio Code Run, pilih Mulai Debugging.

  2. Perhatikan bahwa kesalahan IOException terjadi.

    KONSOL DEBUG tidak mendukung Console.Clear() atau Console.ReadLine() metode. Anda perlu memperbarui file launch.json sebelum debugging.

  3. Pada toolbar Debug, pilih Hentikan.

  4. Gunakan tampilan EXPLORER untuk membuka file launch.json.

  5. Dalam file launch.json, perbarui console atribut sebagai berikut:

    // For more information about the 'console' field, see https://aka.ms/VSCode-CS-LaunchJson-Console
    "console":"integratedTerminal",
    

    Nilai default untuk console atribut adalah internalConsole, yang selaras dengan panel KONSOL DEBUG. Sayangnya, panel DEBUG CONSOLE tidak mendukung beberapa metode konsol. Pengaturan integratedTerminal selaras dengan panel TERMINAL, yang mendukung input dan output konsol.

  6. Simpan perubahan Anda ke file launch.json.

  7. Pada menu Visual Studio Code Run, pilih Mulai Debugging.

  8. Tinjau output yang dihasilkan oleh aplikasi di panel TERMINAL.

    Beralih dari panel DEBUG CONSOLE ke panel TERMINAL untuk meninjau output.

  9. Perhatikan bahwa MakeChange berhasil menyeimbangkan kas ketika menggunakan array testData dalam mensimulasikan transaksi.

    Anda akan melihat baris berikut yang tercantum di bagian bawah output yang dilaporkan:

    The till has 551 dollars
    Expected till value: 551
    
    
    Press the Enter key to exit
    

    Perhatikan bahwa nilai yang dilaporkan dan diharapkan hingga keduanya adalah 551.

  10. Untuk keluar dari aplikasi, tekan Enter.

Mengidentifikasi dan memperbaiki masalah logika

Dalam tugas ini, Anda menggunakan transaksi simulasi untuk mengekspos masalah logika kode, lalu menggunakan alat debugger Visual Studio Code untuk mengisolasi dan memperbaiki masalah.

  1. Untuk menjalankan kode menggunakan transaksi yang dihasilkan secara acak, ubah nilai yang ditetapkan ke useTestDatafalse.

    Anda dapat menemukan variabel di useTestData dekat bagian atas pernyataan tingkat atas.

  2. Simpan file Program.cs, lalu jalankan aplikasi di debugger.

  3. Tinjau output di panel TERMINAL tersebut.

  4. Perhatikan ketidaksesuaian dalam saldo laci kas.

    Saldo akhir kas yang dihitung oleh MakeChange dan saldo yang ada di laporan tingkat atas dicantumkan di bagian bawah keluaran. Contoh:

    Transaction successfully completed.
    The till has 379 dollars
    Expected till value: 434
    
    
    Press the Enter key to exit
    

    Catatan

    Aplikasi ini secara acak menghasilkan biaya pembelian item. Oleh karena itu, nilai "till" yang dilaporkan dalam output Anda berbeda.

  5. Untuk keluar dari aplikasi, tekan Enter.

  6. Tutup panel TERMINAL.

Mendebug kode

Dalam tugas ini, Anda menggunakan alat debugger Visual Studio Code untuk mengisolasi lalu memperbaiki masalah logika.

  1. Di dekat akhir pernyataan tingkat atas, temukan baris kode berikut:

    Console.WriteLine();
    
  2. Atur titik henti pada baris kode yang dipilih.

  3. Pada menu Visual Studio Code Run, pilih Mulai Debugging.

  4. Perhatikan bahwa eksekusi kode berhenti di titik henti.

  5. Pada toolbar Debug controls, pilih Masuk.

  6. Tinjau output di panel TERMINAL tersebut.

  7. Jika nilai yang dilaporkan dan diharapkan sama, pilih Lanjutkan pada toolbar kontrol debug.

  8. Ulangi langkah sebelumnya sampai Anda melihat ada perbedaan antara nilai yang dilaporkan dan nilai yang diharapkan.

  9. Setelah Anda melihat perbedaan, luangkan waktu satu menit untuk memeriksa detail transaksi.

  10. Perhatikan bahwa uang tunai yang dilaporkan diterima dan uang kembalian sudah benar, tetapi kasir kurang lima dolar.

    Kekurangan ini menunjukkan bahwa pembaruan array cashTill dilakukan secara tidak benar, meskipun pelaporannya sudah benar.

  11. Hentikan sesi debug dan tutup panel TERMINAL.

  12. Gulir ke bagian terbawah dari MakeChange metode.

    Pernyataan while yang digunakan untuk "membuat perubahan" terletak di akhir MakeChange metode.

  13. while Tinjau blok kode pernyataan yang digunakan untuk membuat perubahan.

    Karena laci kas kekurangan lima dolar, masalah kemungkinan berada di blok kode while yang digunakan untuk mengembalikan uang kertas lima dolar.

  14. Perhatikan kode berikut:

    while ((changeNeeded > 4) && (cashTill[1] > 0))
    {
        cashTill[2]--;
        changeNeeded -= 5;
        Console.WriteLine("\t A five");
    }    
    

    Array cashTill[] digunakan untuk menyimpan jumlah tagihan dari setiap denominasi yang saat ini tersedia. Elemen array 1 digunakan untuk mengelola jumlah lembaran lima dolar di laci kasir. Ekspresi dalam while pernyataan mengacu pada cashTill[1] dengan benar. Namun, pernyataan di dalam blok kode mengurangi cashTill[2] alih-alih cashTill[1]. Menentukan nilai indeks 2 berarti bahwa uang kertas sepuluh dolar diambil dari laci kas alih-alih uang kertas lima dolar.

  15. while Perbarui blok kode sebagai berikut:

    while ((changeNeeded > 4) && (cashTill[1] > 0))
    {
        cashTill[1]--;
        changeNeeded -= 5;
        Console.WriteLine("\t A five");
    }    
    
  16. Simpan Program.cs sebagai file.

Periksa pekerjaan Anda

Dalam tugas ini, Anda menjalankan aplikasi dan memverifikasi bahwa kode yang diperbarui berfungsi seperti yang dimaksudkan.

  1. Pada menu Visual Studio Code Run , pilih Hapus Semua Titik Henti.

  2. Pada menu Jalankan, pilih Mulai Debug.

  3. Tinjau output di panel TERMINAL tersebut.

  4. Verifikasi bahwa nilai kas yang dilaporkan sama dengan nilai kas yang diharapkan.

    Saldo akhir kas yang dihitung oleh MakeChange dan saldo yang ada di laporan tingkat atas dicantumkan di bagian bawah keluaran. Contoh:

    Transaction successfully completed.
    The till has 452 dollars
    Expected till value: 452
    
    
    Press the Enter key to exit
    

    Aplikasi ini secara acak menghasilkan biaya pembelian item. Oleh karena itu, nilai "till" yang dilaporkan dalam output Anda berbeda. Selama dua nilai sama, Anda telah berhasil memperbaiki masalah logika.