//Метод внесения наличных в Банкомат (случайный парсинг на купюры) public string Deposit(int depositSum) { int divCount = 0; int item, over; int tmpSum = depositSum; int[,] cashCount = new int[listCashBox.Count, 2]; bool successDeposit = true; ATM_Bill.Billing = ""; //Сумма должна быть кратной хотябы одному из номиналов банкнот for (int i = 0; i < listCashBox.Count; i++) { if ((listCashBox[i].Denomination > 0) && (depositSum % listCashBox[i].Denomination == 0)) { divCount++; } } if (divCount > 0) { //Случайное разделение внесенной суммы на банкноты Random rnd = new Random(); do { item = rnd.Next(0, listCashBox.Count); if (tmpSum >= listCashBox[item].Denomination) { tmpSum -= listCashBox[item].Denomination; cashCount[item, 0] = listCashBox[item].Denomination; cashCount[item, 1] += 1; } }while (tmpSum != 0); //Резервирование данных для восстановления в случае неуспешной операции List <ATM_CashBox> backupCashBox = new List <ATM_CashBox>(); int backupCollectionBox = 0; for (int i = 0; i < settings.Denominations.Count; i++) { ATM_CashBox tmpCashBox = new ATM_CashBox(settings.Denominations[i], listCashBox[i].Count, settings.StorageLimit); backupCashBox.Add(tmpCashBox); } backupCollectionBox = collectionBox; //Укладака банкнот в кассеты и контейнер для инкассации for (int i = 0; i < listCashBox.Count; i++) { for (int j = 0; j < cashCount.GetLength(0); j++) { if (listCashBox[i].Denomination == cashCount[j, 0]) { if ((listCashBox[i].Count + cashCount[j, 1]) <= listCashBox[i].StorageLimit) { listCashBox[i].Count += cashCount[j, 1]; } else if ((listCashBox[i].Count + cashCount[j, 1]) > listCashBox[i].StorageLimit) { if ((listCashBox[i].Count < listCashBox[i].StorageLimit) && (collectionBox > 0)) { over = Math.Abs(listCashBox[i].StorageLimit - (listCashBox[i].Count + cashCount[j, 1])); if ((collectionBox - over) > 0) { listCashBox[i].Count = listCashBox[i].StorageLimit; collectionBox -= over; } else { successDeposit = false; } } else if ((listCashBox[i].Count == listCashBox[i].StorageLimit) && (collectionBox > 0)) { if ((collectionBox - cashCount[j, 1]) > 0) { collectionBox -= cashCount[j, 1]; } else { successDeposit = false; } } } } } } //Сохранение, выдача и чек if (successDeposit) { ATM_Bill.Billing += "Внесена сумма: \n\n" + depositSum + " руб 00 коп \n\nПриняты купюры:\n "; for (int j = listCashBox.Count - 1; j >= 0; j--) { if (cashCount[j, 0] > 0) { ATM_Bill.Billing += cashCount[j, 0] + " руб = " + cashCount[j, 1] + " шт\n "; } } } else { listCashBox = backupCashBox; collectionBox = backupCollectionBox; foreach (var x in listCashBox) { Console.WriteLine(x.Denomination + " = " + x.Count); } ATM_Bill.Billing += "Операция отклонена! \n\nК сожалению, наш ящик для инкассации \nне может вместить такое количество купюр. \nПожалуйста, уменьшите количество и повторите операцию."; } } else { ATM_Bill.Billing += "Операция отклонена! \n\nК сожалению, наш банкомат не поддерживает купюры данного номинала. \n\nНевозможно внести сумму: \n\n" + depositSum + " руб 00 коп \n\nИспользуйте купюры другого номинала и повторите операцию."; } ATM_Bill.Billing += " \nСпасибо, что выбрали наш банкомат!"; return(ATM_Bill.Record()); }
//Метод выдачи наличных public string Withdraw(int withdrawSum, bool[] whatDenomination) { int balance = withdrawSum; int[,] denominationSelected = new int[settings.Denominations.Count, 2]; bool withdrawSuccess = false; int[,] billingReport = new int[denominationSelected.GetLength(0), 2]; ATM_Bill.Billing = ""; //Построение массива выбранных купюр с доступным количеством for (int i = 0; i < denominationSelected.GetLength(0); i++) { if ((whatDenomination[i]) && (listCashBox[i].Count > 0)) { denominationSelected[i, 0] = listCashBox[i].Denomination; denominationSelected[i, 1] = listCashBox[i].Count; } else { denominationSelected[i, 0] = 0; denominationSelected[i, 1] = 0; } } //Выдача наличных начиная с крупных List <ATM_CashBox> withdrawCashBox = new List <ATM_CashBox>(); for (int i = 0; i < settings.Denominations.Count; i++) { ATM_CashBox tmpCashBox = new ATM_CashBox(settings.Denominations[i], listCashBox[i].Count, settings.StorageLimit); withdrawCashBox.Add(tmpCashBox); } for (int i = denominationSelected.GetLength(0) - 1; i >= 0; i--) { if ((balance > 0) && (denominationSelected[i, 0] > 0) && ((withdrawCashBox[i].Count - balance / denominationSelected[i, 0]) >= 0) && ((balance / denominationSelected[i, 0]) > 0)) { withdrawCashBox[i].Count -= balance / denominationSelected[i, 0]; billingReport[i, 0] = withdrawCashBox[i].Denomination; billingReport[i, 1] += balance / denominationSelected[i, 0]; balance = balance % denominationSelected[i, 0]; } } //Если выбранных купюр оказалось недостаточно, выдача производится имеющимися if (balance > 0) { DialogResult dialogResult = MessageBox.Show("Указанная сумма не может быть выдана выбранными купюрами! \n\nБанкомат автоматически подберет необходимые купюры. \n\n Хотите продолжить операцию и получить наличные?", "Продолжение операции", MessageBoxButtons.YesNo); if (dialogResult == DialogResult.Yes) { for (int i = denominationSelected.GetLength(0) - 1; i >= 0; i--) { if ((balance > 0) && (withdrawCashBox[i].Count > 0) && ((withdrawCashBox[i].Count - balance / withdrawCashBox[i].Denomination) >= 0) && ((balance / withdrawCashBox[i].Denomination) > 0)) { withdrawCashBox[i].Count -= balance / withdrawCashBox[i].Denomination; billingReport[i, 0] = withdrawCashBox[i].Denomination; billingReport[i, 1] += balance / withdrawCashBox[i].Denomination; balance = balance % withdrawCashBox[i].Denomination; } } withdrawSuccess = true; //Сообщение об успешной операции с вмешательством ИИ банкомата if ((balance == 0) && (withdrawSuccess)) { ATM_Bill.Billing += ("Вы выбрапли купюры, неподходящие для выдачи запрашиваемой суммы.\nНо мы всё предусмотрели и банкомат доложил необходимые банкноты :)\n\n"); } } } //Отмена операции, если не получилось выдать всё if (balance > 0) { ATM_Bill.Billing += "Сумма к выдаче: \n\n" + withdrawSum + " руб 00 коп\n\n"; ATM_Bill.Billing += "Ошибка! Остаток: " + balance.ToString() + " руб не может быть выдан! Операция отклонена!"; for (int i = denominationSelected.GetLength(0) - 1; i >= 0; i--) { withdrawCashBox[i].Count += billingReport[i, 1]; } } else { //Сохранение, выдача и чек listCashBox = withdrawCashBox; ATM_Bill.Billing += "Сумма к выдаче: \n\n" + withdrawSum + " руб 00 коп\n\n"; ATM_Bill.Billing += "Выдано: \n"; for (int i = denominationSelected.GetLength(0) - 1; i >= 0; i--) { if (billingReport[i, 0] > 0) { ATM_Bill.Billing += billingReport[i, 0] + " руб = " + billingReport[i, 1] + " шт \n"; } } } ATM_Bill.Billing += " \nСпасибо, что выбрали наш банкомат!"; return(ATM_Bill.Record()); }