用C++类做的奇怪的日历

一、欧拉欧拉欧拉欧拉欧拉

用伪C++的面向对象的方法做了个日历(设计得完全不像类 ),功能主要如下:

  • 跳转到某年某月某天
  • 查看某年的全部日历
  • 推算几天前是什么日子
  • 推算几天后是什么日子
  • 推算两个日期之间的间隔
  • 查询星座

程序内的每一处都做了输出检测(包括日期输出与选择时输入的数字)

二、效果图

(可能有潜在bug,虽然改了很多次了…(T ^ T) )
话不多说,直接上效果图:

2.1 主界面

在这里插入图片描述

2.2 功能1 —— 日期跳转在这里插入图片描述

如果输入的年月日为负数或者日期超过月份的最大天数时会报错,就像这样:
在这里插入图片描述

2.3 功能 2 —— 日历查看

打印方式为双列打印
在这里插入图片描述

2.4 功能3 —— 日期向前推算

在这里插入图片描述
打开手机日历验证以下:
在这里插入图片描述

2.5 功能4 —— 日期向后推算

在这里插入图片描述
同样,手机验证:
在这里插入图片描述

2.6 功能5 —— 计算日期间隔

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.7 功能6 —— 查询星座

在这里插入图片描述

三、不说了,直接看代码吧

为什么说是伪C++的面向对象呢 ?(至少自己感觉不像),来看看Calender类吧:

//Calender.h
#include <iostream>
#include <tchar.h>
#include <time.h>
#include <Windows.h>
#include <iomanip>
#include <string>
using namespace std;
extern int arrDays[12][6][7];
class Calender
{
public:
	Calender();//默认获取系统时间
	Calender(int year, int month, int day);//自行定义
	~Calender();
	
	static bool isLegalDate(int y, int m, int d); //判断输入的日期是否合法
	static void changeFebDay(int y);//根据年份改变2月份天数
	static bool isLeapYear(int y);//判断是否为闰年
	static int isWeek(int y,int m,int d);//判断某年某月某日设计星期几
	static int totalDay(int y, int m, int d);//计算某天是第几天
	

	static string returnWeek(int w);//返回星期几的中文
	static int returnDay(int y,int m);//返回某年某月的天数
	static int returnYear(int y);//返回对应年份的总天数
	static string returnSX(int y);//返回生肖

	static void initCalender(int y);//初始化日历

	static void print(int arrDay[]);
	static void printMonth(int y,int m,int d);//打印某年某月的日历
	static void printCalender(int y);//双行打印年份对应的日历
	static void dateForwardReckon(int y, int m, int d, int numOfDay);//日期向前推算
	static void dateBackReckon(int y, int m, int d,int numOfDay);//日期向后推算
	static int dateInterval(int y1, int m1, int d1, int y2, int m2, int d2);//推算日期间隔天数
    static void isConstell(int y,int m, int d);//查询星座

	void showDate();//显示时间
	int dateInterval(int y1, int m1, int d1);
	void setYear(int y);
	void setMonth(int m);
	void setDay(int d);
	int getYear();
	int getMonth();
	int getDay();

private:
	static string months[12];
	static int days[13];
	static string weeks[7];
	static string sx[12];
	int year;
	int month;
	int day;
};

很多都是静态函数,而且函数超级多有木有(设计得不太合理),运算符重载、继承、多态什么的都没有(这些都没学,甚至类也还没学…)(不要在意这些细节(〃‘▽’〃))

前方高能…

//Calender.cpp
#include "pch.h"
#include "Calender.h"

int arrDays[12][6][7] = { 0 };
int Calender::days[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31};
string Calender::weeks[7] = {"星期天" ,"星期一","星期二", "星期三", "星期四", "星期五", "星期六"};
string Calender::months[12] = { "January","February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" };
string Calender::sx[12] = { "猴","鸡","狗","猪","鼠","牛","虎","兔","龙","蛇","马","羊" };

Calender::Calender()
{
	time_t timer;
	time(&timer);
	tm *t_tm = localtime(&timer);
	year = t_tm->tm_year + 1900;
	month = t_tm->tm_mon + 1;
	day = t_tm->tm_mday;
}

Calender::Calender(int year = 2019, int month = 1, int day = 1)
{
	this->year = year;
	this->month = month;
	this->day = day;
}

