+1

[Lession 1 - PHP] Giải bài toán rút tiền ATM sử dụng vòng lặp for trong PHP

1. Cho bài toán rút tiền ATM như sau:
  • Nhập vào số tờ tiền trong máy ATM:

    • Số tờ tiền 500k có trong ATM
    • Số tờ tiền 200k có trong ATM
    • Số tờ tiền 100k có trong ATM
    • Số tờ tiền 50k có trong ATM
  • Nhập vào số tiền muốn rút và in ra số lượng các tờ tiền với các mệnh giá khác nhau.

  • Ví dụ: Ví dụ:

    • Số tờ tiền 500k có trong ATM: 2
    • Số tờ tiền 200k có trong ATM: 2
    • Số tờ tiền 100k có trong ATM: 2
    • Số tờ tiền 50k có trong ATM: 2

    => Nhập số tiền muốn rút: 2000k => ATM ko đủ tiền
    => Nhập số tiền muốn rút: 1500k => 500K - 2 tờ, 200k - 2 tờ, 100k - 1 tờ
    => Nhập số tiền muốn rút: 1555k => Số tiền muốn rút phải là bội số của 50

2. Phân tích bài toán và hướng giải:
  • Nhận các giá trị nhập vào từ Input và đưa các giá trị đó vào một Array.

  • Check xem ATM có đủ tiền để rút không, không đủ thì báo ATM phá sản. 😆😆

  • Check xem số tiền cần rút có phải là bội số của 50,000 không, không phải thì báo ngân hàng không có tiền lẻ. 😩

  • Rút ra n tờ tiền có mệnh giá lớn nhất chưa được tính đến trong ATM, với n = min(Số tiền cần rút / Mệnh giá tờ tiền lớn nhất, Số tờ có mệnh giá lớn nhất):

    Giả sử cần rút 1,500,000 và tờ mệnh giá lớn nhất hiện tại là 500,000 thì số tờ expect là 3. Nếu số tờ còn lại là 2 thì ta chỉ rút 2 thôi (min(3, 2)), còn nếu số tờ còn lại là 4 thì ta rút 3 (min(3, 4)).

  • Sau khi thực hiện xong bước ở trên thì tính toán lại số tiền còn lại sẽ là: Số tiền cần rút (mới) = Số tiền cần rút (cũ) - n * Mệnh giá tiền lớn nhất. Nếu số tiền cần rút mà về 0 thì kết thúc quá trình rút tiền, còn không thì tiếp tục lặp lại bước rút tiền ở trên với việc mệnh giá "lớn nhất" mới được chuyển xuống mệnh giá tiếp theo.

3. Code demo

- Đầu tiên khởi tạo 1 file có tên index.php/index.html gồm form chứa input để nhập vào số tờ tiền.

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <form action="atm.php" method="POST">
        Nhập vào số tiền ATM đang có: <br><br>
        Số tờ 500k: <input type="number" name="500"><br><br>
        Số tờ 200k: <input type="number" name="200"><br><br>
        Số tờ 100k: <input type="number" name="100"><br><br>
        Số tờ 50k: <input type="number" name="50"><br><br>
        Nhập vào số tiền cần rút: <br><input type="text" name="input-money"><br><br>

        <input type="submit" value="Nhận tiền">
    </form>
</body>

</html>

- Tạo file có tên atm.php để gọi vào xử lý form trong file index.php.

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <?php
    //get money input from customer - nhận số tiền mà khách hàng nhập vào và cho vào 1 mảng
    $getMoney = $_POST["input-money"];

    $moneyArr = [500000, 200000, 100000, 50000];

    //get money denominations in ATM - nhận mệnh giá tiền trong ATM và cho 1 mảng
    $atm500 = $_POST["500"];
    $atm200 = $_POST["200"];
    $atm100 = $_POST["100"];
    $atm50 = $_POST["50"];

    $atm = [$atm500, $atm200, $atm100, $atm50];

    $sum = 0;
    for ($i = 0; $i < count($moneyArr); $i++) {
        $sum += $atm[$i] * $moneyArr[$i];
    }

    if ($getMoney > $sum) {

        echo "ATM không đủ tiền!";
    } elseif ($getMoney % 50000 != 0) {

        echo "Số tiền nhập vào phải là bội số của 50.";
    } else {

        if (($getMoney % 500000 == 0) && (floor($getMoney / 500000) <= $atm500)) {

            echo "Rút tiền thành công!" .
                "<br>Số tờ 500k: " . floor($getMoney / 500000);
        } else {
            for ($i = 0; $i < count($moneyArr); $i++) {
                $atmCheck = min($getMoney / $moneyArr[$i], $atm[$i]);
                $getMoney -= $atmCheck * $moneyArr[$i];
                echo "Số tờ $moneyArr[$i]: $atmCheck <br>";
                if ($getMoney == 0) {
                    break;
                }
            }
        }
    }
    ?>
</body>

</html>

Kết quả:

1. Kiểm tra số tiền trong ATM có đáp ứng số tiền muốn rút:



Kết quả:

2. Kiểm tra số tiền muốn rút có phải là bội số của 50:


Kết quả:

3. Nhập vào số tiền hợp lệ:


Kết quả:

Chân thành cảm ơn @thangtd90@thangnt đã tài trợ chương trình này! 😘😘

🍁𝔑𝔥ậ𝔱 𝔏𝔞𝔪🍁


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí