程序设计方法与优化
中国有句俗语叫“三天打鱼两天晒网”。某人从2010年1月1日起开始“三天打鱼两天晒网”,问这个人在以后的某一天中是“打鱼”还是“晒网”。用C或C++语言/java/python实现程序解决问题。
基本要求:1.程序风格良好(使用自定义注释模板),提供友好的输入输出。
提高要求:1.输入数据的正确性验证。2.使用文件进行数据测试。如将日期 20100101 20111214 等数据保存在in.txt文件中,程序读入in.dat文件进行判定,并将结果输出至out.txt文件。
个人学习心得总结:这次这个题目比较有意思,以前看到这句话从未想到过自己有一天会被它难到。但我通过努力完成这次作业,输入日期后先要判断日期输入是否正确,然后判断这天是打鱼还是晒网,这个可以通过函数来实现,日期一般用结构体来实现。判断日期需要考虑多个方面,不仅需要考虑年份是平年还是闰年,还要考虑每一个月份的天数是固定的,所以我用到了很多if-else语句来进行判断。判断当天是打鱼还是晒网,主要是看从起始日期到终止日期的总天数,我用了for循环来求sum。最后在main函数中调用函数。这次代码的完成还需要靠调试来检查代码是否存在其他问题,还要靠测试来完善自己的代码,虽然起步很辛苦,但收获很多。
源文件:
#include<stdio.h>
typedef struct time
{
int year;
int month;
int day;
} date;
void judge(date today)
{
int i,j;
int sum=0;
int num[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
if((today.year%4==0&&today.year%100!=0 )|| (today.year%400==0))
num[2]+=1;
for(i=2010;i<today.year;i++)
{
if((i%4==0&&i%100!=0 )|| (i%400==0))
sum+=366;
else
sum+=365;
}
for(j=1;j<today.month;j++)
{
sum+=num[j];
}
sum+=today.day;//总共的天数
printf("这是第%d天\n",sum);
if((sum%5>0 ) && (sum%5<4))
printf("这天在打渔\n");
else printf("这天在晒网\n");
}
int main()
{
date today;
int flag;
while(1)
{
printf("请输入要查询的日期(请以空格隔开):\n");
scanf("%d %d %d",&today.year,&today.month,&today.day);
if(today.year<2010||today.month<=0||today.month>12||today.day<=0||today.day>31)
{
printf("日期输入有误\n");
flag=0;
}
else if(today.month==1||today.month==3||today.month==5||today.month==7||today.month==8||today.month==10||today.month==12)
{
if(today.day>31)
{
printf("日期输入有误\n");
flag=0;
}
}
else if(today.month!=2)
{
if (today.day>30)
{
printf("日期输入有误\n");
flag=0;
}
}
else if((today.year%4==0&&today.year%100!=0 )|| (today.year%400==0))
{
if(today.day>29)
{
printf("日期输入有误\n");
flag=0;
}
}
else if(today.day>28)
{
printf("日期输入有误\n");
flag=0;
}
else flag=1;
if(flag!=0)
{
judge(today);
}
}
}