我有一个任务,我应该编程一台简单的柜员机,它需要10美元的钞票,并交换100,50,20和10美元的钞票。应退还最少的账单。
该作业重点关注指针,我开始怀疑我所做的是好的编程风格,因为我相信我把指针指向一个指针(例如&*balance
)
这是一个很好的方法,还是应该重写它?
这是我的main
:
int main(void) {
int amount = 0; // Amount of 10 dollar bills
int balance = 0; // Total balance (in dollars)
int hundred = 0, fifty = 0, twenty = 0, ten = 0; // Amount of bills calculated
// Set number of 10 dollar bills
printf("Enter amount of 10 dollar bills: ");
scanf("%d", &amount);
// Set balance to user's 10 dollar bills
valueOfBills(&balance, &amount, BILL_VALUE_TEN);
// Calculate amount of bills for the different types
amountOfBills(&balance, &hundred, &fifty, &twenty, &ten);
}
在我的main
中,我致电amountOfBills()
,这是一个计算每个账单返回数量的程序:
void amountOfBills(int *balance, int *hundred, int *fifty, int *twenty, int *ten) {
/* To end up with the least amount of bills, we will start with bills with the largest value */
// Calculate amount of 100 dollar bills
amountOfBillsForBillValue(&*hundred, &*balance, BILL_VALUE_HUNDRED);
// Calculate amount of 50 dollar bills
amountOfBillsForBillValue(&*fifty, &*balance, BILL_VALUE_FIFTY);
// Calculate amount of 20 dollar bills
amountOfBillsForBillValue(&*twenty, &*balance, BILL_VALUE_TWENTY);
// Calculate amount of 10 dollar bills
amountOfBillsForBillValue(&*ten, &*balance, BILL_VALUE_TEN);
}
在amountOfBills()
我打电话给amountOfBillsForBillValue()
,它会计算要返还的特定账单(例如100美元账单)的数量:
void amountOfBillsForBillValue(int *storeAmount, int *balance, int billValue) {
/* We don't want to do anything if the balance is 0
therefore we will just return to avoid any calculations */
if (balance == 0) return;
// Calculate amount
*storeAmount = *balance / billValue;
// Set balance
*balance %= billValue;
}
在amountOfBills()
我使用&*balance
。我应该采取另一种方式吗?或者这样做是否正常?
答案 0 :(得分:3)
&*
互相取消。只需balance
即可为您提供&*balance
相同的服务,并减少两个字符。另一方面,如果你只是想记住它是有意义的,那么使用&*
不会造成任何伤害,并且编译器会很清楚它是一个noop。
然而,另一件事肯定是不好风格。您为各种类型的笔记使用显式参数的方式。如果当你完成这个时,有人来告诉你“我们已经增加了五百美元的钞票,而且我们不会费心填写二十美元钞票”,你将不得不修改一切。你应该概括一下。有数组值和计数数组......
答案 1 :(得分:2)
如果我是你,我会将这些参数分组在一个结构中:
typedef struct
{
int balance;
int hundred;
int fifty;
int twenty;
int ten;
} balance_t;
...
void amountOfBills(balance_t *balance);
这种方式只传递一个指向函数的指针,同样适用于另一个方法,避免函数有很多参数
答案 2 :(得分:1)
我相信我将指针指向指针(例如
&*balance
)
你不是。你取消引用指针,然后取结果的地址。
换句话说,写&*balance
与写balance
相同。我建议你使用后者。