Nền tảng Kiến thức - Hành trang tới Tương lai
Card image

Chương 5-Bài 8. Tạo chương trình ATM đơn giản với các phương án rút tiền theo các mệnh giá

Tác giả: Dương Nguyễn Phú Cường #477
Ngày đăng: Hồi xưa đó
Lượt xem: 816

Mô tả bài toán

Tạo ứng dụng Console, mô phỏng việc thực hiện giao dịch của một máy ATM, với các tính năng:
  • Kiểm tra tài khoản (Balance checking)
  • Rút tiền mặt (Cash withdrawal), với các ràng buộc:
    • Số tiền cần rút phải là bội số của 10.000đ
    • Số tiền còn tối thiểu trong tài khoản phải > 50.000đ
    • Khi rút tiền, cần in tất cả các phương án có thể thối tiền cho người dùng. Với các mệnh giá tiền có thể thối:
      • 500.000đ
      • 200.000đ
      • 100.000đ
      • 50.000đ
      • 20.000đ
      • 10.000đ
  • Gởi tiền mặt (Cash deposition)
Chương trình cần hiển thị dạng Menu để người dùng lựa chọn tính năng theo nhu cầu của người dùng.

Cách giải quyết

  • Cần khởi tạo biến amount để lữu trữ số tiền hiện đang có trong tài khoản của người dùng.
  • Để tạo Menu dạng Console, chúng ta cần tạo danh sách các chức năng tương ứng với hành động của người dùng nhập vào. Thông thường, chúng ta sẽ lặp lại Menu liên tục, cho đến khi người dùng không sử dụng chương trình nữa:
    • Nếu chọn 1: sẽ đi đến chức năng "Kiểm tra tài khoản".
      • In ra màn hình giá trị của biến amount đang có.
    • Nếu chọn 2: sẽ đi đến chức năng "Rút tiền".
      • Cho người dùng nhập số tiền cần rút, lưu giá trị vào biến withdraw
      • Các điều kiện ràng buộc:
        • Số tiền cần rút phải là bội số của 10.000đ.
        • Số tiền còn tối thiểu trong tài khoản phải > 50.000đ.
        • Nếu thỏa các điều kiện:
          • Cho phương trình rút tiền 500000*x1 + 200000*x2 + 100000*x3 + 50000*x4 + 20000*x5 + 10000*x6 = withdraw. Tìm x1, x2, x3, x4, x5, x6.
          • Lấy amount - withdraw. Hiển thị ra màn hình.
    • Nếu chọn 3: sẽ đi đến chức năng "Gởi tiền".
      • Cho người dùng nhập số tiền cần gởi lưu giá trị vào biến deposit
      • Lấy amount = amount + deposit
    • Nếu chọn 4: sẽ thoát vòng lặp, kết thúc chương trình.

