我正在用KN King的C:现代方法学习C并且存在一个问题(Ch.06 - Prog.Project#4),它要求读者编写一个程序,根据交易计算经纪人的佣金直到交易金额是0.
这是作者的实现:
float commission, value;
printf("Enter value of trade: ");
scanf("%f", &value);
while (value != 0.0f) {
if (value < 2500.00f)
commission = 30.00f + .017f * value;
else if (value < 6250.00f)
commission = 56.00f + .0066f * value;
else if (value < 20000.00f)
commission = 76.00f + .0034f * value;
else if (value < 50000.00f)
commission = 100.00f + .0022f * value;
else if (value < 500000.00f)
commission = 155.00f + .0011f * value;
else
commission = 255.00f + .0009f * value;
if (commission < 39.00f)
commission = 39.00f;
printf("Commission: $%.2f\n\n", commission);
printf("Enter value of trade: ");
scanf("%f", &value);
}
Run Code Online (Sandbox Code Playgroud)
但我想的不是两次写printf和scanf,而是使用无限for循环,如下所示:
float value, commission;
for (;;) {
printf("Enter value of trade: ");
scanf("%f", &value);
if (value == 0)
break;
if (value < 2500)
commission = 30.00f + 0.017 * value;
else if (value < 6250)
commission = 56.00f + 0.0066 * value;
else if (value < 20000)
commission = 76.00f + 0.0034 * value;
else if (value < 50000)
commission = 100.00f + 0.0022 * value;
else if (value < 500000)
commission = 155.00f + 0.0011 * value;
else
commission = 255.00f + 0.0009 * value;
if (commission < 39.00f)
commission = 39.00f;
printf("Commission: %.2f\n", commission);
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,考虑到行数和避免重复是一个良好和必要的习惯,或者这是算法设计方法的一个坏方法?
提前致谢!
不要重复自己. 干对湿.
考虑到代码需要重新工作
// weak
printf("Enter value of trade: ");
scanf("%f", &value);
// better
printf("Enter value of trade: ");
fflush(stdout); // Insure text is printed before scanning
if (scanf("%f", &value) != 1) Handle_Error();
Run Code Online (Sandbox Code Playgroud)
代码的维护者是否愿意在1或2个地方更新?
用户I/O通常受益于辅助函数,并且具有明确的非重复编码循环条件.
int read_double(const char *prompt, double *y, ) {
printf("%s", prompt);
fflush(stdout);
int count = scanf("%f", y);
return count;
}
while (read_double("Enter value of trade: ", &value) == 1) {
if (value == 0)
...
printf("Commission: %.2f\n", commission);
}
Run Code Online (Sandbox Code Playgroud)
整if(),else if()...可以使用重新工作了.也许struct对于OP来说太新了,但重点是代码的发展和易于维护的编码是一个非常有价值的目标.
const struct {
double value;
double commission_base;
double commission_rate;
} tier[] = {
{ 2500.00, 30.00, 0.017 },
{ 6250.00, 56.00, 0.0066 },
{ 20000.00, 76.00, 0.0034 },
{ 50000.00, 100.00, 0.0022 },
{ 500000.00, 155.00, 0.0011 },
{ DBL_MAX, 255.00, 0.0009 } };
int n = sizeof tier / sizeof tier[0];
double commission = 0.0;
for (int i = 0; i < n; i++) {
if (value < tier[i].value) {
commission = tier[i].commission_base + tier[i].commission_rate * value;
break;
}
}
#define COMMISSION_MIN 39.00
if (commission < COMMISSION_MIN) {
commission = COMMISSION_MIN;
}
Run Code Online (Sandbox Code Playgroud)