- ベストアンサー
C言語でのカレンダーの表示について質問です
- VisualStudioを使ってC言語でコンソールアプリケーションのカレンダーを作成しています。
- 起動時にカレンダー表示するのはできているんですが、Rでカレンダーを進めていくと12月の次が13月、次が0月、その次が1月となってしまい、日付も上手く表示されません。
- また、L,D,Uでも同じようになります。A,Bで年を変えると日付が正確に表示されません。これらを正しく表示させる方法を教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
とりあえず、CalenderSet()の月判定が間違っていますね。 if( curr_mon > 12 ) は、if( month > 12 ) ではないですか? 1月未満か、の判定も同じく。 また、ループの終了条件はループする毎に評価されますから、このfor( month = curr_mon-1; month <= curr_mon+1; month++ )の終了条件を作る材料である、curr_monをループ内で変更してしまうと、終了条件も変わりますよ? そして、ループカウンタでもあるmonth=1や=12とやってしまうと、今度は1や12からカウントを始めますので、意図しない月数表示されたり、前後分合わせて3ヶ月のうち1~2月分しか表示しない、等の動作を行う気もします。 for()ループのカウンタ(ここではmonth)と終了条件に参照する変数(ここではcurr_mon)は、変更しないで、テンポラリを作成したほうが良いと思います。 void CalenderSet( void ) { int dispmon; //monthの代わり int dispyear; for( month = curr_mon-1; month <= curr_mon+1; month++ ){ dispmon = month; //表示したい月をdispmonにセット dispyear = curr_year; if( dispmon > 12 ){ dispmon -= 12; //今回は+-1月なので、dispmon = 1でもOK。2月以上前後に対応したかったら12を引く dispyear = curr_year + 1; } if( dispmon < 1 ){ dispmon += 12; //上と同じ dispyear = curr_year - 1; } // その月が何日まであるか求めて代入 nday = LaepYear( dispyear, dispmon ); //変更前→curr_year, month); // その月が何曜日から始まるか day_of_week = Zeller(dispyear, dispmon, 1 ); //変更前→ curr_year, month, 1); nweek = 0; 以降省略。必要に応じて、変更してください。 変な動作をする原因は、このCalenderSet()で、中央の年月を記憶する変数(curr_year, curr_mon)を変更してしまっているということではないでしょうか? curr_monやcurr_yearは、中央に表示したい年月であり、キー操作によって”のみ”移動させたいのでしょうから、キー操作以外で変更してはいけません。 表示するために前後の年月が必要なのであれば、それを記憶するためのローカル変数(dispyear, dispmon)を作って、それにコピーした後で、前後の年月にするための変更をローカル変数に行うべきです。 これ以外の部分は見てないのですが、とりあえずここを変更してみて、デバックを進めてみてはどうでしょう?
その他の回答 (2)
- wormhole
- ベストアンサー率28% (1626/5665)
グローバル変数使わずに1月分のカレンダー表示から始めた方がいいと思う。
お礼
現在の月から始めたかったんですけど、1月分からの方が考え方は簡単ですよね。 それと、たまに日数がきちんと表示されないバグがグローバル変数をやめることで直りました! ありがとうございました。
- Tacosan
- ベストアンサー率23% (3656/15482)
症状を正確に書いてほしいんだけどなぁ.... ひょっとして表示される 3か月の中央が 12月だと「その次の月」が「13月」になってたりしませんか? 変数の使い分けが変だと思う.
補足
すみません、字数制限の関係で詳しく書けませんでした。 具体的には一ヶ月ずつ進めていくと、おっしゃる通り以下のような感じになります。 2012 11月 2012 12月 2012 13月 日 月 火 水 木 金 土 日 月 火 水 木 金 土 月 火 水 木 金 土 1 2 3 1 4 5 6 7 8 9 10 2 3 4 5 6 7 8 11 12 13 14 15 16 17 9 10 11 12 13 14 15 18 19 20 21 22 23 24 16 17 18 19 20 21 22 25 26 27 28 29 30 23 24 25 26 27 28 29 30 31 ESCキーで終了 2013 0月 2013 1月 2013 2月 日 月 火 水 木 金 土 日 月 火 水 木 金 土 日 月 火 水 木 金 土 114 4 57 13 24 4 1 2 3 4 5 1 2 112 4 144 6 7 8 9 10 11 12 3 4 5 6 7 8 9 13 14 15 16 17 18 19 10 11 12 13 14 15 16 20 21 22 23 24 25 26 17 18 19 20 21 22 23 27 28 29 30 31 24 25 26 27 28 ESCキーで終了 ----------------------------------------------------------- 一年後にすると 2010 4月 2010 5月 2010 6月 日 月 火 水 木 金 土 日 月 火 水 木 金 土 日 月 火 水 木 金 土 1 2 3 4 1 2 3 1 2 3 4 5 6 1 1 2 3 4 5 4 5 6 7 8 9 10 2 3 4 5 6 7 8 6 7 8 9 10 11 12 11 12 13 14 15 16 17 9 10 11 12 13 14 15 13 14 15 16 17 18 19 18 19 20 21 22 23 24 16 17 18 19 20 21 22 20 21 22 23 24 25 26 25 26 27 28 29 30 30 23 24 25 26 27 28 29 27 28 29 30 30 29 30 30 31 ESCキーで終了 と、表示されてしまいます。 >変数の使い分けが変だと思う. 具体的にどこの変数の使い方がおかしいのでしょうか? ご教授くだされば嬉しいです。
お礼
遅くなって申し訳ありません。 丁寧で分かりやすいご回答ありがとうございました。 テンポラリを作成してソースを改造してみたところ、思い通りの動きにすることができました! 普通に考えれば分かることでしたが、自分だけで考えてた時はテンポラリを作成するという事を全く思いつかなかったので非常に助かりました。