Win32计算器:输入出生年月日,输出周岁,星座以及距离下一次生日的天数

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年起始的时间数据结构

二根据要求设计思路

  1. 输入出生年月日,先让用户输入出生年月日,再输出用于的年月日

定义一个日期的类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;

};

  1. 可以输出对应的周岁,判断用户的出生年月日,输出用户的周岁

在日期类里面再定义一个年龄的属性(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;

}

  1. }输出星座,

定义一个星座类,判断输入的月份日期在哪一个区间,还要先定义各个星座在哪个区间

通过比较来确定区间:使用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] = { "水瓶座","双鱼座","白羊座","金牛座","双子座","巨蟹座","狮子座","处女座","天秤座","天蝎座","射手座","摩羯座" };

};

 

  1. 输出距离下一个生日的天数;

定义一个生日的类,用生日的天数-当下的天数。

先定义一个有关于月份的数组month[]={}

  1. 、要清楚现在的年份的每个月的天数

  1. 判断是否为闰年--》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; }

}

  1. 、判断生日是否在现在的年份已经过去

若没有过,用输入的月日(前几个月的天数相加再加上生日的那天日期)-现在的月日(前几个月的天数相加,再加上本月的日期)

若过了,用现在年份的天数-现在的月日天数+下一年生日的月份日的天数

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 days(Date bb,tm oo,int y)

{

int ds=0;//距离下一次生日的天数

int yds=0;//现在一年的天数

int bds = 0;//一年的开始到生日的天数

int nyds = 0;//一年的开始到现在的日期的天数

int sybds = 0; //下一年的开始到生日的天数

//一年的天数

for (int i = 0; i < 12; i++)

{

yds = month[i] + yds;

}

//cout << "一年的天数" << yds<<endl;

//一年的开始到生日的天数

for(int i=0;i<bb.m_Month-1;i++)

{

bds = month[i] + bds;

}

bds += bb.m_Day;

//cout << "一年的开始到生日的天数" << bds << endl;

//一年的开始到现在的日期的天数

for (int j = 0; j < oo.tm_mon ; j++)

{

nyds += month[j] ;

}

nyds += oo.tm_mday;

//cout << "一年的开始到现在的日期的天数" << nyds << endl;

 //下一年的开始到生日的天数

for (int k = 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;

}

else if (y == -1)//生日还没有过  距离下一次生日的天数=一年的开始到生日的天数-一年的开始到现在的日期的天数

{

ds = bds - nyds;

}

cout << "距离你下一次生日还有" << ds << "天"<<endl;

}

需要源码的宝宝可以私信我~

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值