• ベストアンサー

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

質問者が選んだベストアンサー

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

>結果がうまくいきません どのように、うまくいかないのでしょうか?

tomato1414
質問者

補足

メインの最後の出力が最初に標準入力した値から変わってないんですよ。。

その他の回答 (7)

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

>if(d2<0) return y,m,d,d2; > >??コンパイラはエラーかワーニング出さなかった? エラーにはなりません。 この場合にカンマはカンマ演算子として扱われるので、 if(d2<0) return d2; と書くのと一緒ですね。 >結局 Dateメソッド内で代入文が一つもないことが大問題。 y++とかm++とかがあるので、変数の値が変化しないわけでもないですが、 d2の値が変化しないので、関数から戻っても来ないはずですよね。 だとすると、 >メインの最後の出力が最初に標準入力した値から変わってないんですよ。。 メインの最後の出力はそもそも実行されないわけで、質問者さんの話と一致しないように思うのだけれど、読み違いかなぁ・・・。

  • prophetok
  • ベストアンサー率44% (13/29)
回答No.7

#2,#6の補足ね だれかフォローしてくると思っていたけど、だれもフォローしないので。 まず if(d2<0) return y,m,d,d2; ??コンパイラはエラーかワーニング出さなかった? 何をリターンしたいか分からない。 致命的な点 一例として d2-(30-d); これで何をしたいの? 変数に何の影響も及ぼさないのは理解しましょう。 d2-=30-d; なら分かるけど、意図した動作かどうかは自分で考える。 結局 Dateメソッド内で代入文が一つもないことが大問題。 参照やポインタの話は二の次です。 まずは、プログラミングの基本を理解して次の段階に進みましょう。

  • prophetok
  • ベストアンサー率44% (13/29)
回答No.6

>そして、一生懸命に書き換えたコピーは、関数から帰って来る寸前に消滅してしまいます。 実は書き換えてすらいないんだよね。

回答No.5

引数の「値渡し」と「参照渡し」について学習しましょう。 C言語は、特に指定しない限り「値渡し」なので、渡された引数をどんなに書き換えても、呼び出し元の変数は書き換わりません。 関数に渡されてきた引数は、言ってみれば「元の変数のコピー」なのです。どんなにコピーを書き換えても、原本は書き換わりません。 そして、一生懸命に書き換えたコピーは、関数から帰って来る寸前に消滅してしまいます。

tomato1414
質問者

補足

なるほどですね。値渡しと参照渡しの違いがわかりました。 この場合はメインの変数値を変えたいわけだから参照渡しなんですね。。

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

C++ なら参照でいいけど, C ならアドレスを渡すことになりますよね>#2. ところでこの Date って何を返すんだろ....

tomato1414
質問者

補足

返す値はy,m,d,d2ですね! でも帰ってこないんですよ。。

  • prophetok
  • ベストアンサー率44% (13/29)
回答No.3

#2だけではなく、Dateないの処理が全くだめですね。 せめて、ちゃんとした記述ができるようになってから質問しましょう。

  • prophetok
  • ベストアンサー率44% (13/29)
回答No.2

>メインの最後の出力が最初に標準入力した値から変わってないんですよ。。 そりゃ int Date(int y,int m,int d,int d2) では変わりませんよ。 int Date(int& y,int& m,int& d,int& d2) の様に参照変数とする、必要あり。

tomato1414
質問者

お礼

そうでしたか。。 まず一つ目のエラー発見ありがとうございます!

関連するQ&A