2016-03-24 5 views
-1

私はちょうどCプログラミングコースの紹介を始めました。そして、入力された開始年と終了年の間のすべての閏年を印刷するプログラムを作成しようとしています。Else Cの閏年を調べようとしているときにエラーが発生した場合

#include <stdio.h> 

int main (void) { 
    int start, finish, leap; 

    printf("Enter start year: "); 
    scanf("%d", &start); 

    printf("Enter finish year: "); 
    scanf("%d", &finish); 


    while (start <= finish) { 

     if ((start%400 == 0) || (start%4 == 0)) 
      else if (start%100 != 0) 
     } 

     printf("%d\n", start); 
     start = start + 1 



    return 0; 
} 

「期待される表現」エラーが続き、else if文の先頭を指しています。段階的に作業し、if文はすべての年を400または4で割り切れるように印刷します。

私は100で割り切れる数値を除外しようとしています...何がうまくいかないのかどうか?私たちはあなたのコードを比較する場合C11で述べた必要な構文、1として

+0

質問に 'else if'がありません。また、'} 'がありません。 –

+0

@R_Kappそれは...の前に'; 'がありません。 –

+0

@So uravGhosh:ああ、 'if'自体の中に...私はそれを見逃したので、そこに見えるとは思わなかった。欠落した '}'もないように見えます。ちょうど貧弱なインデントです。 –

答えて

0

あなたの問題はあなたが思うよりも簡単です。このコードを見てください:

if ((start%400 == 0) || (start%4 == 0)) 
      else if (year%100 != 0) 

これに続く文がないif文があります。

if ((start%400 == 0) || (start%4 == 0)) {} 
      else if (year%100 != 0) {} 

これはエラーを解決しますが、これらのコードブロックで何かしたいと思います!

+0

Davidは、 "それに続く文はありません"(式+ ';' =文)でなければなりません。 –

+0

あなたの答えをありがとう。あなたは正しいですが、これはエラーを修正しましたが、開始日と終了日の間のすべての年を印刷していました。まだロジックビットを試してみましたが、フォーマットエラーを指摘していただきありがとうございます:) –

0

、章§6.8.4.1

if (expression) statement else statement 

、それはif (expression)声明一部が欠落しています。ステートメントのブロックが明示的に指定されていない場合

FWIWは、次のステートメント(行)は、前の選択ステートメント(if)に関連ステートメントであると考えられます。 elseステートメントはifステートメントが存在しないので、ifボディの一部にすることはできません。

私はかなりのロジックをチェックしませんでしたが、私が思うに、あなたは、単に最初if式自体にelse if部分で述べた部分に参加する|| 1以上を使用することができます。

0

意味は以下のとおりです。

if <expr> <statment|block> [else <statement|block>] 

だから次if ((start%400 == 0) || (start%4 == 0))文がelse期待していません。

}は、さらに{と一致しません。

正しい文は次のようになります。

if ((start%400 == 0) || (start%4 == 0)) 
     printf("Hello\n"); 
    else if (year%100 != 0) 
     printf("world\n"); 
    else 
     printf("Oops~\n"); 
+0

ありがとう、私はここで間違っていた場所を見ることができます。プログラムは私が今話していることをやっています! –

0

David Hoelzerが必要な回答をくれました。 if文を整理する方法を考える方法を提案します。

一歩踏み込んで始めましょう。あなたは以下の条件をテストする必要があります:Aは、いずれかの真あるBまたはCが trueの場合

 
A: Year is divisible by 4 
B: Year is not divisible by 100 
C: Year is divisible by 400 

年はうるう年です。それぞれの条件を別々にテストしてみましょう。

if (A)     /* A is true */ 
{       /* AND */ 
    if (B)    /* B is true */ 
    { 
    // leap year 
    }      /* OR */ 
    else if (C)   /* C is true */ 
    { 
    // leap year 
    } 
    else 
    { 
    // not leap year 
    } 
} 
else 
{ 
    // not leap year 
} 

これは簡単で簡単ですが、少し冗長です。多くの方が良いでしょう

if (A)    /* A is true */ 
{      /* AND */ 
    if (B || C)  /* B OR C is true */ 
    { 
    // leap year 
    } 
    else 
    { 
    // not leap year 
    } 
} 
else 
{ 
    // not leap year 
} 

を、まだそれにはいくつかの冗長性を持っている:私たちは、とても似BCのためのテストを組み合わせることができます。私たちは、さらにテストを組み合わせることができます。

if (A && (B || C)) /* A is true AND B OR C is true */ 
{ 
    // leap year 
} 
else 
{ 
    // not leap year 
} 

&&||よりも優先順位が高いので、私たちは&&への単一のオペランドとしてB || Cを扱いたい場合は、私たちは一緒に明示的グループにそれらを持っています。また、&&||の両方が「短絡」です。左オペランドを評価した後に式の値を決定できる場合、右オペランドはまったく評価されません。 IOW、Aが偽の場合、BCも評価されません(偽&& xは偽です)。 Bがtrueの場合、Cは評価されません(true || xがtrue)。

は今、それはあなたがテストしたい、実際の式へAB、およびCを翻訳し、あなたはそれらのケースのために実行する文で// leap year// not leap yearを交換するだけです。


1年が400で割り切れる場合、それは100

0
while (start <= finish) 
    { 

     if ((start%400 == 0) && (start%4 == 0) && (start%100 !=0)) 
      printf("%d is a leap Year",start); 
     start++; 
    } 

によっても割り切れるだと、これは

を助けうるう変数は必要

希望はありません

関連する問題