C++ 万年历

这是一个课程作业,也没有什么算法的内容,但是对编程风格的要求比较高,经过2个小时,写了200行左右的代码,可以大致实现控制台下的万年历功能。不过由于没有图形界面,看上去还是比较挫……

声明:由于课程作业的截止时间尚未到,所以严禁抄袭,否则后果自负……

/*
author: lwfcgz
studentID: ********
environment: Dev-C++ 4.9.2
time: 2012-10-1	
*/

#include<iostream>
#include<string>
#include<iomanip> 

using namespace std;

//存储表示月份的字符串
const string months[13]={"", "January","February","March",
					"April","May","June","July","August",
					"September","October","November","December"};

//存储表示每个月天数的整数
const int daysNumber[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};

//存储表示一周各天的字符串
const string dayString[7]={"Mon","Tue","Wed","Thu","Fri","Sat","Sun"};

//Month类用来为Date类提供基本服务
class Month{
public:
	//返回月份对应的英语单词
	string getMonth(int monthNumber);
	//返回月份所对应的天数
	int getDaysNumber(int yearNumber, int monthNumber);
	//返回从公元0年到这一个月开始的总天数
	int getTotalDays(int yearNumber,int monthNumber);
	//判断一年是否为闰年
	bool isLeapYear(int yearNumber);
};

//日期类用来获取输入、显示日历
class Date{
private:
	//年份
	int year;
	//月份
	int month;
	//天数计数器
	int daysCounter;
	//month月份的天数
	int daysNumberOfMonth;
	//Month类的实例
	Month monthInstance;
	//判断输入是否合法
	bool isValidInput();
public:
	//获取输入
	void getInput();
	//显示日历
	void showCalendar();
};


//主函数的执行入口
int main(){
	Date date;	
	while(1){
		//获取输入
		date.getInput();
		//显示日历
		date.showCalendar();
		system("pause");
		system("cls");
	}	
	return 0;
}




//返回月份对应的英语单词
string Month::getMonth(int monthNumber){
	if(monthNumber<0 ||monthNumber>12)
		return "out of range!";
	return months[monthNumber];
}

//返回月份所对应的天数
int Month::getDaysNumber(int yearNumber, int monthNumber){
	if(monthNumber<0 ||monthNumber>12)
		return -1;
	//需要对2月进行单独讨论
	if(monthNumber!=2)
		return daysNumber[monthNumber];
	//闰年则返回29天
	if(isLeapYear(yearNumber)==true)
		return 29;
	//平年则返回28天
	else return 28;
}

//判断一年是否为闰年
bool Month::isLeapYear(int yearNumber){
	if(yearNumber%4!=0)
		return false;
	if(yearNumber%100==0 && yearNumber%400!=0)
		return false;
	return true;
}

//返回从公元0年到这一个月开始的总天数
int Month::getTotalDays(int yearNumber, int monthNumber){	
	int counter=0;
	//从公元元年开始加
	for(int i=0;i<yearNumber;i++){
		if(isLeapYear(i)==true)
			counter+=366;
		else counter+=365;
	}
	//对当前年份进行计算
	for(int i=1;i<monthNumber;i++){
		counter+=getDaysNumber(yearNumber,i);
	}
	return counter;
}


//获取输入
void Date::getInput(){
	while(1){
		cout<<"请输入年月(格式为“年 月”): ";
		cin>>year>>month;
		//检验有效则继续进行
		if(isValidInput()==true)
			break;
		//输入为无效年月则重新输入
		else{
			cout<<"输入数据无效!"<<endl;
			system("pause");
			system("cls");
			continue;
		}
	}
}

//显示日历
void Date::showCalendar(){
	//无效输入不会进行月份显示
	if(isValidInput() == false)
		return;
	//获取从公元元年开始的总天数
	daysCounter=monthInstance.getTotalDays(year,month);
	daysCounter+=5;
	daysCounter%=7;
	//获取该月的总天数
	daysNumberOfMonth=monthInstance.getDaysNumber(year,month);
	//初始化计数器,保证每七个显示结果后面跟一个换行
	int tmpCounter=0;
	cout<<monthInstance.getMonth(month)<<endl;
	//输出表示星期几的字符串
	for(int i=0;i<7;i++){
		cout<<setw(4)<<dayString[i];
	}
	cout<<endl;
	//先填充空白的区域
	for(int i=0;i<daysCounter;i++){
		cout<<setw(4)<<" ";
		tmpCounter++;
	}
	//显示日历
	for(int i=0;i<daysNumberOfMonth;i++){
		if(tmpCounter%7==0 && tmpCounter!=0)
			cout<<endl;
		cout<<setw(4)<<i+1;
		tmpCounter++;
	}
	cout<<endl;
	return;
}

//判断输入是否有效
bool Date::isValidInput(){
	if((this->year)<0 || (this->month)<=0 ||(this->month)>12)
		return false;	
	return true;
}

有不对的地方还请大家多多指正。。。。

你可能感兴趣的:(C++,Date,String,System,存储,日历)