栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++模块化设计---日历系统

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++模块化设计---日历系统

设计思路:

数据层:

#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
#include 
class 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;
}

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/917339.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号