第一次程序设计与方法优化作业

作者:A.y.

日期:2019/2/28

运行环境:Visual C++ 6.0

问题描述:某人从2010/1/1日起,开始"三天打鱼两天晒网",问这个人在之后的某一天中是"打鱼"还是"晒网",要求输入日期正确性验证,同时将输入数据保存到in.txt文件,将结果保存到out.txt文件。

算法设计思路:首先通过问题可以知道需要输入的有三个变量year,month,day;因此可以定义一个结构体包含这三个变量便于操作;还需计算所求日期到2010/1/1日之间的总天数用来对5取余数,以此判断该人是 ”打鱼"还是"晒网",计算日期时还需要判断该年是闰年还是平年,对于日期的正确性验证需要判断输入日期的合理性和,最后就只剩下对文件的写入操作了。

算法设计流程图:

代码实现:

#include<stdio.h>
#include<stdlib.h> 
struct date                                           //定义结构体表示所求日期
{ int year; int month; int day;};
//计算所求日期与2010/1/1之间每一年的天数的函数
int temp(struct date D)                                        
{ int i,symbol=0;                                     //symbol是闰年的标记,symbol为0是平年,symbol为1是闰年 
  int number[2][13]= {{31,28,31,30,31,30,31,31,30,31,30,31},{31,29,31,30,31,30,31,31,30,31,30,31}};//闰年与平年每个月的天数 
  if((D.year%4== 0)&&(D.year%100!= 0)||(D.year%100== 0))        //判断是否为闰年  
     symbol=1;  
  for(i=1;i<D.month;i++) 
     D.day=D.day+number[symbol][i]; 
  return D.day;
}
//输入所求日期同时判断输入日期是否合理的函数
bool display(struct date D)                                       
{ FILE *fp1;                                          //定义in.txt文件指针                                   
  fp1=fopen("in.txt","at");                           //设置打开文件方式为正常打开并可添加数据 
  if(fp1== NULL) 
  {  printf("File cannot open!");  
     exit(0); 
  }    
  int m,symbol=0;                                     //symbol是闰年的标记,symbol为0是平年,symbol为1是闰年 
  printf("\tPlease enter a query date(year/month/day):" ); 
  m=scanf("%d/%d/%d",&D.year,&D.month,&D.day);        //输入所求日期 
  fprintf(fp1,"%d/%d/%d\n",D.year,D.month,D.day);     //向文件中添加数据 
  fclose(fp1); 
  int number[2][13]={{31,28,31,30,31,30,31,31,30,31,30,31},{31,29,31,30,31,30,31,31,30,31,30,31}};   //闰年与平年每个月的天数 
  if((D.year%4== 0)&&(D.year%100!= 0)||(D.year%100== 0))                    //判断是否为闰年  
     symbol=1; 
  if(m!=3||D.year<2010||D.month>12||D.day>number[symbol][D.month-1])        //判断输入是否合理 
  {  m=1;  
     return false; 
  } 
  return true;
}
int main()
{ int i,a,sum;                                         //sum为所求日期到2010/1/1日之间的天数 
sum=0;
struct date D1,D2; 
FILE *fp2;                                             //定义out.txt文件指针 
fp2=fopen("out.txt","at+");                            //设置打开文件方式是正常打开并可添加数据 
if(fp2==NULL)      
{  printf("File cannot open!");  
   exit(0); 
}
while(!display(D1))                                    //判断日期是否输入正确 
{  printf("\n\tEnter error!Please enter again!\n");  
   fprintf(fp2,"Enter error!\n"); 
} 
for(i=2010;i<D1.year;i++)                              //计算所求日期到2010/1/1之间的天数 
{  D2.year=i;  
   sum=sum+temp(D2);
} 
sum=sum+temp(D1); 
a=sum%5;                                               //求余,若余数大于0小于4,则该人当天在捕鱼,否则在晒网 
if(a>0&&a<4) 
{  printf("\n\tThe man is fishing.");  
   fprintf(fp2,"The man is fishing\n"); 
}
else 
{  printf("\n\tThe man is relaxing.\n");               //将所求结果显示出来  
   fprintf(fp2,"The man is relaxing\n"); 
} 
fclose(fp2); 
return 0
}   

运行截图:

心得:通过实际操作了解对代码的注释有了深入的了解,对于文件的读写等操作也熟悉,但有个缺陷就是通过.dat文件进行判定这个操作仍未能实现,网上查阅了很久也没能找到,希望之后能在图书馆找到相关的操作。

猜你喜欢

转载自blog.csdn.net/qq_43696482/article/details/88061317
今日推荐