根据某个字符串改变程序中的一个单词



我在写一个程序,我想要一些用户输入。我们定义一个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::chronolocaltime来获得它-后者为你将日期解包为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
要做到这一点,你可以阅读这些问题:
  1. 两个日期之间的天数c++,
  2. 如何计算两个日期之间的多少天在c++ visual studio?
  3. 如何使用boost::date_time获得两个日期之间的天数,
  4. 确定日期之间的差异

你想要实现的是,如果有人是一天大于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)

相关内容

  • 没有找到相关文章

最新更新