/// <summary> /// Подбирает подходящую купюру к выдаче /// </summary> /// <param name="sum">double Сумма которую необходимо выдать</param> /// <param name="item">MoneyCost предпочитаемая купюра</param> /// <returns> пара ключ-значение купюра из хранилища </returns> private KeyValuePair <Guid, MoneyCost> getNextCut(double sum, MoneyCost cost, out bool result) { result = true; KeyValuePair <Guid, MoneyCost> res = new KeyValuePair <Guid, MoneyCost>(Guid.Empty, MoneyCost.Ten); var items = storage.Where(a => a.Value.Equals(cost)); // ищем предпочитаемую купюру if (items.Count() > 0 & sum > cost.GetValue()) { res = items.First(); } else { items = storage.Where((a) => a.Value.GetValue() == sum);// ищем купюру, равную сумме if (items.Count() > 0) { res = items.First(); } else { items = storage.Where((a) => a.Value.GetValue() < sum); // ищем купюру меньше суммы if (items.Count() > 0) { res = items.First(); } else { result = false; } } } return(res); }
public Dictionary <Guid, MoneyCost> PullMoney(MoneyCost cost, double sum, out bool result) { double resSum = 0; bool isCutFound = false; Dictionary <Guid, MoneyCost> res = new Dictionary <Guid, MoneyCost>(); result = true; while (resSum < sum) { var cut = getNextCut((sum - resSum), cost, out isCutFound); if (isCutFound) { res.Add(cut.Key, cut.Value); storage.Remove(cut.Key); resSum += cut.Value.GetValue(); } else { result = false; break; } } if (!result) { // Катимся назад, т.к. несмогли подобрать купюры под нужную сумм foreach (KeyValuePair <Guid, MoneyCost> item in res) { storage.Add(item.Key, item.Value); } res.Clear(); result = false; } return(res); }
public void TestValueAtrribute() { MoneyCost cost = MoneyCost.Hundred; Assert.AreEqual(cost.GetValue(), 100); Assert.AreNotEqual(MoneyCost.FiveHundred.GetValue(), MoneyCost.FiveThousand.GetValue()); Assert.AreEqual(MoneyCost.Ten.GetValue(), 10); }
public Cut(MoneyCost cost) { this.cost = cost; Name = cost.GetImageResource(); Uri uri = new Uri(cost.GetImageResource()); try { image = new BitmapImage(uri); } catch { }; }
private void btnGetMoney_Click(object sender, RoutedEventArgs e) { double sum = 0; if (!double.TryParse(tbSum.Text, out sum)) { ShowResult(new DisplayMessage("Операция прервана", "Неверно указана сумма")); return; } try { var obj = lbAviableCuts.SelectedItem; if (obj != null) { MoneyCost cost = ((Model.Cut)obj).cost; lbTakeMoney.Content = "Заберите деньги(Двойной шелчек):"; bool result; var cuts = App.Machine.PullMoney(cost, sum, out result); if (!result) { ShowResult(new DisplayMessage("Операция прервана", "Операция недоступна")); return; } foreach (KeyValuePair <Guid, MoneyCost> item in cuts) { lbTakedCuts.Items.Add(new Model.Cut(item.Value)); } lbTakedCuts.MouseDoubleClick += (s, ev) => { ShowResult(new DisplayMessage("Операция успешно завершена", string.Format("Доступные средства: {0} рублей" , App.Machine.GetBalance().ToString()))); }; } else { ShowResult(new DisplayMessage("Операция прервана", "Операция недоступна")); } } catch (Exception ex) { ShowResult(new DisplayMessage("Операция прервана", "Данная сумма недоступна")); } }