## Grub 4

Hi I am doing a vending Machine application. Now I can insert denominations from 5 10 20 50 1pound and 2 pounds. Is there a way of filtering the most efficent coin combination to pay for the snack. e.g. I have a snack for 45 pence. I insert 2 pounds and 50 pence. I want the machine to be able to determine which is the most efficen coins to use.

Start taking out from the largest to the smallest coin.

## Grub 4

It is precisely what I have done. But if something is say 45 pence. And I had earlier inserted 2 pounds and a fifty pence piece only. Then it takes the 2 pound I would rather the machine took the fifty. Hence I made adjustments, however the adjustments are not as robust. I need to be careful with the prices of the snacks and the coins I insert in order for harmony but as I said, this is not a robust machine. Any other suggestions?

The code is depicted below

First I insert money say five 50 pence coins = 2.50, and two 2pouns coins to make £6.50.
Now the vending machine method purchases takes an int as a parameter to specify the slot.

``````public static final int FIVE_VALUE = 5;
public static final int TEN_VALUE = 10;
public static final int TWENTY_VALUE = 20;
public static final int FIFTY_VALUE = 50;
public static final int POUND_VALUE = 100;
public static final int TWOPOUND_VALUE = 200;

// insert coin method. I insert say £6.50 as above.

protected void insertCoins(int insert)
{
int i = 0;
if(insert == 5)
{
credit[0] = credit[0] + 1;
}
else if(insert == 10)
{
credit[1] = credit[1] + 1;
}
else if(insert == 20)
{
credit[2] = credit[2] + 1;
}
else if(insert == 50)
{
credit[3] = credit[3] + 1;
}
else if(insert == 100)
{
credit[4] = credit[4] + 1;
}
else if(insert == 200)
{
credit[5] = credit[5] + 1;
}
else
{
System.out.println("This Machine only accepts 5, 10, 20 and 50 pence and 1 and 2 pound coins");
}
}

public void purchase(int choice)
{
// Calling the dispenseSnack(i) method with the parsed integer parameter so that the snack is dispensed provided the snackObject is not null.
if(choice < snackObject.length && choice >= 0)
{
if(snackObject[choice] == null)
{
System.out.println(" SLOT " + choice + " IS EMPTY");
}
if(calculateTotal() < snackObject[choice].price)
{
System.out.println("Insufficient credit");
}
if(calculateTotal() >= snackObject[choice].price)
{
dispenseSnack(choice);
}
}
}

//displayCredit method display the current credit held in the vending machine
protected void displayCredit()
{
System.out.println("-----Current Credit in Pence :----- " + calculateTotal());
}
// The total method calculates the total active credit held in the vending machine
public int calculateTotal()
{
total = credit[0] * FIVE_VALUE + credit[1] * TEN_VALUE + credit[2] * TWENTY_VALUE + credit[3] * FIFTY_VALUE + credit[4] * POUND_VALUE + credit[5] * TWOPOUND_VALUE;
}

//The dispense(i) method takes a parameter which is the option selected by the user.
private void dispenseSnack(int i)
{

total = snackObject[i].price;
//Loop is to ensure that the all the coins are are emptied
do
{
if(snackObject[i].price / TWOPOUND_VALUE >= 1 && credit[5] > 0)
{
change[5] = change[5] + 1;
credit[5] = credit[5] - 1;
total = total - 200;
}
if(snackObject[i].price / POUND_VALUE >= 1 && credit[4] > 0)
{
change[4] = change[4] + 1;
credit[4] = credit[4] - 1;
total = total - 100;
}
if(snackObject[i].price / FIFTY_VALUE >= 1 && credit[3] > 0)
{
change[3] = change[3] + 1;
credit[3] = credit[3] - 1;
total = total - 50;
}
if(snackObject[i].price / TWENTY_VALUE >= 1 && credit[2] > 0)
{
change[2] = change[2] + 1;
credit[2] = credit[2] - 1;
total = total - 20;
}
if(snackObject[i].price / TEN_VALUE >= 1 && credit[1] > 0)
{
change[1] = change[1] + 1;
credit[1] = credit[1] - 1;
total = total - 10;
}
if(snackObject[i].price / FIVE_VALUE >= 1 && credit[0] > 0)
{

change[0] = change[0] + 1;
credit[0] = credit[0] - 1;
total = total - 5;
}
}
while(total > 0);
System.out.println(snackObject[i].snackName + " :- Is despensed");
snackObject[i] = null;
calculateTotal();

}
``````