/// <summary> /// Allows for adding change to the existing change in the vending machine. /// </summary> /// <param name="change"></param> public void LoadChange(ChangeHolder change) { ChangeHolder.Quarter.quantity += change.Quarter.quantity; ChangeHolder.Dime.quantity += change.Dime.quantity; ChangeHolder.Nickel.quantity += change.Nickel.quantity; ChangeHolder.Penny.quantity += change.Penny.quantity; }
/// <summary> /// Check to see if there is enough change before vending item. /// </summary> /// <param name="AmountInserted"></param> /// <param name="ItemPrice"></param> /// <returns></returns> public bool EnoughChange(decimal AmountInserted, decimal ItemPrice) { ChangeHolder tempChangeHolder = new ChangeHolder(); tempChangeHolder.Quarter.quantity = ChangeHolder.Quarter.quantity; tempChangeHolder.Dime.quantity = ChangeHolder.Dime.quantity; tempChangeHolder.Nickel.quantity = ChangeHolder.Nickel.quantity; tempChangeHolder.Penny.quantity = ChangeHolder.Penny.quantity; decimal AmountOfChangeToMake = AmountInserted - ItemPrice; if (AmountOfChangeToMake < 0) { throw new Exception("Not enough money inserted to purchase item!"); } if (AmountOfChangeToMake == 0) { return(true); } while (AmountOfChangeToMake != 0) { if (tempChangeHolder.Quarter.quantity > 0 && AmountOfChangeToMake % tempChangeHolder.Quarter.value == 0) { tempChangeHolder.Quarter.quantity--; AmountOfChangeToMake -= ChangeHolder.Quarter.value; } else if (tempChangeHolder.Dime.quantity > 0 && AmountOfChangeToMake % tempChangeHolder.Dime.value == 0) { tempChangeHolder.Dime.quantity--; AmountOfChangeToMake -= ChangeHolder.Dime.value; } else if (tempChangeHolder.Nickel.quantity > 0 && AmountOfChangeToMake % tempChangeHolder.Nickel.value == 0) { tempChangeHolder.Nickel.quantity--; AmountOfChangeToMake -= ChangeHolder.Nickel.value; } else if (tempChangeHolder.Penny.quantity > 0 && AmountOfChangeToMake % tempChangeHolder.Penny.value == 0) { tempChangeHolder.Penny.quantity--; AmountOfChangeToMake -= ChangeHolder.Penny.value; } else { return(false); } } return(true); }
/// <summary> /// Calculates the amount of change to dispense. If a certain coin has run out, it moves on the next one. /// </summary> /// <param name="AmountInserted"></param> /// <param name="ItemPrice"></param> /// <returns></returns> public ChangeHolder MakeChange(decimal AmountInserted, decimal ItemPrice) { ChangeHolder CoinsGiven = new ChangeHolder(); decimal AmountOfChangeToMake = AmountInserted - ItemPrice; if (AmountOfChangeToMake < 0) { throw new Exception("Not enough money inserted to purchase item!"); } if (AmountOfChangeToMake == 0) { return(CoinsGiven); } while (AmountOfChangeToMake != 0) { if (ChangeHolder.Quarter.quantity > 0 && AmountOfChangeToMake % ChangeHolder.Quarter.value == 0) { CoinsGiven.Quarter.quantity++; AmountOfChangeToMake -= ChangeHolder.Quarter.value; ChangeHolder.Quarter.quantity--; } else if (ChangeHolder.Dime.quantity > 0 && AmountOfChangeToMake % ChangeHolder.Dime.value == 0) { CoinsGiven.Dime.quantity++; AmountOfChangeToMake -= ChangeHolder.Dime.value; ChangeHolder.Dime.quantity--; } else if (ChangeHolder.Nickel.quantity > 0 && AmountOfChangeToMake % ChangeHolder.Nickel.value == 0) { CoinsGiven.Nickel.quantity++; AmountOfChangeToMake -= ChangeHolder.Nickel.value; ChangeHolder.Nickel.quantity--; } else if (ChangeHolder.Penny.quantity > 0 && AmountOfChangeToMake % ChangeHolder.Penny.value == 0) { CoinsGiven.Penny.quantity++; AmountOfChangeToMake -= ChangeHolder.Penny.value; ChangeHolder.Penny.quantity--; } else { throw new Exception("Unable to make enough change!"); } } return(CoinsGiven); }
public ChangeMaker() { ChangeHolder = new ChangeHolder(); }
/// <summary> /// Loads Change to machine. Assumes that only one of each item is in the list. /// </summary> /// <param name="change"></param> public static void loadChange(ChangeHolder change) { changeMaker.LoadChange(change); adminPanelSelection(); }
public static void adminPanelSelection() { Console.WriteLine("What would you like to do?"); Console.WriteLine("To load change, press 1."); Console.WriteLine("To empty change, press 2."); Console.WriteLine("To load a specific item, press 3"); Console.WriteLine("To load a list of items, press 4"); Console.WriteLine("To place the machine in vend mode, press 5"); int selection = 0; Int32.TryParse(Console.ReadLine(), out selection); if (selection < 1 || selection > 5) { Console.WriteLine("Invalid Selection. Please try again."); adminPanelSelection(); //Could throw a stack overflow execption here if user selects wrong item too many times } //all values being passed are being coded here instead of asking for input to simplify both coding and testing switch (selection) { case 1: ChangeHolder change = new ChangeHolder(); change.Quarter.quantity = 25; change.Dime.quantity = 30; change.Nickel.quantity = 40; change.Penny.quantity = 100; loadChange(change); break; case 2: emptyChange(); break; case 3: loadItem(new Item() { Name = "Pepsi", quantity = 10, Price = .89M }); break; case 4: Items items = new Items(); items.items.Add(new Item() { Name = "CocaCola", Price = .87M, quantity = 12 }); items.items.Add(new Item() { Name = "Diet Pepsi", Price = .96M, quantity = 1 }); items.items.Add(new Item() { Name = "Diet Coke", Price = .96M, quantity = 3 }); loadItems(items); break; case 5: VendMode(); break; } }
/// <summary> /// Change must be inserted before being able to select an item. Machine will check if there is enough change to make the purchase. /// </summary> public static void VendMode() { Items availableItems = new Items(); availableItems = itemSelector.AvailableItems(); Console.WriteLine("Please insert change. Q for quarter, D for dime, N for nickel, P for penny. Press enter when done"); string changeInput = Console.ReadLine(); List <Change> change = new List <Change>(); ChangeHolder changeHolder = new ChangeHolder(); decimal inserted = 0M; foreach (var character in changeInput) { switch (character) { case 'Q': changeHolder.Quarter.quantity++; inserted += changeHolder.Quarter.value; break; case 'D': changeHolder.Dime.quantity++; inserted += changeHolder.Dime.value; break; case 'N': changeHolder.Nickel.quantity++; inserted += changeHolder.Nickel.value; break; case 'P': changeHolder.Penny.quantity++; inserted += changeHolder.Penny.value; break; default: break; } } int index = 0; foreach (Item item in availableItems.items) { if (item.quantity > 0) { Console.WriteLine(index + " - " + item.Name + " - " + item.Price); } index++; } Console.WriteLine("X to shutdown or A to enter admin panel."); int selectedIndex = -1; while (selectedIndex == -1) { string input = Console.ReadLine(); if (input == "X") { return; } if (input == "A") { adminPanelSelection(); } else { Int32.TryParse(input, out selectedIndex); if (selectedIndex == -1) { Console.WriteLine("invalid selection, please try again"); } } } Item selectedItem = new Item(); selectedItem = availableItems.items[selectedIndex]; try { if (changeMaker.EnoughChange(inserted, selectedItem.Price)) { itemSelector.VendItem(selectedItem); ChangeHolder changeGiven = new ChangeHolder(); changeGiven = changeMaker.MakeChange(inserted, selectedItem.Price); Console.WriteLine("Change given"); Console.WriteLine("Quarters: " + changeGiven.Quarter.quantity.ToString()); Console.WriteLine("Dimes: " + changeGiven.Dime.quantity.ToString()); Console.WriteLine("Nickels: " + changeGiven.Nickel.quantity.ToString()); Console.WriteLine("Pennies: " + changeGiven.Penny.quantity.ToString()); changeMaker.LoadChange(changeHolder); //load the coins inserted into the change maker Console.WriteLine("Item vended"); } else { Console.WriteLine("Not enough change. Returning inserted change."); changeHolder = new ChangeHolder(); } } catch (Exception e) { Console.WriteLine(e.Message); } VendMode(); }