2014秋C++第17周 项目5参考 玩日期时间

简介: 课程主页在http://blog.csdn.net/sxhelijian/article/details/39152703,课程资源在云学堂“贺老师课堂”同步展示,使用的帐号请到课程主页中查看。 【项目5-玩日期时间】定义一个表示时间(包括年、月、日、时、分、秒)的结构体,然后完成下面的功能。提示:将各个功能分别设计成函数实现,在main函数中调用,进行测试。可以设计一个函数,即刻进行测试,
课程主页在 http://blog.csdn.net/sxhelijian/article/details/39152703,课程资源在 云学堂“贺老师课堂”同步展示,使用的帐号请到课程主页中查看。 


【项目5-玩日期时间】
定义一个表示时间(包括年、月、日、时、分、秒)的结构体,然后完成下面的功能。
提示:将各个功能分别设计成函数实现,在main函数中调用,进行测试。可以设计一个函数,即刻进行测试,以降低复杂度。
要实现的功能是:
(1)输入一个时间(注意各部分数据的取值范围)将输入的时间保存在一个结构体变量中;
(2)输出该日在本年中是第几天(注意闰年问题);
(3)输出这是这一天中的第几秒;
(4)输出这是这一年中的第几秒;(不要认为这个数荒唐,在计算中需要取随机数时需要一个不会重复的“种子数”,这个秒数是常用的。)
(5)求你输入的时间d天后是哪年哪月哪日,将结果保存在一个结构体变量中输出;(你的万天日期靠这个功能了)——插讲一个故事。当年老贺由小孩儿过百日,想到自己的万日在哪天。编程计算,结果刚过了十几天,那个懊恼啊。第二个万日得再等26年多(现在离第二个万日靠近了),第三个万日,谁敢说一定能过上?20岁左右的你,要算清楚了。在第(1)问中输入你的生日及时辰,d值取为10000,可以算出你的万日,大概在26岁多。
(6)求你输入的时间s秒后是何日何时,将结果保存在一个结构体变量中输出;
(7)用结构体变量给定两个时间,求相差多少天?相差多少秒?


(1)-(5)的参考解答:详细的实现和测试过程,参考http://blog.csdn.net/sxhelijian/article/details/8655466

#include <iostream>
using namespace std;
struct Time
{
    int year;
    int month;
    int day;
    int hour;
    int minute;
    int second;
};


//输入一个限定范围内的整型数值
int getNum(char *prompt, int min, int max)
{
    int value=-1;
    cout<<"输入"<<prompt<<",范围["<<min<<","<<max<<"]:";
    do
    {
        cin>>value;
    }
    while(value<min || value>max);
    return value;
}


//返回y年m月的天数
int daysOfMonth(int m,int y)
{
    int days;
    switch(m)
    {
    case 1:
    case 3:
    case 5:
    case 7:
    case 8:
    case 10:
    case 12:
        days=31;
        break;
    case 4:
    case 6:
    case 9:
    case 11:
        days=30;
        break;
    case 2:
        if((y%4==0&&y%100!=0)||y%400==0)
            days=29;
        else
            days=28;
    }
    return days;
}


//输入时间,参数为引用类型,可以影响实参的值
void getTime(Time &t)
{
    t.year=getNum("年",0,3000); //用于输入一定范围内的数
    t.month=getNum("月",1,12);
    t.day=getNum("日",1,daysOfMonth(t.month, t.year));
    t.hour=getNum("时",0,24);
    t.minute=getNum("分",0,59);
    t.second=getNum("秒",0,59);
}


//输出时间,参数也用作引用是对结构常见的处理办法
void outputTime(Time &t)
{
    cout<<"时间为: "<<t.year<<"年"<<t.month<<"月"<<t.day<<"日"<<t.hour<<"时"<<t.minute<<"分"<<t.second<<"秒"<<endl;
}


//这天是这一年的第几天
int dayOfYear(Time &t)
{
    int days=0;
    int m=1;
    while(m<t.month)  //前若干月的天数加起来
    {
        days+=daysOfMonth(m,t.year);  //充分利用已经设计的函数
        ++m;
    }
    days+=t.day; //再加上本月的天数
    return days;
}


//这天是这一天的第几秒
int secondOfDay(Time &t)
{
    return t.hour*3600+t.minute*60+t.second;
}


//返回一年有多少天(365或366天)
int daysOfYear(int y)
{
    return ((y%4==0&&y%100!=0)||y%400==0)?366:365;
}


//求你输入的时间d天后是哪年哪月哪日
Time afterDays(Time t,int d)
{
    Time t1=t;
    int d1=d+dayOfYear(t); //dayOfYear(t)求出t是当年第几天
    t1.month=1;
    t1.day=0;  //这样,将问题转换为在当年1月0日基础上加d1天(这个0有意思),避免以后老为2月操心,以及剩余天数一加以后持续进位
//    cout<<"转换为";
//    outputTime(t1);
//    cout<<"这一天后"<<d1<<"天。";
    while(d1>daysOfYear(t1.year))  //天数还够一个整年
    {
        d1-=daysOfYear(t1.year);
        ++t1.year;
    }
    //天数不够一整年后,再考虑月,因为从1月1日开始,不用担心Nt.year再加1年
    while(d1>daysOfMonth(t1.month,t1.year))  //天数还够一个整月
    {
        d1-=daysOfMonth(t1.month,t1.year);
        ++t1.month;
    }
    //剩全天数加到日上
    t1.day+=d1;
    return t1;
}


