通过使用无限循环避免重复行,是好还是坏?

Sai*_*aid 1 c loops

我正在用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)

我的问题是,考虑到行数和避免重复是一个良好和必要的习惯,或者这是算法设计方法的一个坏方法?

提前致谢!

chu*_*ica 6

不要重复自己. 干对湿.

考虑到代码需要重新工作

// 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)