- 1. 日历系统
- 2. 模式结构图
- 3. MVC关于C++头文件互相引用问题解决
- 4. 源代码
获得当前时间
#include#include //time_t tm #include using namespace std; class CDateTime { private: //年 月 日 时 分 秒 int year; int month; int day; int hour; int min; int sec; public: CDateTime() { year = month = day = 1; hour = min = sec = 0; } //获得当前时间 void Now() { time_t tn; tm tmp; time(&tn); localtime_s(&tmp, &tn); year = tmp.tm_year + 1900; month = tmp.tm_mon + 1; day = tmp.tm_mday; hour = tmp.tm_hour; min = tmp.tm_min; sec = tmp.tm_sec; } void PrintDate() const { printf("year:%d,month:%d,day:%d.n", year, month, day); } }; int main() { CDateTime cd; cd.Now(); cd.PrintDate(); return 0; }
运行结果
ModelDate.h
#ifndef CONTROLLER_H
#define CONTROLLER_H
#include"ViewDate.h"
#include"ModelDate.h"
class ModelDate;
class ViewDate;
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();
};
#endif
ModelDate.cpp
#include// time.h #include"ModelDate.h" bool ModelDate::Is_Leap(int y) { return (y % 4 == 0 && y % 100 != 0) || (y % 400 == 0); } int ModelDate::GetYM_Day(int y, int m) { const static int day[] = { 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 (2 == m && Is_Leap(y)) { m = 0; } return day[m]; } int ModelDate::Get_Week(int year, int month,int d) { int c = year / 100; int y = year % 100; int m = month; if (month == 1 || month == 2) { m += 12; } return (y + y / 4 + c / 4 - 2 * c + 26 * (m + 1) / 10 + d - 1) % 7; } ModelDate::ModelDate() :year(1),month(1),mday(1) { Now(); } ModelDate::~ModelDate() {} void ModelDate::SetVeiw(ViewDate* pview) { view = pview; } int ModelDate::GetYear() const { return year; } int ModelDate::GetMonth() const { return month; } int ModelDate::GetMday()const { return mday; } int ModelDate::GetWeek() const { return oneweek; } int ModelDate::GetMdays() const { return mdays; } 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; curweek = tnode.tm_wday; mdays = GetYM_Day(year, month); oneweek = Get_Week(year, month); //view->Event(this); } void ModelDate::NextMonth() { if (++month > 12) { year += 1; month = 1; } mday = 1; mdays = GetYM_Day(year, month); curweek = oneweek = Get_Week(year, month); //view->Event(this); } void ModelDate::PrivMonth() { if (--month < 1) { year -= 1; month = 12; } mday = 1; mdays = GetYM_Day(year, month); curweek = oneweek = Get_Week(year, month); //view->Event(this); } void ModelDate::NextYear() { year += 1; // month; mday; curweek = Get_Week(year, month, mday); oneweek = Get_Week(year, month); mdays = GetYM_Day(year, month); //view->Event(this); } void ModelDate::PrevYear() { if (--year < 1) return; curweek = Get_Week(year, month, mday); oneweek = Get_Week(year, month); mdays = GetYM_Day(year, month); //view->Event(this); }
ViewDate.h
#ifndef VIEWDATE_H
#define VIEWDATE_H
#include"ModelDate.h"
class ViewDate
{
public:
int Menum();
void PrintDate(int year,int month,int mday,int oneweek,int mtotal) const;
void Event(ModelDate * pmode);
};
#endif
ViewDate.cpp
#include#include using namespace std; #include"ModelDate.h" #include"ViewDate.h" //事件响应 void ViewDate::Event(ModelDate* pmode) { PrintDate(pmode->GetYear(), pmode->GetMonth(), pmode->GetMday(), pmode->GetWeek(), pmode->GetMdays()); } void ViewDate::PrintDate(int year, int month, int mday, int oneweek,int mtotal)const { int n = mtotal + oneweek;//总的输出次数,总天数+星期 int d = 1; printf("日 一 二 三 四 五 六n"); for (int i = 1; i <= n; ++i) { if (i <= oneweek) { printf("t"); } else { printf("%d", d++); } if (i % 7 == 0) printf("n"); } } int ViewDate::Menum() { 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); return n; }
Controller.h
#ifndef CONTROLLER_H
#define CONTROLLER_H
#include"ViewDate.h"
#include"ModelDate.h"
class ModelDate;
class ViewDate;
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();
};
#endif
Controller.cpp
#includeusing namespace std; #include"Controller.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 { system("cls"); select = view->Menum(); 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; default: printf("input error n"); } } while (select != 0); } void Controller::Now() { model->Now(); } void Controller::NextMonth() { model->NextMonth(); } void Controller::PrevMonth() { model->PrivMonth(); } void Controller::NextYear() { model->NextYear(); } void Controller::PrevYear() { model->PrevYear(); }
TestMain.cpp
#includeusing namespace std; #include"ViewDate.h" #include"ModelDate.h" #include"Controller.h" class Client { public: Client() { contr.SetModel(&model); contr.SetView(&view); model.SetVeiw(&view); } void Run() { contr.Run();//loop; } private: ModelDate model; ViewDate view; Controller contr; }; int main() { Client client; client.Run(); }



