经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C++ » 查看文章
C++面向对象实现万年历的示例代码
来源:jb51  时间:2022/6/6 15:45:36  对本文有异议

引入

本文是通过面向对象对日历进行实现;

主要会有以下几个模块:模型 视图 控制(也算是浅浅的实现了一下MCV)

文件结构:

在这里我们使用的这几个文件分别对应它们要实现的功能

ModelDate(模型) 获取数据并处理返回数据

ViewDate(视图) 将获得的数据进行组织,并最终向用户输出,可以直观的看到web界面

controller(控制器) 控制着我们不同功能的转换

Controller.h

  1. #ifndef CONTROLLER_H
  2. #define CONTROLLER_H
  3.  
  4. class ViewDate;
  5. class ModelDate;
  6. class Controller
  7. {
  8. private:
  9. //需要将视图与模式连接起来
  10. ViewDate* pview; //视图指针
  11. ModelDate* pmodel;//模式指针 上述两个指针并不产生对象
  12. public:
  13. Controller();
  14. ~Controller();
  15.  
  16. void SetView(ViewDate* pv);//设计视图将外部视图的地址设置给pview
  17. void SetModel(ModelDate *pm);//将模式的地址给pmode
  18.  
  19. void Run();
  20. void Now();
  21. void NextYear();
  22. void PrevYear();
  23. void NextMonth();
  24. void PrevMonth();
  25. };
  26. #endif
  27.  

Controller.cpp

  1. #include<stdio.h>
  2. #include"Controller.h"
  3. #include "ViewDate.h"
  4. #include "ModelDate.h"
  5.  
  6.  
  7. Controller::Controller() //控制对象 将视图对象和模式对象关联
  8. :pview{ nullptr }, pmodel{nullptr}
  9. {}
  10. Controller::~Controller()
  11. {
  12.  
  13. }
  14. void Controller::SetView(ViewDate* pv)
  15. {
  16. pview = pv;
  17. }
  18. void Controller::SetModel(ModelDate* pm)
  19. {
  20. pmodel = pm;
  21. }
  22. void Controller::Run() //策略形式来运行
  23. {
  24. int select = 0;
  25. do
  26. {
  27. select = pview->Menum();
  28. switch (select)
  29. {
  30. case 0:break;
  31. case 1:
  32. NextMonth();
  33. break;
  34. case 2:
  35. PrevMonth();
  36. break;
  37. case 3:
  38. NextYear();
  39. break;
  40. case 4:
  41. PrevYear();
  42. break;
  43. default:
  44. printf("select error\n");
  45. break;
  46. }
  47. } while (select != 0);
  48. }
  49. void Controller::Now()
  50. {
  51. pmodel->Now();
  52. }
  53. void Controller::NextYear()
  54. {
  55. pmodel->NextYear();
  56. }
  57. void Controller::PrevYear()
  58. {
  59. pmodel->PrevYear();
  60. }
  61. void Controller::NextMonth()
  62. {
  63. pmodel->NextMonth();
  64. }
  65. void Controller::PrevMonth()
  66. {
  67. pmodel->PrevMonth();
  68. }
  69.  

ViewDate.h

  1. #ifndef VIEWDATE_H
  2. #define VIEWDATE_H
  3.  
  4. class ModelDate;
  5.  
  6. class ViewDate
  7. {
  8. private:
  9. public:
  10. ViewDate();
  11. ~ViewDate();
  12. int Menum();
  13. void PrintDate(int y, int m, int md, int ow, int mt);
  14. //年 月 日 当前这个月的星期 总的天数
  15. void Event(ModelDate* pmodel);
  16. };
  17. #endif
  18.  
  19.  

