私は今、「今日」の日付を入力すると、「次の日」と「前の日」が表示されるプログラムをC言語で作っているのですが、ときたま曜日が表示されないときがあります。その原因を探っていただけないでしょうか。また、コードが長いので、短くする方法を教えていただければ幸いです。よろしくお願いします。
(例:正しく表示される場合)
年を入力してください。
1
月を入力してください。
1
日を入力してください。
1
今日は西暦1年1月1日SUNです。
次の日は西暦1年1月2日MONです。
前の日は紀元前1年12月31日SATです。
(例:正しく表示されない場合)
年を入力してください。
1
月を入力してください。
1
日を入力してください。
7
今日は西暦1年1月7日SATです。
次の日は西暦1年1月8日SUNです。
前の日は西暦1年1月6日です。(←ここが表示されない)
コードを貼っておきます。↓
#include <stdio.h>
#define Z "\aそんな日はありません。もう一度入力してください。\n"
void increment_date(int *y,int *m,int *d)/*日付を一日増やします*/
{
switch(*m){
case 1 :if(*d==31){*m=2;*d=1;}else{*d=*d+1;}break;
case 2 :if(*y%4==0){if(*d==29){*m=3;*d=1;}else{*d=*d+1;}break;}
else{if(*d==28){*m=3;*d=1;}else{*d=*d+1;}break;}
case 3 :if(*d==31){*m=4;*d=1;}else{*d=*d+1;}break;
case 4 :if(*d==30){*m=5;*d=1;}else{*d=*d+1;}break;
case 5 :if(*d==31){*m=6;*d=1;}else{*d=*d+1;}break;
case 6 :if(*d==30){*m=7;*d=1;}else{*d=*d+1;}break;
case 7 :if(*d==31){*m=8;*d=1;}else{*d=*d+1;}break;
case 8 :if(*d==31){*m=9;*d=1;}else{*d=*d+1;}break;
case 9 :if(*d==30){*m=10;*d=1;}else{*d=*d+1;}break;
case 10 :if(*d==31){*m=11;*d=1;}else{*d=*d+1;}break;
case 11 :if(*d==30){*m=12;*d=1;}else{*d=*d+1;}break;
case 12 :if(*d==31){*y=*y+1;*m=1;*d=1;}else{*d=*d+1;}if(*y==0){*y=1;}break;
}
}
void decrement_date(int *y,int *m,int *d)/*日付を一日減らします*/
{
switch(*m){
case 1 :if(*d==1){*y=*y-1;*m=12;*d=31;}else{*d=*d-1;}if(*y==0){*y=-1;}break;
case 2 :if(*d==1){*m=1;*d=31;}else{*d=*d-1;}break;
case 3 :if(*y%4==0){if(*d==1){*m=2;*d=29;}else{*d=*d-1;}break;}
else{if(*d==1){*m=2;*d=28;}else{*d=*d-1;}break;}
case 4 :if(*d==1){*m=3;*d=31;}else{*d=*d-1;}break;
case 5 :if(*d==1){*m=4;*d=30;}else{*d=*d-1;}break;
case 6 :if(*d==1){*m=5;*d=31;}else{*d=*d-1;}break;
case 7 :if(*d==1){*m=6;*d=30;}else{*d=*d-1;}break;
case 8 :if(*d==1){*m=7;*d=31;}else{*d=*d-1;}break;
case 9 :if(*d==1){*m=8;*d=31;}else{*d=*d-1;}break;
case 10 :if(*d==1){*m=9;*d=30;}else{*d=*d-1;}break;
case 11 :if(*d==1){*m=10;*d=31;}else{*d=*d-1;}break;
case 12 :if(*d==1){*m=11;*d=30;}else{*d=*d-1;}break;
}
}
int main(void)
{
int a,b,c,d,e,f,date=0,i;
int g[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
char h[7][128]={"SAT","SUN","MON","TUE","WED","THU","FRI"};
/*可能な西暦を設定*/
printf("年を入力してください。\n");
do{
scanf("%d",&a);
if(a==0){
printf("\aそんな年はありません。もう一度入力してください。\n");
}
}while(a==0);
/*可能な月を設定*/
printf("月を入力してください。\n");
do{
scanf("%d",&b);
if(b<1||b>12){
printf("\aそんな月はありません。もう一度入力してください。\n");
}
}while(b<1||b>12);
/*可能な日を設定*/
printf("日を入力してください。\n");
scanf("%d",&c);
switch(b){
case 1 :do{if(c<1||c>31){printf(Z);scanf("%d",&c);}}while(c<1||c>31);break;
case 2 :if(a%4==0){do{if(c<1||c>29){printf(Z);scanf("%d",&c);}}while(c<1||c>29);break;}
else{do{if(c<1||c>28){printf(Z);scanf("%d",&c);}}while(c<1||c>28);break;}
case 3 :do{if(c<1||c>31){printf(Z);scanf("%d",&c);}}while(c<1||c>31);break;
case 4 :do{if(c<1||c>30){printf(Z);scanf("%d",&c);}}while(c<1||c>30);break;
case 5 :do{if(c<1||c>31){printf(Z);scanf("%d",&c);}}while(c<1||c>31);break;
case 6 :do{if(c<1||c>30){printf(Z);scanf("%d",&c);}}while(c<1||c>30);break;
case 7 :do{if(c<1||c>31){printf(Z);scanf("%d",&c);}}while(c<1||c>31);break;
case 8 :do{if(c<1||c>31){printf(Z);scanf("%d",&c);}}while(c<1||c>31);break;
case 9 :do{if(c<1||c>30){printf(Z);scanf("%d",&c);}}while(c<1||c>30);break;
case 10 :do{if(c<1||c>31){printf(Z);scanf("%d",&c);}}while(c<1||c>31);break;
case 11 :do{if(c<1||c>30){printf(Z);scanf("%d",&c);}}while(c<1||c>30);break;
case 12 :do{if(c<1||c>31){printf(Z);scanf("%d",&c);}}while(c<1||c>31);break;
}
d=a;e=b;f=c;
if(a%4==1){date=(a/4)*(365*4+1)+365*0;}
if(a%4==2){date=(a/4)*(365*4+1)+365*1;}
if(a%4==3){date=(a/4)*(365*4+1)+365*2;}
if(a%4==0){date=(a/4)*(365*4+1)+365*3;}
switch(b%12){
case 1 :date+=c;break;
case 2 :date+=c+g[1];break;
case 3 :if(a%4==0){date+=c+g[1]+g[2]+1;}
else{date+=c+g[1]+g[2];}break;
case 4 :if(a%4==0){date+=c+g[1]+g[2]+g[3]+1;}
else{date+=c+g[1]+g[2]+g[3];}break;
case 5 :if(a%4==0){date+=c+g[1]+g[2]+g[3]+g[4]+1;}
else{date+=c+g[1]+g[2]+g[3]+g[4];}break;
case 6 :if(a%4==0){date+=c+g[1]+g[2]+g[3]+g[4]+g[5]+1;}
else{date+=c+g[1]+g[2]+g[3]+g[4]+g[5];}break;
case 7 :if(a%4==0){date+=c+g[1]+g[2]+g[3]+g[4]+g[5]+g[6]+1;}
else{date+=c+g[1]+g[2]+g[3]+g[4]+g[5]+g[6];}break;
case 8 :if(a%4==0){date+=c+g[1]+g[2]+g[3]+g[4]+g[5]+g[6]+g[7]+1;}
else{date+=c+g[1]+g[2]+g[3]+g[4]+g[5]+g[6]+g[7];}break;
case 9 :if(a%4==0){date+=c+g[1]+g[2]+g[3]+g[4]+g[5]+g[6]+g[7]+g[8]+1;}
else{date+=c+g[1]+g[2]+g[3]+g[4]+g[5]+g[6]+g[7]+g[8];}break;
case 10 :if(a%4==0){date+=c+g[1]+g[2]+g[3]+g[4]+g[5]+g[6]+g[7]+g[8]+g[9]+1;}
else{date+=c+g[1]+g[2]+g[3]+g[4]+g[5]+g[6]+g[7]+g[8]+g[9];}break;
case 11 :if(a%4==0){date+=c+g[1]+g[2]+g[3]+g[4]+g[5]+g[6]+g[7]+g[8]+g[9]+g[10]+1;}
else{date+=c+g[1]+g[2]+g[3]+g[4]+g[5]+g[6]+g[7]+g[8]+g[9]+g[10];}break;
case 12 :if(a%4==0){date+=c+g[1]+g[2]+g[3]+g[4]+g[5]+g[6]+g[7]+g[8]+g[9]+g[10]+g[11]+1;}
else{date+=c+g[1]+g[2]+g[3]+g[4]+g[5]+g[6]+g[7]+g[8]+g[9]+g[10]+g[11];}break;
}
/*曜日を特定*/
switch(date%7){
case 0:i=0;break;
case 1:i=1;break;
case 2:i=2;break;
case 3:i=3;break;
case 4:i=4;break;
case 5:i=5;break;
case 6:i=6;break;
}
if(a>0){
printf("今日は西暦%d年%d月%d日%sです。\n",a,b,c,h[i]);
}else{
printf("今日は紀元前%d年%d月%d日%sです。\n",-a,b,c,h[i]);
}
increment_date(&a,&b,&c);
decrement_date(&d,&e,&f);
if(a>0){
i++;
printf("次の日は西暦%d年%d月%d日%sです。\n",a,b,c,h[i]);
}else{
i++;
printf("次の日は紀元前%d年%d月%d日%sです。\n",-a,b,c,h[i]);
}
if(d>0){
i=i-2;
printf("前の日は西暦%d年%d月%d日%sです。\n",d,e,f,h[i]);
}else{
i=i-2;
printf("前の日は紀元前%d年%d月%d日%sです。\n",-d,e,f,h[i]);
}
return 0;
}