int main()
{
    Time t,nt;
    //(1)输入一个时间(注意各部分数据的取值范围)将输入的时间保存在一个结构体变量中;
    cout<<"请输入一个时间(包括年,月,日,时,分,秒):"<<endl;
    getTime(t);
    outputTime(t);
    //(2)输出该日在本年中是第几天(注意闰年问题);
    cout<<"这是这一年中的第"<<dayOfYear(t)<<"天。"<<endl;
    //(3)输出这是这一天中的第几秒;
    cout<<"这是这一天中的第"<<secondOfDay(t)<<"秒。"<<endl;
    //(4)输出这是这一年中的第几秒;
    cout<<"这是这一年中的第"<<dayOfYear(t)*24*3600+secondOfDay(t)<<"秒。"<<endl;
    //(5)求你输入的时间d天后是哪年哪月哪日,将结果保存在一个结构体变量中输出;
    int d;
    cout<<"请输入一个天数";
    cin>>d;
    nt=afterDays(t,d);
    cout<<"这一天后d(如10000)天后是:";
    outputTime(nt);


    return 0;
}





=================== 迂者 贺利坚 CSDN博客专栏=================
|== IT学子成长指导专栏 专栏文章的分类目录(不定期更新) ==|
|== C++ 课堂在线专栏  贺利坚课程教学链接(分课程年级) ==|
|== 我写的书——《逆袭大学——传给IT学子的正能量》    ==|
===== 为IT菜鸟起飞铺跑道,和学生一起享受快乐和激情的大学 =====

目录
相关文章
|
2月前
|
Rust 测试技术 编译器
Rust与C++的区别及使用问题之Rust项目中组织目录结构的问题如何解决
Rust与C++的区别及使用问题之Rust项目中组织目录结构的问题如何解决
|
1月前
|
编译器 C++ 开发者
Visual Studio属性表:在新项目中加入已配置好的C++库
通过以上步骤可以确保Visual Studio中新项目成功地加入了之前已配置好的C++库。这个过程帮助开发者有效地管理多个项目中共享的库文件,提升开发效率。
44 0
|
2月前
|
编译器 C++
【C++】如何用C++写一个日期计算器
【C++】如何用C++写一个日期计算器
|
3月前
|
C++
【C++】日期类Date(详解)②
- `-=`通过复用`+=`实现,`Date operator-(int day)`则通过创建副本并调用`-=`。 - 前置`++`和后置`++`同样使用重载,类似地,前置`--`和后置`--`也复用了`+=`和`-=1`。 - 比较运算符重载如`&gt;`, `==`, `&lt;`, `&lt;=`, `!=`,通常只需实现两个,其他可通过复合逻辑得出。 - `Date`减`Date`返回天数,通过迭代较小日期直到与较大日期相等,记录步数和符号。 ``` 这是236个字符的摘要,符合240字符以内的要求,涵盖了日期类中运算符重载的主要实现。
|
4月前
|
编译器 C语言 C++
从C语言到C++⑥(第二章_类和对象_中篇_续)大练习(日期类)+笔试选择题(下)
从C语言到C++⑥(第二章_类和对象_中篇_续)大练习(日期类)+笔试选择题
45 2
从C语言到C++⑥(第二章_类和对象_中篇_续)大练习(日期类)+笔试选择题(下)
|
2月前
|
Java C++ 开发者
如何根据项目需求选择使用C++还是Python进行内存管理?
【7月更文挑战第2天】如何根据项目需求选择使用C++还是Python进行内存管理?
36 0
|
3月前
|
C语言 C++
【C++】日期类Date(详解)③
该文介绍了C++中直接相减法计算两个日期之间差值的方法,包括确定max和min、按年计算天数、日期矫正及计算差值。同时,文章讲解了const成员函数,用于不修改类成员的函数,并给出了`GetMonthDay`和`CheckDate`的const版本。此外,讨论了流插入和流提取的重载,需在类外部定义以符合内置类型输入输出习惯,并介绍了友元机制,允许非成员函数访问类的私有成员。全文旨在深化对运算符重载、const成员和流操作的理解。
|
3月前
|
定位技术 C语言 C++
C++】日期类Date(详解)①
这篇教程讲解了如何使用C++实现一个日期类`Date`,涵盖操作符重载、拷贝构造、赋值运算符及友元函数。类包含年、月、日私有成员,提供合法性检查、获取某月天数、日期加减运算、比较运算符等功能。示例代码包括`GetMonthDay`、`CheckDate`、构造函数、拷贝构造函数、赋值运算符和相关运算符重载的实现。
|
3月前
|
C++
【C++】:日期类的实现 -- 日期计算器
【C++】:日期类的实现 -- 日期计算器
42 0
|
4月前
|
C语言 C++
c++日期&时间
c++日期&时间
44 1