“三天打鱼两天晒网”问题

题目:中国有句俗语叫“三天打鱼两天晒网”。某人从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 Count(int y,int m,int d,int month[])/*计算从2010年1月1日到输入的日期的天数*/
{
	int x=0;                              /*定义变量x来存储天数*/
	for(int Y=2010;Y<y;Y++)             /*开始计算天数*/
	{
		if((Y%4==0&&Y%100!=0)||Y%400==0)
			x+=366;
		else
			x+=365;
	}
	if((y%4==0&&y%100!=0)||y%400==0)    
		month[1]=29;
	else
		month[1]=28;
	for(int i=1;i<m;i++)
	{
		x+=month[i-1];
	}
	x+=d;                               
	return x;                          /*返回计算得到的天数*/
}
void File(int s[])                     /*文件操作函数*/
{
	FILE *fp;                          /*定义文件in.txt的指针*/
	if((fp=fopen("d:\\in.txt","wt+"))==NULL) /*打开文件in.txt*/
	{
		printf("打开文件失败!");
		exit(1);
	}
	printf("请输入年月日:");
	scanf("%d%d%d",&s[0],&s[1],&s[2]);
    fprintf(fp,"%d\n%d\n%d\n",s[0],s[1],s[2]);/*将输入的年月日写入到文件in.txt中*/
	rewind(fp);                               /*移动文件内部指针到首位*/
	for(int i=0;i<3;i++)                      /*读取文件in.txt中的数据,并分别赋值给数组s的几个元素*/
		fscanf(fp,"%d",&s[i]);
	fclose(fp);                               /*关闭文件in.txt*/
}
int Juge(int y,int m,int d)                  /*判断数据是否合法的函数*/
{
	if(y>2010||y==2010)                       /*判断年份是否合法*/
	{
		if(m>0&&m<13)                         /*判断月份是否合法*/
		{
			if(m==1||m==3||m==5||m==7||m==8||m==10||m==12)/*以下判断日子是否合法*/
			{
				if(d>31||d<1)
				{
					printf("数据错误!");
				    return 0;
				}
				else
				{
					printf("数据正确!");
				    return 1;
				}

			}
			else if(m==4||m==6||m==9||m==11)
			{
				if(d>30||d<1)
				{	
					printf("数据错误!");
				    return 0;
				}
				else
				{
					printf("数据正确!");
				    return 1;
				}
			}
			else
			{
				if((y%4==0&&y%100!=0)||y%400==0)    
				{
					if(d<1||d>29)
					{	
						printf("数据错误!");
					    return 0;
					}
					else
					{
						printf("数据正确!");
					    return 1;
					}
				}
	            else
				{
					if(d<1||d>28)
					{
						printf("数据错误!");
					    return 0;
					}
					else
					{
						printf("数据正确!");
					    return 1;
					}
				}
	 	        
			}
		
		}
		else
		{	
			printf("数据错误!");
		    return 0;
		}
	}
	else
	{
		printf("数据错误!");
	    return 0;
	}
}
void main()
{
	int month[12]={31,28,31,30,31,30,31,31,30,31,30,31};/*先定义每个月的天数的数组,暂将2月定为28天,根据具体情况再做变动*/
	int y,m,d,X;                                        /*定义年、月、日以及接收返回值的变量*/
	int s[3];                                           /*定义数组用来保存年月日*/
	File(s);
	y=s[0];
	m=s[1];
	d=s[2];
    if(Juge(y,m,d)==1)
    {
		X=Count(y,m,d,month);
		FILE *fp1;                                           /*定义文件out.txt的指针*/
		if((fp1=fopen("d:\\out.txt","w"))==NULL)/*打开文件out.txt,准备写入计算结果*/
		{
			printf("打开文件失败!");
			exit(1);
		}
		if(X%5==0||X%5==4)                       /*向文件out.txt中写入计算结果*/      
			fprintf(fp1,"%d年%d月%d日在晒网!",y,m,d);
		else
			fprintf(fp1,"%d年%d月%d日在打鱼!",y,m,d);
		fclose(fp1);                             /*关闭文件out.txt*/
	}
}

 

 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值