• 締切済み

エラー C言語 プログラミングについて

#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行目に式の構文エラーが出るんですが どうしてでしょうか?? 間違ってない気がするんですけど。。

みんなの回答

  • S117
  • ベストアンサー率40% (18/45)
回答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); と書けます。

tomato1414
質問者

お礼

iが1になってたのと関数内のelse if文がおかしかったから上手く行かなかったんですね>< else ifは順番に動作していくから先に判定が真になったものから処理を行うということで、2400のときも先に0を返して終了していたということですね。。 最後の条件をまとめられるのも参考になりました。 詳しく教えてくださってありがとうございました^^

回答No.6

>int year,i=1; i=0; なのでは? それと、 2400年と2800年が閏年になっていません。

tomato1414
質問者

補足

上の方とは別の方とは気づかず、一緒にお礼行っちゃいました>< i=1は凡ミスでほんとに反省っすね。。 どうもありがとうございました! 閏年の件も解決できました^^

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.5

相変わらず leapYear がおかしいです. 2000年は閏年ですが, この関数で「閏年」と判定できますか? あと, 気付かなかったんだけど main で for ループの中に return を入れたらだめ.

tomato1414
質問者

補足

でも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になるんです。。 なんでかわかりますかね??><

  • 1108435
  • ベストアンサー率43% (94/217)
回答No.4

#2です。もうひとつ関数の呼び出しがこれでは異常です、独立させましょう。 year = leapyear(i); printf("%d leap = %d\n", i, year); どうしてyearにiを代入しているのかわかりません。

tomato1414
質問者

補足

あーもうダメダメですいません>< 下記の方でも教えてくださってありがとうございます!!

  • 1108435
  • ベストアンサー率43% (94/217)
回答No.3

