练习9.51:设计一个类,它有三个unsigned成员,分别表示年、月和 日。为其编写构造函数,接受一个表示日期的string参数。你的构造函 数应该能处理不同数据格式,如January 1,1900

难点:

1. 输入格式太多种,进行转换难度大

2. 懂得通过find和substr对字符串进行切割

3.知道用hashtabe进行月份的转化

class Date
{
public:
	Date(){}
	Date(string str)
	{
		//用k-y对应月份
		unordered_map<string, int>hashTable;
		hashTable["January"] = 1;
		hashTable["February"] = 2;
		hashTable["March"] = 3;
		hashTable["April"] = 4;
		hashTable["May"] = 5;
		hashTable["June"] = 6;
		hashTable["July"] = 7;
		hashTable["August"] = 8;
		hashTable["September"] = 9;
		hashTable["October"] = 10;
		hashTable["November"] = 11;
		hashTable["December"] = 12;

		hashTable["Jan"] = 1;
		hashTable["Feb"] = 2;
		hashTable["Mar"] = 3;
		hashTable["Apr"] = 4;
		hashTable["May"] = 5;
		hashTable["Jun"] = 6;
		hashTable["Jul"] = 7;
		hashTable["Aug"] = 8;
		hashTable["Sep"] = 9;
		hashTable["Oct"] = 10;
		hashTable["Nov"] = 11;
		hashTable["Dec"] = 12;

		//根据find和substr进行划分字符串
		vector<string>vec;
		int pos = 0,found=0;
		string temp = "/, -";
		while((found=str.find_first_of(temp,pos))!=string::npos)
		{
			vec.push_back(str.substr(pos, found - pos));
			pos = found + 1;
		}
		vec.push_back(str.substr(pos));
		auto beg = vec.begin();
		while (beg != vec.end())
		{
			if (isalpha((*beg)[0]))
			{
				month = hashTable[*beg];
			}
			else
			{
				unsigned temp = stoi(*beg);
				if (beg == vec.begin() && temp <= 31)
				{
					day = temp;
					++beg;
					continue;
				}
				if (temp > 31)
				{
					year = temp;
				}
				else if (!month&&temp<=12)
				{
					month = temp;
				}
				else 
				{
					day = temp;
				}
			}
			++beg;
		}
	}

	unsigned getYear()
	{
		return year;
	}
	unsigned getMonth()
	{
		return month;
	}
	unsigned getDay()
	{
		return day;
	}
private:
	unsigned year;
	unsigned month=0;
	unsigned day;
};


int main(int argc,char * argv[])
{	
	string str = "2021-2-3";
	Date date=Date(str);
	cout << date.getYear() << " " << date.getMonth() << " " << date.getDay() << endl;
	return 0; 
}

样例:

2023-2-2
January 1,1900
1/1/1990
Jan 1 1900

纯CPP萌新,如有错误,恳请大佬在评论区指教!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值