первое минимальное значение из заданных значений в C ++ - PullRequest
0 голосов
/ 22 декабря 2011
    string result;

    double zpls, zmin, ypls, ymin, xpls, zmin ;

    zpls = 4.2;
    zmin = 0;
    ypls = -2;
    ymin = 4.2;
    xpls = 6;
    xmin = 8;

Как найти «первое минимальное положительное значение» среди этих значений и установить

    result = "+Z";// or wichever value is lowest -z, +Y etc  

(на С ++)

я пробовал массивы, если еще и min (zpls, min (zmin, min (....))) // с #include <algorithm>

но не смог получить его правильно

спасибо

Ответы [ 4 ]

2 голосов
/ 22 декабря 2011

Пока у вас есть данные в независимых переменных, вам нужно будет выполнить if-else

result = ""; // no result yet
double minValue = std::numeric_limits<double>::max( );
if( zplus > 0 && zpls < minValue ) {
  minValue = zpls;
  result = "+Z"
}
if( zmin > 0 && zmin < minValue ) {
  minValue = zmin;
  result = "-Z"
}

и так далее в этом шаблоне.В конце result будет либо иметь желаемую строку, либо она будет пустой (в этом случае положительных значений не было).

Вот полный пример:

#include <iostream>
#include <limits>
#include <string>

int main () {
    std::string result;

    double zpls, zmin, ypls, ymin, xpls, xmin ;

    zpls = 4.2;
    zmin = 0;
    ypls = -2;
    ymin = 4.2;
    xpls = 6;
    xmin = 8;

    result = ""; // no result yet
    double minValue = std::numeric_limits<double>::max( );
    if( zpls > 0 && zpls < minValue ) {
      minValue = zpls;
      result = "+Z";
    }
    if( zmin > 0 && zmin < minValue ) {
      minValue = zmin;
      result = "-Z";
    }
    if( ypls > 0 && ypls < minValue ) {
      minValue = ypls;
      result = "+Y";
    }
    if( ymin > 0 && ymin < minValue ) {
      minValue = ymin;
      result = "-Y";
    }

    if( xpls > 0 && xpls < minValue ) {
      minValue = xpls;
      result = "+X";
    }
    if( xmin > 0 && xmin < minValue ) {
      minValue = xmin;
      result = "-X";
    }


    std::cout << "The first mininum positive element is: " << result << "\n";
}
0 голосов
/ 22 декабря 2011

вы действительно нуждаетесь в отдельных переменных.Почему бы не спроектировать так:

enum Tags
{
 ZPlus,
 ZMinus,
 Etc
};

const std::string [] names = {"z+", "z-", "etc" }

int values[3];

и вместо zmin = -3; вы получите values[ZMinus] = -3;, тогда вы можете найти минимальный индекс в массиве values и return names[minimumIndex];

0 голосов
/ 22 декабря 2011

Не настраивайте алгоритмы.Алгоритм понятен («найди минимум»).Вместо этого измените критерии поиска и оставайтесь в области O (n).

Код.

#include <algorithm>
#include <vector>
#include <iostream>
int main () {
    // std::min_element()
    std::vector<float> vec;

    vec.push_back(0);
    vec.push_back(-1);
    vec.push_back(-2);
    vec.push_back(2);
    vec.push_back(4);

    auto cmp = [](float lhs, float rhs) {
        const bool lz = lhs < 0,
                   rz = rhs < 0;
        if (lz && rz) return lhs < rhs;
        if (lz) return false;
        if (rz) return true;
        return lhs < rhs;
    };

    const float mp = *std::min_element (vec.begin(), vec.end(), cmp);        
    std::cout << mp << '\n';

    // demonstration of our comparison
    sort (vec.begin(), vec.end(), cmp);
    for (auto it=vec.begin(), end=vec.end(); it!=end; ++it)
        std::cout << *it << " ";
    std::cout << std::endl;
}

Выход.

0
0 2 4 -1 -2

Объяснение.

Наша функция сортировки закодирована в cmp.Он проверяет знаки своих операндов.Если оба отрицательны, побеждает больший.Если только LHS является отрицательным, тогда RHS автоматически предпочтительнее при сортировке.Наоборот, если RHS является отрицательным, LHS является предпочтительным.Оба они положительны, мы возвращаемся к нормальному порядку.

Приятно то, что это выполняется ровно один раз в диапазоне и в O (n).

0 голосов
/ 22 декабря 2011

если вы наберете std::sort для любого набора чисел, «первый минимальный положительный результат» будет просто «первым положительным».

Если вы выполните std::find_if в этой отсортированной коллекции, вы можете найти первый положительный результат.

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