C++ 记录问答(定义一个 Date 类,包括 year 、 month、 day 三个数据成员)

题目:

定义一个 Date 类,包括 year 、 month、 day 三个数据成员,通过 set_date 成员函
数输入出生日期数据,通过 disp_date 成员函数将其输出, 输出格式如下:
12-25-2010
December 25,2010;
25 December 2010
写一个完整的程序,检验此类。注意:对于日期 day 成员,不能接受大于 31 或小于 1
的值,对于月 month,不能接受大于 12 或小于 1 的值。

C++实现

#include <iostream>
#include <map>
#include <string>
using namespace std;

struct st_data
{
    st_data() : m_nYear(), m_nMonth(), m_nDay() {}
    int m_nYear;            // 年份
    int m_nMonth;           // 月份 
    int m_nDay;             // 日期
};

class Data
{
public:
    Data() :mapData() {}

    /**
     * @brief 设置出生日期
     * @param m_pYear:   输入年份
     * @param m_pMonth:  输入月份
     * @param m_pDay:    输入日期
     */
    void set_data(std::string m_pstrName, st_data st_pData)
    {
        // 对于日期 day 成员,不能接受大于 31 或小于 1的值,对于月 month,不能接受大于 12 或小于 1 的值
        if ((st_pData.m_nDay < 1 || st_pData.m_nDay > 31) && (st_pData.m_nMonth < 1 || st_pData.m_nMonth>12))
        {
            std::cout << "输入的出生日期有误!" << std::endl;
            return;
        }
        // insert_or_assign直接插入,如果有该key,则替换velue;如果没有该key值,直接插入
        mapData.insert_or_assign(m_pstrName, st_pData);
    }

    /**
     * @brief 打印全部出生日期
     */
    void disp_data()
    {
        if (mapData.empty())
        {
            std::cout << "出生日期集合为空!" << std::endl;
            return;
        }
        for (auto iter : mapData)
        {
            std::cout << "\n" << "名字:" 
                << iter.first << " 出生日期:"
                << iter.second.m_nMonth << "-"
                << iter.second.m_nDay << "-"
                << iter.second.m_nYear << std::endl;
        }
    }

    /**
     * @brief 根据名字打印对应的出生日期
     */
    void disp_namedata(std::string m_pName)
    {
        map<std::string, st_data>::iterator mapIter = mapData.find(m_pName);
        if (mapIter != mapData.end())
        {
            std::cout << "\n" << "名字:"
                << mapIter->first << " 出生日期:"
                << mapIter->second.m_nMonth << "-"
                << mapIter->second.m_nDay << "-"
                << mapIter->second.m_nYear << std::endl;
        }
        else
        {
            std::cout << m_pName << "未录入出生日期信息!" << std::endl;
        }
    }

    /**
     * @brief 删除全部出生日期
     */
    void deleteAllDataInfo()
    {
        map<std::string, st_data>().swap(mapData);
    }

    /**
     * @brief 删除名字打印对应的出生日期
     */
    void deleteNameData(std::string m_pName)
    {
        map<std::string, st_data>::iterator mapIter = mapData.find(m_pName);
        if (mapIter != mapData.end())
        {
            mapData.erase(m_pName);
        }
        else
        {
            std::cout << "未找到" << m_pName << "的相关信息!" << std::endl;
        }
    }


private:
    std::map<std::string, st_data> mapData;    // 存储生日map  key:名字,value:生日
};

int main()
{
    int ch = 0;          // 输入命令
    int y = 0;           // 输入结束符

    Data stObjdata;
    st_data stdata;

    do
    {
        std::cout << "************************************" << std::endl;
        std::cout << "\n\t 输入指令 ";
        std::cout << "\n 1. 设置出生日期 ";
        std::cout << "\n 2. 打印全部出生日期记录";
        std::cout << "\n 3. 根据名字打印对应的出生日期记录";
        std::cout << "\n 4. 删除全部出生日期记录";
        std::cout << "\n 5. 根据名字删除对应的出生日期记录";
        std::cout << "\n 6. 退出 \n";
        std::cout << "************************************" << std::endl;
        std::cout << "\n输入您的选择: ";
        std::cin >> ch;
        switch (ch)
        {
        case 1: 
        {       
            std::string strName; // 名字
            std::cout << "\n 输入您的名字: ";
            std::cin >> strName;

            std::cout << "\n 输入您生日的年份: ";
            std::cin >> stdata.m_nYear;

            std::cout << "\n 输入您生日的月份(输入的值不能大于 12 或小于 1): ";
            std::cin >> stdata.m_nMonth;

            std::cout << "\n 输入您生日的日期(输入的值不能大于 31 或小于 1): ";
            std::cin >> stdata.m_nDay;


            stObjdata.set_data(strName, stdata);
            std::cout << "\n出生日期信息录入.\n";
            break;
        }
        case 2: 
        {
            stObjdata.disp_data();
            break;
        }
        case 3: 
        {
            std::string strTempName;
            std::cout << "\n 输入您要查询的名字: ";
            std::cin >> strTempName;
            stObjdata.disp_namedata(strTempName);
            break;
        }
        case 4:
        {
            stObjdata.deleteAllDataInfo();
            break;
        }
        case 5:
        {
            std::string strTempName;
            std::cout << "\n 输入您要删除的名字: ";
            std::cin >> strTempName;
            stObjdata.deleteNameData(strTempName);
            break;
        }
        case 6: 
        {
            y = 1;
            break;
        }
        default: std::cout << "\n输入有效选项.";
        }
        cout << endl;

    } while (y != 1);
    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值