打鱼晒网问题(C++)

题目链接:https://www.bilibili.com/video/av21356335?p=3

问题描述:某人从1999年1月1日起开始三天打鱼两天晒网,计算输入的日期是打鱼还是晒网

问题分析:

(1)先计算出输入的日期距1990.01.01一共有多少天

(2)用计算出的天数去取余5,根据结果判断若余数为1,2,3则为打鱼,其他为晒网

 

程序一:

#include<iostream>
using namespace std;

//判断输入的年份是否为闰年 
bool is_leap_year(int year)
{
	if ((year%400==0) || ((year%100!=0)&&(year%4==0)))
	{
		return true;
	}
	return false;
}

//计算输入的日期距离 1990 年 1 月 1 日一共多少天 
int total_day(int year, int month, int day)
{
	int total_num = 0;
	int this_year = year;
	int day_of_month[] = {31,28,31,30,31,30,31,31,30,31,30,31};
	
	while(this_year>1990)
	{
		if(!is_leap_year(this_year))
		{
			total_num += 365;
		}
		else
		{
			total_num += 366;
		}
		this_year--;
	}
	
	for(int i = 1; i<month; i++)
	{
		total_num += day_of_month[i-1];
	}
	
	//若日期大于二月并且该年是闰年,总天数 + 1 
	if(month>2 && is_leap_year(year))
	{
		total_num++;
	}
	
	total_num += day;
	return total_num;
}

int main() 
{
	cout<<"请输入日期:"<<endl;
	int year,month,day;
	int total_number;
	 
	cin>>year;
	cin>>month;
	cin>>day; 
	
	total_number = total_day(year,month,day);
	cout<<year<<"年"<<month<<"月"<<day<<"日距1990年1月1日一共有"<<total_number<<"天"<<endl;
	
	int remainder = total_number % 5;
	
	if(remainder==1 || remainder==2 || remainder==3)
	{
		cout<<"今天打鱼!"<<endl; 
	}
	else
	{
		cout<<"今天晒网!"<<endl; 
	}
	
	return 0;
}

程序二:定义结构体存储日期

#include<iostream>
using namespace std;

//定义日期结构体
typedef struct date{
	int year;
	int month;
	int day;
}DATE; 

//计算天数的函数声明 
int countDay(DATE);

//判断是否为闰年的函数声明 
int runYear(int); 

int main(){
	DATE today;		//指定日期 
	int totalDay;		//指定日期距 1990.01.01的天数
	int result;		//总天数对 5 取余的结果
	
	cout<<"输入指定日期: "<<endl; 
	cin>>today.year;
	cin>>today.month;
	cin>>today.day;
	
	totalDay = countDay(today);
	cout<<"今天是第"<<totalDay<<"天"<<endl; 
	
	result = totalDay%5;
	if(result>0&&result<4)
		cout<<"今天打鱼!"<<endl;
	else
		cout<<"今天晒网!"<<endl;
		
	return 0;
} 

//判断是否为闰年 
int runYear(int year)
{
	if((year%400==0&&year%100!=0)||(year%400==0))
		return 1;
	else
		return 0;
 } 
 
 //计算输入日期距规定日期的总天数 
 int countDay(DATE currentDay)
 {
 	  int perMonth[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
 	  int totalDay = 0,i,year;
 	  
 	  for(year=1990;year<currentDay.year;year++)
 	  {
 	  	if(runYear(year))
 	  		totalDay += 366;
 	  	else
 	  		totalDay += 365;
	   }
	   
	   if(runYear(currentDay.year))
			perMonth[2] = 29;
			
		for(i=0;i<currentDay.month;i++)
			totalDay += perMonth[i];
			
		totalDay += currentDay.day;
		
		return totalDay;
 }

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值