Возникли проблемы с простой арифметикой в ​​C ++ - PullRequest
0 голосов
/ 01 февраля 2012

Итак, вот логика, которую я пытаюсь реализовать:

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

где функция min находит самое низкое ПОЛОЖИТЕЛЬНОЕ целое число.

А вот как я это зацикливаю:

 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 ]

2 голосов
/ 01 февраля 2012

Что касается ответа @ Роба, ему нужно ограничить 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 );
...

Не забудьте включить # 1009 *

Полагаю, если оба числа не положительны, не имеет значения, какое из них возвращается.

2 голосов
/ 01 февраля 2012

Во-первых, вам нужна функция 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 голос
/ 01 февраля 2012

То, что вы написали, эквивалентно:

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);
1 голос
/ 01 февраля 2012

кроме всего прочего, ваш код ничего не сделает, потому что date90 равен -1, поэтому меньше чем date120.Таким образом, первый if не может что-либо сделать, а затем остальные ничего не могут сделать.

Второй оператор if имеет ту же проблему, что и первый.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...