ViewDate.cpp

  1. #include<stdio.h>
  2. #include"ViewDate.h"
  3. #include"ModelDate.h"
  4.  
  5.  
  6. ViewDate::ViewDate()
  7. {
  8.  
  9. }
  10. ViewDate::~ViewDate()
  11. {
  12.  
  13. }
  14. int ViewDate::Menum()
  15. {
  16. printf("**********************************************");
  17. printf("\n");
  18. printf(" =_= =_= =_= =_= 现在时间 =_= =_= =_= =_= ");
  19. printf("\n");
  20. printf(" =_= =_= =_= =_= 0.退出 =_= =_= =_= =_= ");
  21. printf("\n");
  22. printf(" =_= =_= =_= =_= 1.下个月日历 =_= =_= =_= =_= ");
  23. printf("\n");
  24. printf(" =_= =_= =_= =_= 2.上个月日历 =_= =_= =_= =_= ");
  25. printf("\n");
  26. printf(" =_= =_= =_= =_= 3.下一年日历 =_= =_= =_= =_=");
  27. printf("\n");
  28. printf(" =_= =_= =_= =_= 4.上一年日历 =_= =_= =_= =_= ");
  29. printf("\n");
  30. printf("**********************************************");
  31. printf("\n");
  32. int select = 0;
  33. printf("请输入你的选择: ");
  34. scanf_s("%d", &select);
  35. return select;
  36. }
  37. void ViewDate::PrintDate(int year, int month, int mday, int oneweek, int mdays)
  38. {
  39. int n = mdays + oneweek;
  40. int d = 1;
  41. printf("当前的时间:2022年 %d月\n",month-1);
  42. printf("获取的时间:%d年 %d月 \n", year, month);
  43. printf(" 日 一 二 三 四 五 六\n");
  44. for (int i = 1; i <= n; ++i)
  45. {
  46. if (i <= oneweek)
  47. {
  48. printf("%5c", ' ');
  49. }
  50. else
  51. {
  52. printf("%5d", d++);
  53. }
  54. if (i % 7 == 0)
  55. printf("\n");
  56. }
  57. printf("\n");
  58. }
  59.  
  60. void ViewDate::Event(ModelDate* pmodel) //事件与模式相连
  61. {
  62. PrintDate(pmodel->GetYear(), pmodel->GetMonth(), pmodel->GetMday(), pmodel->GetOneweek(), pmodel->GetMdays());
  63. }

ModelDate.h

  1. #ifndef MODELDATH_H
  2. #define MODELDATH_H
  3.  
  4. class ViewDate;
  5. class ModelDate //模式端 是对数据进行处理
  6. {
  7. private:
  8. ViewDate* pview;
  9. //指向视图的指针
  10. private:
  11. int year;
  12. int month;
  13. int mday;//这一个月里的第几天
  14. int curweek;//这一年这一月这一天是第几周
  15. int oneweek; //这一年这一月1号是第几天
  16. int mdays;//这一月总的天数
  17. void SetWM();
  18. public: //私有属性通过公有方法给出数据
  19. void SetView(ViewDate *pv);
  20. int GetYear() const;
  21. int GetMonth()const;
  22. int GetMday() const;
  23. int GetCurweek() const;
  24. int GetOneweek() const;
  25. int GetMdays() const;
  26. public:
  27. bool Is_leap() const; //判断是否是闰年
  28. int GetYM_Day() const;//根据年月获得这个月的总天数
  29. int GetWeek(int d = 1) const;//判断具体哪一天是周几
  30. public:
  31. ModelDate();
  32. ~ModelDate();
  33. void Now();//现在的日期
  34. void NextYear();
  35. void PrevYear();
  36. void NextMonth();
  37. void PrevMonth();
  38. };
  39.  
  40. #endif // !MODELDATH_H