Source code

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Console_ATM_VietNam
{
    class Program
    {
        static void Main(string[] args)
        {
            int amount = 15000000, deposit, withdraw;
            int choice, pin = 0;
            bool continueAsk = true;
            Console.Write("Enter Your Pin Number: ");
            pin = int.Parse(Console.ReadLine());
            if(pin != 1234)
            {
                Console.WriteLine("Sorry, dont correct PIN number. Please try again!");
                Console.Read();
                return;
            }
            while (continueAsk)
            {
                Console.WriteLine("********Welcome to ATM Service**************");
                Console.WriteLine("1. Check Balance");
                Console.WriteLine("2. Withdraw Cash");
                Console.WriteLine("3. Deposit Cash");
                Console.WriteLine("4. Quit");
                Console.WriteLine("*********************************************");
                Console.Write("Enter your choice: ");
                choice = int.Parse(Console.ReadLine());
                switch (choice)
                {
                    case 1:
                        Console.WriteLine(" YOUR BALANCE IN Rs : {0} ", amount);
                        break;
                    case 2:
                        Console.WriteLine(" ENTER THE AMOUNT TO WITHDRAW: ");
                        withdraw = int.Parse(Console.ReadLine());
                        if (withdraw % 10000 != 0)
                        {
                            Console.WriteLine(" PLEASE ENTER THE AMOUNT IN MULTIPLES OF 100");
                        }
                        else if (withdraw > (amount - 50000)) // Số tiền tối thiểu còn trong tài khoản (sau khi rút tiền) phải > 50000
                        {
                            Console.WriteLine(" INSUFFICENT BALANCE");
                        }
                        else
                        {
                            CacPhuongAnRutTien(withdraw);
                            amount = amount - withdraw;
                            Console.WriteLine(" PLEASE COLLECT CASH");
                            Console.WriteLine(" YOUR CURRENT BALANCE IS {0}", amount);
                        }
                        break;
                    case 3:
                        Console.WriteLine(" ENTER THE AMOUNT TO DEPOSIT");
                        deposit = int.Parse(Console.ReadLine());
                        amount = amount + deposit;
                        Console.WriteLine("YOUR BALANCE IS {0}", amount);
                        break;
                    case 4:
                        Console.WriteLine(" THANK U USING ATM");
                        continueAsk = false;
                        break;
                }
            }
            Console.WriteLine(" THANKS FOR USING OUT ATM SERVICE");
            Console.Read();
        }

        /// <summary>
        /// Tính toán phương án rút tiền theo các mệnh giá 500000đ, 200000đ, 100000đ, 50000đ, 20000đ, 10000đ
        /// </summary>
        /// <param name="withdraw">Số tiền cần rút</param>
        private static void CacPhuongAnRutTien(int withdraw)
        {
            // Chỉ được rút tối thiểu số tiền là bội số của 10000đ
            if (withdraw % 10000 != 0)
            {
                Console.WriteLine("So tien rut phai la boi so cua 10000d");
                return;
            }

            // Các mệnh giá tiền có thể đưa cho người dùng khi rút số tiền `withdraw`
            // 500000, 200000, 100000, 50000, 20000, 10000
            //    x1     x2      x3      x4     x5     x6
            // Phương trình rút tiền:
            // 500000*x1 + 200000*x2 + 100000*x3 + 50000*x4 + 20000*x5 + 10000*x6 = `withdraw`
            Console.WriteLine("Cac phuong an thoi tien co the co: ");
            int x1 = 0, x2 = 0, x3 = 0, x4 = 0, x5 = 0, x6 = 0;
            while (x1 <= (withdraw / 500000))
            {
                while (x2 <= (withdraw / 200000))
                {
                    while (x3 <= (withdraw / 100000))
                    {
                        while (x4 <= (withdraw / 50000))
                        {
                            while (x5 <= (withdraw / 20000))
                            {
                                while (x6 <= (withdraw / 10000))
                                {
                                    if (500000 * x1 + 200000 * x2 + 100000 * x3 + 50000 * x4 + 20000 * x5 + 10000 * x6 == withdraw)
                                    {
                                        Console.WriteLine("500000={0} to; 200000={1} to; 100000={2} to; 50000={3} to; 20000={4} to; 10000={5} to", x1, x2, x3, x4, x5, x6);
                                    }
                                    x6++;
                                }
                                x6 = 0;
                                x5++;
                            }
                            x5 = 0;
                            x4++;
                        }
                        x4 = 0;
                        x3++;
                    }
                    x3 = 0;
                    x2++;
                }
                x2 = 0;
                x1++;
            }
        }
    }
}

Github

https://github.com/kellyfire611/learning.nentang.vn-csharp/blob/master/src/Console_ATM_VietNam/Program.cs  

