/*各自この部分を作る*/の部分は所々作成してみたのですが
Date InputDate以下はどこにどういったものを入れるのかも分からず、
進むことができなくなってしまいました。
ぜひお力をお借りしたいです。
#include <stdio.h>
#include <stdlib.h>
#define GREGORIAN 1582
#define MENU 4
#define MONTH 12
#define WEEK 7
#define TRUE 1
#define FALSE 0
typedef struct {
int year;
int month;
int day;
int days;
int leap;
} Date;
char *wday[] = {
"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
};
int mday[2][13] = {
{ 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
{ 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
};
void PrintMenu(void);
Date InputDate(int);
void PrintDate(Date);
int CountDays(Date);
int IsLeap(int);
Date CalcDate(int);
void BeforeAfter(void);
void Calendar(Date);
void Difference(void);
void PrintDates(Date, Date, int);
int main()
{
Date date1, date2;
int n;
PrintMenu();
do {
printf("\nEnter (0-%d) : ", MENU);
scanf("%d", &n);
switch (n) {
case 0:
break;
case 1: printf("\n");
date1 = InputDate(TRUE);
PrintDate(date1);
printf("\n");
break;
case 2:
Difference();
break;
case 3:
date1 = InputDate(FALSE);
Calendar(date1);
break;
case 4:
BeforeAfter();
break;
case 5:
PrintMenu();
break;
default:
fprintf(stderr, "\nInvalid number : %d\n", n);
fprintf(stderr, "Menus are as follow\n");
PrintMenu();
exit(1);
}
}while (n > 0);
return 0;
}
void PrintDate(Date date)
{
printf("%4d/%02d/%02d (%s)",
date.year, date.month, date.day, wday[date.days%WEEK]);
}
void BeforeAfter(void)
{
Date base, date;
int n;
base =InputDate(TRUE);
printf("Enter (n) : ");
scanf("%d", &n);
date = CalcDate(base.days+n);
PrintDates(date, base, n);
}
void Difference(void)
{
Date dateA, dateB;
int days;
printf("\n --- dateA ---\n");
dateA = InputDate(TRUE);
printf("\n --- dateB ---\n");
dateB = InputDate(TRUE);
days = dateA.days - dateB.days;
PrintDates(dateA, dateB, days);
}
void PrintDates(Date date1, Date date2, int days)
{
PrintDate(date1);
/*days の正負により出力を BEFORE, AFTERと切り変える*/
if(days <= 10){
printf("is 10 days AFTER ");
}
else
printf("is 10 days BEFORE ");
PrintDate(date2);
printf("\n");
}
void PrintMenu(void)
{
printf("\t0: Quit\n");
/* 各自この部分を作る */
printf("\t1: Pront Date\n");
printf("\t2: difference between 'dateA' and 'dateB'\n");
printf("\t3: Calendar\n");
printf("\t4: 'n' days before(after) 'date'\n");
printf("\t5: print Menu\n");
}
Date InputDate(int flag)
{
Date date;
/* 各自この部分を作る */
printf("Enter (year >= %d) : ", GREGORIAN);
scanf("%4d", &date.year);
printf("Enter (month:1---12) : ");
scanf("%2d", &date.month);
printf("Enter (day:1---31) : ");
scanf("%2d", &date.day);
if(flar==TRUE){
printf("Enter (day:1---31) : ");
scanf("%2d", &date.day);
}
else
return date;
}
int CountDays(Date date)
{
int days, y, j;
/* 各自この部分を作る …西暦Y年m月d日がdays日目とする*/
return days;
}
int IsLeap(int y)
{
/* 各自この部分を作る …うるう年*/
if (y % 400 == 0) return 1;
else if (y % 100 == 0) return 0;
else if (y % 4 == 0) return 1;
else return 0;
}
void Calendar(Date date)
{
int j, k,week,uru,y,dday,day;
char *mname[] = {"", "Jan", "Feb", "Mar", "Apr", "May", "Jun","Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
/* 「月」の名前と「西暦」を出力する */
/*for 文を用いて4桁幅で wday[0]~wday[WEEK-1] を出力する*/
k = date.days%WEEK;
/*1 データ四文字分なので、「4つの空白」で一データkデータ分「4つの空白」を出力する。
つまり for 文で j=0, 1, 2, …, k-1 に対して「4 つの空白」を出力*/
/*1~mday[date.leap][date.month] までを for 文を使って 4 桁幅で出力kをデータ位置情報として使う。
・数字を出力する度に k の値を 1 増加させる
・k の値が KEEK と等しくなったら
「k の値を 0 に戻す」「改行する」という動作をする。*/
/*mday[date.leap][date.month] の値を出力したデータ位置によっては改行*/
}
Date CalcDate(int days)
{
Date date;
/* 各自この部分を作る …days 日目から西暦y年m月d日を出力する。*/
return date;
}