Win32计算器
-
实验要求:
1、完成一个win32计算器,具体实现的功能为:输入出生年月日,可以输出对应的周岁,星座,距离下一个生日的天数;
2、提交内容为:设计思路的文档、项目代码和可执行程序release版本;
-
实验思路
1、首先了解如何获取系统当前的时间:
C++中获取当前系统时间的方法
系统时间相关的函数在C++定义在<ctime>头文件中。
1.1 time(time_t*)函数
函数定义如下:
time_t time (time_t* timer);
获取系统当前日历时间 UTC 1970-01-01 00:00:00开始的unix时间戳
参数:timer 存取结果的时间指针变量,类型为time_t,指针变量可以为null。如果timer指针非null,则time()函数返回值变量与timer指针一样,都指向同一个内存地址;否则如果timer指针为null,则time()函数返回一个time_t变量时间。
返回值,如果成功,获取当前系统日历时间,否则返回 -1。
1.2、结构体 struct tm
变量 类型 说明 范围
tm_sec int 每分钟的秒数 [0 - 61]
tm_min int 每小时后面的分钟数 [0 - 59]
tm_hour int 凌晨开始的小时数 [0 - 23]
tm_mday int 从每月份开始算的天数 [1 - 31]
tm_mon int 从一月份开始的月份数 [0 - 11]
tm_year int 从1900年开始的年数
tm_wday int 从每周天开始算的天数 [0 - 6]
tm_yday int 一年的第几天,从零开始 [0 - 365]
tm_isdst int 夏令时
1.3、本地时间转换函数localtime(time_t*)
函数原型 struct tm * localtime (const time_t * timer);
将日历时间转换为本地时间,从1970年起始的时间戳转换为1900年起始的时间数据结构
二根据要求设计思路
-
输入出生年月日,(先让用户输入出生年月日,再输出用于的年月日)
定义一个日期的类Date,属性有年(m_Year) ,月 (m_Month),日 (m_Day)
定义当前的年月日 n_Date类,属性有 当前年(n_Year),当前月(n_Month),当前日期 (n_Day)
先输入,再输出
//定义出生日期类
class Date
{
public:
int m_year;//出生年
int m_Month;//出生月
int m_Day;//出生日
};
//输出当前时间函数
tm timing()
{
time_t nowtime;
struct tm *p;
time(&nowtime);
p = localtime(&nowtime);
//tm_year是从1900年开始的年数,tm_mon是从一月份开始的的月份数所以分别+1900和+1
cout << "今天是" << p->tm_year + 1900 << "年" << p->tm_mon + 1 << "月" << p->tm_mday << "日" << endl;
tm o;
o.tm_year = p->tm_year;
o.tm_mon = p->tm_mon;
o.tm_mday = p->tm_mday;
return o;
}
//请用户输入自己的出生年月日
void userBorn()
{
cout << "----------------------------------" << endl;
cout << "请您输入自己的出生年月日" << endl;
}
//打印用户的出生年月日
void userBorn(Date d)
{
cout << "----------------------------------" << endl;
cout << "您出生于"<<d.m_year<<"年"<<d.m_Month<<"月"<<d.m_Day<<"日"<< endl;
};
-
可以输出对应的周岁,(判断用户的出生年月日,输出用户的周岁)
在日期类里面再定义一个年龄的属性(m_Age),用现在的年份(n_Year)-出生的年份(m_Year)来得到年龄
判断:当前的年份(n_Year)减去出生时的年份(m_Year),得到的数字设为(m_Age),再比较出生的月份(m_Month)和日期(m_Day),如果当前的月日在你的生日之前,那么周岁就是(m_Age)-1岁,如果当前的月日在你的生日之后,那么周岁就是(m_Age)岁。
//判断用户是否生日已经过了,并打印用户周岁
int isBirth(Date d,tm &p)
{
int Age;
int temp;//当temp == 1时输出周岁为当前年份-出生年份 当temp==-1时 输出周岁为当前年份-出生月份-1
//先判断月份
//当前的月份比出生月份大 周岁为 直接输出 当前年份-出生年份
if(p.tm_mon>d.m_Month)
{
temp = 1;
}
//当前的月份比出生月份小 周岁为 直接输出 当前年份-出生月份-1
else if(p.tm_mon < d.m_Month)
{
temp = -1;
}
//当前的月份与出生月份相等 再判断日 若当前日大于出生日 周岁为直接输出 当前年份-出生年份-1 若当前日小于出生日 周岁为直接输出 当前年份-出生年份
else if (p.tm_mon == d.m_Month)
{
if (p.tm_mday > d.m_Day)
{
temp = -1;
}
else temp = 1;
}
Age = p.tm_year -d.m_year+1900;
return temp;
}
//输出用户的周岁
void zhouyear(int &nn,Date &dd,tm &pp)
{
int A = 0;
A =pp.tm_year - dd.m_year + 1900;
if (nn == 1)
{
cout << "您的周岁为" << A <<"岁"<< endl;
}
else
{
cout << "您的周岁为" << A - 1 <<"岁"<< endl;
}
-
}输出星座,
定义一个星座类,判断输入的月份日期在哪一个区间,还要先定义各个星座在哪个区间
通过比较来确定区间:使用if语句
class star:public Date
{
public:
//判断用户是哪个星座
int IsStar(int &mm, int &dd)
{
int i = 1;
if ((mm == 12 && dd >= 22) || (mm == 1 && dd <= 19)) { i = 11; }
else if ((mm == 1 && dd >= 20) ||(mm == 2 && dd <= 18)){ i =0 ; }
else if ((mm == 2 && dd >= 19) ||(mm == 3 && m_Day <= 20)){ i =1 ; }
else if ((mm == 3 && m_Day >= 21) || (mm == 4 && m_Day <= 19)){ i =2 ; }
else if ((mm == 4 && m_Day >= 20) || (mm == 5 && m_Day <= 20)){ i = 3; }
else if ((mm == 5 && m_Day >= 21) || (mm == 6 && m_Day <= 21)){ i = 4; }
else if ((mm == 6 && m_Day >= 22) || (mm == 7 && m_Day <= 22)){ i = 5; }
else if ((mm == 7 && m_Day >= 23) || (mm == 8 && m_Day <= 22)){ i =6; }
else if ((mm == 8 && m_Day >= 23) || (mm == 9 && m_Day <= 22)){ i = 7; }
else if ((mm == 9 && m_Day >= 23) || (mm == 10 && m_Day <= 23)) { i = 8; }
else if ((mm == 10 && m_Day >= 24) || (mm == 11 && m_Day <= 22)){ i = 9; }
else if ((mm == 11 && m_Day >= 23) || (mm == 12 && m_Day <= 21)){ i = 10; }
return i;
}
//输出用户的星座
void userStar(int t)
{
cout << "您的星座是" <<st[t]<< endl;
}
string st[12] = { "水瓶座","双鱼座","白羊座","金牛座","双子座","巨蟹座","狮子座","处女座","天秤座","天蝎座","射手座","摩羯座" };
};
-
输出距离下一个生日的天数;
定义一个生日的类,用生日的天数-当下的天数。
先定义一个有关于月份的数组month[]={}
-
、要清楚现在的年份的每个月的天数
-
判断是否为闰年--》2月为多少天 润年为29 非闰年为28
int isRun(int &r)
{
int zz;
//判断条件能被4整除但不能被100整除,或者直接被100整除
if ((r % 4 == 0 && r % 100 != 0)||r%400==0)
{
zz = 1;//是闰年
}
else
zz = 0;//不是闰年
return zz;
}
void changeFeb(int &zzz,int bir)
{
if (zzz = 1) { bir = 29; }
else { bir = 28; }
}
-
、判断生日是否在现在的年份已经过去