Chương trình học


  1. Cài đặt môi trường Lập trình C# 2
    1. Cài đặt Visual Studio #13
    2. Môi trường phát triển .NET #232
  2. Nhập môn Lập trình C# 18
    1. Giới thiệu ngôn ngữ lập trình C# #323
    2. Cấu trúc chương trình C# #166
    3. Cú pháp cơ bản C# #238
    4. Các kiểu dữ liệu trong C# #240
    5. Chuyển đổi kiểu dữ liệu trong C# #245
    6. Khởi tạo biến trong C# #247
    7. Hằng số trong C# #249
    8. Toán tử trong C# #251
    9. Điều kiện trong C# #253
    10. Vòng lặp trong C# #262
    11. Tính bao đóng trong C# #274
    12. Tạo phương thức/hàm trong C# #276
    13. Đối tượng Nullable trong C# #280
    14. Mảng trong C# #283
    15. Chuỗi trong C# #349
    16. Cấu trúc trong C# #351
    17. Enums trong C# #353
    18. Truyền Tham số Reference hay Tham trị (Value) trong C# #10172
  3. Hướng đối tượng trong C# 12
    1. Class trong C# #355
    2. Kế thừa trong C# #359
    3. Tính đa hình trong C# #361
    4. Nạp chồng toán tử trong C# #534
    5. Giao diện (Interface) trong C# #537
    6. Namespace trong C# #540
    7. Các lệnh tiền xử lý trong C# #543
    8. Biểu thức chính quy (Regular) trong C# #726
    9. Bắt các lỗi/ngoại lệ (Exception) trong C# #730
    10. Xử lý Đọc/Ghi File trong C# #732
    11. LINQ trong C# #7805
    12. Mã hóa (Encryption) và Giải mã (Decryption) trong C# #11880
  4. Các kỹ thuật nâng cao trong C# 2
    1. Thuộc tính (Attributes) trong C# #739
    2. Biên dịch ngược (Reflection) trong C# #741
  5. Bài tập thực hành 28
    1. Khai báo các Kiểu dữ liệu cho Mẫu Lý lịch A2 và Mẫu Hóa đơn Bán hàng #7703
    2. Sử dụng các Toán tử cơ bản trong C# #7704
    3. Kiểm tra số chẵn hay lẻ #171
    4. Thay đổi vị trí của 2 phần tử #175
    5. Tính tổng các kí tự số #224
    6. Đảo ngược con số #229
    7. Tạo chương trình ATM đơn giản #466
    8. Tạo chương trình ATM đơn giản với các phương án rút tiền theo các mệnh giá #477
    9. Tìm số Max, Min trong mảng 2 chiều #480
    10. Tạo cấu trúc lưu trữ thông tin Nhân viên #654
    11. Làm quen Hướng đối tượng trong C# #661
    12. Mã hóa chuỗi với Hacker Speak (H4ck3rSp34k) #681
    13. Mã hóa chuỗi với Alternating Captions (AlTeRnAtInG_CaPs​​​​​) #683
    14. Tính tổng 2 số nhỏ nhất trong danh sách #689
    15. Trích xuất thông tin từ dữ liệu trong FILE TEXT #760
    16. In bảng cửu chương #7747
    17. In tam giác Nhị phân #7749
    18. In tam giác Số ký tự #7751
    19. Đếm số 1 #7754
    20. Sử dụng Mảng 2 chiều để in tên dạng Asterisk ra màn hình #7761
    21. Sử dụng Mảng 1 chiều để phân tách Tên với khoảng cách #7765
    22. Bài tập Biểu thức Chính quy (Regular Expression) #7779
    23. Ghi log lỗi với File và Try Catch #7795
    24. Ghi Access log #7796
    25. LINQ group by tên tập tin #7812
    26. LINQ với collection #7822
    27. Tạo chương trình Quản lý Danh sách Sinh viên và Giảng viên #8554
    28. Bài tập tạo các CLASS OOP C# căn bản 1 #11842
  6. Kiểm tra kiến thức 1
    1. Kiểm tra kiến thức Lập trình C# #205
  7. Kiểm tra kiến thức - Đồ án 4
    1. Bài tập Kiểm tra Thực hành C# - Đề 01 #903
    2. Bài tập Kiểm tra Thực hành C# - Đề 02 #7825
    3. Đề thi Aptech C# - Đề 01 #11888
    4. Đề thi Aptech C# - Đề 02 #11891
Các bài học

Chương trình học

Bao gồm Module, Chương, Bài học, Bài tập, Kiểm tra...

