• 締切済み

万年プログラムの祝日にマーク

こんにちは、Cプログラムの初心者です。万年カレンダーを作っているのですが、祝日と日曜日に(かっこ)をつける方法を教えていただけませんか?よろしくお願いいたします。

みんなの回答

  • FEX2053
  • ベストアンサー率37% (7991/21371)
回答No.2

祝日の計算は非常にめんどくさいんですが・・・。 例えば今年の5/6は祝日ですが、これってどうやって出てくるか 知ってますか? 5/3は憲法記念日で祝日、ただし日曜日なので、翌日が振替休日 5/4はみどりの日で祝日、既に休日なので更に翌日が振替休日 5/5はこどもの日で祝日、既に休日なので更に翌日が振替休日 5/6は平日の水曜日、故に繰り越した振替休日を適用 と、こんな計算になります。これをどうやって式にするかだけで どう考えても大変です。また今年の9/21も 5/21は9月第3月曜なので敬老の日で祝日 5/22は火曜日 5/23は秋分の日で祝日 祝日同士に挟まれた1日だけの平日は国民の休日になるので、5/22は 祝日に変更 という大変な計算があります。更に春分の日、秋分の日は毎年日付が 変わります。 ですので、通常は「祝日をデータベース化しておき、それを参照する」 方法で計算します。それでも結構な計算式になりますから、初心者だと 相当な難物ですよ。

redflower5
質問者

お礼

ありがとうございます。難しいようですが、少しずつやってみます。

redflower5
質問者

補足

お助けお願いできますか? 配列で四ヶ月ごと一行になるようにしました。 祝日には()をつけようとしましたが、エラーになってしまいます。どうかよろしくお願いいたします。 どうかy for (i=0; i<12; i++) for (j=0; j<6; j++) for (k=0; k<7; k++) cal[i][j][k]=0;/* うるう年判定 */ if (((yy%4==0)&&(yy%100!=0))||(yy%400==0)) mm[1]=29; else mm[1]=28;/* 1月1日の曜日 */ youbi=((yy-1)+(yy-1)/4-(yy-1)/100+(yy-1)/400+(13*13+8)/5+1)%7;/* 計算 */ dd=1; for (i=0;i<12;) { for(j=0;j<6;) { cal[i][j][youbi++]=dd++; if (youbi==7) {youbi=0; j++;} /* 次の週 */ if (mm[i]<dd) {i++; dd=1; break;} /* 次の月 */ } } for(y=0;y<4;y++){ // for(x=0;x<4;x++){ // printf("     %2d月",i); // printf("\n");} for(z=0; z<7; z++){ printf("%4s",week[z]);} printf(" "); } printf("\n"); for (j=0; j<6; j++) { for (k=0; k<7; k++) { if (cal[i][j][k]==0) printf(" "); else if(hantei(yy,mm,dd,youbi) == 2){ printf("\t"); printf("(%3d) ",cal[i][j][k]); flag = 1; // 日曜と祝日が重なったらflagをたてる } else if(hantei(yy,mm,dd,youbi) == 1 || flag == 1){ printf("(%3d) ",cal[i][j][k]); printf("\t"); flag = 0; } else if((i-1)%7 == 6){ // 土曜日 printf("%3d ",cal[i][j][k]); printf("\t"); } else{ printf("(%3d) ",cal[i][j][k]); //printf("%d"); //日付を出力 flag = 0; } if((i-1)%7 == 6) printf("\n"); //土曜のあとは改行 } for (k=0; k<7; k++) { if (cal[i+1][j][k]==0) printf(" "); else if(hantei(yy,mm,dd,youbi == 2){ printf("(%3d) ",cal[i+1][j][k]); flag = 1; // 日曜と祝日が重なったらflagをたてる } else if(hantei(yy,mm,dd,youbi) == 1 || flag == 1){ printf("(%3d) ",cal[i+1][j][k]); flag = 0; } else if((i-1)%7 == 6){ // 土曜日 printf("%3d ",cal[i+1][j][k]); } else { printf("(%3d) ",cal[i+1][j][k]); flag = 0; } if((i-1)%7 == 6) printf("\n"); //土曜のあとは改行 } for (k=0; k<7; k++) { if (cal[i+2][j][k]==0) printf(" "); printf("\t"); else if(hantei(yy,mm,dd,youbi) == 2){ printf("(%3d) ",cal[i+2][j][k]); flag = 1; // 日曜と祝日が重なったらflagをたてる } else if(hantei(yy,mm,dd,youbi) == 1 || flag == 1){ printf("(%3d) ",cal[i+2][j][k]); flag = 0; } else if((i-1)%7 == 6){ // 土曜日 printf("%3d ",cal[i+2][j][k]); } else{ printf("(%3d) ",cal[i+2][j][k]); flag = 0; } if((i-1)%7 == 6) printf("\n"); //土曜のあとは改行 } int hantei(int yy,int mm,int dd,int youbi){ if((mm==3 && dd== (int)(20.8431 + 0.242194*(yy-1980) - (yy-1980)/4)) // 春分の日 || (mm==9 && dd== (int)(23.2488 + 0.242194*(yy-1980) - (yy-1980)/4)) // 秋分の日 || (mm==1 && dd==1) // 元旦 || (mm==1 && dd>7 && dd<15 && youbi==1) // 成人の日 || (mm==2 && dd==11) // 建国記念日 || (mm==4 && dd==29) // みどりの日 || (mm==5 && dd==3) // 憲法記念日 || (mm==5 && dd==4) // 国民の祝日 || (mm==5 && dd==5) // 子供の日 || (mm==7 && dd>14 && dd<22 && youbi==1) // 海の日 || (mm==9 && dd>14 && dd<22 && youbi==1) // 敬老の日 || (mm==10 && dd>7 && dd<15 && youbi==1) // 体育の日 || (mm==11 && dd==3) // 文化の日 || (mm==11 && dd==23) // 勤労感謝の日 || (mm==12 && dd==23))// 天皇誕生日 { if(youbi == 0){// 日曜と休日が重なった処理 return 2; } else { return 1; } if(youbi == 0){ // 日曜日 return 1; } // return 0; } }

回答No.1

業務ソフト? 祝日のデータベースを作って、付き合わせで表示する。

redflower5
質問者

補足

回答ありがとうございます。 会社の研修で万年カレンダーを作ることになっています。 カレンダーは表示できるが、祝日表示はできないです。 Cプログラムだけで作りたいですが、 既にできているカレンダーに祝日だけ(かっこ) をつけるいい方法はありますか?

関連するQ&A

専門家に質問してみよう