热门标签 | 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;
}

 


推荐阅读
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • 本文讨论了如何使用IF函数从基于有限输入列表的有限输出列表中获取输出,并提出了是否有更快/更有效的执行代码的方法。作者希望了解是否有办法缩短代码,并从自我开发的角度来看是否有更好的方法。提供的代码可以按原样工作,但作者想知道是否有更好的方法来执行这样的任务。 ... [详细]
  • iOS Swift中如何实现自动登录?
    本文介绍了在iOS Swift中如何实现自动登录的方法,包括使用故事板、SWRevealViewController等技术,以及解决用户注销后重新登录自动跳转到主页的问题。 ... [详细]
  • IOS开发之短信发送与拨打电话的方法详解
    本文详细介绍了在IOS开发中实现短信发送和拨打电话的两种方式,一种是使用系统底层发送,虽然无法自定义短信内容和返回原应用,但是简单方便;另一种是使用第三方框架发送,需要导入MessageUI头文件,并遵守MFMessageComposeViewControllerDelegate协议,可以实现自定义短信内容和返回原应用的功能。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • C# WPF自定义按钮的方法
    本文介绍了在C# WPF中实现自定义按钮的方法,包括使用图片作为按钮背景、自定义鼠标进入效果、自定义按压效果和自定义禁用效果。通过创建CustomButton.cs类和ButtonStyles.xaml资源文件,设计按钮的Style并添加所需的依赖属性,可以实现自定义按钮的效果。示例代码在ButtonStyles.xaml中给出。 ... [详细]
  • 开发笔记:Java是如何读取和写入浏览器Cookies的
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Java是如何读取和写入浏览器Cookies的相关的知识,希望对你有一定的参考价值。首先我 ... [详细]
  • 在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板
    本文介绍了在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板的方法和步骤,包括将ResourceDictionary添加到页面中以及在ResourceDictionary中实现模板的构建。通过本文的阅读,读者可以了解到在Xamarin XAML语言中构建控件模板的具体操作步骤和语法形式。 ... [详细]
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社区 版权所有