我在写一个程序,我想要一些用户输入。我们定义一个int型;叫年龄。如果用户是成年人(假设30岁以上),我希望程序将所有非正式的"you"转换为"正式的"you(许多语言,如法语,都有这种区别,想想vous和tu)。在荷兰语中,"u"是正式的,而不是"je"。
最简洁的方法是什么?我现在有这个(使用今天的日期,2015年9月18日):
string abc;
if (2015 - year of birth > 30) {
abc = "u";
}
else {
abc = "je";
}
if (2015 - year of birth == 30) {
if ( September - month of birth > 0) {
abc = "u";
}
else {
abc = "je";
}
}
if (2015 - year of birth == 30) {
if (September - month of birth == 0) {
if (18 - day of birth >= 0) {
abc = "u";
}
else {
abc = "je";
}
}
}
我很确定它是有效的,但可能不是最优的。我该如何改进呢?
我假设你可能真的需要与今天的日期进行比较,所以使用std::chrono
和localtime
来获得它-后者为你将日期解包为std::tm
:请注意链接的文档中年份和月份分别以1900和0为基础。
std::tie
方便地将这些值分组到一个tuple
中,以便于比较,这样,如果最左边的值相等,则考虑最右边的值,以此类推。
auto now = std::chrono::system_clock::now();
auto my_time_t = std::chrono::system_clock::to_time_t(now);
std::tm* p = std::localtime(&my_time_t);
string abs = std::tie(p->tm_year + 1900 - 30, p->tm_mon + 1, p->tm_mday) >
std::tie(year_of_birth, month_of_birth, day_of_birth)
? "je" : "u";
如果你不需要今天的日期,只需去掉前三行,硬编码p->tm_xxx + ...
值。
你可以这样做
string abc="u";
if ((2015 - year of birth < 30) ||
(2015 - year of birth ==30 && September- month of birth < 0) ||
(2015 - year of birth ==30 && September- month of birth ==0 && 18 - day of birth < 0))
abc ="je";
最简单的方法是实现/使用函数"两个日期之间的天数"。如果你的任务可以接受几天内的错误,你可以这样使用:
int difference = currentDate - birthday; // nb of days between today and birthday of user
abc = (difference >= 30 * 365) ? "u" : "je"; // 365 is approx. number of days in a year
要做到这一点,你可以阅读这些问题:
- 两个日期之间的天数c++,
- 如何计算两个日期之间的多少天在c++ visual studio?
- 如何使用boost::date_time获得两个日期之间的天数,
- 确定日期之间的差异
你想要实现的是,如果有人是一天大于30年,那么字符串将是,abc = 'u'
,否则它将是abc = "je"
。
现在你使用的方法是静态的,也就是说你在你的程序中使用一个特定的日期。使用c++中的ctime
库可以很容易地解决上述问题。
此链接包含您正在搜索的程序。我希望这对你有帮助:)
如果没有适当的赞扬,它很难阅读。在你的代码中,你必须有一点荣誉。但为了让它看起来更短,也让它看起来更好。
string abc = "je";
if (2015 - year of birth > 30) abc = "u";
else if ( 2015 - year of birth == 30){
if ( September - month of birth > 0) abc = "u";
else if (September - month of birth == 0){
if (18 - day of birth >= 0) abc = "u";
}
}
现在您将字符串abc
作为"je"
。这样,你就不需要其他的了。如果其中一个条件为真,则为"u"
。应该是一样的
编辑:实际上,像jeremy那样回答会更好。
首先,我将出生日期转换为自epoch以来的毫秒数,并与自epoch以来的当前时间进行比较。这将大大简化您的代码,因为您只需对地址类型进行一次测试。
这个线程解释了进程
数学将1970年以来的秒转换为日期,反之亦然
然后输入
if (ageInMilliseconds>= formalAgeInMilliseconds)