程序设计方法学作业
一.题目:中国有句俗语叫“三天打鱼两天晒网”。某人从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,则他是在“打鱼”,否则 是在“晒网”
在这三步中,关键是第一步。求从2010年1月1日至指定日期有多少天,要判断经历年份中是否有闰年,二月为29天,平年为28天。
C语言中判断能否整除可以使用求余运算(即求模)
三.个人学习心得
当看到编程题目“三天打鱼两天晒网”时,突然觉得编程是一个很神奇的东西,生活中很难解决的问题通过代码就可以搞定。
这个问题解决的关键在于计算从2010年1月1日至某一天的天数,天数中间还要分清平年(365)与闰年(366)的不同,大月小月的判断等,最后利用天数取余,余数为0或4,为晒网,剩下为打鱼。
除了简单的判断以外,还想将输入时间进行文件保存,对于写文件自己的能力还是不够,尝试好几次都失败,最终还是放弃。在以后的学习中还是得多学习,毕竟好多程序的编写都需要文件。
四.源代码
#include <stdio.h>
#include <stdlib.h>
int Insert(); //录入数据并判断是否合法
int Date(int, int, int); //求期间的天数,参数为年月日
int Date(int year, int month, int day)
{
int days = 0; //期间共有多少天
int days_tmp = 0; //不满一年的整月天数
int oyear[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int lyear[] = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int i = 0;
int j = 0;
for(i = 2010; i <= year; i++) //遍历每一年
{
if((i % 4 == 0 && i % 100 != 0) || (i % 400 == 0)) //判断闰年
{
if((year - i) != 0) //判断是否为完整的一年
days += 366;
else
{
for(j = 0; j < month - 1; j++)
days_tmp += lyear[j];
days += days_tmp + day;
}
}
else
{
if((year - i) != 0) //判断是否为完整的一年
days += 365;
else
{
for(j = 0; j < month - 1; j++)
days_tmp += oyear[j];
days += days_tmp + day;
}
}
}
return days;
}
int Insert()
{
int days = 0, //从始至终的总天数
year = 0,
month = 0,
day = 0;
int num = 0;
printf("\t 输入一个2010年1月1日后的日期 \n\n");
printf("输入日期(例2010,1,1):");
while(1) //录入数据并判断是否合法
{
scanf("%d,%d,%d", &year, &month, &day);
if(year >= 2010 && month >= 1 && month <= 12) //判断年月
{
if(month == 1||month == 3||month == 5||month == 7||month == 8||month == 10||month == 12)
{
if(day >= 1 && day <= 31) //大月天数是否合法
break;
else
{
printf("输入错误,请重新输入:");
}
}
else if(month == 2) //2月天数是否合法
{
if((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) //闰年
{
if(day >= 1 && day <= 29)
break;
else
{
printf("输入错误,请重新输入:");
}
}
else
{
if(day >= 1 && day <= 28)
break;
else
{
printf("输入错误,请重新输入:");
}
}
}
else if(day >= 1 && day <= 30) //小月天数是否合法
break;
else
{
printf("输入错误,请重新输入:");
}
}
else
{
printf("输入错误,请重新输入:");
}
}
days = Date(year, month, day); //调用求天数的函数
return days; //返回天数
}
int main()
{
int days = 0; //从始至终的总天数
days = Insert(); //调用函数
if((days % 5 == 4) || (days % 5 == 0)) //利用取余判断打鱼还是晒网
printf("这一天晒网");
else
printf("这一天打鱼");
return 0;
}