设计思路:
数据层:
#pragma once #include#include using namespace std; class ViewDate; //数据层 --- 进行所有的数据处理 class ModelDate { private: ViewDate* view; //数据层连接显示层 private: int year; int month; int mday; //今天是几号 int curweek; //当天星期 int hour; int min; int sec; int oneweek; //本月1号星期 int mdays; //本月天数 static bool Is_Leap(int y); static int GetYM_Days(int y, int m); static int Get_Week(int y, int m, int d = 1); public: int GetYear()const; //年 int GetMonth()const; //月 int GetMday()const; //日 int GetCurweek()const; //星期 int GetHour()const; //小时 int GetMin()const; //分 int GetSec()const; //秒 int GetMdays()const; //本月天数 int GetOneweek()const; //本月1号星期 public: ModelDate(); ~ModelDate(); void SetView(ViewDate* pview); void Now(); void NextMonth(); void PrevMonth(); void NextYear(); void PrevYear(); };
#include"Model.h"
#include"View.h"
//常用静态方法
bool ModelDate::Is_Leap(int y)
{
return (y % 4 == 0 && y % 100 == 0) || (y % 400 == 0);
}
int ModelDate::GetYM_Days(int y, int m)
{
static const int days[] = { 29,31,28,31,30,31,30,31,31,30,31,30,31 };
// 0 1 2 3 4 5 6 7 8 9 10 11 12
if (m == 2 && Is_Leap(y))
{
m = 0;
}
return days[m];
}
int ModelDate::Get_Week(int y, int m, int d)
{
int c = y / 100; //世纪-1
y %= 100; //年份后两位
if (m == 1 || m == 2) //月份>=3 <=14
{
m += 12;
}
return (y + y / 4 + c / 4 - 2 * c + 26 * (m + 1) / 10 + d - 1) % 7;
}
/
/
//获取数据层的属性值
int ModelDate::GetYear()const //年
{
return year;
}
int ModelDate::GetMonth()const //月
{
return month;
}
int ModelDate::GetMday()const //日
{
return mday;
}
int ModelDate::GetCurweek()const //星期
{
return curweek;
}
int ModelDate::GetHour()const //小时
{
return hour;
}
int ModelDate::GetMin()const //分
{
return min;
}
int ModelDate::GetSec()const //秒
{
return sec;
}
int ModelDate::GetMdays()const //本月天数
{
return mdays;
}
int ModelDate::GetOneweek()const
{
return oneweek;
}
//对数据层数据的操作方法
void ModelDate::SetView(ViewDate* pview)
{
view = pview;
}
ModelDate::ModelDate()
:year(1),month(1),mday(1),hour(0),min(0),sec(0)
{
Now();
}
ModelDate::~ModelDate() {}
void ModelDate::Now()
{
time_t tmp;
tm tnode;
time(&tmp);
localtime_s(&tnode, &tmp);
year = tnode.tm_year + 1900;
month = tnode.tm_mon + 1;
mday = tnode.tm_mday;
hour = tnode.tm_hour;
min = tnode.tm_min;
sec = tnode.tm_sec;
curweek = tnode.tm_wday;
mdays = GetYM_Days(year, month);
oneweek = Get_Week(year, month);
view->Event(this, 0); //连接显示层
}
void ModelDate::NextMonth()
{
if (++month > 12)
{
year += 1;
month = 1;
}
mday = 1;
mdays = GetYM_Days(year, month);
curweek = oneweek = Get_Week(year, month);
view->Event(this); //连接显示层
}
void ModelDate::PrevMonth()
{
if (--month < 1)
{
year -= 1;
month = 12;
}
mday = 1;
mdays = GetYM_Days(year, month);
curweek = oneweek = Get_Week(year, month);
view->Event(this); //连接显示层
}
void ModelDate::NextYear()
{
year += 1;
mday = 1;
curweek = oneweek = Get_Week(year, month);
mdays = GetYM_Days(year, month);
view->Event(this); //连接显示层
}
void ModelDate::PrevYear()
{
if (--year < 1) return;
mday = 1;
curweek = oneweek = Get_Week(year, month);
mdays = GetYM_Days(year, month);
view->Event(this); //连接显示层
}
显示层
#pragma once #includeclass ModelDate; //显示层 --- 只负责显示 class ViewDate { public: int Menu(); void PrintDate(int year, int month, int mday, int curweek, int oneweek, int hour, int min, int sec, int mtotal,int sign) const; //留给数据层的接口 void Event(ModelDate* pomde); void Event(ModelDate* pomde,int()); };
#include"View.h"
#include"Model.h"
int ViewDate::Menu()
{
printf("************欢迎使用LoveHoneyYou的日历**********n");
printf("*******************当前日历***********************n");
printf("********** 0. 按0退出 **********n");
printf("********** 1. 获取下一个月的日历 **********n");
printf("********** 2. 获取上一个月的日历 **********n");
printf("********** 3. 获取下一个年的日历 **********n");
printf("********** 4. 获取上一个年的日历 **********n");
printf("********** 5. 获取当前时间的日历 **********n");
int n = 0;
printf("请输入你的选择-> ");
scanf_s("%d", &n);
system("cls");
return n;
}
void ViewDate::PrintDate(int year, int month, int mday, int curweek, int oneweek, int hour, int min, int sec, int mtotal,int sign) const
{
if (sign == 0)
{
printf("%dyear %dmonth n", year, month);
}
else
{
printf("%dyear %dmonth %dday %dweek %dhour %dmin %dsecn", year, month, mday, curweek, hour, min, sec);
}
printf("日 一 二 三 四 五 六n");
int weekday = oneweek;
int arr[6][7]{};
int count = 1;
int j = weekday;
int d = mtotal;
int tag = 0;
for (int i = 0; i < 6; i++)
{
for (; j < 7; j++)
{
arr[i][j] = count++;
if (count > d)
{
tag = 1;
break;
}
}
if (tag)
{
break;
}
j = 0;
}
int m = weekday;
if (m == 0)
{
}
else if (m == 1)
{
printf(" ");
}
else if (m == 2)
{
printf(" ");
}
else if (m == 3)
{
printf(" ");
}
else if (m == 4)
{
printf(" ");
}
else if (m == 5)
{
printf(" ");
}
else
{
printf(" ");
}
int k = weekday;
for (int i = 0; i < 6; i++)
{
for (; k < 7; k++)
{
if (arr[i][k] != 0)
{
printf("%2d ", arr[i][k]);
}
}
k = 0;
printf("n");
}
}
//int year, int month, int oneweek, int mtotal
void ViewDate::Event(ModelDate* pomde)
{
PrintDate(pomde->GetYear(), pomde->GetMonth(), pomde->GetMday(), pomde->GetCurweek(), pomde->GetOneweek()
, pomde->GetHour(), pomde->GetMin(), pomde->GetSec(), pomde->GetMdays(), 0);
}
//int year, int month, int mday, int curweek, int oneweek, int hour, int min, int sec, int mtotal
void ViewDate::Event(ModelDate* pomde, int())
{
PrintDate(pomde->GetYear(), pomde->GetMonth(), pomde->GetMday(), pomde->GetCurweek(), pomde->GetOneweek()
, pomde->GetHour(), pomde->GetMin(), pomde->GetSec(), pomde->GetMdays(), 1);
}
控制层
#pragma once
class ViewDate;
class ModelDate;
//控制层---连接显示层和数据层
class Controller
{
private:
ModelDate* model;
ViewDate* view;
public:
Controller();
~Controller();
void SetModel(ModelDate* pmodel);
void SetView(ViewDate* pview);
void Run();
void Now();
void NextMonth();
void PrevMonth();
void NextYear();
void PrevYear();
};
#include"Controller.h"
#include"Model.h"
#include"View.h"
Controller::Controller() {}
Controller::~Controller() {}
void Controller::SetModel(ModelDate* pmodel)
{
model = pmodel;
}
void Controller::SetView(ViewDate* pview)
{
view =pview ;
}
void Controller::Run()
{
int select = 0;
do
{
select = view->Menu(); //连接显示层
switch (select)
{
case 0:
break;
case 1:
NextMonth(); //连接数据层
break;
case 2:
PrevMonth(); //连接数据层
break;
case 3:
NextYear(); //连接数据层
break;
case 4:
PrevYear(); //连接数据层
break;
case 5:
Now(); //连接数据层
break;
}
} while (select != 0);
}
void Controller::Now()
{
model->Now();
}
void Controller::NextMonth()
{
model->NextMonth();
}
void Controller::PrevMonth()
{
model->PrevMonth();
}
void Controller::NextYear()
{
model->NextYear();
}
void Controller::PrevYear()
{
model->PrevYear();
}
客户端
//#pragma
#include"Model.h"
#include"View.h"
#include"Controller.h"
class Client
{
private:
ModelDate model;
ViewDate view;
Controller contr;
public:
Client()
{
contr.SetModel(&model);
contr.SetView(&view);
model.SetView(&view);
}
void Run()
{
contr.Run();
}
};
int main()
{
Client client;
client.Run();
return 0;
}



