我有一个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");
}
}
正如您所看到的,最后一个条件并不完全有效。我应该使用什么类型的控制结构?别的?
非常感谢。
答案 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)
只是为了它,而不是推荐它,因为它可能更难以阅读,因为它滥用从bool
到int
的转换:
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 ,而分支一般在第二种情况下。