2010年7月11日日曜日

C言語で万年カレンダー

宿題や課題ネタで人気のあるC言語による万年カレンダーです。 この課題は難しいノで以下のコードをコピーして使って下さい。

 /*万年カレンダ表示C言語プログラム*/

#include <stdio.h>

#define URUU 1
#define NO_URUU 0

#define FEBRUARY 2

#define D30 30
#define D31 31
#define D28 28

#define MAXYEARS 9999
#define MINYEARS 1

#define MAXMONTH 12
#define MINMONTH 1


/*グローバル変数:月の日数保管用テーブル*/
const int ITBLMONTH[] = {D31,D28,D31,D30,D31,D30,D31,D31,D30,D31,D30,D31};



int main(void){

/*年月の入力用変数*/
int iYear;
int iMonth;

/*該当の月の日数*/
int iNumMonth;

/*該当の月の開始曜日*/
int iStartWeek;

/*週間カウント用*/
int iCntWeek;

/*閏年フラグ*/
int iFlgUruu;

/*日数カウント用変数*/
int iCntDay;

/*空白文字列*/
const char sBlanks[] = {32,32,32,32,32};

/*フォーマット文字列*/
const char sFormats[] = {32,'%','2','d',32,0};

do{
    printf("Enter Year?");
    scanf("%d",&iYear);
}while(iYear < MINYEARS || iYear > MAXYEARS);

do{
printf("Enter Month?");
scanf("%d",&iMonth);
}while(iMonth < MINMONTH || iMonth > MAXMONTH );


/*閏年の計算*/
if(iYear % 4){
iFlgUruu = NO_URUU;
}
else if(iYear % 100){
iFlgUruu = URUU;
}
else if(iYear % 400){
iFlgUruu = NO_URUU;
}
else{
iFlgUruu = URUU;
}


/*指定された月の日数を取得する*/
iNumMonth = ITBLMONTH[ iMonth - 1 ];
if(iMonth == FEBRUARY ){
iNumMonth += iFlgUruu;
}

/*カレンダーのタイトルを表示する*/
printf("%d-%d\n", iYear, iMonth);

/*万年カレンダーを作るときに便利なツェラーの公式を使い月初の曜日を求める*/
iYear += (iMonth-1)/12;
iMonth = (iMonth - 1) % 12+1;
if ( iMonth < 3 ){
--iYear;
iMonth += 12;
}

/*月初の曜日Kを求める*/
iStartWeek = (iYear + iYear/4 - iYear/100 + iYear/400 + (iMonth*13+8)/5 + 1)%7;

/*曜日の表示:アンダースコアは知恵袋対策*/
printf("Sun Mon Tue Wed Thr Fri Sat\n");

/*万年カレンダーを表示する*/
iCntWeek = 0;
for(iCntDay = -iStartWeek + 1 ; iCntDay <= iNumMonth ; ++iCntDay){

if(iCntDay > 0){
printf(sFormats,iCntDay);
}
else{
printf("    ");
}

++iCntWeek;
if(iCntWeek >= 7){
printf("\n");
iCntWeek = 0;
}
}

}
書かれている記事
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1443468809

0 件のコメント:

コメントを投稿