Calender::~Calender()
{
	cout << "Loading..." << endl;
}

bool Calender::isLegalDate(int y, int m = 1, int d = 1)
{
	if (y < 0||m<=0||d<=0)
	{
		MessageBox(NULL, _T(" 非法日期!日期中可能含有负数或者月份和日期为0!"),
			_T("警告"), MB_OK | MB_ICONEXCLAMATION);
		system("pause");
		return false;
	}
	if (d > returnDay(y, m))
	{
		MessageBox(NULL, _T(" 非法日期!天数超过该月最大天数,请重新输入!"),
			_T("警告"), MB_OK | MB_ICONEXCLAMATION);
		system("pause");
		return false;
	}
	if (m > 12)
	{
		MessageBox(NULL, _T(" 非法日期!月份范围:1 ~ 12!"),
			_T("警告"), MB_OK | MB_ICONEXCLAMATION);
		system("pause");
		return false;
	}
	return true;
}

void Calender::changeFebDay(int y)
{
	if (isLeapYear(y))
	{
		days[2] = 29;
	}
	else
	{
		days[2] = 28;
	}
}

bool Calender::isLeapYear(int y)
{
	if ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0)
	{
		return true;
	}
	else
	{
		return false;
	}
}

int Calender::isWeek(int y, int m = 1, int d = 1)
{
	if (m == 1 && d == 1)//一年第一天
	{
		return ((y - 1) + (y - 1) / 4 - (y - 1) / 100 + (y - 1) / 400 + 1) % 7;
	}

	int _day = totalDay(y, m, d);
	return ((y - 1) + (y - 1) / 4 - (y - 1) / 100 + (y - 1) / 400 + _day) % 7;
}

int Calender::totalDay(int y, int m, int d = 1)
{
	int sum = 0;
	for (int i = 0; i < m; i++)
	{
		sum += days[i];
	}
	sum += d;
	if (m > 2 && isLeapYear(y))
	{
		sum += 1;
	}
	return sum;
}

void Calender::isConstell(int y,int m, int d)
{
	cout << "你属" << returnSX(y) << endl;
	switch(m)
	{ 
	case 1:if (d <= 20)
		cout << "你是魔羯座" << endl;
		   else cout << "你是水瓶座" << endl;
		break;
	case 2:if (d <= 19)
		cout << "你是水瓶座" << endl;
		   else cout << "你是双鱼座" << endl;
		break;
	case 3:if (d <= 20)
		cout << "你是双鱼座" << endl;
		   else cout << "你是白羊座" << endl;
		break;
	case 4:if (d <= 20)
		cout << "你是白羊座" << endl;
		   else cout << "你是金牛座" << endl;
		break;
	case 5:if (d <= 21)
		cout << "你是金牛座" << endl;
		   else cout << "你是双子座" << endl;
		break;
	case 6:if (d <= 21)
		cout << "你是双子座" << endl;
		   else cout << "你是巨蟹座" << endl;
		break;
	case 7:if (d <= 22)
		cout << "你是巨蟹座" << endl;
		   else cout << "你是狮子座" << endl;
		break;
	case 8:if (d <= 23)
		cout << "你是狮子座" << endl;
		   else cout << "你是处女座" << endl;
		break;
	case 9:if (d <= 23)
		cout << "你是处女座" << endl;
		   else cout << "你是天秤座" << endl;
		break;
	case 10:if (d <= 23)
		cout << "你是天秤座" << endl;
			else cout << "你是天蝎座" << endl;
		break;
	case 11:if (d <= 22)
		cout << "你是天蝎座" << endl;
			else cout << "你是射手座" << endl;
		break;
	case 12:if (d <= 21)
		cout << "你是射手座" << endl;
			else cout << "你是魔羯座" << endl;
		break;
	}
}

int Calender::returnDay(int y,int m)
{
	if (m == 2 && isLeapYear(y))
	{
		return days[m] + 1;
	}
	else
	{
		return days[m];
	}
}

string Calender::returnWeek(int w)
{
	return weeks[w];
}

int Calender::returnYear(int y)
{
	if (isLeapYear(y))
		return 366;
	else
		return 365;
}

string Calender::returnSX(int y)
{
	return sx[y % 12];
}

