皓皓松的博客

欢迎来到 皓皓松博客,敢想!敢做!敢当!

【课设】C++实现万年历

一、万年历要求的功能

①输入年份,打印出该年份12个月的月历

②输入年份、月份,输出对应年份月份的月历

③输入具体的一个日期,输出这一天是星期几,并计算出与当天相隔的日期数,以及输出公历节日(若有)。

二、代码块

#include <iostream>
#include <iomanip>
using namespace std;
class date//定义一个日期类 
{ 
	public: 
		date(int y=1,int m=1,int d=1):year(y),month(m),day(d){}//构造函数 

		void setyear (int y){year=y;} //改变年份的接口 
		void setmonth(int m){month=m;} //改变月份的接口 
		void setday (int d){day=d;}//改变日期的接口 

		int getyear() const{return year;} //得到年份 
		int getmonth() const{return month;} //得到月份 
		int getday() const{return day;} //得到日期 

		//date operator+(int days); //运算符“+”的重载 
		//date operator-(int days); //运算符"-"的重载 

		static bool isleapyear(int y)//定义布尔型,判断闰年的函数 
		{ 
			return ( y%4==0 && y%100 !=0 || y%400==0 );
		} 
		static int getyeardays(int y)//得到一年的日子 
		{
			 return isleapyear(y)? 366:365; 
		} 
		static int getmonthdays (const date &d); //得到月份的日子 
		static int week(const date& d)
		{	
			int w = 0;
			int y = d.year; 
			int m = d.month;
			if(d.month==1||d.month==2)
			{
				m = d.month+12;
				y = d.year-1;
			}
			w = d.day+2*m+3*(m+1)/5+y+y/4-y/100+y/400;
			w=w%7+1;
			return w;
		} 
		int date_count(const date&d)   //计算输入日期到0年1月1日的天数
		{
 			int t=0;
 			int j;
 			j=d.getyear()-1;
 			int a=j/4-j/100+j/400+d.getyear()*365;//判断年份有多少天(其中还判断了有多少闰年)
 			int n=31;
 			int i=d.getmonth()-1;
 			if(i>=1)//判断输入月份与1月之间有多少天 *难点所在呀!!!
 			{
  				switch(i)
  				{
   					case 2:
    					n+=29;break;
   					case 3:
    					n+=29+31;break;
   					case 4:
    					n+=29+31+30;break;
   					case 5:
    					n+=29+31+30+31;break;
   					case 6:
    					n+=29+31+30+31+30;break;
   					case 7:
    					n+=29+31+30+31+30+31;break;
   					case 8:
    					n+=29+31+30+31+30+31+31;break;
   					case 9:
    					n+=29+31+30+31+30+31+31+30;break;
   					case 10:
    					n+=29+31+30+31+30+31+31+30+31;break;
   					case 11:
    					n+=29+31+30+31+30+31+31+30+31+30;break;
   					default: n=31;break;
  				}
			}
 			else n=0;
 			if(!(d.getyear()%400==0||d.getyear()%4==0&&d.getyear()%100!=0) && d.getmonth()>2)
  				n--;
    		t=a+n-1+d.getday();
 			return t;
		}
	private: 
		int year; //定义三个私有成员 
		int month; 
		int day; 
};

ostream& operator<<(ostream &out,const date &d); //重载“<<”操作符 
istream& operator>>(istream &in,date &d); //重载“>>”操作符 

int date::getmonthdays(const date&d) //得到具体一月的天数 
{ 
	switch( d.getmonth() ) 
	{ 
		case 1: case 3: case 5: case 7: case 8: case 10: case 12: 
			return 31;
		case 4: case 6: case 9: case 11: 
			return 30; 
		case 2: 
			return isleapyear(d.getyear())? 29:28;
	} 
} 

ostream &operator<<(ostream &out,const date &d) 
{ 
	out<<d.getyear()<<"年"<<d.getmonth()<<"月"<<d.getday()<<"日"; 
	return out; 
} 

istream &operator>>(istream &in,date&d) 
{ 
	int year,month,day; 
	cin>>year>>month>>day; 
	d=date(year,month,day); 

	return in; 
}

inline void printyear(int y)//打印域宽 
{
	cout << setw(28) << y << " 年" << endl;//setw(int)设置输出数据项的域宽 
}

inline void printline()//打印行 
{
	cout << " ----------------------------------------------------" << endl;
}

void printmonth(int m)//打印月份 
{
	char month[][5]={ "0", "一", "二", "三", "四", "五", "六", "七", "八", "九", "十", "十一", "十二" };
	cout << setw(27) << month[m] << "月" <<endl;//设置输出数据项的域宽 
}

inline void printweek()
{
	cout << " 星期日 星期一 星期二 星期三 星期四 星期五 星期六" <<endl;
}

void printday(int md, int week)
{
	int line=1;
	if(7 != week)
	{	
		for( int blank=week; blank; --blank,++line )//blank的作用就是空格 
			cout << setw(7) << " ";
	}
	for( int d=1; d<=md; ++d,++line )
	{
		cout << setw(7) << d;
		if( line%7==0 )//当一行有七个时,输出换行符 
		cout << endl;
	}
	cout << endl;
}