forループの書き方間違えてますね、 for(i=2000; i<=2999; i++) { が正しいです。i=2000; i=2999;ではiのループ条件ができていません。

tomato1414
質問者

補足

#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; } } 新しくプログラミングしたんですけど、これでも動かないのはなんででしょうか??。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

for もおかしいけどね. ああ, leapYear もおかしい.

tomato1414
質問者

補足

指摘ありがとうございました(>_<) いやーダメダメだぁ。。

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.1

> printf("%d leap = %d \n",i,leapYear(int year)); printf("%d leap = %d \n",i,leapYear(year)); intが余計なのでは。

関連するQ&A

  • C言語習いはじめです

    大学の講義でC言語を習い始めたのですが、if文でコンパイルするとどうしても解決できないエラーが起こってしまいます。 文の意味は 「4で割り切れる年は”閏年”また、400でも割り切れる年も”閏年”と表示する。100で割り切れる年は”平年”と表示する」 というものです。値は2100で指定しています。 #include <stdio.h> main() { int y; printf(" y=2100; "); { if(y%400:0) { printf("a leap year \n"); {/* 閏年 */} } else if(y%100:0) { printf("a common year \n"); {/* 平年 */} } else if(y%40:0) { printf("a leap year \n"); {/* 閏年 */} } else { printf("a common year \n"); {/* 平年 */} } } return 0; } これをコンパイルすると、どうしても 「エラー E2377 ”ファイル名” 5: If文に ) がない(関数 main)」 と出てきてしまいます。 残るこのエラーだけが解決できません。どなたか、間違っている点がわかる方はいませんでしょうか。お願いします。

  • C言語プログラミングについて

    #include <stdio.h> int main(void) { printf("hello,world\n"); } □■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■ #include <stdio.h> int main(void) { printf("hello"); printf(",world"); printf("\n"); } 上の2つのプログラムをコンパイルするとどのような違いが生じるんですか??printfってどんな働きをするんですか?

  • C言語 実行エラー 10000日先が表示されない 

    今10000日先後の年、月、日を求めていて下のプログラムを 考えたんですけど、コンパイルは通るんですが結果がうまくいきません↓ どこがおかしいですか? #include<stdio.h> int leapYear(int); int Date(int,int,int,int); int main(void){ int year,i=0,month,date,date2=10000,emp=0; printf("年>>"); scanf("%d",&year); printf("月>>"); scanf("%d",&month); printf("日>>"); scanf("%d",&date); Date(year,month,date,date2);//date2から各月の日数を引いていく printf("year=%d month=%d date=%d date2=%d \n",year,month,date,date2); return 0; } int leapYear(int year){ //うるう年を求める if(year%400==0){ return 1; } else if(year%4==0 && year%100!=0){ return 1; } else return 0; } int Date(int y,int m,int d,int d2){ for(;;y++){ if(d2<0) return y,m,d,d2; for(;m<=12 || d2>=0;m++){ if(leapYear(y)==1){ if(m==4||m==6||m==9||m==11){ d2-(30-d); } else if(m==2) d2-(29-d); else d2-(31-d); } else if(m==4||m==6||m==9||m==11){ d2-(30-d); } else if(m==2) d2-(28-d); else d2-(31-d); } } }

  • C言語 関数問題

    西暦年yearを引数として受け取り,閏年かどうかの判定結果を戻り値として返す関数leap_year()を作成せよ. ただし,leap_year()は,閏年の場合は1を返し,そうでない場合は0を戻り値として返すものとする. 提出するプログラムは,関数leap_year()だけでなく,メイン関数main()も含む下記プログラムを完成させる形で作成する #include <stdio.h> /* ここに関数leap_year()のプロトタイプ宣言を記述する */ int main() { int i, year[3]; for (i=0; i<3; i++) { printf("西暦年を入力してください"); scanf("%d", &year[i]); if (leap_year(year[i]) == 1) { printf("閏年です.\n"); } else { printf("閏年ではありません.\n"); } } } /* ここに関数leap_year()を定義する */

  • C言語について

    次のような問題です。 問 自然数nを入力し、nを3で割って割り切れるかどうかを判定し結果を表示する。「割り切れる」、「1余る」、「「2余る」のいずれかが入るものとする。 このようなものをつくりました。 #include<stdio.h> int main(void) { int n; printf("自然数:"); scanf("%d",&n); if(n==0){ printf("割り切れる\n"); }else if(n==1){ printf("1余る\n"); }else{ printf("2余る"); } return(0); } これで合っているかよろしくお願いします。

  • 困ってます…nCrを求めるC言語プログラミング

    nCr、つまりn個のうちr個を取り出すときの場合の数を求めるプログラミングを作りたいのですが、どうもうまくいきません。 関数combinationを作って求めるという指定もあり、自分で出来るとこまで作ってみたのですが訳がわからなくなってしまい、かなり困っています…; コンパイルは出来るのですが実行してもセグメントエラーが出るばかりで… すみませんがご指摘していただけないでしょうか…? #include<stdio.h> //階乗を計算する関数 int fact(int num){ int i; if(num < 0){ return -1; } else if(num == 0){ return 1; } else if(num == 1){ return 1; } else { i = num * fact(num - 1); return i; } } //コンビネーションを計算 int combination(int n, int r) { int fact(int num); int i; i=fact(n)/fact(r)/fact(n-r); return combination(n-1, r-1)-combination(n,r-1); } int main(void) { int n, r; while ( printf("n r を入力して下さい。"), scanf("%d%d", &n, &r) == 2 ) { printf("nCr(%d,%d)=%d\n", n, r, combination(n, r)); } return 0; }

  • c言語についての質問です。

    #include<stdio.h> int main(void){ int a; printf("1文字たいぷしてください。\n"); scanf("%d",&a); if(a>=65 && a<=90){ printf("大文字です。\n"); } else if(a>=97 && a<=122){ printf("小文字です。\n"); } else{ printf("大文字でも小文字でもありません\n"); } return 0; } このプログラムは正しくなくて、 intをchar %dを%cにかえなければなりません。 なぜintはダメなんでしょうか? できれば丁寧に教えてください。 お願いします。

  • 再帰について(C言語)

    今、再帰処理を勉強しています。 しかし、以下のプログラムがどうしても理解できません。 流れ的には一体どういう手順になっているのでしょうか? return i * fact( i - 1 )の部分を考えると頭が こんがらがってしまいます。 #include <stdio.h> int main( void ){  printf("5の階乗は %d です", fact(5) );  return 0; } int fact( int i ){  if( i == 1 ) return 1;  else return i * fact( i - 1 ); } --------実行結果---------- 5の階乗は 120 です

  • c言語のフローチャートについての質問です

    #include <stdio.h> int main (void) { int n; for (n=1900; n<2000; n++) { if (n%4==0 && n%100!=10) printf ("%d",n); else if(n%400==0) printf ("%d",n); } printf("\n"); return 0; } をどなたかフローチャートに直してください JIS規格のものでお願いします

  • C言語で分からないところがあるのですが……

    C言語で分からないところがあるのですが…… すみません。C言語を学習していてつまづいたので、皆さんの意見を聞きたいと思います。 現在、カレンダーを表示するプログラムをつくっています。 Yearとmonthをユーザが入力すると、その年その月のカレンダーが出るという算段です。(画像貼っておきます。ソースコードは下) これはできました。 これをいじって、Yearをユーザから受け取ると、その年の1月から12月までのカレンダーがば~っと表示されるようにしろ、と言われました。 Yearとmonthを受け取って書くやつは友人の助けを得ながらなんとかかけましたが、もう無理です。多分、for文を使うんだと思うんですが……助けてください! #include <stdio.h> int dayofweek(int year, int month); int daysinmonth(int year, int month); int daysinyear(int year); void showcal(int dow, int days); int main(void) { int year, month; int dow; int dim; printf ("Year?: "); scanf ("%d", &year); printf ("Month?: "); scanf ("%d", &month); dow = dayofweek(year, month); dim = daysinmonth(year, month); showcal(dow, dim); return 0; } void showcal (int dow, int days) { int i, j, d; printf ("Su Mo Tu We Th Fr Sa\n"); d = 1; for (i = 0; i < dow; i++) { printf (" "); } for (; i < 7; i++) { printf (" %d ", d); d++; } printf("\n"); for (j = 0; d <= days; j++) { for (i = 0; i < 7 && d <= days; i++) { if (d < 10) printf (" %d ", d); else printf ("%d ", d); d++; } printf("\n"); } } int daysinmonth( int year, int month) { int dim; dim = 31; if (month == 4 || month == 6 || month == 9 || month == 11) dim = 30; if (month == 2) { if ( (year % 4 == 0 && year % 100 != 0) || year % 400 == 0) dim = 29; else dim = 28; } return dim; } int daysinyear( int year) { int diy; if ( (year % 4 == 0 && year % 100 != 0) || year % 400 == 0) diy = 366; else diy = 365; return diy; } int dayofweek (int year, int month) { int dow; int days; int y, m; if (year >= 2000) { days = 0; for ( y = 2000; y < year; y++ ) { days = days + daysinyear(y); } for ( m = 1; m < month; m++ ) { days = days + daysinmonth(year, m); } dow = (6 + days) % 7; } else { days = 0; for ( m = month; m <= 12; m++ ) { days = days + daysinmo

専門家に質問してみよう