void Calender::initCalender(int y)
{
	int i = 0;
	for (; i < 12; i++)
	{
		for (int j = 0; j < 6; j++)
		{
			for (int k = 0; k < 7; k++)
			{
				arrDays[i][j][k] = 0;
			}
		}
	}
	int week = (isWeek(y));
	int _week = ((isWeek(y) + 1) % 7 - 1);
	week = (week == 6 ? 6 : _week);

	int count; 
	
	changeFebDay(y);
	i = 0;
	for (; i < 12; i++)
	{
		count = 1;
		for (int j = 0; j < 6; j++)
		{
			if (count > days[i + 1])
				break;
			for (int k = 0; k < week; k++)
				arrDays[i][j][k] = 0;
			for (int k = week; k < 7; k++)
			{
				arrDays[i][j][k] = count++;
				week++;
				if (week >= 7)
				{
					week = 0;
				}
				if (count > days[i + 1])
					break;
			}
		}
	}
}

void Calender::print(int arrDay[])
{
	for (int k = 0; k < 7; k++)
	{
		if (arrDay[k] == 0)
		{
			cout << "    ";
		}
		else
		{
			cout << setw(3) << arrDay[k] << " ";
		}
	}
}

void Calender::printMonth(int y, int m, int d = 1)
{
	initCalender(y);
	int week = isWeek(y, m);

	HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN);//黄字
	cout << endl << setw(5) << y << "/" << setw(2) << m << "/" << setw(2) << d << weeks[isWeek(y, m, d)] << endl;
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE);//回复白色

	cout << endl <<setw(27) << months[m-1] << endl;
	cout << "---------------------------\n";
	cout << "Sun Mon Tue Wed Thu Fri Sat\n";

	for (int k = 0; k < week; k++)
		printf("    "); // 每月一号对齐它的星期数

	int days = returnDay(y, m);
	for (int j = 1; j <= days; j++)
	{
		if(j==d)
		{ 
			HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
			SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN);
		    cout << setw(3) << j << " ";
			SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE);
		}
		else
		{
			cout << setw(3) << j << " ";
		}
		week++;
		if (week >= 7)
		{
			cout << endl;
			week %= 7;
		}
	}
	cout << endl;
}

void Calender::printCalender(int y)
{
	HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN);//黄字
	cout << endl << setw(28) << y << "年日历" << endl << endl;
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE);//回复白色
	initCalender(y);
	for (int i = 1; i <= 11; i += 2)
	{
		
		cout << setw(27) << months[i-1] << "\t" << setw(27) << months[i]<< endl;
		cout << "---------------------------\t---------------------------\n";
		cout << "Sun Mon Tue Wed Thu Fri Sat\tSun Mon Tue Wed Thu Fri Sat\n";
		for (int j = 0; j < 6; j++)
		{
			print(arrDays[i-1][j]);
			cout << "\t";
			print(arrDays[i][j]);
			cout << endl;
		}
	}
}

void Calender::dateForwardReckon(int y, int m, int d, int numOfDay)
{
	cout << y << "/" << m << "/" << d << " " << weeks[isWeek(y, m, d)] << "的" << numOfDay << "天前是:";
	if (numOfDay == 0)
	{
		cout << y << "/" << m << "/" << d << " " << weeks[isWeek(y, m, d)] << endl;
		return;
	}
	if (d >= numOfDay)
	{
		d -= numOfDay;
		if (d == 0)
		{ 
			m--;
			if (m == 0)
			{
				y--;
				m = 12;
			}
			d = returnDay(y, m);
		}
		cout << y << "/" << m << "/" << d << " " << weeks[isWeek(y, m, d)] << endl;
	}
	else
	{
		numOfDay -= d;
		m -= 1;
		if (m <= 0)
		{
			y--;
			m = 12;
		}
		for (int i = m;; i--)
		{
			changeFebDay(y);
			int temp = numOfDay;
			numOfDay -= days[i];
			if (numOfDay < 0)
			{
				d = returnDay(y,m)-temp;
				m = i;
				break;
			}
			if (i <= 1)
			{
				y--;
				i = 13;
			}
		}
		cout << y << "/" << m << "/" << d << " " << weeks[isWeek(y, m, d)] << endl;
	}
}