void check(int month,int day)
{
	switch(month)
	{
		case 1:
		{	
			if(day == 1)
				cout<<"元旦"<<endl;
			else 
				cout<<"否"<<endl;
		};break;
		case 2:
		{
			if(14 == day)
				cout<<"情人节"<<endl;
			else 
				cout<<"否"<<endl; 
		};break;
		case 3:
		{	
			if(8 == day)
			 	cout<<"妇女节"<<endl;
			else if(12 == day)
				cout<<"植树节"<<endl;
			else 
				cout<<"否"<<endl;
		};break;
		case 4:
		{	
			if(1 == day)
				cout<<"愚人节"<<endl;
			else 
				cout<<"否"<<endl;
		};break;
		case 5:
		{
			if(1 == day)
				cout<<"劳动节"<<endl;
			else if(5 == day)
				cout<<"植树节"<<endl;
			else if(14 == day)
				cout<<"母亲节"<<endl;
			else 
				cout<<"否"<<endl;
		};break;
		case 6:
		{
			if(1 == day)
				cout<<"儿童节"<<endl;
			else if(19 == day)
				cout<<"父亲节"<<endl;
			else 
				cout<<"否"<<endl;
		};break;
		case 7:
		{
			if(1 == day)
				cout<<"建党节"<<endl;
			else 
				cout<<"否"<<endl;	
		};break; 
		case 8:
		{	
			if(1 == day)
				cout<<"建党节"<<endl;
			else 
				cout<<"否"<<endl; 
		};break;
		case  9:
		{
			if(10 == day)
				cout<<"教师节"<<endl;
			else if(28 == day)
				cout<<"孔子诞辰"<<endl;
			else 
				cout<<"否"<<endl;			
		};break; 
		case 10:
		{
			if(1 == day)
				cout<<"国庆节"<<endl;
			else 
				cout<<"否"<<endl;
		};break;
		case 11:
		{
			cout<<"否"<<endl;
		};break;
		case 12:
		{
			if(24 == day)
				cout<<"平安夜"<<endl;
			else if(25 == day)
				cout<<"圣诞节"<<endl;
			else if(26 == day)	
				cout<<"毛泽东诞辰"<<endl;
			else 
				cout<<"否"<<endl;
		};break; 
		default:
			break;	
	}	
}
void show1()
{
	int y;
	cin >> y;
	date lz(y);
	printyear(lz.getyear());
	for( int m=1; m<=12; ++m )
	{
		lz.setmonth(m);

		printline();
		printmonth(m);
		printweek();
		printday( lz.getmonthdays(lz), lz.week(lz) );
		printline();
	}

}
void show2()
{
    int y = 2000;
	int m = 1;
	int d = 1;
    cin>>y>>m;
    date lz(y,m);
    printyear(y);
    printline();
	printmonth(m);
	printweek();
	printday( lz.getmonthdays(lz), lz.week(lz) );
	printline();
}
void show3()
{	
	int y,m,d;
	int wk = 0;
	cin>>y>>m>>d;
	date lz(y,m,d);
	wk = lz.week(lz);
	cout<<"您查询的日期为"<<lz<<endl;
	cout<<"这一天星期:"<<wk<<endl;
	cout<<"是否为节日:";check(m,d); 

	time_t current;
    struct tm *t;
    time(¤t); //得到目前的时间
    t=localtime(¤t);
    t->tm_year+=1900;
    t->tm_mon+=1;
    cout<<endl<<"今天的日期为:"<<t->tm_year<<" 年 ";
    cout<<t->tm_mon<<" 月 "<<t->tm_mday<<" 日"<<endl;
    date today(t->tm_year,t->tm_mon,t->tm_mday);
    int count1 = today.date_count(today);
    int count2 = lz.date_count(lz);
    if(count1>count2)
		cout<<"相差"<<count1-count2<<"天"<<endl;
    else 
    	cout<<"相差"<<count2-count1<<"天"<<endl;
}
void menu()
{ 	
	start:
	int tem = 0;
   	while(tem!=1 && tem!=2 && tem!=3)
    {
		cout<<"===========================万年历============================"<<endl;
		cout<<"||                                                         ||"<<endl; 
     	cout<<"||		   1.输入年份,得到该年的日历              ||"<<endl;
     	cout<<"||		   2.输入年月,得到该月的日历              ||"<<endl;
     	cout<<"||		   3.输入年月日,判断是否为节日             ||"<<endl;
     	cout<<"||                                                         ||"<<endl; 
     	cout<<"============================================================="<<endl;
     	cin>>tem;
     	getchar();
    	switch(tem)
     	{
      		case 1:
      		{	
      			cout<< "请输入年份 > ";
      			show1();
      		};break;
      		case 2:
      		{	
      			cout<<"请输入年/月 >"<<endl;
				show2();
          		break;
      		}
      		case 3:
      		{
         		cout<<"请输入年/月/日 >"<<endl;
				show3();
          		break;
      		}
      		default: system("cls");
            cout<<"输入有误!!请重新输入 >"<<endl;
  		}
  	}
    		getchar();
    		char choose;
    		cout<<endl;
    		cout<<"输入字符'e'结束,其他继续 >"<<endl;
    		choose=getchar();
    		if(choose=='e')
      			return ;
    		else	
   			{
        		system("cls");
        		goto start;
       		}
}
int main()
{
	menu();
	return 0;
}

三、部分运行结果截图

第一个功能:

第二个功能

第三个功能:

 

 

---------------》》用C语言实现万年历


 

阅读更多
版权声明:本文由 皓皓松博客 创作,转载请附带链接,有问题欢迎交流。 https://blog.csdn.net/qq_31828515/article/details/51759205
个人分类: C++
想对作者说点什么? 我来说一句

C++ 万年历

2018年01月02日 202KB 下载

C++制作万年历

2013年10月05日 1.04MB 下载

C++ 实现万年历功能

2010年12月15日 10KB 下载

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