一、欧拉欧拉欧拉欧拉欧拉
用伪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;
}
}
}