2011-12-29 2 views
1

私はいくつかのif文を置いたforループを持っています。これらの条件の目的は、数値の除数をチェックし、その数値が3で割り切れる場合は文字列を出力することです。数値が5で割り切れる場合は、別の文字列が出力されます。ただし、数字が3と5の両方で割り切れる場合は、別の文字列ではなく、まったく異なる文字列が代わりに出力されます。ここでIf-construct adviceが必要です

は私のコードです:

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'文はここからは大丈夫です。 –

+0

'if'はループを形成しません。ループは、開始点と終了点が何らかの点で合流する*閉じたものです。シーケンス図を描くと、あなたが表示されます。ところで、このコードのシーケンス図も描きます。 – thiton

+0

@DanFego私は、ステートメントは、他の2つを上書きする場合は、代わりに 「Hoppity」 「HopHop」 で、印刷されたので、唯一の「ホップ」、trueの場合ステートメントは、これは「フィズと呼ばれる –

答えて

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上記の答えが正しいものであれば、その答えの横にあるチェックマークをクリックして確認してください。ありがとう! –

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

+0

@Dave:私は実際には*エレガントな*と呼んではいませんが、人間が* if-else *同等のものを読み、解析することは難しいです(つまり、残りのものに対してすべての条件をチェックする必要があります*彼らは排他的です、それは2つのメッセージは印刷されません) –

+0

@DavidRodríguez-dribeas彼は 'else'がもっと強力だと言いました。私は 'else'がよりエレガントであると言っています – Dave

1

私はelse-ifsを使用して

(i % 5 == 0 && i % 3 == 0) <=> (i % 15 == 0)という事実を私たちになるだろう:あなたもまったくfor -loop以外の任意の制御構造を使用せずに逃げることができます。もちろん、

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

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

その解決策はわずかですこれは、あなたが物事を別々にする方法を示しています(そして、1つの関数で決まった数の分岐パスを超えることは決してありません。

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) ]; 
もちろん

、両方のソリューションは、彼らがかの構造ではないので、質問自体に反対しているのではなく、場合の使用を避ける最初のケースではブランチが一般的です。