三天打鱼两天晒网(c语言可用文件进行测试)

三天打鱼两天晒网(C语言)
题目:中国有句俗语叫做“”三天打鱼两天晒网“。某人从2010年1月1日起开始“三天打鱼两天晒网”,问这个人在以后某一天是打鱼还是晒网。
程序要求:①.输入数据正确性验证②使用文件进行数据测试,将测试日期(如2011 1 1存入in.txt 文件中),程序 读入in.txt文件进行判定,并将结果输出值out.txt文件中。
程序

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int date(int year,int month,int day)    //计算当前日期距离2010年月1日多少天
{
int i,j,sign,k1,k2;
static int s[2][12]={{31,29,31,30,31,30,31,31,30,31,30,31},
{31,28,31,30,31,30,31,31,30,31,30,31}};//设置一个二元数组放置平年和闰年每个月的天数
for(i=2010;i<year;i++)                 //判断2010年到输入年份year之间的年份是否闰年
{
	if(i%4==0&&i%100!=0||i%400==0)    //判断此年是否闰年
		day+=366;
	else
		day+=365;
}
if(year%4==0&&year%100!=0||year%400==0)//判断输入年份year是否闰年,来选择该年各月份天数
sign=0;
else
sign=1;
for(j=1;j<month;j++)
{
	switch(sign)                      //选择该年月份天数情况
	{
	case 0:
		{for(k1=0;k1<month-1;k1++)
		day+=s[0][k1];
		};break;
	case 1:
		{for(k2=0;k2<month-1;k2++)
		day+=s[0][k2];
		};break;
	}
}
return day;
}
int main()
{
int yu,year1,month1,day1,a,b,c,tag;
FILE *p,*f;
printf("请输入选择标志tag的值:tag为1是从键盘输入年月日,tag为0是从in.txt中提取日期\n");
scanf("%d",&tag);
switch(tag)
{
case 0:
{
p=fopen("in.txt","r");             //用只读方式打开文件in.txt
f=fopen("out.txt","w");            //用只写方式打开文件out.txt
while(!feof(p))                    //文件指针到达文件末尾时结束数据读取
{                           
 fscanf(p,"%d %d %d",&a,&b,&c);    //从in.txt中读取数据年月日
 printf("%d年%d月%d日",a,b,c);
 year1=a;
 month1=b;
 day1=c;
if(year1<2010||month1<1||day1<1)     //判断输入年月份数据是否正确,若有误,输出输入数据有误。
 printf("输入数据有误,请重新输入\n");
else
{
yu=date(year1,month1,day1);
yu=day1%5;
if(yu<4)                           //根据余数判断打鱼还是晒网
{printf("他这天在打鱼\n");
 fprintf(f,"%d %s %d %s %d %s",year1,"年",month1,"月",day1,"日");//将判断及结果写入out.txt中                          
 fprintf(f,"%s","他这天在打鱼\n");}
else
{printf("他这天在晒网\n");
fprintf(f,"%d %s %d %s %d %s",year1,"年",month1,"月",day1,"日");
fprintf(f,"%s","他这天在晒网\n");}
}	
}}
break;
case 1:{
	printf("请输入年月日\n");
	scanf("%d%d%d",&year1,&month1,&day1);}
	
	break;
}

if(year1<2010||month1<1||day1<1)     //判断输入年月份数据是否正确,若有误,输出输入数据有误。
	printf("输入数据有误,请重新输入\n");
else
yu=date(year1,month1,day1);
yu=day1%5;
if(yu<4)                           //根据余数判断打鱼还是晒网
printf("他这天在打鱼\n");                          
else
printf("他这天在晒网\n");
return 0;
}

心得体会:
1.写程序先要对其进行分步分析。
根据题意可以将解题过程分为三步:①计算从2010年1月1日开始到指定日期共有多少天;②由于打鱼和晒网周期为5天,所以用计算天数除以5。③根据余数判断是打鱼还是晒网。④加入文件读写相关内容。
2.分析问题要考虑到其漏洞。
从文件中提取日期时需要注意.是否符合相关格式,是否在2010年1月1日之前。如果不符合要求的话,应该给予提示。
3.要弄明白文件与程序之间的关系方便进行数据测试
本题中的in.txt和out.txt应该建在同一工程文件下。
4.要多查资料熟练掌握文件的读写例如熟练掌握fprintf和fscanf的用法和方式。

猜你喜欢

转载自blog.csdn.net/weixin_43920565/article/details/88071421