如果需要构建建议

时间:2011-12-29 21:28:31

标签: c++ c loops modulus

我有一个for循环,我在其中放置了几个if语句。这些条件的目的是检查数字的可分性,如果数字可以被3整除则输出一个字符串。如果数字可以被5整除,则输出另一个字符串。但是,如果数字可以被3和5整除,则会输出完全不同的字符串而不是其他字符串。

这是我的代码:

for (i = 1; i <= file_int; i++){
     if (i % 3 == 0) {
        printf("Hoppity \n");
    }
    if (i % 5 == 0) {
        printf("Hophop \n");
    }
    if (i % 5 == 0 && i % 3 == 0) {
        printf("Hop \n");
    }   
}

正如您所看到的,最后一个条件并不完全有效。我应该使用什么类型的控制结构?别的?

非常感谢。

4 个答案:

答案 0 :(得分:3)

for (i = 1; i <= file_int; i++){
    if (i % 5 == 0 && i % 3 == 0) {
        printf("Five and three\n");
    } else if (i % 3 == 0) {
        printf("Three\n");
    } else if (i % 5 == 0) {
        printf("Five\n");
    } else {
        printf("None of the conditions passed\n");
    }
}

答案 1 :(得分:1)

我会使用else-ifs并告诉我们

这一事实

(i % 5 == 0 && i % 3 == 0) <=> (i % 15 == 0)

for (i = 1; i <= file_int; i++){
  if (i % 15 == 0)
    printf("Hop \n");
  else if (i % 3 == 0)
    printf("Hoppity \n");
  else if (i % 5 == 0)
    printf("Hophop \n"); 
}

当然你也可以在不使用除for - 循环之外的任何控制结构的情况下离开:

const char* values[15] = {"Hop \n", "", "", "Hoppity \n", "", 
                          "Hophop \n", "Hoppity \n", "", "", "Hoppity \n", 
                          "Hophop \n", "", "Hoppity \n", "", ""};
for (int i = 1; i <= 100; i++) 
  printf(values[i % 15]);

对于这个例子来说,这个解决方案有点疯狂,但是它显示了你可以用不同的方式做事情(当编写代码时,你不会在一个函数中拥有超过一定数量的分支路径(过度编码),这并不是那么牵强。约定...))。

答案 2 :(得分:0)

另一种解决方案,更接近原始代码。虽然else解决方案确实更有效(并且更优雅)。

for (i = 1; i <= file_int; i++){
    if (i % 3 == 0 && i % 5 != 0) {
        printf("Hoppity \n");
    }
    if (i % 5 == 0 && i % 3 != 0) {
        printf("Hophop \n");
    }
    if (i % 5 == 0 && i % 3 == 0) {
        printf("Hop \n");
    }   
}

答案 3 :(得分:0)

只是为了它,而不是推荐它,因为它可能更难以阅读,因为它滥用从boolint的转换:

int msg = (i % 3 == 0) + 2*(i % 5 == 0);
switch ( msg ) {
case 3:
   cout << "Multiple of 3 and 5";
case 2: 
   cout << "Multiple of 5";
case 1:
   cout << "Multiple of 3";
}

可以进一步浓缩为:

const char* msgs[] = { "", "Multiple 3", "Multiple 5", "Multiple 3 and 5" };
cout << msgs[ (i%3==0) + 2*(i%5==0) ];

当然,这两个解决方案都是针对这个问题的,因为它们不是 if 构造,而是避免在第一种情况下使用 if ,而分支一般在第二种情况下。