中国有句俗语叫“三天打鱼两天晒网”某人从2010年1月1日开始“三天打鱼两天晒网”,问这个人在以后的某一天中是“打鱼”还是“晒网”。
一.设计思路
我是选择用c++来完成这个题目,首先分析题目,三天打鱼两天晒网意思五天为一个周期,只需要计算出“某一天”到2010年1月1日的天数并除以5,如果余数为123则他是在“打鱼”,否则即为“晒网”。所以本道题的重点就是求输入日期到起始日期的天数。第一步先计算输入日期到起始日期中间所隔的年数,这里需要判断这中间有没有闰年,如果有则在总天数中加1。第二步计算输入日期这一年的总天数,先要判断这一年是否为闰年,若为闰年在判断是否在二月之后,如果在二月之后则在总天数之上加一。最后计算中总天数,判断为“打鱼”还是“晒网”。
最后又运用所学的输入输出流的知识,实现了文件的读取。可将所需判断的日期放入一个文件中,程序会读取文件中的信息并将结果输出至新的文件中。
代码块
using namespace std;
int main() {
FILE *fp;
int i,n,j,y,m,d,h,s,k,l,temp;
int a[13]= {0,31,28,31,30,31,30,31,31,30,31,30,31}; //表示1月份前面有0天,2月份前面有31天,3月份前面有31加28天,,,
int b[1000];
printf(“请选择:1.键盘输入 2.文件读取\n”);
scanf(“%d”,&temp);
n=365,j=0;
switch(temp) {
case 1:
printf(“请输入日期(格式:year,month,date):\n”);//输入年、月、日
scanf(“%d,%d,%d”,&y,&m,&d);
//求输入年份之前每年的总天数
for(i=2010; i<y; i++) {
if((i%4==0&&i%100!=0)||i%400==0) { //判断是否为闰年
j=j+n+1;//如果为闰年则这年总天数为365+1
} else
j=j+n;//如果不是闰年则这年总天数为365天
}
//求输入年份的总天数
h=0;
for(i=1; i<m; i++) {
h=h+a[i];
}
if((y%4==0&&y%100!=0)||y%400==0)//判断输入年份是否为闰年
if(m>2)//判断输入月份是否在二月之后
h=h+1;
//求总天数
s=j+h+d;
i=s%5;
if(i<=3)
printf("今天是打鱼\n");//除以周期5,若123则为打鱼
else
printf("今天是晒网\n");//否则为晒网
break;
case 2:
k=0;
if((fp=fopen("in.txt","r"))==NULL) {
printf("无法打开\n");
}
while(!feof(fp)) {
fscanf(fp,"%d",&b[k]);
k++;
}//读入数据
fclose(fp);
if((fp=fopen("out.txt","w"))==NULL) {
printf("无法打开\n");
}
for(l=0; l<k; l++) {
y=b[l]/10000;
m=(b[l]/100)%100;
d=b[l]%100;
if(y<2010||m<1||m>12||d>31||d<1){
printf("文件内容有误,请修改!");
break;
}
for(i=2010; i<y; i++) {
if((i%4==0&&i%100!=0)||i%400==0) { //判断是否为闰年
j=j+n+1;//如果为闰年则这年总天数为365+1
} else
j=j+n;//如果不是闰年则这年总天数为365天
}
//求输入年份的总天数
h=0;
for(i=1; i<m; i++) {
h=h+b[i];
}
if((y%4==0&&y%100!=0)||y%400==0)//判断输入年份是否为闰年
if(m>2)//判断输入月份是否在二月之后
h=h+1;
//求总天数
s=j+h+d;
i=s%5;
if(i<=3) {
printf("%d今天是打鱼\n",b[l]);
fprintf(fp,"%d:今天是打鱼\n",b[l]);//除以周期5,若123则为打鱼
} else {
printf("%d今天是晒网\n",b[l]);
fprintf(fp,"%d:今天是晒网\n",b[l]);//否则为晒网
}
}//写入数据
fclose(fp);
break;
default:
printf("input error!");
}
return 0;
}