/*
第2種情報処理技術者試験 平成6年度・秋期・午後 問7
BohYoh Shibata PREPARATION
*/
#include <stdio.h>
#define leap(y) ( y % 4 == 0 && y % 100 != 0 || y % 400 == 0 )
typedef struct{
int year;
int month;
int day;
} Tdate;
long calcd(Tdate *);
int check(Tdate *);
int table[24] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31,
31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
main()
{
long total;
Tdate today,birthday;
printf("** 生年月日を入力してください **\n");
scanf("%d %d %d",&birthday.year,&birthday.month,
&birthday.day);
printf("** 今日の日付を入力してください **\n");
scanf("%d %d %d",&today.year,&today.month,&today.day);
if ( check(&birthday) == 0 && check(&today) == 0 )
if ((total = calcd(&today) - calcd(&birthday)) >= 0 )
printf(" %d年%d月%d日から今日までの日数は\n"
" %ld日です\n",
birthday.year,birthday.month,birthday.day,
total);
else
printf("** 生年月日が今日の日付より後になっています **\n");
else
printf ("** 入力した年月日が正しい範囲内にありません **\n");
}
/* 西暦1年1月1日からの日数を計算する */
long calcd(Tdate *dayp)
{
int i;
int offset;
long years = dayp->year - 1 ;
long days = dayp->day;
days += years * 365;
days += years / 4 - years / 100 + years / 400;
/* 前年までのうるう年の数の合計を加える */
if (leap(dayp->year))
offset = 12;
else
offset = 0;
for (i = 0; i < dayp->month - 1 ; i++)
days += table[i+offset] ;
return days;
}
/* 入力データの誤りを検出する */
int check(Tdate *dayp)
{
int offset;
int dlimit;
if (leap(dayp->year))
offset = 12;
else
offset = 0;
dlimit = table[dayp->month + offset - 1];
if (dayp->year < 1800 ||
dayp->month < 1 || dayp->month > 12 ||
dayp->day < 1 || dayp->day > dlimit)
return 1; /* 年月日が正しい範囲内にないとき1を返す */
else
return 0; /* 年月日が正しい範囲内のとき0を返す */
}