“三天打鱼,两天晒网”日期计算和判定,C语言程序
第一章
中国有句俗语叫“三天打鱼两天晒网”。某人从2010年1月1日起开始“三天打鱼两天晒网”,问这个人在以后的某一天中是“打鱼”还是“晒网”。用C或C++语言/java/python实现程序解决问题。
基本要求:
1.程序风格良好(使用自定义注释模板),提供友好的输入输出。
提高要求:
1.输入数据的正确性验证。
2.使用文件进行数据测试。如将日期 20100101 20111214 等数据保存在in.txt文件中,程序读入in.dat文件进行判定,并将结果输出至out.txt文件。
算法思路:
1.计算从2010年1月1日开始至输入的日期共有多少天;先用循环语句算经历了多少个闰年,再加上多出来的天数。
2.可以知道“打鱼”和“晒网”的周期为5天,所以将计算出的天数用5去除;
3.根据余数来判断他是在“打鱼”还是在“晒网”;
如果 余数为1,2,3,则他是在“打鱼”
否则 是在“晒网”;
4.判断是否为闰年时
如果 ((年能被4除尽 且 不能被100除尽)或 能被400除尽)
则 该年是闰年;
否则 不是闰年。
流程图
具体代码
#include <stdio.h>
#include <stdlib.h>
int str[12]={31,28,31,30,31,30,31,31,30,31,30,31};//将不是闰年的年份的各个月的天数存在数组str中
int nums1=0,nums2=0; //nums1为用户所输入的所在年(假设不是闰年)的天数,nums2为用户所输入日期相隔2010年1月1日的总天数
int year,month,day;//3个变量分别为年,月,日的天数
int days=0;//仅为用户所输入年份到2010年相隔的年数,不包括本年
int counts=0;//所经历的闰年的个数
int i;
void input_one()//进行数据输入,以及输入日期正确性的判断
{
int flag=1;//flag用来标记是否正确输入
while(flag)
{ printf("请您输入日期(格式如2018-02-16):\n");
scanf("%d-%d-%d",&year,&month,&day);
if((month==2&&day>29)||year<2010||month>12||month<1||day>31||day<1)//年份大于2010,或者月份大于12,当2月时day大于29也有误
//月份小于1,天数大于31,或者小于1则有误
printf("您输入的日期有误!请您重新输入!\n\n");
else
flag=0;
}
}
void show()//显示结果
{
int i;
for(i=2010;i<=year;i++)
if((i%4==0&&i%100!=0)||i%400==0)//计算出所经历的闰年的个数
counts++;
days=counts*366+(year-2010-counts)*365;
for(i=0;i<month-1;i++)
nums1+=str[i];//计算出如果不是闰年的天数
if((year%4==0&&year%100!=0)||year%400==0)//计算出总天数
nums2=days+nums1+day+1;//是闰年的在原来的基础上再加一天
else
nums2=days+nums1+day;
if((nums2%5==1)||(nums2%5==2)||(nums2%5==3))//总天数被整除后能余1或2或3就是打鱼,否则为晒网
printf("这天是在打鱼!\n\n");
else
printf("这天是在晒网!\n\n");
}
void input_two()//进行文件内的数据测试
{
FILE *fp = NULL;
FILE *fp1=NULL;
char year1[10];//暂时装着读取的字符
char month1[10];
char day1[10];
fp = fopen("test.txt", "r");
fp1= fopen("OUT.txt", "w+");
for(i=0;i<3;i++)//循环读取3次数据
{
fgets(year1, 5, (FILE*)fp);//从文件读取4个字符到year1
year=atoi(year1); //将字符转化为数字
fgets(month1, 3, (FILE*)fp);
month=atoi(month1);
fgets(day1, 4, (FILE*)fp);
day=atoi(day1);
printf("%d-%d-%d\n", year,month,day);
if((year%4==0&&year%100!=0)||year%400==0)
nums2=days+nums1+day+1;
else
nums2=days+nums1+day;
if((nums2%5==1)||(nums2%5==2)||(nums2%5==3))
fprintf(fp1,"这天是在打鱼!\n\n");
else
fprintf(fp1,"这天是在晒网!\n\n");
}
fclose(fp);//关闭文件
}
void main()
{
input_one();
show();
printf("开始文件读入测试:\n");
input_two();
}
学习心得:
这次的题目是程序设计方法中的第一个作业。其中对于我来说比较难解决的是文件的读写操作。之前不太了解,所以产生了一定的困难。但这次作业中感悟最大的是编程风格的重要性。在这之前认为代码只要缩进然后对齐就可以了,并没有考虑到其他方面。