2011-12-29 84 views
1

我有一个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"); 
    } 
} 

正如你所看到的,最后的条件完全不是那么回事。我应该使用什么类型的控制结构?其他?

非常感谢。

+3

你是什么意思“你可以看到?”你展示了代码,但没有输出。最后的'if'语句从这里看起来没问题。 – 2011-12-29 21:29:48

+0

'if'不形成循环。一个循环是一个闭合的东西,其中开始和结束在某个时刻相遇。画一个顺序图,你会看到。顺便说一句,为这个代码绘制一个序列图。 – thiton 2011-12-29 21:31:20

+0

@DanFego我需要if语句覆盖其他两个if语句时,它是真实的,所以才有“合”印,而不是 “Hoppity” “HopHop” ,“跳” – 2011-12-29 21:31:32

回答

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"); 
    } 
} 
+0

@ Number7even如果您发现上述答案是正确的,请点击答案旁边的勾号来确认。谢谢! – 2011-12-30 04:21:51

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"); 
    } 
} 
+0

功能强大,没有。优雅,是的。 – Dave 2011-12-29 22:02:25

+0

@Dave:我不会真的叫*优雅*,对我来说,阅读和解析比人类的if * else *更难(即你需要检查所有的条件,其余的* *知道*他们是独家的,这是没有两个信息将被打印) – 2011-12-29 23:05:54

+0

@DavidRodríguez-dribeas他说'else'更强大。我在说'else'更优雅 – Dave 2011-12-30 01:13:25

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 -loop任何控制结构都:

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]); 

该解决方案是略微insa ne这个例子,但是它展示了你如何做不同的事情(当编写代码的时候,你永远不会在一个函数中拥有一定数量的分支路径(过度的编码约定......))。

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) ]; 

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