概述
文章目录
- 一、问题描述
- 二、问题分析与算法设计
- 总结
一、问题描述
中国有句俗语叫“三天打鱼两天晒网”。某人从2010年1月1日起开始“三天打鱼两天晒网”,问这个人在以后的以后的某一天中是打鱼还是晒网。用C语言或c++实现。
基本要求:1.程序风格良好(使用自定义注释模板),提供友好的输入输出。
提高要求:1.输入数据的正确性验证。
2.使用文件进行数据测试。如将日期 20100101 20111214 等数据保存在in.txt文件中,程序读入in.dat文件进行判定,并将结果输出至out.txt文件。
二、问题分析与算法设计
1)计算从2010年1月1日至指定日期共多少天。思路为:所隔年份天数加上所隔月份天数,加上日的天数,要分平年和闰年,闰年二月有29天,其他只有28天,闰年的判断用伪代码描述如下:
若能被4除尽 且 不能被100除尽或 能被400除尽 闰年。 否则 平年。
2)打鱼晒网周期为5天,,将总天数用5除,若余数为1,2,3,在打鱼,否则在晒网。
流程图如下:
程序设计实现源代码如下:
#include<stdio.h>
int main()
{
int year,month,day,x,a;
int ye=2010;
int sum=0;
int i[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};//建立平年各月份天数的数组
int j[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};//建立闰年各月份天数的数组
printf("请按照年月日的顺序输入日期n");
scanf("%d",&x);//输入日期
year=x/10000;
month=(x%10000)/100;
day=x%100;
while((year<2010)||(month<1||month>12)||((month==2&&(year%4!=0&&year%400!=0)&&day>28)||(day>j[month])))
{
printf("输入日期错误,请重新输入n");
printf("请按照年月日的顺序重新输入日期n");
scanf("%d",&x);
year=x/10000;
month=(x%10000)/100;
day=x%100;
}//判断输入日期是否正确
for(ye;ye<year;ye++) //加上所隔年份天数
{
if((ye%400==0)||(ye%4==0&&ye%100!=0))//判断此年份是否是闰年
{
sum+=366;//闰年总数加366
}
else
{
sum+=365;//平年总数加365
}
}
for(a=1;a<month;a++)//加上所隔月份天数
{
if((ye%400==0)||(ye%4==0&&ye%100!=0))
{
sum+=j[a];//闰年月数
}
else{
sum+=i[a];//平年月数
}
}
sum+=day;
if((sum%5==1)||(sum%5==2)||(sum%5==3))//天数除以5,若余数为1,2,3,则打鱼
{
printf("今天打鱼");
}
else //否则晒网
{
printf("今天晒网");
}
return 0;
}
调试结果如图:
测试结果如图:
总结
这个题目主要得难度是在天数得计算上,我开始想通过判断闰年就给天数一个366,平年就给一个365,但对于整月份的天数计算,我开始是定义了一个一维数组,然后发现闰年和平年来累加有点不好加,于是我又定义了一个二维数组,将闰年和平年的月份分开,这样虽然可能有点繁琐,但不容易出错。在进行本题的设计过程中,我又重新复习了一遍C语言的相关语法,除了基本的循环结构还有文件读写。本题中最核心的部分莫过于计算指定日期,这个过程也学习到了很多。
最后
以上就是美满枫叶为你收集整理的三天打鱼两天晒网C语言实现一、问题描述二、问题分析与算法设计总结的全部内容,希望文章能够帮你解决三天打鱼两天晒网C语言实现一、问题描述二、问题分析与算法设计总结所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复