カレンダーがうまく表示されない
開始月と終了月を指定して、3か月ごとにカレンダーを改行する
プログラムを作ってみました。
ところが、動作をさせてみたところ7月が配列tuki[12]において31日
と指定しているのにも関わらず25日分しか表示されません。
それと、たまに4月分が24日分しか表示されません。(試した限りでは、
4月を終了月に指定するとそうなりました。)
なにがおかしいためにこうなってしまうのでしょうか。
よろしくお願いいたします。
#include<stdio.h>
#include<string.h>
/*月の最初の日をメインプログラムに返す*/
int getyoubi(int year,int month,int day)
{
if(month==1 || month==2 )
{
year--;
month +=12;
}
return ((year+year/4-year/100+year/400+(13*month+8)/5 + day)%7);
}
/*カレンダーを3か月分表示させる*/
void print(char s[3][7][22],int n)
{
int i,j;
for(i=0;i<n;i++)
{
printf("%s ",s[i][0]);
}
printf("\n");
for(i=0;i<n;i++)
{
printf(" 日 月 火 水 木 金 土 ");
}
printf("\n");
for(i=0;i<n;i++)
{
printf("---------------------- ");
}
printf("\n");
for(i=1;i<7;i++)
{
for(j=0;j<n;j++)
{
printf("%s ",s[j][i]);
}
printf("\n");
}
printf("\n");
}
int main(void)
{
int nen1,tuki1,nen2,tuki2,tukiho,nenho,tukih,w,j;
char sbuf[3][7][22];
int tuki[12]={31,28,31,30,31,30,31,31,30,31,30,31};
int k;
char tmp[4];
int count=0;
printf("カレンダーを表示します。\n");
printf("開始年月を入力せよ。\n");
printf("年:");
scanf("%d",&nen1);
printf("月:");
scanf("%d",&tuki1);
printf("終了年月を入力せよ。\n");
printf("年:");
scanf("%d",&nen2);
printf("月:");
scanf("%d",&tuki2);
/*最大3カ月分のカレンダーを格納する。*/
do{
w=getyoubi(nen1,tuki1,1);
sprintf(sbuf[count][0],"%10d / %02d ",nen1,tuki1);
for(k=1;k<7;k++)
{
sbuf[count][k][0]='\0';
}
sprintf(sbuf[count][1],"%*s",3*w,"");
k=1;
for(j=1;j<=tuki[tuki1-1];j++)
{
sprintf(tmp,"%3d",j);
strcat(sbuf[count][k],tmp);
if((j+w-1)%7==6)
{
k++;
}
}
do{
if((j+w-1)%7==6)
{
sprintf(sbuf[count][k],"%21s","");
}
else
{
do{
strcat(sbuf[count][k]," ");
j++;
}while((j+w-1)%7!=0);
}
k++;
}while(k!=7);
count++;
if(count==3)
{
print(sbuf,count);
count=0;
}
tuki1++;
if(tuki1==13)
{
tuki1=1;
nen1++;
}
}while(nen1<nen2 || nen1==nen2 && tuki1<=tuki2);
if(count)
{
print(sbuf,count);
}
return 0;
}