我有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);
}
答案 0 :(得分:0)
假设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
具有两个功能不是最精简的代码,但可读性更好。玩得开心!
答案 1 :(得分:0)
这就是我用来完成项目的条件。
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;
}
答案 2 :(得分:0)
我有一些工作代码。我上课了。我记得当我看不到什么是好的班级时。现在,我不能不上课就刷牙。 :-)
我强迫自己做这些问题,以获得一些C#的经验。现在,我对C#有3件事。
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;
}