Win32计算器:输入出生年月日 输出周岁 星座以及距离下一次生日的天数
- 相关推荐
-
![Win32计算器:输入出生年月日 输出周岁 星座以及距离下一次生日的天数](https://900zi.500zi.com/uploadfile/img/15/728/caf6a5ef79d528d069bf6845278743de.jpg)
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)
先输入,再输出
//定义出生日期类
classDate
{
public:
intm_year;//出生年
intm_Month;//出生月
intm_Day;//出生日
};
//输出当前时间函数
tmtiming()
{
time_tnowtime;
structtm*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;
tmo;
o.tm_year= p->tm_year;
o.tm_mon= p->tm_mon;
o.tm_mday= p->tm_mday;
returno;
}
//请用户输入自己的出生年月日
voiduserBorn()
{
cout<<"----------------------------------"<<endl;
cout<<"请您输入自己的出生年月日"<<endl;
}
//打印用户的出生年月日
voiduserBorn(Dated)
{
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)岁。
//判断用户是否生日已经过了,并打印用户周岁
intisBirth(Dated,tm&p)
{
intAge;
inttemp;//当temp == 1时输出周岁为当前年份-出生年份 当temp==-1时 输出周岁为当前年份-出生月份-1
//先判断月份
//当前的月份比出生月份大 周岁为 直接输出 当前年份-出生年份
if(p.tm_mon>d.m_Month)
{
temp= 1;
}
//当前的月份比出生月份小 周岁为 直接输出 当前年份-出生月份-1
elseif(p.tm_mon< d.m_Month)
{
temp= -1;
}
//当前的月份与出生月份相等 再判断日 若当前日大于出生日 周岁为直接输出 当前年份-出生年份-1 若当前日小于出生日 周岁为直接输出 当前年份-出生年份
elseif(p.tm_mon== d.m_Month)
{
if(p.tm_mday> d.m_Day)
{
temp= -1;
}
elsetemp= 1;
}
Age= p.tm_year-d.m_year+1900;
returntemp;
}
//输出用户的周岁
voidzhouyear(int&nn,Date&dd,tm&pp)
{
intA= 0;
A=pp.tm_year- dd.m_year+ 1900;
if(nn== 1)
{
cout<<"您的周岁为"<<A<<"岁"<<endl;
}
else
{
cout<<"您的周岁为"<<A- 1 <<"岁"<<endl;
}
}输出星座,
定义一个星座类,判断输入的月份日期在哪一个区间,还要先定义各个星座在哪个区间
通过比较来确定区间:使用if语句
classstar:publicDate
{
public:
//判断用户是哪个星座
intIsStar(int&mm, int&dd)
{
inti= 1;
if((mm== 12 && dd>= 22) || (mm== 1 && dd<= 19)) { i= 11; }
elseif((mm== 1 && dd>= 20) ||(mm== 2 && dd<= 18)){ i=0 ; }
elseif((mm== 2 && dd>= 19) ||(mm== 3 && m_Day<= 20)){ i=1 ; }
elseif((mm== 3 && m_Day>= 21) || (mm== 4 && m_Day<= 19)){ i=2 ; }
elseif((mm== 4 && m_Day>= 20) || (mm== 5 && m_Day<= 20)){ i= 3; }
elseif((mm== 5 && m_Day>= 21) || (mm== 6 && m_Day<= 21)){ i= 4; }
elseif((mm== 6 && m_Day>= 22) || (mm== 7 && m_Day<= 22)){ i= 5; }
elseif((mm== 7 && m_Day>= 23) || (mm== 8 && m_Day<= 22)){ i=6; }
elseif((mm== 8 && m_Day>= 23) || (mm== 9 && m_Day<= 22)){ i= 7; }
elseif((mm== 9 && m_Day>= 23) || (mm== 10 && m_Day<= 23)) { i= 8; }
elseif((mm== 10 && m_Day>= 24) || (mm== 11 && m_Day<= 22)){ i= 9; }
elseif((mm== 11 && m_Day>= 23) || (mm== 12 && m_Day<= 21)){ i= 10; }
returni;
}
//输出用户的星座
voiduserStar(intt)
{
cout<<"您的星座是"<<st[t]<<endl;
}
stringst[12] = { "水瓶座","双鱼座","白羊座","金牛座","双子座","巨蟹座","狮子座","处女座","天秤座","天蝎座","射手座","摩羯座"};
};
输出距离下一个生日的天数;
定义一个生日的类,用生日的天数-当下的天数。
先定义一个有关于月份的数组month[]={}
、要清楚现在的年份的每个月的天数
判断是否为闰年--》2月为多少天 润年为29 非闰年为28
intisRun(int&r)
{
intzz;
//判断条件能被4整除但不能被100整除,或者直接被100整除
if((r% 4 == 0 && r% 100 != 0)||r%400==0)
{
zz= 1;//是闰年
}
else
zz= 0;//不是闰年
returnzz;
}
voidchangeFeb(int&zzz,intbir)
{
if(zzz= 1) { bir= 29; }
else{ bir= 28; }
}
、判断生日是否在现在的年份已经过去
若没有过,用输入的月日(前几个月的天数相加再加上生日的那天日期)-现在的月日(前几个月的天数相加,再加上本月的日期)
若过了,用现在年份的天数-现在的月日天数+下一年生日的月份日的天数
intisBirth(Dated,tm&p)
{
intAge;
inttemp;//当temp == 1时输出周岁为当前年份-出生年份 当temp==-1时 输出周岁为当前年份-出生月份-1
//先判断月份
//当前的月份比出生月份大 周岁为 直接输出 当前年份-出生年份
if(p.tm_mon>d.m_Month)
{
temp= 1;
}
//当前的月份比出生月份小 周岁为 直接输出 当前年份-出生月份-1
elseif(p.tm_mon< d.m_Month)
{
temp= -1;
}
//当前的月份与出生月份相等 再判断日 若当前日大于出生日 周岁为直接输出 当前年份-出生年份-1 若当前日小于出生日 周岁为直接输出 当前年份-出生年份
elseif(p.tm_mon== d.m_Month)
{
if(p.tm_mday> d.m_Day)
{
temp= -1;
}
elsetemp= 1;
}
Age= p.tm_year-d.m_year+1900;
returntemp;
}
voiddays(Datebb,tmoo,inty)
{
intds=0;//距离下一次生日的天数
intyds=0;//现在一年的天数
intbds= 0;//一年的开始到生日的天数
intnyds= 0;//一年的开始到现在的日期的天数
intsybds= 0; //下一年的开始到生日的天数
//一年的天数
for(inti= 0; i< 12; i++)
{
yds= month[i] + yds;
}
//cout << "一年的天数" << yds<<endl;
//一年的开始到生日的天数
for(inti=0;i<bb.m_Month-1;i++)
{
bds= month[i] + bds;
}
bds+= bb.m_Day;
//cout << "一年的开始到生日的天数" << bds << endl;
//一年的开始到现在的日期的天数
for(intj= 0; j< oo.tm_mon; j++)
{
nyds+= month[j] ;
}
nyds+= oo.tm_mday;
//cout << "一年的开始到现在的日期的天数" << nyds << endl;
//下一年的开始到生日的天数
for(intk= 0; k< bb.m_Month-1; k++)
{
sybds= month2[k] + sybds;
}
sybds+= bb.m_Day;
//cout << "下一年的开始到生日的天数" << sybds << endl;
//cout << y << endl;
if(y== 1)//生日已经过了 距离下一次生日的天数=现在一年的天数-现在的月日天数+下一年的开始到生日的天数
{
ds= yds- nyds+ sybds;
}
elseif(y== -1)//生日还没有过 距离下一次生日的天数=一年的开始到生日的天数-一年的开始到现在的日期的天数
{
ds= bds- nyds;
}
cout<<"距离你下一次生日还有"<<ds<<"天"<<endl;
}
需要源码的宝宝可以私信我~
本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。