Chương trình học


  1. Cài đặt môi trường Lập trình C# 2
    1. Cài đặt Visual Studio #13
    2. Môi trường phát triển .NET #232
  2. Nhập môn Lập trình C# 18
    1. Giới thiệu ngôn ngữ lập trình C# #323
    2. Cấu trúc chương trình C# #166
    3. Cú pháp cơ bản C# #238
    4. Các kiểu dữ liệu trong C# #240
    5. Chuyển đổi kiểu dữ liệu trong C# #245
    6. Khởi tạo biến trong C# #247
    7. Hằng số trong C# #249
    8. Toán tử trong C# #251
    9. Điều kiện trong C# #253
    10. Vòng lặp trong C# #262
    11. Tính bao đóng trong C# #274
    12. Tạo phương thức/hàm trong C# #276
    13. Đối tượng Nullable trong C# #280
    14. Mảng trong C# #283
    15. Chuỗi trong C# #349
    16. Cấu trúc trong C# #351
    17. Enums trong C# #353
    18. Truyền Tham số Reference hay Tham trị (Value) trong C# #10172
  3. Hướng đối tượng trong C# 12
    1. Class trong C# #355
    2. Kế thừa trong C# #359
    3. Tính đa hình trong C# #361
    4. Nạp chồng toán tử trong C# #534
    5. Giao diện (Interface) trong C# #537
    6. Namespace trong C# #540
    7. Các lệnh tiền xử lý trong C# #543
    8. Biểu thức chính quy (Regular) trong C# #726
    9. Bắt các lỗi/ngoại lệ (Exception) trong C# #730
    10. Xử lý Đọc/Ghi File trong C# #732
    11. LINQ trong C# #7805
    12. Mã hóa (Encryption) và Giải mã (Decryption) trong C# #11880
  4. Các kỹ thuật nâng cao trong C# 2
    1. Thuộc tính (Attributes) trong C# #739
    2. Biên dịch ngược (Reflection) trong C# #741
  5. Bài tập thực hành 28
    1. Khai báo các Kiểu dữ liệu cho Mẫu Lý lịch A2 và Mẫu Hóa đơn Bán hàng #7703
    2. Sử dụng các Toán tử cơ bản trong C# #7704
    3. Kiểm tra số chẵn hay lẻ #171
    4. Thay đổi vị trí của 2 phần tử #175
    5. Tính tổng các kí tự số #224
    6. Đảo ngược con số #229
    7. Tạo chương trình ATM đơn giản #466
    8. Tạo chương trình ATM đơn giản với các phương án rút tiền theo các mệnh giá #477
    9. Tìm số Max, Min trong mảng 2 chiều #480
    10. Tạo cấu trúc lưu trữ thông tin Nhân viên #654
    11. Làm quen Hướng đối tượng trong C# #661
    12. Mã hóa chuỗi với Hacker Speak (H4ck3rSp34k) #681
    13. Mã hóa chuỗi với Alternating Captions (AlTeRnAtInG_CaPs​​​​​) #683
    14. Tính tổng 2 số nhỏ nhất trong danh sách #689
    15. Trích xuất thông tin từ dữ liệu trong FILE TEXT #760
    16. In bảng cửu chương #7747
    17. In tam giác Nhị phân #7749
    18. In tam giác Số ký tự #7751
    19. Đếm số 1 #7754
    20. Sử dụng Mảng 2 chiều để in tên dạng Asterisk ra màn hình #7761
    21. Sử dụng Mảng 1 chiều để phân tách Tên với khoảng cách #7765
    22. Bài tập Biểu thức Chính quy (Regular Expression) #7779
    23. Ghi log lỗi với File và Try Catch #7795
    24. Ghi Access log #7796
    25. LINQ group by tên tập tin #7812
    26. LINQ với collection #7822
    27. Tạo chương trình Quản lý Danh sách Sinh viên và Giảng viên #8554
    28. Bài tập tạo các CLASS OOP C# căn bản 1 #11842
  6. Kiểm tra kiến thức 1
    1. Kiểm tra kiến thức Lập trình C# #205
  7. Kiểm tra kiến thức - Đồ án 4
    1. Bài tập Kiểm tra Thực hành C# - Đề 01 #903
    2. Bài tập Kiểm tra Thực hành C# - Đề 02 #7825
    3. Đề thi Aptech C# - Đề 01 #11888
    4. Đề thi Aptech C# - Đề 02 #11891

Bài học trước Bài học tiếp theo