三天打鱼两天晒网
第一章
中国有句俗语叫“三天打鱼两天晒网”。某人从2010年1月1日起开始“三天打鱼两天晒网”,问这个人在以后的某一天中是“打鱼”还是“晒网”。用C或C++语言/java/python实现程序解决问题。
基本要求:1.程序风格良好(使用自定义注释模板),提供友好的输入输出。
提高要求:1.输入数据的正确性验证。
2.使用文件进行数据测试。如将日期 20100101 20111214 等数据保存在in.txt文件中,程序读入in.dat文件进行判定,并将结果输出至out.txt文件。
#include<stdio.h> #include<stdlib.h> int main() { int year=0,month=0,day=0;//当前年月日 int n=0;//距离2010.1.1的天数 int d;//每月的天数 FILE *p,*q; p=fopen("in.txt","r"); q=fopen("out.txt","w"); fscanf(p,"%d %d %d",&year,&month,&day);//从in.txt中读入日期 //判断输入的日期是否正确 switch(month) { case 1:case 3:case 5:case 7:case 8:case 10:case 12: d=31; case 4:case 6:case 9:case 11: d=30; } if(((year%4==0)&&(year%100!=0))||(year%400==0)&&month==2) d=29; else d=28; if((year<2010)||(month>12)||(day>d)) { printf("日期格式有误"); fprintf(q,"%s","日期格式有误"); } else { //将差的年数转化为天数 for(int j=2010;j<year;j++) { if(((j%4==0)&&(j%100!=0))||(j%400==0)) n+=366; else n+=365; } //将差的月数转化为天数 for(int i=1;i<month;i++) { if((i==1)||(i==3)||(i==5)||(i==7)||(i==8)||(i==10)) n+=31; else if(i==2) { if(((j%4==0)&&(j%100!=0))||(j%400==0)) n+=29; else n+=28; } else n+=30; } n+=day;//将差的天数补上 printf("%d\n",n);//输出打渔天数 fprintf(q,"%d",n);//将打渔天数存入out.txt中 if(n%5>0&&n%5<4) { printf("他在打鱼\n");//打印结果 fprintf(q,"%s","他在打鱼\n");//将结果存入out.txt中 } else printf("他在晒网\n");//打印结果 fprintf(q,"%s","他在晒网\n");//将结果存入out.txt中 fclose(p);//关闭文件 fclose(q); return 0; } }
学习心得:刚开始拿到题目后,由于编程基础薄弱,有点无从下手,看了老师给的分析思路,发现最重要的一步是计算从2010年1月1日开始到用户指定日期的天数,判断该人是在打鱼还是晒网,并能够检测错误日期的输入。这次作业的主要问题就在于总天数的计算上,解决了这一问题,整个程序也就一目了然,另外我增加了日期的正确性的检测功能,这个问题也要考虑很多,编程期间也碰到了不少问题,最后不断调试,成功了,通过这次作业,我收获到了很多有用的知识,与此同时也发现了自己的不足之处,基础知识掌握不牢固,不能学以致用,发现编程这方面还得通过多多实践提高,以后要认真学习专业知识。