- ベストアンサー
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); } } }
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
>結果がうまくいきません どのように、うまくいかないのでしょうか?
その他の回答 (7)
- titokani
- ベストアンサー率19% (341/1726)
>if(d2<0) return y,m,d,d2; > >??コンパイラはエラーかワーニング出さなかった? エラーにはなりません。 この場合にカンマはカンマ演算子として扱われるので、 if(d2<0) return d2; と書くのと一緒ですね。 >結局 Dateメソッド内で代入文が一つもないことが大問題。 y++とかm++とかがあるので、変数の値が変化しないわけでもないですが、 d2の値が変化しないので、関数から戻っても来ないはずですよね。 だとすると、 >メインの最後の出力が最初に標準入力した値から変わってないんですよ。。 メインの最後の出力はそもそも実行されないわけで、質問者さんの話と一致しないように思うのだけれど、読み違いかなぁ・・・。
- prophetok
- ベストアンサー率44% (13/29)
#2,#6の補足ね だれかフォローしてくると思っていたけど、だれもフォローしないので。 まず if(d2<0) return y,m,d,d2; ??コンパイラはエラーかワーニング出さなかった? 何をリターンしたいか分からない。 致命的な点 一例として d2-(30-d); これで何をしたいの? 変数に何の影響も及ぼさないのは理解しましょう。 d2-=30-d; なら分かるけど、意図した動作かどうかは自分で考える。 結局 Dateメソッド内で代入文が一つもないことが大問題。 参照やポインタの話は二の次です。 まずは、プログラミングの基本を理解して次の段階に進みましょう。
- prophetok
- ベストアンサー率44% (13/29)
>そして、一生懸命に書き換えたコピーは、関数から帰って来る寸前に消滅してしまいます。 実は書き換えてすらいないんだよね。
- chie65536(@chie65535)
- ベストアンサー率44% (8742/19841)
引数の「値渡し」と「参照渡し」について学習しましょう。 C言語は、特に指定しない限り「値渡し」なので、渡された引数をどんなに書き換えても、呼び出し元の変数は書き換わりません。 関数に渡されてきた引数は、言ってみれば「元の変数のコピー」なのです。どんなにコピーを書き換えても、原本は書き換わりません。 そして、一生懸命に書き換えたコピーは、関数から帰って来る寸前に消滅してしまいます。
補足
なるほどですね。値渡しと参照渡しの違いがわかりました。 この場合はメインの変数値を変えたいわけだから参照渡しなんですね。。
- Tacosan
- ベストアンサー率23% (3656/15482)
C++ なら参照でいいけど, C ならアドレスを渡すことになりますよね>#2. ところでこの Date って何を返すんだろ....
補足
返す値はy,m,d,d2ですね! でも帰ってこないんですよ。。
- prophetok
- ベストアンサー率44% (13/29)
#2だけではなく、Dateないの処理が全くだめですね。 せめて、ちゃんとした記述ができるようになってから質問しましょう。
- prophetok
- ベストアンサー率44% (13/29)
>メインの最後の出力が最初に標準入力した値から変わってないんですよ。。 そりゃ int Date(int y,int m,int d,int d2) では変わりませんよ。 int Date(int& y,int& m,int& d,int& d2) の様に参照変数とする、必要あり。
お礼
そうでしたか。。 まず一つ目のエラー発見ありがとうございます!
補足
メインの最後の出力が最初に標準入力した値から変わってないんですよ。。