#include "stdio.h"
typedef struct da //定义备忘的结构
{
char dat[20];
char beiwang[100];
struct da *next;
}TT;
void putoutclause(void); //函数声明
void scanclause(void);
long int f(int year,int month);
long int g(int month);
long int n(int year,int month,int day);
int w(int year,int month,int day);
void a1(void);
void a2(void);
void cai(void);
long int f(int year,int month)
{
if(month < 3)
return year - 1;
else
return year;
}
long int g(int month)
{
if(month < 3)
return month + 13;
else
return month + 1;
}
long int n(int year,int month,int day)
{
return 1461L * f(year,month) / 4 + 153L * g(month) / 5 + day;
}
int w(int year,int month,int day)
{
return(int)((n(year,month,day) % 7 - 621049l % 7) % 7);
}
int data[12][6][7]; //定义三维数组用来计算日期
int day_n[2][12] = {{31,28,31,30,31,30,31,31,30,31,30,31},
{31,29,31,30,31,30,31,31,30,31,30,31}}; //统计所有年份一个月的天数
void a1(void)
{
int sw,leap,i,j,k,wd,day,year;
char title[] = "SUN MON TUE WED THU FRI STA";
printf("输入想要查询的年份:");
scanf("%d",&year); //输入年份
sw = w(year,1,1);
leap = year % 4 == 0 && year % 100 || year % 400 == 0;//判断是否为闰年
for(i = 0;i < 12;i ++)
for(j = 0;j < 6;j++)
for(k = 0;k < 7; k ++)
data[i][j][k] = 0; //日期表置零
for(i = 0;i < 12;i++)
for(wd = 0,day = 1;day <= day_n[leap][i]; day++)
{
data[i][wd][sw] = day;
sw = ++ sw % 7; //一周的统计
if(sw == 0)
wd++;
}
printf("======================输入的年份是:%d======================/n",year);
for(i = 0;i < 6;i++)
{
for(wd = 0,k = 0;k < 7;k ++)
wd += data[i][5][k] + data[i + 6][5][k];
wd = wd ? 6 : 5;
printf("%2d %s %2d %s/n",i + 1,title,i + 7,title);
for(j = 0;j < wd;j++)
{
printf(" "); //输出空白符
for(k = 0;k < 7;k++) //左栏为i+1月
if(data[i][j][k])
printf("%4d",data[i][j][k]);
else
printf(" ");
printf(" ");
for(k = 0;k < 7;k++) //右栏为i+7月
if(data[i + 6][j][k])
printf("%4d",data[i + 6][j][k]);
else
printf(" "); //输出空白字符
printf("/n");
}
printf("/n=========================================================/n");
}
cai();
}
void a2(void) //子菜单
{
int a;
printf("*************************************************/n");
printf("*-------------------备忘菜单--------------------*/n");
printf("*************************************************/n");
printf("* 1. 查询备忘 */n");
printf("* 2. 添加备忘 */n");
printf("* 3. 退出系统 */n");
printf("*************************************************/n");
printf("请输入选项号(1-3):[ ]/b/b");
scanf("%d",&a);
switch(a)
{
case 1: putoutclause(); break;
case 2: scanclause(); break;
case 3: exit(0); break;
default: exit(0);
}
}
void cai(void) //主菜单
{
int a;
printf("*************************************************/n");
printf("*-------------------系统主菜单------------------*/n");
printf("*************************************************/n");
printf("* 1. 查询日历 */n");
printf("* 2. 备忘管理 */n");
printf("* 3. 退出系统 */n");
printf("*************************************************/n");
printf("请输入选项号(1-3):[ ]/b/b");
scanf("%d",&a);
switch(a)
{
case 1: a1(); break;
case 2: a2(); break;
case 3: exit(100); break;
default: cai();
}
}
void scanclause(void) //录入备忘
{
FILE *p = NULL; //定义文件指针
TT *temp = (TT*)malloc(sizeof(TT)); //用结构指针申请动态内存
if((p = fopen("data.txt","a")) == NULL) //判断文件打开情况
printf("文件打开错误或不存在!/n");
printf("输入日期:(格式:xxxx-yy-dd)");
scanf("%s",temp ->dat); //输入日期
printf("/n输入备忘(无空格输入):");
scanf("%s",temp ->beiwang); //输入备忘
fprintf(p,"%c%s%c%s",' ',temp ->dat,' ',temp ->beiwang); //将其存入文件
free(temp); //释放内存
fclose(p); //关闭文件
a2();
}
void putoutclause(void) //输出备忘
{
char a = ' ';
FILE *p = NULL; //申请文件指针
TT *temp = (TT*)malloc(sizeof(TT)); //申请动态内存
TT *temp1 = temp;
if((p = fopen("data.txt","r+")) == NULL) //判断文件打开情况
printf("文件打开错误或不存在!/n");
while(!feof(p)) //将文件中的数据读到链表中
{
fscanf(p,"%s%s",temp1->dat,temp1 ->beiwang);
temp1->next = (TT*)malloc(sizeof(TT));
temp1 = temp1 ->next;
temp1 ->next = NULL;
}
while(temp ->next!= NULL) //通过链表输出备忘
{
printf("日期:%s%c备忘:%s/n",temp ->dat,' ',temp ->beiwang);
temp = temp ->next;
}
fclose(p); //关闭文件
a2();
}
void main()
{
cai();
}