2011-12-29 66 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) ]; 

當然,兩種解決方案都是針對這個問題本身,因爲它們不是如果構造,而是避免使用如果在第一種情況下,並且分支一般在第二種情況下。