public WithdrawArgs(DateTime time, decimal requestedSum, AtmState resultOfOperation, Money money) { Time = time; RequestedSum = requestedSum; ResultOfOperation = resultOfOperation; Money = money; }
public string ToString(Money money, AtmState state) { if (money == null) { throw new ArgumentNullException("money"); } var stringBuilder = new StringBuilder(); try { if (state != AtmState.NoError) { return(_errromMessage[state]); } foreach (var variable in money.Banknotes.Where(variable => variable.Value != 0)) { stringBuilder.Append("["); stringBuilder.Append(variable.Key); stringBuilder.Append(','); stringBuilder.Append(variable.Value); stringBuilder.Append("]"); } } catch (KeyNotFoundException ex) { Log.Error(ex); throw; } catch (ArgumentNullException ex) { Log.Error(ex); throw; } return(stringBuilder.ToString()); }
public Record(DateTime timeOfOperation, decimal requestedSum, Money money, AtmState resultOfOperation) { Money = money; TimeOfOperation = timeOfOperation; ResultOfOperation = resultOfOperation; RequestedSum = requestedSum; }
private static void CheckRegisterCMD(string[] args) { if (IsEmail(args[1]) && args[2].Length >= 5) { if (UserManager.EmailExists(args[1]) == false) { if (UserManager.RegisterUser(args[1], args[2]) == true) { Console.WriteLine("Please log in to continue!"); s_currentState = AtmState.MainScreen; } else { Console.WriteLine("Email in use"); } } else { Console.WriteLine("Email in use"); } } else { Console.WriteLine("ERROR: Either that was an invalid email or your password was less than 5 characters."); } }
/// <summary> /// Sends user to the portal, printing available commands to the console /// </summary> private static void SendToPortal() { Console.WriteLine(" "); Console.WriteLine(" "); Console.WriteLine("Logged in. Welcome to the user portal. Available commands are "); Console.WriteLine("accounts - used to view current bank accounts opened with us."); Console.WriteLine("createaccount type - used to create a new bank account. Valid types are checking, savings, business"); Console.WriteLine("You can quit at anytime by typing 'quit' or logout by typing 'logout'"); s_currentState = AtmState.UserPortal; }
internal static void OnWithdrawMoneyEvent(decimal requestedSum, AtmState resultOfOperation, Money money) { var handler = WithdrawMoneyEvent; var withdrawArgs = new WithdrawArgs(DateTime.Now, requestedSum, resultOfOperation, (Money)money.Clone()); if (handler != null) { handler(null, withdrawArgs); } }
private static void VerifyPinExists() { if (s_currentUser.AtmPin != ushort.MaxValue) { SendToPortal(); } else { Console.WriteLine("You have not selected a pin yet. Please type a four digit numeric code below"); s_currentState = AtmState.SelectPin; } }
public string ToString(Money money, AtmState state) { var stringBuilder = new StringBuilder(); try { stringBuilder.Append(Enum.GetName(typeof(AtmState), state) + ' '); foreach (var variable in money.Banknotes) { stringBuilder.Append('['); stringBuilder.Append(variable.Key); stringBuilder.Append('-'); stringBuilder.Append(variable.Value); stringBuilder.Append(']'); stringBuilder.Append('\n'); } } catch (ArgumentNullException ex) { Log.Error(ex); throw; } return(stringBuilder.ToString()); }
Dictionary <Banknote, int> IDecomposable.DecomposeMoney(Dictionary <Banknote, int> money, decimal requestedSum, out AtmState state) { if (TotalMoney(money) < requestedSum) { state = AtmState.NotEnoughMoney; return(new Dictionary <Banknote, int>()); } if (TotalMoney(money) < requestedSum) { state = AtmState.NotEnoughMoney; return(null); } bool isSumsLess = false; List <List <decimal> > oldDegree = new List <List <decimal> >(); List <decimal> firstSum = new List <decimal> { 0 }; firstSum.AddRange(money.Select(i => 0).Select(dummy => (decimal)dummy)); oldDegree.Add(firstSum); do { List <List <decimal> > newDegree = new List <List <decimal> >(); for (int i = 0; i < oldDegree.Count(); i++) { isSumsLess = false; for (int j = 0; j < money.Count(); j++) { if (oldDegree[i][0] + money.ElementAt(j).Key.Nominal <= requestedSum && oldDegree[i][j + 1] + 1 <= money.ElementAt(j).Value) { List <decimal> newSum = new List <decimal>(oldDegree[i]); newSum[0] += money.ElementAt(j).Key.Nominal; newSum[j + 1]++; newDegree.Add(newSum); isSumsLess = true; if (newDegree[newDegree.Count() - 1][0] != requestedSum) { continue; } state = AtmState.Ok; Dictionary <Banknote, int> decomposedSum = new Dictionary <Banknote, int>(); for (int h = 1; h < newDegree[i].Count(); h++) { decomposedSum.Add(money.ElementAt(h - 1).Key, (int)newDegree[newDegree.Count() - 1][h]); } Money decomposedMoney = new Money { Banknotes = decomposedSum }; return(decomposedMoney.Banknotes); } } } oldDegree = newDegree; } while (isSumsLess); state = AtmState.ImpossibleToCollectMoney; return(null); }
public bool TrySelect(List <MutablePair <decimal, int> > moneyCassettes, decimal requestedSum, out AtmState result, out List <MutablePair <decimal, int> > selectedMoney) { try { if (moneyCassettes == null) { throw new ArgumentNullException("moneyCassettes"); } if (requestedSum < 0) { throw new FormatException("requestedSum"); } if (TotalSum(moneyCassettes) < requestedSum) { result = AtmState.MoneyDeficiency; selectedMoney = null; return(false); } selectedMoney = new List <MutablePair <decimal, int> >(); var cassetteUsed = new Stack <MutablePair <decimal, int> >(); var cassetteForUsing = new LinkedList <MutablePair <decimal, int> >(); var moneyStack = new Stack <MutablePair <decimal, int> >(); foreach (var item in moneyCassettes) { cassetteForUsing.AddFirst(item); } //пока для выдачи не останется ноль повторяем while (requestedSum > 0) { //смотрим номинал купюр находящийся в вершине стека номиналов которые буду использованы var currentCassette = cassetteForUsing.Last(); //если кроме текущего номинала доступен хотя бы ещё один //или с помощьью текущего номинала можно выдать оставшуюся сумму if ((cassetteForUsing.Count() > 1) || ( ((requestedSum % currentCassette.Key == 0) && ( requestedSum / currentCassette.Key <= currentCassette.Value)))) { //извекаем текущий номинал из стека неиспользованных номиналов cassetteForUsing.RemoveLast(); //находим наименьшее между количеством купюр в банкомате и максиммальным количеством купюр //суммарное достоинство которых не превышает требуемой суммы var banknotesNumber = Math.Min((int)(requestedSum / currentCassette.Key), currentCassette.Value); //извлекаем купюры из кассеты currentCassette.Value -= banknotesNumber; //из запрошенной суммы вычитаем сумму выбранных на данном шаге купюр requestedSum -= currentCassette.Key * banknotesNumber; //в стек использованных номиналов добавляем текущий номинал cassetteUsed.Push(currentCassette); //в деньги для выдачи добавляем купюры, выбранные на текущем шаге moneyStack.Push(new MutablePair <decimal, int>(currentCassette.Key, banknotesNumber)); continue; } //если цикл не пошёл на следующий шаг //то пока есть использованные номиналы и количество //купюр текущего номминала равно нулю while (cassetteUsed.Any() && moneyStack.Peek().Value == 0) { //переносим использованные номиналы в стек неиспользованных cassetteForUsing.AddLast(cassetteUsed.Pop()); //извлекаем из выдачи номиналы с нулевым количеством moneyStack.Pop(); } //если после извлечения купюр на предыдущем этапе //в выдаче не осталось никаких номиналов if (!moneyStack.Any()) { // то получить нужную сумму невозможно result = AtmState.CombinationFailed; return(false); } //если номиналы остались, то уменьшаем на единицу количество купюр //номинала из вершины стека moneyStack.Peek().Value--; //возвращаем эту купюру в контейнер cassetteUsed.Peek().Value++; //увеличиваем сумму для подбора на номинал купюры, перемещённой обратно в банкомат requestedSum += cassetteUsed.Peek().Key; } //если произошёл успешный выход из цикла, состоянию присваиваем статус успешного завершения result = AtmState.NoError; //деньги из стека перекладываем в объект класса Money и возвращаем результат selectedMoney.AddRange(moneyStack.ToArray()); } catch (ArgumentNullException ex) { Log.Error(ex); result = AtmState.MoneyDeficiency; selectedMoney = null; return(false); } catch (FormatException ex) { Log.Error(ex); result = AtmState.FormatError; selectedMoney = null; return(false); } return(true); }
public Atm() { currentState = new NoCash(this); }