void Calender::dateBackReckon(int y, int m, int d, int numOfDay)
{
	cout << y << "/" << m << "/" << d << " " << weeks[isWeek(y, m, d)] << "的" << numOfDay << "天后是:";
	if(numOfDay == 0)
	{ 
		cout << y << "/" << m << "/" << d << " " << weeks[isWeek(y, m, d)] << endl;
		return;
	}
	int end = returnDay(y, m) - d;//参数所传日期距离月尾end天

	if (end >= numOfDay)
	{
		d += numOfDay;
		cout << y << "/" << m << "/" << d << " " << weeks[isWeek(y, m, d)] << endl;
	}
	else
	{
		numOfDay -= end;
		m += 1;
		if (m >= 13)//
		{
			y++;
			m = 1;
		}
		for (int i = m;;i++)
		{
			changeFebDay(y);
			int temp = numOfDay;
			numOfDay -= days[i];
			if (numOfDay <= 0)
			{ 
				d = temp;
				m = i;
				break;
			}
			if (i >= 12)//月份满12,年份进1
			{
				y++;
				i = 0;
			}
		}
		cout << y << "/" << m << "/" << d << " " << weeks[isWeek(y,m,d)]<<endl;
	}
}

void Calender::showDate()
{
	cout << "   当前日期:" << year << "/" << month << "/"
		<< day << endl << endl;
}

int Calender::dateInterval(int y1, int m1, int d1, int y2, int m2, int d2)
{
	int max = y1 > y2 ? y1 : y2;
	int min = y1 < y2 ? y1 : y2;
	int day1, day2;
	int sum = 0;
	if(max==min)//年份相同
	{
		day1 = totalDay(y1, m1, d1);
		day2 = totalDay(y2, m2, d2);
		sum = abs(day1 - day2);
		return sum;
	}

	if (max == y1)//第一个日期比较小
	{
		day1 = totalDay(y1, m1, d1);
		day2 = returnYear(y2) - totalDay(y2, m2, d2);
	}
	else//第二个日期比较小
	{
		day1 = returnYear(y1) - totalDay(y1, m1, d1);
		day2 = totalDay(y2, m2, d2);
	}
	int temp = (max - min - 1) * 365; 

	if (temp < 0)
		sum = 0;
	else
		sum = temp;

	for (int i = min + 1; i < max; i++)
	{
		if (isLeapYear(i))
		{
			sum += 1;
		}
	}
	sum += day1 + day2;
	return sum;
}

int Calender::dateInterval(int y1, int m1, int d1)
{
	int y2 = year, m2 = month, d2 = day;
	return dateInterval(y1, m1, d1, y2, d2, m2);
}

void Calender::setYear(int y)
{
	year = y;
}

void Calender::setMonth(int m)
{
	month = m;
}

void Calender::setDay(int d)
{
	day = d;
}

int Calender::getYear()
{
	return year;
}

int Calender::getMonth()
{
	return month;
}

int Calender::getDay()
{
	return day;
}

主程序

!!!∑(゚Д゚ノ)ノ小伙只,你能看到这,厉害了!

