热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

设计思路:数据层:#pragmaonce#include#includeusingnamespacestd;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 12if (m == 2 && Is_Leap(y)){m = 0;}return days[m];
}int ModelDate::Get_Week(int y, int m, int d)
{int c &#61; y / 100; //世纪-1y %&#61; 100; //年份后两位if (m &#61;&#61; 1 || m &#61;&#61; 2) //月份>&#61;3 <&#61;14{m &#43;&#61; 12; }return (y &#43; y / 4 &#43; c / 4 - 2 * c &#43; 26 * (m &#43; 1) / 10 &#43; 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 &#61; 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 &#61; tnode.tm_year &#43; 1900;month &#61; tnode.tm_mon &#43; 1;mday &#61; tnode.tm_mday;hour &#61; tnode.tm_hour;min &#61; tnode.tm_min;sec &#61; tnode.tm_sec;curweek &#61; tnode.tm_wday;mdays &#61; GetYM_Days(year, month);oneweek &#61; Get_Week(year, month);view->Event(this, 0); //连接显示层
}void ModelDate::NextMonth()
{if (&#43;&#43;month > 12){year &#43;&#61; 1;month &#61; 1;}mday &#61; 1;mdays &#61; GetYM_Days(year, month);curweek &#61; oneweek &#61; Get_Week(year, month);view->Event(this); //连接显示层
}void ModelDate::PrevMonth()
{if (--month <1){year -&#61; 1;month &#61; 12;}mday &#61; 1;mdays &#61; GetYM_Days(year, month);curweek &#61; oneweek &#61; Get_Week(year, month);view->Event(this); //连接显示层
}void ModelDate::NextYear()
{year &#43;&#61; 1;mday &#61; 1;curweek &#61; oneweek &#61; Get_Week(year, month);mdays &#61; GetYM_Days(year, month);view->Event(this); //连接显示层
}void ModelDate::PrevYear()
{if (--year <1) return;mday &#61; 1;curweek &#61; oneweek &#61; Get_Week(year, month);mdays &#61; 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 &#61; 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 &#61;&#61; 0){printf("%dyear %dmonth \n", year, month);}else{printf("%dyear %dmonth %dday %dweek %dhour %dmin %dsec\n", year, month, mday, curweek, hour, min, sec);}printf("日 一 二 三 四 五 六\n");int weekday &#61; oneweek;int arr[6][7]{};int count &#61; 1;int j &#61; weekday;int d &#61; mtotal;int tag &#61; 0;for (int i &#61; 0; i <6; i&#43;&#43;){for (; j <7; j&#43;&#43;){arr[i][j] &#61; count&#43;&#43;;if (count > d){tag &#61; 1;break;}}if (tag){break;}j &#61; 0;}int m &#61; weekday;if (m &#61;&#61; 0){}else if (m &#61;&#61; 1){printf(" ");}else if (m &#61;&#61; 2){printf(" ");}else if (m &#61;&#61; 3){printf(" ");}else if (m &#61;&#61; 4){printf(" ");}else if (m &#61;&#61; 5){printf(" ");}else{printf(" ");}int k &#61; weekday;for (int i &#61; 0; i <6; i&#43;&#43;){for (; k <7; k&#43;&#43;){if (arr[i][k] !&#61; 0){printf("%2d ", arr[i][k]);}}k &#61; 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 &#61; pmodel;
}void Controller::SetView(ViewDate* pview)
{view &#61;pview ;
}void Controller::Run()
{int select &#61; 0;do{select &#61; 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 !&#61; 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;
}

 


推荐阅读
  • 【线段树】  本质是二叉树,每个节点表示一个区间[L,R],设m(R-L+1)2(该处结果向下取整)左孩子区间为[L,m],右孩子区间为[m ... [详细]
  • Java设计模式详解:解释器模式的应用与实现
    本文详细介绍了Java设计模式中的解释器模式,包括其定义、应用场景、优缺点以及具体的实现示例。通过音乐解释器的例子,帮助读者更好地理解和应用这一模式。 ... [详细]
  • 普通树(每个节点可以有任意数量的子节点)级序遍历 ... [详细]
  • 本文介绍了 Go 语言中的高性能、可扩展、轻量级 Web 框架 Echo。Echo 框架简单易用,仅需几行代码即可启动一个高性能 HTTP 服务。 ... [详细]
  • 零拷贝技术是提高I/O性能的重要手段,常用于Java NIO、Netty、Kafka等框架中。本文将详细解析零拷贝技术的原理及其应用。 ... [详细]
  • 本文介绍如何使用线段树解决洛谷 P1531 我讨厌它问题,重点在于单点更新和区间查询最大值。 ... [详细]
  • 单片微机原理P3:80C51外部拓展系统
      外部拓展其实是个相对来说很好玩的章节,可以真正开始用单片机写程序了,比较重要的是外部存储器拓展,81C55拓展,矩阵键盘,动态显示,DAC和ADC。0.IO接口电路概念与存 ... [详细]
  • C语言编写线程池的简单实现方法
    2019独角兽企业重金招聘Python工程师标准好文章,一起分享——有时我们会需要大量线程来处理一些相互独立的任务,为了避免频繁的申请释放线程所带 ... [详细]
  • 我有一个从C项目编译的.o文件,该文件引用了名为init_static_pool ... [详细]
  • Hadoop的文件操作位于包org.apache.hadoop.fs里面,能够进行新建、删除、修改等操作。比较重要的几个类:(1)Configurati ... [详细]
  • 本文详细介绍了Java反射机制的基本概念、获取Class对象的方法、反射的主要功能及其在实际开发中的应用。通过具体示例,帮助读者更好地理解和使用Java反射。 ... [详细]
  • JUC(三):深入解析AQS
    本文详细介绍了Java并发工具包中的核心类AQS(AbstractQueuedSynchronizer),包括其基本概念、数据结构、源码分析及核心方法的实现。 ... [详细]
  • Spring – Bean Life Cycle
    Spring – Bean Life Cycle ... [详细]
  • DAO(Data Access Object)模式是一种用于抽象和封装所有对数据库或其他持久化机制访问的方法,它通过提供一个统一的接口来隐藏底层数据访问的复杂性。 ... [详细]
  • IOS Run loop详解
    为什么80%的码农都做不了架构师?转自http:blog.csdn.netztp800201articledetails9240913感谢作者分享Objecti ... [详细]
author-avatar
红杏出墙的爱_408
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有