- ベストアンサー
特定の年月日だけを表示するプログラミング
特定の年月だけを表示するプログラミングの課題がうまくできません。ちなみにそこまで詳しくないです。 (プログラミングについて)このように表示したいのですが 2007 / 4 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 みたいな感じです。 ちなみに自分でやってみたものは #include <stdio.h> void Calendar(int y,int m) { /* printf("%d / %d\n",y,m); */ } int main(void) { /* int i; for(i=1;i<=30;i++){ printf("%3d",i); if(i%7==0) putchar('\n'); } puts(""); */ Calendar(2007,4); return(0); } のような感じでやってみたのですがお察しのとおり 表示すると1~30日のあとに2007 / 4がきてしまいます。 ちなみに/*~*/の部分は自分で書いたもので、 他はもともとあったものです。 i%7==0のところで横が7つになったら改行するように しているのですが30までいった後の改行で puts("");みたいにしてますが正直これでいいのかと 思ってしまいます。特によくわからないのが値の返さない関数 の中にprintf関数をつかっていいのかとか考えます。 長文、駄文ですみませんがよろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
課題だったんですね、危うくソースを書いてしまう所でした。 出力を目的とした関数以外では出力を行わないことが望ましいです。 計算を行う関数は独立させた方がよい。 課題の内容であれば、計算部分をCalendar関数で、値の設定や出力はmain関数で行うのが妥当です。 参考までに Calendar関数 void fcarender(int month, int daystart, char *dest) 関数の中身 1、switch文かif文を使って、その月は何日あるかを求める。 2、既に記載されている通り、forループの中で% 7で週単位になるようにする。 ヒント1:sprintf関数を使う方が楽です。 ヒント2:スペースには" "を用いるより、\nを用いた方がよいです。 ヒント3:destでは、sprintfよって作成したカレンダーの表の部分が入ります。 おまけ:スペースよりタブにした方がカレンダーは見やすいです。 main関数 int year = 2007; //年 int month = 4; //月 int daystart = 0; //0が日曜日、6が土曜日 char dest[256]; //カレンダーの文字列 ヒント:putsではなく、printfを用いた方がよいです。 ヒント:printf関数は2回書きます。
その他の回答 (1)
- Oh-Orange
- ベストアンサー率63% (854/1345)
★参考アルゴリズム (1)横7×縦6のマスを表示するように全体を考える。 (2)特定の年月から表示する『月』の1日の曜日を求める。 (3)求めた曜日から1日が始まるように『空白』を出力する。 (4)7で割ったあまりがゼロならば改行コードを出力する。→if ( !(i % 7) ){ … } (5)表示する『月』の最後の日付(28,29,30,31)が来たらそれ以降を空白で埋める。 ・全体のアルゴリズムは上記のようになります。 なお、カレンダー・プログラムで重要になるのが『閏年』の判定です。 この閏年の判定が分かれば、表示する『月』の1日の曜日や、最終日の28、29、30、31日が わかります。最終日の28~31日は、 int table[ 13 ] = { 0, 31, // 1月 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, // 12月 }; として table[month] とすると表示する月の最終日が簡単に求まります。 ただし、2月の最終日が閏年なら 29、平年ならば 28日とする処理を追加して下さい。 最後に: ・値の返さない関数の中に printf 関数を使っても構いません。全く問題ありません。 ・下の『参考URL』に閏年の仕組みが載っています。参考にどうぞ。 以上。
お礼
回答ありがとうございます。 少しうるう年についてあやふやだったのですが おかげで仕組み?が理解できました。 うるう年を求めるプログラムも何とかできました! ありがとうございました<(_ _)>
お礼
迅速な回答ありがとうございます。 まだやってはないのですが参考にしてやってみますね~。<(_ _)>