#include "Calender.h"
void input(int &a)
{
	cin >> a;
	while (cin.fail() || a < 0)
	{
		MessageBox(NULL, _T("输入错误,请重新输入!"),
			_T("警告"), MB_OK | MB_ICONEXCLAMATION);
		cin.clear();
		while (cin.get() != '\n')
		{
			continue;
		}
		cin >> a;
	}
}
int main()
{
	system("title 奇怪的日历");
	int year, month, day, _day;
	int choose;
	
	while (1)
	{
		system("cls");
		Calender mycalender;
		mycalender.showDate();
		mycalender.printMonth(mycalender.getYear(), mycalender.getMonth(),mycalender.getDay());

		cout << "***********************************************************************************" << endl;
		cout << "〓〓〓〓〓〓〓〓〓〓  ☆              主  菜  单           ☆  〓〓〓〓〓〓〓〓〓〓" << endl;
		cout << "〓〓〓〓〓〓〓★★★★★            ★★★★★★★         ★★★★★〓〓〓〓〓〓〓" << endl;
		cout << "〓〓〓〓〓〓〓〓〓★  ☆       1.跳转到某年某月某天        ☆  ★〓〓〓〓〓〓〓〓〓" << endl;
		cout << "〓〓〓〓〓〓〓〓〓★  ☆       2.查看某年的全部日历        ☆  ★〓〓〓〓〓〓〓〓〓" << endl;
		cout << "〓〓〓〓〓〓〓〓〓★  ☆       3.推算几天前是什么日子      ☆  ★〓〓〓〓〓〓〓〓〓" << endl;
		cout << "〓〓〓〓〓〓〓〓〓★  ☆       4.推算几天后是什么日子      ☆  ★〓〓〓〓〓〓〓〓〓" << endl;
		cout << "〓〓〓〓〓〓〓〓〓★  ☆       5.推算两个日期之间的间隔    ☆  ★〓〓〓〓〓〓〓〓〓" << endl;
		cout << "〓〓〓〓〓〓〓〓〓★  ☆       6.查询星座                  ☆  ★〓〓〓〓〓〓〓〓〓" << endl;
		cout << "〓〓〓〓〓〓〓〓〓★  ☆       7.安全退出日历              ☆  ★〓〓〓〓〓〓〓〓〓" << endl;

		cout << "\n\t\t\n\t\t请选择:";
		
		input(choose);
		
		switch (choose)
		{
		
		case 1:
			while (1)
			{
				cout << "\t\t请输入合法年份:";
				input(year);
				cout << "\t\t请输入合法月份:";
				input(month);
				cout << "\t\t请输入合法日期:";
				input(day);
				if (Calender::isLegalDate(year, month, day))
				{
					mycalender.printMonth(year, month, day);
					system("pause");
					break;
				}
			}
			break;
		case 2:
			while (1)
			{
				cout << "\t\t请输入合法年份:";
				input(year);
				if (Calender::isLegalDate(year,1,1))
				{
					mycalender.printCalender(year);
					system("pause");
					break;
				}
			}
			break;
		case 3:
			while (1)
			{
				cout << "\t\t请输入合法年份:";
				input(year);
				cout << "\t\t请输入合法月份:";
				input(month);
				cout << "\t\t请输入合法日期:";
				input(day);
				if (Calender::isLegalDate(year, month, day))
				{
					cout << "\t\t请输入天数:";
					input(_day);
					mycalender.dateForwardReckon(year, month, day, _day);
					system("pause");
					break;
				}
			}
			break;
		case 4:
				while (1)
				{
					cout << "\t\t请输入合法年份:";
					input(year);
					cout << "\t\t请输入合法月份:";
					input(month);
					cout << "\t\t请输入合法日期:";
					input(day);
					if (Calender::isLegalDate(year, month, day))
					{
						cout << "\t\t请输入天数:";
						input(_day);
						mycalender.dateBackReckon(year, month, day, _day);
						system("pause");
						break;
					}
				}
			break;
		case 5:
			while (1)
			{
				cout << "\t\t请输入合法年份:";
				input(year);
				cout << "\t\t请输入合法月份:";
				input(month);
				cout << "\t\t请输入合法日期:";
				input(day);
				if (Calender::isLegalDate(year, month, day))
				{
					int _year, _month, _day;
					while(1)
					{
						cout << "\t\t请输入合法年份:";
						input(_year);
						cout << "\t\t请输入合法月份:";
						input(_month);
						cout << "\t\t请输入合法日期:";
						input(_day);
						if (Calender::isLegalDate(_year, _month, _day))
						{
							cout << year << " - " << month << " - " << day 
								<< Calender::returnWeek(Calender::isWeek(year, month, day))<< " 与 "
								<< _year << " - " << _month << " - " << _day 
								<< Calender::returnWeek(Calender::isWeek(_year, _month, _day))
								<< "相隔" << Calender::dateInterval(year,month,day,_year,_month,_day) << "天" << endl;
							system("pause");
							break;
						}
					}
					break;
				}
			}
			break;
		case 6:
			while (1)
			{
				cout << "\t\t请输入合法年份:";
				input(year);
				cout << "\t\t请输入合法月份:";
				input(month);
				cout << "\t\t请输入合法日期:";
				input(day);
				if (Calender::isLegalDate(year, month, day))
				{
					mycalender.isConstell(year, month, day);
					system("pause");
					break;
				}
			}
			break;
		case 7:
				return 0;
		default:
			MessageBox(NULL, _T("不在指定输入范围内,请重新输入!"),
				_T("警告"), MB_OK | MB_ICONEXCLAMATION);
			break;
		}
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_43894577/article/details/86742006
今日推荐