中国有句俗语叫“三天打鱼两天晒网”。某人从2010年1月1日起开始“三天打鱼两天晒网”,问这个人在以后的某一天中是“打鱼”还是“晒网”。用C或C++语言实现程序解决问题。
基本要求:1.程序风格良好(使用自定义注释模板),提供友好的输入输出。
提高要求:1.输入数据的正确性验证。
2.使用文件进行数据测试。如将日期 20100101 20111214 等数据保存在in.txt文件中,程序读入in.dat文件进行判定,并将结果输出至out.txt文件。
源代码:
#include<stdio.h>
#include<stdlib.h>
int decideday(int x);
int allday(int x);
int mdays(struct date day);
struct date
{
int year;
int month;
int day;
};
void main() /*设计主界面,调用函数*/
{
FILE *fp;
fp=fopen("张家乐.txt","wt+");
if(fp==NULL)
{
printf("can'topen this file!\n");
exit(0);
}
struct date term;
int a,b,c;
term.year=2000;
term.month=01; /*设置变量的初始值:月*/
term.day=01; /*设置变量的初始值:日*/
printf("**********欢迎使用本程序************\n");
printf("*********三天打鱼两天晒网**********\n");
printf("**起始日期为2000年01月01日且为第一天打渔,格式为20000101 **");
fputs("**********欢迎使用本程序************\n",fp);
fputs("*********三天打鱼两天晒网**********\n",fp);
fputs("**起始日期为2000年01月01日且为第一天打渔,格式为20000101 **",fp);
intA;
do
{
printf("\n\n\n");
printf("请输入终止日期(格式为20000101):");
fputs("\n",fp);
fputs("请输入终止日期(格式为20000101):",fp);
scanf("%d",&a); /*输入日期*/
fprintf(fp,"%d",a);
printf("\n");
fputs("\n",fp);
if(decideday(a)!=a) c=1;
elsec=0;
if(c==0) /*输出选择*/
{ b=allday(a);
if(b%5<4&&b%5>0)
{ printf("渔夫今天要打渔。\n\n");
fputs("\t\t\t渔夫今天要打渔。\n",fp);
}
else
{ printf("渔夫今天要晒网。\n\n");
fputs("\t\t\t渔夫今天要晒网。\n",fp);
}
}
else
fputs("\t\t\t您输入的日期有误。\n",fp);
printf("\n\n%d\n\n",b);
printf("是否继续,是请输1,否请输0:");
scanf("\t%d",&A);
}while(A);
fclose(fp);
}
int decideday(int x) /* 判定日期是否规范*/
{
inty;
structdate today;
if(x>=20000101)
{
today.year=x/10000;
today.month=x%10000/100;
today.day=x%100;
if(today.month<=12)
{
y=mdays(today);
if(today.day>y)
{
printf("您输入的日期有误。\n");
return0;
}
}
else
{
printf("您输入的日期有误。\n");
return0;
}
returnx;
}
else
{
printf("您输入的日期有误。\n");
return0;
}
}
int mdays(struct date day) /*查询某月的总天数*/
{
staticint day_tab[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}
};
intm,LP;
LP=day.year%4==0&&day.year%100!=0||day.year%400==0; /*判定year为闰年还是平年,lp=0为平年,非0为闰年*/
m=day_tab[LP][day.month];
returnm;
}
int allday(int x) /*计算全部天数*/
{
structdate today;
today.year=x/10000;
today.month=x%10000/100;
today.day=x%100;
inty;
intcount1=0,count2=0;
intallday,i,k;
for(y=2000;y<today.year;y++)
{
if(y%4==0&&y%100!=0||y%400==0)
count1++;
count2++;
}
allday=count2*365+count1;
intlp[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}
};
if(today.year%4==0&&today.year%100!=0||today.year%400==0) /*判断是否为瑞年,是的话k=1,否则k=0*/
k=1;
else
k=0;
for(i=0;i<today.month-1;i++)
{
allday+=lp[k][today.month-1];
}
allday=allday+today.day;
returnallday;
}