三天打鱼两天晒网

 

第一章

   中国有句俗语叫“三天打鱼两天晒网”。某人从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日开始到用户指定日期的天数,判断该人是在打鱼还是晒网,并能够检测错误日期的输入。这次作业的主要问题就在于总天数的计算上,解决了这一问题,整个程序也就一目了然,另外我增加了日期的正确性的检测功能,这个问题也要考虑很多,编程期间也碰到了不少问题,最后不断调试,成功了,通过这次作业,我收获到了很多有用的知识,与此同时也发现了自己的不足之处,基础知识掌握不牢固,不能学以致用,发现编程这方面还得通过多多实践提高,以后要认真学习专业知识。