#include<stdio.h>
int leapYear(int);
int main(void){
int year,i;
for(i=2001;i=2999;i++){
year=i;
printf("%d leap = %d \n",i,leapYear(int year));
return 0;
}
}
int leapYear(int year){
if(year%100==0){
return 0;
}
else if(year%400==0){
return 1;
}
else if(year%4==0 && year%100!=0){
return 1;
}
}
をコンパイルすると11行目に式の構文エラーが出るんですが
どうしてでしょうか??
間違ってない気がするんですけど。。
No.1
- 回答日時:
> printf("%d leap = %d \n",i,leapYear(int year));
printf("%d leap = %d \n",i,leapYear(year));
intが余計なのでは。
No.3
- 回答日時:
forループの書き方間違えてますね、
for(i=2000; i<=2999; i++) {
が正しいです。i=2000; i=2999;ではiのループ条件ができていません。
この回答への補足
#include<stdio.h>
int leapYear(int);
int main(void){
int year;
for(year=2001;year<=2999;year++){
printf("%d leap = %d \n",year,leapYear(year));
return 0;
}
}
int leapYear(int year){
if(year%100==0){
return 0;
}
else if(year%400==0){
return 1;
}
else if(year%4==0 && year%100!=0){
return 1;
}
}
新しくプログラミングしたんですけど、これでも動かないのはなんででしょうか??。
No.4
- 回答日時:
#2です。
もうひとつ関数の呼び出しがこれでは異常です、独立させましょう。year = leapyear(i);
printf("%d leap = %d\n", i, year);
どうしてyearにiを代入しているのかわかりません。
No.5
- 回答日時:
相変わらず leapYear がおかしいです. 2000年は閏年ですが, この関数で「閏年」と判定できますか?
あと, 気付かなかったんだけど main で for ループの中に return を入れたらだめ.
この回答への補足
でも2001~2999までを判定したいんで2000は除いてて良いんですよね。。
あとreturnの位置がおかしかったので変更しました。
ありがとうございます!
だいぶ上手く行ってもう一歩てとこなんですが、現在のソースは
#include<stdio.h>
int leapYear(int);
int main(void){
int year,i=1;
for(year=2001;year<=2999;year++){
printf("%d leap = %d \n",year,leapYear(year));
if(leapYear(year)==1){
i++;
}
printf("%d 回です\n",i);
}
return 0;
}
int leapYear(int year){
if(year%100==0){
return 0;
}
else if(year%400==0){
return 1;
}
else if(year%4==0 && year%100!=0){
return 1;
}
else return 0;
}
こんな感じでなんですが、結果が「242回です」になるはずなのに241になるんです。。
なんでかわかりますかね??><
No.7ベストアンサー
- 回答日時:
2400年と2800年の判定もおかしいですよ。
判定してるプログラムを日本語で書いて、
そのネスト構造をインデントして表記すると以下の通りです。
--- start
100で割りきれる // a
閏年でない // 1
そうでない
400で割り切れる // b
閏年である // 2
そうでない
4で割り切れてかつ、100で割れない // c
閏年である // 3
そうでない
閏年でない // 4
--- end
まず、400で割り切れる数は必ず100で割り切れます。
たとえば、2400年は閏年のはずですが、aの判定で1に行ってしまうので、閏年になりません。
ここが一つ目の問題ですが、もう一つ問題があります。
aの判定により、100で割り切れる数はcの判定に到達しません。
しかし、どういうわけか100で割り切れないという条件があります。
実は最初のaの判定がいらないのです。
if(year%400==0){
return 1;
}
else if(year%4==0 && year%100!=0){
return 1;
}
else return 0;
どうにもelse ifの動作を正しく理解していないのではないでしょうか。
else if文と通称されるこの書き方ですが、実はCにそんなものはありません。単にif文が再帰的に記述されているだけです。
よくswitchとの関連が説明されますが、両者には大きな違いがあります。
else ifは先頭から順に判定していき、真になったらそのブロックを実行します。そして、残りのブロックは実行されません。
つまり、一番最初に真になったifのブロックのみ実行されます。
このため、順序を入れ替えると動作が変わります。
一方、switch文はcaseに書く整数値は必ずユニークの必要があります。真になるcaseは常に一つです。結果、breakを省略しない限り、順序を入れ替えても動作は同じです。
なお、このプログラムは
return year % 400 == 0 || (year % 4 == 0 && year % 100 != 0);
と書けます。
iが1になってたのと関数内のelse if文がおかしかったから上手く行かなかったんですね><
else ifは順番に動作していくから先に判定が真になったものから処理を行うということで、2400のときも先に0を返して終了していたということですね。。
最後の条件をまとめられるのも参考になりました。
詳しく教えてくださってありがとうございました^^
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# プログラムの時、フローチャートはどうなりますか?図でお願いします。 int main(void) { 1 2022/10/01 22:45
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# プログラミングのペーパーテスト 実行結果を表示せよ #include <stdio.h> int h 1 2022/07/09 15:27
- C言語・C++・C# C言語でif文が予想と違う動きをする件について7 4 2023/03/20 00:26
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
2の補数を計算するプログラム
-
intとlongは同じ?
-
再起呼び出しの回数をカウント...
-
C言語で%を使わない余りの出し方
-
迷路を脱出する経路探索プログ...
-
画像の拡大・縮小
-
分数の足し算をさせるプログラ...
-
C言語で簡単なパックマンゲーム...
-
C++で表を作成したいのです ...
-
条件が多い場合
-
複数の共有メモリの作成
-
ヒストグラム均等化処理プログラム
-
3のつく数と3の倍数を表示 C言語
-
argvのNULLチェック
-
乱数で交互に偶数、奇数が、、、。
-
プログラミングに関して
-
OpenCVによる4値化について
-
再帰処理をループ処理に変換
-
16bitで乱数を生成する方法
-
C++ Debug Errorについて教えて
おすすめ情報