没有合适的资源?快使用搜索试试~ 我知道了~
万年历显示。 功能要求: 输入一个年份,输出是在屏幕上显示该年的日历。假定输入的年份在1940-2040年之间。 输入年月,输出该月的日历。 输入年月日,输出距今天还有多少天,星期几,是否是公历节日。
资源推荐
资源详情
资源评论
一、 实验目的
通过本次实验,进一步掌握 c++语言的语言特性,标准库的用法以及面向对象思想的培养。
掌握类的构造函数、私有成员(属性)、公有成员(接口)的相关方法。
二、 实验内容
用 c++语言编写设计一个万年历,要求功能有:
输入一个年份,输出是在屏幕上显示该年的日历。假定输入的年份在 1940-2040 年之间。
输入年月,输出该月的日历。
输入年月日,输出距今天还有多少天,星期几,是否是公历节日。
三、 实验环境
Microsoft Visual C++ 6.0
四、 设计思路或方案
这对这个题目以及所要求的功能,我们需要显示一年的日历、一个月的日历以及某一天的信息,
我们需要用数据去保存他们,我们需要抽象出一个好的数据模型来使存储尽可能的小并能满足所有功
能要求,必要时还具有扩展性,但我们的操纵的可以说是每一天的数据,并且要显示一个月、一年的
信息,需要支持显示的范围为 100 年日历。这样的情况下,我们针对 100 年每年大约 365 天的情况,
设想如果每一天对应一个值,那么总共有 36500 种变化,我们为每一天都赋予一个唯一值(变量名 :
unique_value)。从 1940 年月 1 日开始唯一值为 0,以后每增加一天我们将为唯一值加 1,这样
就可以把每一天都编上号,使得我们可以精确的定位到任何一天。这样做好处不仅如此,对于跨年跨
月的计算天数,是一件非常困难的工作,而这样对与每一天有对应编号来讲,就变得十分简单,只需
要相减就可以的出相差天数。
所以,我们以此唯一值为基础,只要知道了 1940 年 1 月 1 日是周几就能计算出所有日期的信息!
外加年(变量名:year)月(变量名:month)日(变量名:day)三个无符号整型变量辅助,构成
了类的私有数据,不过这样还不够,我们还需要获取当前的日期,这个可以用库和 Windows API 函
数来得到,并添加到私有数据中去(变量名:Local_date)。
构造类的困难之处在于如何实现年月日三个无符号整型数值和唯一值之间的相互转换,对于这个
问 题 , 我 们 编 写 出 了 两 个 函 数 : DateTounique_value() 用 于 将 日 期 转 换 成 唯 一 值 ,
unique_valueToDate()用于将唯一值转换成日期,这些都是以 1940 年 1 月 1 日为初始值参照的,
同样还需要直到某一天是星期几,我们使用了 count_week()来通过唯一值来计算,同时在私有数据
中也加入了一个 week 变量,他的取值为 0-6,表示星期天到星期六,实际上只要知道了 1940 年 1
月 1 日是周几和特定日期的唯一值对 7 取余即可算出,这个算法实现较易。
还有一些细节问题需要注意,例如闰年的情况我们定义了函数 bool IsLeapYear()来确定对象的属
性 year 是不是闰年,类还需要一些重载函数来实现一些不同的功能(见源代码),另外,对于公历
节日显示我们创建了一个文件(文件内容见附录 1)用来存储每年的公历节日,程序在输入了日期后
会与文件中日期的对比,如若对比成功,则输出该节日,否则无任何操作。
最后,就是要显示了,显示的接口定义了 3 中,分别是显示年历(要求输入年)、显示月历(要
求 输 入 年 和 月 ) 、 以 及 显 示 某 一 天 的 信 息 ( 要 求 输 入 年 月 日 ) 。 分 别 用
print_year()、print_month()、print_day()三个函数以及它们的重载版本实现。
五、 程序清单
#include<iostream>//输入输出流
#include<iomanip> //操作子
#include<vector>//容器
#include<string>//字符串
#include<fstream>//文件操作,用于读取公历节日
#include<time.h>
using namespace std; //使用命名空间
//打印年历,月历,日期信息的三个函数
void p_year(); //打印年的函数
void p_month(); //打印月历的函数
void p_day(); //打印日期信息的函数(包括节日)
void input_command(); //键盘命令输入的函数
//两个全局数组 存储闰年与非闰年的每月天数
int NotLeapYear[12]={31,28,31,30,31,30,31,31,30,31,30,31};
int LeapYear[12]={31,29,31,30,31,30,31,31,30,31,30,31} ;
//定义每年节日的数据类型
typedef struct
{
string Name; //节日名
int mon; //在几月
int da; //在几日
}Festival; //别名
typedef struct
{
int year;
int month;
int day;
int value;
}DATE; //存储当前日期的类型
//类的定义,所有的操作都将基于类的数据
//所有的操作都将会基于类的接口函数
class Date
{
public:
//默认构造函数 //1940 年 1 月一日是周一
Date():year(1940),month(1),day(1),unique_value(0),week(1) {}
//多个版本的重载构造函数
//这个是根据日期来构造的
Date(unsigned short y,unsigned short m,unsigned short d):year(y),month(m),day(d)
{
//构造后并给 value 赋值
DateTounique_value();
//并计算星期
count_week();
}
//这个是根据唯一值来构造的,一般不用,因为无法确定唯一值(只有 1940.1.1 知道是 0)
Date(unsigned short value):unique_value(value)
{
//构造后并为给 year month day 赋值
unique_valueToDate();
//并计算星期
count_week();
}
//改变日期的函数,带默认值的函数
void change_date(unsigned short y=1940,unsigned short m=1,unsigned short d=1)
{
//赋值
year=y;
month=m;
day=d;
//改变其他属性值,因为他们是相关的
DateTounique_value();
count_week();
}
//判断是否为闰年的函数 他还有一个带参数的重载版本,这里面用到的值是对象的私有值
bool IsLeapYear()
{
return (year%4==0&&year%100!=0)||(year%400==0);
}
//另一个版本的带参 判断非成员是否为闰年的函数
bool IsLeapYear(unsigned short other_year)
{
return (other_year%4==0&&other_year%100!=0)||(other_year%400==0);
}
//唯一值转日期的函数,用 unique_value 去计算 year month 和 day 的值
void unique_valueToDate()
{
unsigned i=1940,j=0; //初始化变量
unsigned short temp=unique_value; //赋值给临时值
剩余17页未读,继续阅读
资源评论
ms347
- 粉丝: 15
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功