三天打鱼两天晒网(首次博客)

作者:无*
**题目:
中国有句俗语叫“三天打鱼两天晒网”。某人从2010年1月1日起开始“三天打鱼两天晒网”,问这个人在以后的某一天中是“打鱼”还是“晒网”。用C或C++语言/java/python实现程序解决问题。
**提高要求:
1.输入数据的正确性验证。
2.使用文件进行数据测试。如将日期 20100101 20111214 等数据保存在 in.txt文件中,程序读入in.dat文件进行判定,并将结果输出至out.txt文件。
**编程思路:
计算从2010年1月1日开始至指定日期共有多少天;先判断是否为闰年,再分别计算年,月,日之间的天数。
由于“打鱼”和“晒网”的周期为5天,所以将计算出的天数用5去除;根据余数判断他是在“打鱼”还是在“晒网”;若余数为1,2,3,则他是在“打鱼”。否则是在“晒网”。

** 相关程序及注释

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int x;                                                       //x代表打鱼或晒网
void sum(int year,int month,int day )

{    int a1[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};     //闰年对应月份天数
	 int a2[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};     //平年对应月份天数
     int days=0;
	 int m;
	for(int i=2010;i<year;i++)                     //计算相应年数之间的天数
			 {
		       if(i%400==0||(i%4==0&&i%100!=0))            //判断是否为闰年
			   {	days+=366;
                     m=0;                                      //m=0表示闰年
			   }
		       else
			   {   days+=365;
		           m=1;                                      //m=1表示平年
			   }
			 }
	         if(m==0)                                           //计算相应月份对应天数
			 {   
				 for(int i=1;i<month;i++)
				 {    days=days+a1[i];
				 }
			 }
	         else
	            {
				 for(int i=1;i<month;i++)
			   {days=days+a2[i];
				 }
			 }
	days=days+day;                                      //根据日计算日对应的天数
	printf("共有%d天\n",days);
if(days%5==1||days%5==2||days%5==3)                      //通过总天数对5求余,余数为1,2,3则在打鱼
{printf("%d年%d月%d日他在打鱼",year,month,day);
x=1;                                             
}
else{ printf("%d年%d月%d日他在晒网",year,month,day);
 x=0;
}
}
   int main()
{     
	int year,month,day;
	int s;
	printf("是否进行文本测试 1代表是,其他数代表否 \n");         //根据输入是否为1判断是否进行文本测试
	scanf("%d",&s);
	if(s==1)                                                     //进行文本测试
	{  
    FILE *a,*b;                               
     a=fopen("in.txt","r");                                   //打开只读文件
     b=fopen("out.txt","w");                                  //打开只写文件
     if(a==NULL)
	  {printf("错误");
      exit(1);
	  }
	  else
      fscanf(a,"%d%d%d",&year,&month,&day);
         if(year<2010||month<1||day<1)
		 {    printf("输入有误:\n");
			 fprintf(b,"%s","输入有误:\n");}
		 else
		 {
      sum(year,month,day);
      if(x==1)
	  {
      fprintf(b,"%s","他今天在打鱼\n");
	  }
      else
	  { fprintf(b,"%s","他今天在晒网\n");
	  }
   fclose(a);
   fclose(b);
	}
	}
	else                                                      //此处为直接在弹出框输入年月日
	{
		printf("请依次输入年月日 \n");
	scanf("%d%d%d",&year,&month,&day);
	   if(year<2010||month<1||day<1)
	      printf("输入有误:\n");
	   else 
	   {    sum(year,month,day);
	   }
	 }
return 0;
}

**相关截屏
文本测试截图
三天打鱼两天晒网(首次博客)
手动输入日期截图
三天打鱼两天晒网(首次博客)
**相关问题:
在这次编程中,主要问题在于文本测试方面,如何正确的进行文本读写,相关指针的应用,编写过程中也出现过多次报错,但通过一步步地调试,最终还是解决了代码有误的问题。在这次程序编写过程中也重新复习了很多关于c语言的知识,收获还是有很多的。

**心得体会:
此程序关键问题在于判断是否为闰年,并注意相关的判断条件,用数组表示相关年份中每个月的天数。完成一个新的程序之前一定要将思路编写完整会加快代码的编写与完成; 流程图是最关键的,尽量使用简单的代码会减少整体代码复杂度并且易于实现; 遇到无法解决的问题时经常上网查询有助于加快学习,尤其是细小的问题,比如文本的读写要多查阅相关资料。
尽管程序完成的过程有些小问题,但通过查阅书籍,最后还是解决了,对于此次代码的编写上,基本实现了基本要求和提高要求,自己也从中学到了很多,第一次写博客,难免有些不足,哈哈哈!!但是想到能成功发表并分享我的这次编写过程和心得还是挺开心的。其次,我认为发表博客也是记录我们进步的一个做法!!!