- 締切済み
万年カレンダーについて。
プログラミング初心者です。 初めての投稿になります。至らない点などございますが、 どうぞよろしくお願いいたします。 一応、カレンダーが12ヶ月分縦に一気に表示されるプログラムを作りました。 そこでその1年分のカレンダーを2*6の並びにしたく、 作ろうと思ったのですが、ネットや本でたくさん調べたのですが、 配列や構造体の使い方がわからなくて・・・(´・ω・`) 配列を使うと「型の前に ; がありません」がでてきたり、 わけがわからなくて・・・ わかりやすいヒント、 配列や構造体のことなどくださると幸いです。 よろしくお願いいたします。 ちなみに、2*6というのは、 1月 2月 3月 4月 5月 6月 : という感じです。 回答よろしくお願いいたします。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- tatsu99
- ベストアンサー率52% (391/751)
以下のようにしてください。 --------------------------------------------- # include <stdio.h> int main(void) { int y,m,d=0; int yy=0,mm=0; int day; int wd; int i; int j; int wm; int low; int col; //12カ月分のカレンダー用日付 //6行7列=42個を確保 //カレンダーに1から末日までの数値を埋め込み、値が0の個所は空白を表示させる int days[12][42]; printf("年(西暦)="); scanf("%d",&yy); //配列全体を0クリアする for (i=0;i<12;i++){ for (j=0;j<42;j++){ days[i][j] = 0; } } //12か月分の日付を格納する for(mm=1;mm<=12;mm++){ //閏年 switch(mm){ case 2: if(((yy%4==0)&&(yy%100!=0)||yy%400==0)) day=29; else day=28; break; //4月6月9月11月30日まで case 4: case 6: case 9: case 11: day=30; break; default: day=31; break; } y=yy; m=mm; if(m==1||m==2){ y--; m+=12; } //ツェラー wd=(y + (y/4) - (y/100) + (y/400) + ((13*m+8)/5) + 1)%7; //その月の日付を設定(1日から末日まで) for(d=1;d<=day;d++){ i = mm -1; j = d -1 + wd; days[i][j] = d; } } //カレンダーを2列で表示する for(wm=0;wm<6;wm++){ m = 2 * wm + 1; printf("%2d月__________________%2d月\n",m,m+1); printf("日_月_火_水_木_金_土__日_月_火_水_木_金_土\n"); for(low=0;low<6;low++){ //左側の月 i = m - 1; for(col=0;col<7;col++){ j = low * 7 + col; d = days[i][j]; if (d == 0){ printf("___"); }else{ printf("%2d_",d); } } printf("_"); //右側の月 i = m + 1 - 1; for(col=0;col<7;col++){ j = low * 7 + col; d = days[i][j]; if (d == 0){ printf("___"); }else{ printf("%2d_",d); } } printf("\n"); } } } --------------------------------------------- 空白が詰められるので、空白を_で表示してあります。 このプログラムを実行されるときは、_を空白に変えてからコンパイルしてください。 以下実行結果です。 --------------------------------------------- 年(西暦)=2014 1月__________________ 2月 日_月_火_水_木_金_土__日_月_火_水_木_金_土 _________ 1_ 2_ 3_ 4____________________ 1_ 5_ 6_ 7_ 8_ 9_10_11__ 2_ 3_ 4_ 5_ 6_ 7_ 8_ 12_13_14_15_16_17_18__ 9_10_11_12_13_14_15_ 19_20_21_22_23_24_25__16_17_18_19_20_21_22_ 26_27_28_29_30_31_____23_24_25_26_27_28____ ___________________________________________ 3月__________________ 4月 日_月_火_水_木_金_土__日_月_火_水_木_金_土 __________________ 1________ 1_ 2_ 3_ 4_ 5_ 2_ 3_ 4_ 5_ 6_ 7_ 8__ 6_ 7_ 8_ 9_10_11_12_ 9_10_11_12_13_14_15__13_14_15_16_17_18_19_ 16_17_18_19_20_21_22__20_21_22_23_24_25_26_ 23_24_25_26_27_28_29__27_28_29_30__________ 30_31______________________________________ 5月__________________ 6月 日_月_火_水_木_金_土__日_月_火_水_木_金_土 ____________ 1_ 2_ 3__ 1_ 2_ 3_ 4_ 5_ 6_ 7_ 4_ 5_ 6_ 7_ 8_ 9_10__ 8_ 9_10_11_12_13_14_ 11_12_13_14_15_16_17__15_16_17_18_19_20_21_ 18_19_20_21_22_23_24__22_23_24_25_26_27_28_ 25_26_27_28_29_30_31__29_30________________ ___________________________________________ 7月__________________ 8月 日_月_火_水_木_金_土__日_月_火_水_木_金_土 ______ 1_ 2_ 3_ 4_ 5_________________ 1_ 2_ 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_29_30_ ______________________31___________________ 9月__________________10月 日_月_火_水_木_金_土__日_月_火_水_木_金_土 ___ 1_ 2_ 3_ 4_ 5_ 6___________ 1_ 2_ 3_ 4_ 7_ 8_ 9_10_11_12_13__ 5_ 6_ 7_ 8_ 9_10_11_ 14_15_16_17_18_19_20__12_13_14_15_16_17_18_ 21_22_23_24_25_26_27__19_20_21_22_23_24_25_ 28_29_30______________26_27_28_29_30_31____ ___________________________________________ 11月__________________12月 日_月_火_水_木_金_土__日_月_火_水_木_金_土 __________________ 1_____ 1_ 2_ 3_ 4_ 5_ 6_ 2_ 3_ 4_ 5_ 6_ 7_ 8__ 7_ 8_ 9_10_11_12_13_ 9_10_11_12_13_14_15__14_15_16_17_18_19_20_ 16_17_18_19_20_21_22__21_22_23_24_25_26_27_ 23_24_25_26_27_28_29__28_29_30_31__________ 30_________________________________________ 不明点は、補足にて問い合わせください。
- tatsu99
- ベストアンサー率52% (391/751)
>>一応、カレンダーが12ヶ月分縦に一気に表示されるプログラムを作りました。 このプログラムを提示してください。 それをもとに、どのようにするか考えましょう。
- kmee
- ベストアンサー率55% (1857/3366)
> 型の前に ; がありません」 とか言われても、何をどうやろうとしてどうなったのかわかりません。 わからないので、それをどう直したらいいかもわかりません。 やりかたはいくらでもあります。 あなたがどんなやり方をしようとしたかがわからないので、それが正しいかどうかも判断できません。 どういう風に考えてどう作ろうとしたか、まずは提示してはどうでしょう? 配列を使わない方法もあります。 例えば > 1月 2月 というのは 1月の1行目 2月の1行目 改行 1月の2行目 2月の2行目 改行 1月の3行目 2月の3行目 改行 ... と考えれらますよね?
補足
一応こんな感じにつくりました>< # include <stdio.h> int main(void) { int y,m,d=0; int yy=0,mm=0; int day; int wd; int i; printf("年(西暦)="); scanf("%d",&yy); for(mm=1;mm<=12;mm++){ //閏年 switch(mm){ case 2: if(((yy%4==0)&&(yy%100!=0)||yy%400==0)) day=29; else day=28; break; //4月6月9月11月30日まで case 4: case 6: case 9: case 11: day=30; break; default: day=31; break;} y=yy; m=mm; if(m==1||m==2){ y--; m+=12;} //ツェラー wd=(y + (y/4) - (y/100) + (y/400) + ((13*m+8)/5) + 1)%7; printf("\n %d月\n",mm); printf("日 月 火 水 木 金 土"); printf("\n"); for(i=1;i<=wd;i++){printf(" ");} //日にちの計算 for(d=1;d<=day;d++){ wd=(y + (y/4) - (y/100) + (y/400) + ((13*m+8)/5) + d)%7; printf("%2d ",d); if(wd==6){ printf("\n");} } } }