文章目录
- 一、问题描述
- 二、问题分析与算法设计
- 总结
一、问题描述
中国有句俗语叫“三天打鱼两天晒网”。某人从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,在打鱼,否则在晒网。
流程图如下:
程序设计实现源代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56#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语言实现一、问题描述二、问题分析与算法设计总结内容请搜索靠谱客的其他文章。
发表评论 取消回复