Withdraw money from ATM

Asked by At

I need to print out something like these.

If the input is 60, then the output should be "Here is 3 $20 notes and 0 $50 notes."
If the input is 100, then the output should be "Here is 0 $20 notes and 2 $50 notes."
If the input is 120, then the output should be "Here is 1 $20 notes and 2 $50 notes."

Code:

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int i, j, n = input.nextInt();
        int x = 0, y = 0;

        if (n % 50 == 0) {
            j = n/50;
            for (i = 1; i != j+1; i++) {
                y++;
            }
            System.out.println("Here is " + x + " $20 notes and " + y + " $50 notes.");
        }   
        else if (n % 20 == 0 && n < 100) {
            j = n/20;
            for (i = 1; i != j+1; i++) {
                x++;
            }
            System.out.println("Here is " + x + " $20 notes and " + y + " $50 notes.");
        }
        else if ((n % 100 != 0) && (n > 100) && (n % 20 == 0)) {
            y = n/100;
            int l = n-(y*100);
            if (l % 20 == 0) {
                int k = l/20;
                for (i = 1; i != k+1; i++) {
                    x++;
                }
                System.out.println("Here is " + x + " $20 notes and " + y*2 + " $50 notes.");
            }
        }
        else if ((n % 50 != 0) && (n > 50)) {
            y = n/50;
            int l = n-(y*50);
            if (l % 20 == 0){
                int k = l/20;
                for (i = 1; i != k+1; i++) {
                    x++;
                }
                System.out.println("Here is " + x + " $20 notes and " + y + " $50 notes.");
            }
        }
        else {
            System.out.println("Sorry, the value you input cannot be withdrew.");
        }
    }
}

This is what I did so far. It does not work with input of 110, 130, 210, etc.

1 Answers

1
Stultuske On

In order to get what you need, there is no need for such amount of conditions. As long as you have a well thought order in your code, and you re-use duplicated code, one single conditional statement will suffice:

import java.util.Scanner;

public class ATM {

    private static int input = 0;
    private static int nrOf100s = 0;
    private static int nrOf50s = 0;
    private static int nrOf20s = 0;
    private static int nrOf5s = 0;

    public static void main(String[] args) {

        System.out.print("Enter an amount to withdraw: ");
        input = new Scanner(System.in).nextInt();

        nrOf100s = getValue(100); // run these in a different order, and your result will be wrong
        nrOf50s = getValue(50);
        nrOf20s = getValue(20);
        nrOf5s = getValue(5);

        System.out.println("nr of 100s: " + nrOf100s);
        System.out.println("nr of 50s:  " + nrOf50s);
        System.out.println("nr of 20s:  " + nrOf20s );
        System.out.println("nr of 5s:   " + nrOf5s);
        System.out.println("nr of 1s:   " + input); // no special variable needed for value of 1's. the remainder applies here
    }

    private static int getValue(int divisor) {
        if( input < divisor ) {
            return 0; // this happens if you try to get nr of 100s when the input is less than 100 (for instance)
        }
        int result = input / divisor;
        input = input % divisor; // don't forget to reduce the value of input
        return result;
    }
}