题目:
定义一个 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;
}