中国有句俗语叫“三天打鱼两天晒网”。某人从2010年1月1日起开始“三天打鱼两天晒网”,问这个人在以后的某一天中是“打鱼”还是“晒网”。用C++实现程序解决问题。
根据题意可以将解题过程分为三步:
1)计算从2010年1月1日开始至指定日期共有多少天;
2)由于“打鱼”和“晒网”的周期为5天,所以将计算出的天数用5去除;
3)根据余数判断他是在“打鱼”还是在“晒网”;
若 余数为1,2,3,则他是在“打鱼”
否则 是在“晒网”
在这三步中,关键是第一步。求从2010年1月1日至指定日期有多少天,要判断经历年份中是否有闰年,二月为29天,平年为28天。闰年的方法可以用伪语句描述如下:
如果 ((年能被4除尽 且 不能被100除尽)或 能被400除尽)
则 该年是闰年;
否则 不是闰年。
C++语言中判断能否整除可以使用求余运算(即求模)
程序设计流程图
开始日期
start_days.year=2010;
start_days.month=1;
start_days.day=1;
指定日期
end_days.year;
end_days.month;
end_days.day;
源代码
/**
*Title: 中国有句俗语叫“三天打鱼两天晒网”。某人从2010年1月1日起开始
“三天打鱼两天晒网”,问这个人在以后的某一天中是“打鱼”
还是“晒网”。
*@language C++
*@author 齐佳乐
*@version 2.0
*/
#include<iostream>
using namespace std;
class number_of_days
{
public:
int year;
int month;
int day;
};
int main()
{
int months[12]={31,28,31,30,31,30,31,31,30,31,30,31};
int sum=0;
number_of_days start_days,end_days;
start_days.year=2010;
start_days.month=1;
start_days.day=1;
while(1){
cout<<"input the year(>=2010) ____\b\b\b\b";
cin>>end_days.year;
cout<<"input the month __\b\b";
cin>>end_days.month;
cout<<"input the day __\b\b";
cin>>end_days.day;
//判断输入的数据是否正确
if(end_days.year>=2010&&end_days.month>0&&end_days.month<=12&&end_days.day>=0&&end_days.day<=31)
{
break;
}
else
{
cout<<" 输入错误,请重新输入! ";
system("pause");
system("cls");
continue;
}
}
//输入年份和2010整年之间相差年的总天数
while((end_days.year-start_days.year)>0)
{
if((start_days.year%4==0&&start_days.year%100!=0)||(start_days.year%400==0))
{
sum+=366;
}
else
{
sum+=365;
}
start_days.year++;
}
//计算1~end_days.month-1月的总天数
for(int i=0;i<end_days.month-1;i++)
{
sum+=months[i];
if((end_days.year%4==0&&end_days.year%100!=0)||(end_days.year%400==0))
{
if((end_days.month-1)>2)
{
sum+=1;
}
}
}
sum+=end_days.day;
if((sum%5)!=4&&((sum%5)!=0))
{
cout<<"总天数除5余:"<<sum%5<<"在打鱼 ";
}
else{
cout<<"总天数除5余:"<<sum%5<<"在晒网 ";
}
return 0;
}
测试图片
输入错误测试01
数据结果测试01
数据测试结果02