У меня есть 2 массива: один из типов чисел, которые будут использоваться, а второй массив — сколько раз можно использовать это число. У меня есть буква, которая определяет, какой метод будет использоваться. Мне нужно выяснить, сколько раз я могу использовать определенное число из массива, чтобы определить букву + число. «Число» - это то, что я должен сделать со всеми доступными числа, которые я могу использовать. Если номер не может быть создан, я хотел бы просто сказать, что номер не может быть составлен или что-то еще, но позволить программе двигаться дальше. Вот что у меня есть
int[] picksToUse = { 100, 50, 20, 10, 5, 1 };
int[] timesToUse = { 10, 10, 10, 10, 10, 10 };
string choice = Console.ReadLine();
string input = "";
if (choice.Length > 2)
{
input = choice.Substring(choice.IndexOf("$") + 1);
}
if (...){
}
else if (choice.Equals("D"))
{
int amt = Convert.ToInt32(input);
// code here to determine if number can be made with above choices
Dispense(amt, timesToUse);
}
C#, но думает так же, как это сделать
Вы случайно не делаете римские цифры?
Нет, я работаю как банкомат? Кассовый аппарат отслеживает оставшиеся счета, и если у меня заканчивается определенный счет, поэтому я не могу ввести введенное число, которое хочу отобразить, не могу сделать
не могли бы вы поделиться образцом ввода? Д___ ?
Вы не против рекурсии? Я думаю, что рекурсивная функция с логическим возвратом могла бы сказать вам, работает она или нет, в нескольких строках, и тогда вам нужно было бы беспокоиться только о фактическом выполнении транзакции (или нет).





Предполагая, что picksToUse и timesToUse точно такие же, как вы их объявили, вот способ узнать, достаточно ли у вас всего на складе, чтобы «заплатить». Это логическая функция, использующая рекурсию. Вы бы вызвали его с необходимой суммой в качестве параметра, и он тут же сказал бы вам, достаточно ли у вас всего.
Private Function HasCashInStock(amount As Integer, Optional index As Integer = 0) As Boolean
Dim billsNeeded As Integer = amount \ picksToUse(index)
If billsNeeded > timesToUse(index) Then
Return False
End If
amount -= picksToUse(index) * billsNeeded
If amount = 0 Then
Return True
End If
Return HasCashInStock(amount, index + 1)
End Function
\ — это оператор целочисленного деления (по крайней мере, в VB.NET — я без зазрения совести позволяю вам переводить этот код). Если вы не знакомы с оператором целочисленного деления, что ж, когда вы используете его с целым числом, он избавляется от плавающих чисел.
3 / 2 не работает с целыми числами, потому что это даст 1,5.
3 \ 2 действителен для целых чисел и даст 1.
Вот и все, на самом деле. Ах да, и рекурсия. Мне нравится рекурсия, но другие скажут вам избегать ее, насколько это возможно. Что я могу сказать, я думаю, что хорошая рекурсивная функция имеет элегантность.
Вы также можете полностью скопировать эту функцию в другой раз, изменить ее и использовать для вычитания из вашего массива timesToUse(), как только вы будете уверены, что всего достаточно для оплаты.
If HasCashInStock(HereIsTheAmountAsInteger) Then
GivesTheMoney(HereIsTheAmountAsInteger)
End If
Наличие двух функций — не самый простой код, но он был бы более читабельным. Развлекайся!
У меня есть метод, поэтому я получаю нужное мне количество счетов, а также отслеживаю все счета, которые у меня остались. Я думаю, мне нужен такой метод, как: public static bool Validate (int amount, int [] total, int [] Needed) {
public static bool Validate(int amount, int[] total, int[] Needed) Я хочу стать лучше в рекурсии. Я посмотрю на ваш VB и посмотрю, смогу ли я проверить с ним свою дозу()
Мой код использует индекс вашего массива для рекурсивного поиска, есть ли у вас все необходимые счета. Возвращает истину или ложь. Как только вы точно знаете, есть ли у вас счета, вам не нужно проверять их дважды, поэтому вы можете просто повторно использовать тот же метод, но на этот раз немного изменить код, чтобы вместо подсчета счетов он вычитал их из вашего «банка». " (и этот метод может быть Void, потому что вам не нужно ничего возвращать, это будет просто часть "выполнение работы, теперь мы знаем, что должны это сделать").
Это то, что я использовал, чтобы закончить свой проект.
public static bool Validate(int amount, int[] total, int[] needed)
{
int[] billCount = total;
int[] cash = { 100, 50, 20, 10, 5, 1 };
int total = amount;
bool isValid = true;
for (int i = 0; i < total.Length; i++)
{
if (total >= cash[i])
{
billCount[i] = billCount[i] - needed[i];
}
if (billCount[i] < 0)
{
isValid = false;
break;
}
}
return isValid;
}
У меня есть рабочий код. Я сделал это с классом. Я помню, когда я не мог видеть, что такое хорошие уроки. Теперь я не могу чистить зубы без занятий. :-)
Я заставляю себя решать эти задачи, чтобы набраться опыта в C#. Теперь у меня есть 3 вещи, которые мне нравятся в C#.
class ATM
{
public int Denomination { get; set; }
public int Inventory { get; set; }
public ATM(int denom, int inven)
{
Denomination = denom;
Inventory = inven;
}
}
List<int> Bills = new List<int>();
List<ATM> ATMs = new List<ATM>();
private void OP2()
{
int[] picksToUse = { 100, 50, 20, 10, 5, 1 };
foreach (int d in picksToUse )
{
ATM atm = new ATM(d, 10);
ATMs.Add(atm);
}
//string sAmtRequested = Console.ReadLine();
string sAmtRequested = textBox1.Text;
if (int.TryParse(sAmtRequested, out int AmtRequested))
{
int RunningBalance = AmtRequested;
do
{
ATM BillReturn = GetBill(RunningBalance);
if (BillReturn is null)
{
MessageBox.Show("Cannot complete transaction");
return;
}
RunningBalance -= BillReturn.Denomination;
} while (RunningBalance > 0);
}
else
{
MessageBox.Show("Non-numeric request.");
return;
}
foreach (int bill in Bills)
Debug.Print(bill.ToString());
Debug.Print("Remaining Inventory");
foreach (ATM atm in ATMs)
Debug.Print($"For Denomination {atm.Denomination} there are {atm.Inventory} bills remaining");
}
private ATM GetBill(int RequestBalance)
{
var FilteredATMs = from atm in ATMs
where atm.Inventory > 0
orderby atm.Denomination descending
select atm;
foreach (ATM bill in FilteredATMs)
{
if (RequestBalance >= bill.Denomination )
{
bill.Inventory -= 1;
Bills.Add(bill.Denomination);
return bill;
}
}
return null;
}
Это не JavaScript.