ModelDate.cpp

  1. #include<time.h>
  2. #include"ModelDate.h"
  3. #include"ViewDate.h"
  4.  
  5. //获取数据的函数
  6. int ModelDate::GetYear() const
  7. {
  8. return year;
  9. }
  10. int ModelDate::GetMonth()const
  11. {
  12. return month;
  13. }
  14. int ModelDate::GetMday() const
  15. {
  16. return mday;
  17. }
  18. int ModelDate::GetCurweek() const
  19. {
  20. return curweek;
  21. }
  22. int ModelDate::GetOneweek() const
  23. {
  24. return oneweek;
  25. }
  26. int ModelDate::GetMdays() const
  27. {
  28. return mdays;
  29. }
  30. bool ModelDate::Is_leap() const //判断是否是闰年
  31. {
  32. return ((year % 4 == 0) && ((year % 100) != 0) || year % 400 == 0);
  33. }
  34. //用到查表的方法
  35. int ModelDate::GetYM_Day() const//根据年月获得这个月的总天数
  36. {
  37. //为了防止在这个表中的数据发生初始化我们采取静态
  38. static int days[]{ 29, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
  39. //0 1 2 3 4 5 6 7 8 9 10 11 12
  40. int m = month;
  41. if (2 == m && Is_leap())
  42. {
  43. m = 0;
  44. }
  45. return days[m];
  46. }
  47.  
  48. //泰勒公式:根据年月日如何得到星期几
  49. int ModelDate::GetWeek(int d ) const//判断具体哪一天是周几
  50. {
  51. int c = year / 100;
  52. int y = year % 1;
  53. int m = month;
  54. if (m == 1 || m == 2)
  55. {
  56. m += 12;
  57. y--;
  58. }
  59. return ((y + y / 4 + c / 4 - 2 * c + 26 * (m + 1) / 10 + d - 1) % 7) > 0 ? (y + y / 4 + c / 4 - 2 * c + 26 * (m + 1) / 10 + d - 1) % 7 : (y + y / 4 + c / 4 - 2 * c + 26 * (m + 1) / 10 + d - 1) % 7 + 7;
  60. }
  61.  
  62. void ModelDate::SetView(ViewDate* pv)
  63. {
  64. pview = pv; //对象视图与外部视图进行关联
  65. }
  66. ModelDate::ModelDate()
  67. :pview{nullptr} //将视图指针设为空
  68. {
  69. Now();
  70. }
  71. ModelDate::~ModelDate()
  72. {
  73.  
  74. }
  75.  
  76. void ModelDate::SetWM()
  77. {
  78. curweek = GetWeek(mday);
  79. oneweek = GetWeek(1);
  80. mdays = GetYM_Day();
  81. }
  82. void ModelDate::Now()//现在的日期
  83. {
  84. time_t tt;
  85. tm md;
  86. time(&tt);
  87. localtime_s(&md, &tt);
  88. year = md.tm_year + 1900;
  89. month = md.tm_mon + 1;
  90. mday = md.tm_mday;
  91. }
  92. void ModelDate::NextYear()//下一年
  93. {
  94. year += 1;
  95. SetWM();
  96. pview->Event(this);//事件一改变就发送数据
  97. }
  98. void ModelDate::PrevYear()//上一年
  99. {
  100. if (year > 1)
  101. {
  102. year -= 1;
  103. }
  104. SetWM();
  105. pview->Event(this);
  106. }
  107. void ModelDate::NextMonth()//下一个月份
  108. {
  109. if (++month > 12)
  110. {
  111. month = 1;
  112. year += 1;
  113. }
  114. SetWM();
  115. pview->Event(this);
  116. }
  117. void ModelDate::PrevMonth()//上一个月份
  118. {
  119. if (--month < 1)
  120. {
  121. if (year > 1)
  122. {
  123. year -= 1;
  124. month = 12;
  125. }
  126. }
  127. SetWM();
  128. pview->Event(this);
  129.  
  130. }

main.cpp

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<iostream>
  4. #include<string.h>
  5. #include"Controller.h"
  6. #include"ModelDate.h"
  7. #include"ViewDate.h"
  8.  
  9. class Client
  10. {
  11. public:
  12. Client() :contr{}, model{}, view{}
  13. {
  14. contr.SetModel(&model);
  15. contr.SetView(&view);
  16. model.SetView(&view);
  17. }
  18. ~Client(){}
  19. void Run()
  20. {
  21. contr.Run();
  22. }
  23. private:
  24. Controller contr;
  25. ModelDate model;
  26. ViewDate view;
  27. };
  28.  
  29. int main()
  30. {
  31. Client client;
  32. client.Run();
  33. return 0;
  34. }

各功能测试结果

以上就是C++面向对象实现万年历的示例代码的详细内容,更多关于C++万年历的资料请关注w3xue其它相关文章!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号