在C ++中遇到简单算术问题

时间:2012-02-01 15:08:38

标签: c++ algorithm logic

所以,这是我试图实现的逻辑:

date120 = date5;
date90 = min(date90,date120);
date60 = min(date60, date90, date120);
date30 = min(date30,date60,date90,date120);

其中min函数找到最低的POSITIVE整数。

以下是我如何循环它:

 if(strStatus != "5" && date5 >= 0)
{
    date120 = date5;
    COUT<<"date30 is "<<date30<<" and date60 is "<<date60<<" and date120 is "<<date5<<" and date90 is "<<date90<<ENDL;
    if((date120 < date90) && (date120 >= 0))
    {
        date90 = date120;
        COUT<<"and date90 is "<<date90<<ENDL;
        if((date90 < date60) && (date90 >= 0))
        {
            date60 = date90;
            COUT<<"and date60 is "<<date60<<ENDL;
            if((date60 < date30) && (date60 >= 0))
            {
                date30 = date60;
                COUT<<"and date30 is "<<date30<<ENDL;
            }
        }
        if((date60 < date30) && (date60 >= 0))
            date30 = date60;
    }
    if((date90 < date60) && (date90 >= 0))
    {
        date60 = date90;
        COUT<<"and date60 is "<<date60<<ENDL;
        if((date60 < date30) && (date60 >= 0))
            date30 = date60;
    }
    if((date60 < date30) && (date60 >= 0))
    {
        date30 = date60;
        COUT<<"and date30 is "<<date30<<ENDL;
    }
    COUT<<"Because there was a 5 and date30 is "<<date30<<" and date60 is "<<date60<<ENDL;
}

日志中的输出如下:

date30 is -1 and date60 is -1 and date120 is 15 and date90 is -1
Because there was a 5 and date30 is -1 and date60 is -1

我的逻辑错误了吗?我错过了逻辑明智的东西吗?有更简单的方法吗?

4 个答案:

答案 0 :(得分:2)

首先,您需要一个具有您描述的行为的min函数:

// If only one of a,b is non-negative, return it.
// if both of a,b are non-negative, return the lesser
// untested
int myMin(int a, int b) {
  if(b < 0)
    return a;
  if(a < 0)
    return b;
  if(b < a)
    return b;
  return a;
}

然后你的代码变得微不足道了:

// untested
date120 = date5;
date90 = myMin(date90, date120);
date60 = myMin(date60, date90);
date30 = myMin(date30, date60);

答案 1 :(得分:2)

关于@ Rob's anwer,他需要将min限制为最低整数,所以我建议你实现一个自定义min函数,例如

int minpos( int x, int y ) {
    return x <= 0 ? y : ( y <= 0 ? x : std::min( x, y ) );
}

然后使用@Rob建议的内容:

date120 = date5;
date90 = minpos( date90, date120 );
...

不要忘记#include&lt; algorithm&gt;

我假设如果两个数字都是非正数,则返回哪一个并不重要。

答案 2 :(得分:1)

除此之外,你的代码不会做任何事情,因为date90是-1,所以小于date120。 所以第一个如果没有做任何事情,那么剩下的就没有了。

其他if语句都与第一个语句具有相同的问题。

答案 3 :(得分:1)

你所写的内容相当于:

date120 = date5;
date90 = min(date90, date120);
date60 = min(date60, date90);
date30 = min(date30, date60);

我假设你的代码(>= 0)你的意思是非负面的,而不是正面的。

我会这样写,我想:

template <typename T>
T min_non_negative(T t1, T t2)
{
    return(std::min(t1 >= 0 ? t1 : t2, t2 >= 0 ? t2 : t1));  // Let the compiler do this in the best way for my platform.
}

date120 = date5;
date90 = min_non_negative(date90, date120);
date60 = min_non_negative(date60, date90);
date30 = min_non_negative(date30, date60);