您的位置:首页 > 编程语言 > C语言/C++

使用C语言解决:某人从2010年1月1日起开始“三天打鱼两天晒网”,问这个人在以后的某一天中是“打鱼”还是“晒网”。

2019-03-02 08:52 253 查看

1. 程序说明
此程序使用C语言编写,运行此程序时,需要在工程文件夹下建立in.txt文件,并存储8位数表示日期。
2. 算法设计
根据题意可以将解题过程分为三步:
(1)计算从2010年1月1日开始至指定日期共有多少天;
(2)由于“打鱼”和“晒网”的周期为5天,所以将计算出的天数用5去除;
(3)根据余数判断他是在“打鱼”还是在“晒网”;若余数为1,2,3,则他是在“打鱼”,否则是在“晒网”
3. 流程图

4. 程序代码

#include<stdio.h>
int sum_days();	//计算给定日期与20100101相差天数
int mon_days();	//计算平年给定月份是当年的第多少天
bool judge_data();	//判断所读取的数据是否合理
void judge();	//判断某日期打鱼还是晒网
void duwendang();	//从in.txt里读取八位字符并转化为整型赋值给year,month,day
int year,month,day;	//声明全局变量
void main()
{
duwendang();
if(judge_data())
printf("数据不合理\n");
else
judge();
}

int sum_days()	//计算给定日期与20100101相差天数
{
int days;	//days为相差的总天数
if(year-2010==0)	//判断是否是2010年
if(month<3)	//2010年1月和2月与20100101相差天数的计算方法
days=day+mon_days();
else
days=mon_days()+day+1;		//2010年其他月份相差天数的计算方法
else
days=(year-2010)*365+mon_days()+day+(year-2010)/4;		//其他年份总天数计算方法
return days;
}

int mon_days()	////计算平年给定月份前的月份有多少天
{
int mondays;
switch(month)
{
case 1:mondays=0;break;
case 2:mondays=31;break;
case 3:mondays=59;break;
case 4:mondays=90;break;
case 5:mondays=120;break;
case 6:mondays=151;break;
case 7:mondays=181;break;
case 8:mondays=212;break;
case 9:mondays=243;break;
case 10:mondays=273;break;
case 11:mondays=304;break;
case 12:mondays=334;break;
}
return mondays; //返回天数为整型数据
}

bool judge_data()	//判断所读取的数据是否合理
{
if(year<2010 || year>2019 || month<1 ||month>12 ||day<1 || day>31)
{
{
{
if((year-2010)%4==0 && month==2 && day>29)
return true;
if(month==4 || month==6 || month==9 || month==11)
if(day>30)
return true;
}
return true;
}
return true;
}
else
return false;

}

void judge()	//判断某日期打鱼还是晒网
{
FILE *fp;
if(sum_days()%5<4 && sum_days()%5>0)	//判断相差天数除5的余数,若为1,2,3则打鱼,否则晒网
{
fp=fopen("out.txt","wt+");
char st[20]="该天打鱼";
fputs(st,fp);
fclose(fp);
}
else
{
fp=fopen("out.txt","wt+");
char st[20]="该天晒网";
fputs(st,fp);
fclose(fp);
}
printf("已生成文件out.txt\n");
}

void duwendang()	//从in.txt里读取八位字符并转化为整型赋值给year,month,day
{
int i=0;
FILE *fp;
char ch,c[8];
fp=fopen("in.txt","rt");
while(ch!=EOF)	//读取文件中的字符
{
c[i]=fgetc(fp);
i++;
}
year=(c[0]-48)*1000+(c[1]-48)*100+(c[2]-48)*10+(c[3]-48);
month=(c[4]-48)*10+(c[5]-48);
day=(c[6]-48)*10+(c[7]-48);	//将文档里的字符型数字转化为整型数据
}
/*
系统版本:Windows 7 旗舰版
版本6.1(内部版本 7601: Service Pack 1)
编写软件版本:Visual C++ 6.0
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