标签:c++ c++ primer 习题答案
//Date.h
#include <map>
#include <string>
#include <vector>
using namespace std;
struct Date
{
explicit Date(const string & info){//检测输入格式,尝试初始化,若失败则进行errorInit
if(mymap.empty()){
initMap();
}
if(!checkInfoFormat(info)){
errorInit();
return;
}
string monthStr=info.substr(0,info.find_first_of(", /"));
string dayStr=info.substr(info.find_first_of(", /")+1,info.find_last_of(", /")-info.find_first_of(", /")-1);
string yearStr=info.substr(info.find_last_of(", /")+1,info.size());
if(!tryToInit({yearStr,monthStr,dayStr})){
errorInit();
}
cout<<"year: "<<year<<endl;
cout<<"month: "<<month<<endl;
cout<<"day: "<<day<<endl;
}
unsigned year;
unsigned month;
unsigned day;
static void initMap();
private:
bool checkDate(){//检查日期是否合法
if(year>10000||month>12||day>31)
return false;
if(month==4||month==6||month==9||month==11){
if(day>30)
return false;
}
if(month==2){
if(checkYear(year)&&day>29){
return false;
}
if(!checkYear(year)&&day>28)
return false;
}
return true;
}
bool checkYear(unsigned year)//检测闰年
{
return (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)) ? true : false;
}
static map<string,unsigned> mymap;
void errorInit()
{
year=1970;
month=1;
day=1;
}
bool tryToInit(const vector<string> & data)//尝试初始化
{
try{
year=stoul(data[0]);
day=stoul(data[2]);
}catch(invalid_argument & error){
return false;
}
try{
month=stoul(data[1]);
}catch(invalid_argument & error){
if(mymap.find(data[1])==mymap.end())
return false;
month=mymap[data[1]];
}
return checkDate();
}
bool checkInfoFormat(const string & info)//检测格式是否正确
{
if(info.empty())
return false;
if(info.find_first_of(", /")==info.size())
return false;
if(info.find_first_of(", /")==info.find_last_of(", /"))
return false;
return true;
}
};
//Date.cpp
map<string,unsigned> Date::mymap;
void Date::initMap(){
mymap.insert(make_pair<string,unsigned>("January",1));
mymap.insert(make_pair<string,unsigned>("Jan",1));
mymap.insert(make_pair<string,unsigned>("February",2));
mymap.insert(make_pair<string,unsigned>("Feb",2));
mymap.insert(make_pair<string,unsigned>("March",3));
mymap.insert(make_pair<string,unsigned>("Mar",3));
mymap.insert(make_pair<string,unsigned>("April",4));
mymap.insert(make_pair<string,unsigned>("Apr",4));
mymap.insert(make_pair<string,unsigned>("May",5));
mymap.insert(make_pair<string,unsigned>("June",6));
mymap.insert(make_pair<string,unsigned>("Jun",6));
mymap.insert(make_pair<string,unsigned>("July",7));
mymap.insert(make_pair<string,unsigned>("Jul",7));
mymap.insert(make_pair<string,unsigned>("August",8));
mymap.insert(make_pair<string,unsigned>("Aug",8));
mymap.insert(make_pair<string,unsigned>("September",9));
mymap.insert(make_pair<string,unsigned>("Sep",9));
mymap.insert(make_pair<string,unsigned>("October",10));
mymap.insert(make_pair<string,unsigned>("Oct",10));
mymap.insert(make_pair<string,unsigned>("November",11));
mymap.insert(make_pair<string,unsigned>("Nov",11));
mymap.insert(make_pair<string,unsigned>("December",12));
mymap.insert(make_pair<string,unsigned>("Dec",12));
}
//表驱动法的应用
《C++ Primer 第五版》练习9.51参考答案,布布扣,bubuko.com
标签:c++ c++ primer 习题答案
原文地址:http://blog.csdn.net/zjq2008wd/article/details/38537923