dポイントプレゼントキャンペーン実施中!

三次元配列を使い、その年を入力すると一年分のカレンダーが出力するC言語のプログラムを教えてください。
それで、一ヶ月を六週として数字が当てはまらない所には「0」が入るようにして、後で「0」を空白に変えるようにして、1月の第1週が出力された後、2月の第1週、3月の第1週、1月の第2週、2月の第2週・・・・・と順に表示させるようなプログラムです。
出力結果は横に三か月分、縦に四か月分が出力される(下記)ようにしたいのですが、よろしくお願いします。

出力結果
      ・・・年
   1月  2月  3月
   4月  5月  6月
   7月  8月  9月
   10月  11月  12月

A 回答 (1件)

これは何かの演習問題ですか?


他人のプログラムを見るのも勉強と思いますので参考プログラムを書きますが、何をやっているかは理解して下さいね。(全角スペースを使っています)
#include <stdio.h>

int main(void) {
 int i,j,k;
 int cal[12][6][7];
 int mon[12]={31,28,31,30,31,30,31,31,30,31,30,31};
 int year,weekday,day;
 
 scanf("%d",&year);
 for (i=0; i<12; i++) for (j=0; j<6; j++) for (k=0; k<7; k++) cal[i][j][k]=0;
 /* うるう年判定 */
 if (((year%4==0)&&(year%100!=0))||(year%400==0)) mon[1]=29; else mon[1]=28;
 /* 1月1日の曜日 */
 weekday=((year-1)+(year-1)/4-(year-1)/100+(year-1)/400+(13*13+8)/5+1)%7;
 /* 計算 */
 day=1;
 for (i=0;i<12;) {
  for(j=0;j<6;) {
   cal[i][j][weekday++]=day++;
   if (weekday==7) {weekday=0; j++;} /* 次の週 */
   if (mon[i]<day) {i++; day=1; break;} /* 次の月 */
  }
 }
 /* 表示 */
 for (i=0;i<12;i+=3) {
  printf("     %2d月          %2d月          %2d月\n",i+1,i+2,i+3);
  for (j=0; j<6; j++) {
   for (k=0; k<7; k++) if (cal[i][j][k]==0) printf("  "); else printf("%2d ",cal[i][j][k]);
   printf("  ");
   for (k=0; k<7; k++) if (cal[i+1][j][k]==0) printf("  "); else printf("%2d ",cal[i+1][j][k]);
   printf("  ");
   for (k=0; k<7; k++) if (cal[i+2][j][k]==0) printf("  "); else printf("%2d ",cal[i+2][j][k]);
   printf("\n");
  }
  printf("\n");
 }
 return 0;
}
    • good
    • 1
この回答へのお礼

ありがとうございました。たいへん参考になりました。

お礼日時:2004/10/20 19:00

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています