Условие в «если» игнорируется в «для» цикла - PullRequest
0 голосов
/ 08 марта 2012

Для приведенного ниже кода, когда ввод:

первый вход = 0 1 2 3 4 5 6 7 8 9

второй вход = 1 2 3 4 5 6 7 8 9 10

выдаст:

первый выход = 0

второй выход = 1

вместо того, чтобы брать каждый входной квартиль, он берет свой первый элемент, и проблема в том, что (после тестирования и т. Д.) Она следует с проблемой в коде

for (vector<int>::size_type counter = 0; (quartiles < quadro) && (counter < numstore.size()); ++counter)
{
    if (counter == (quartiles/quadro * numstore.size()))
    {
        quaele.push_back(numstore[counter]);
        if ((quartiles == 2) && (numstore.size() / 2 == 0))
            quaele[quartiles-1] = (numstore[counter]+numstore[counter-1]) / 2;
        ++quartiles;
    }
    // test
    cout << quartiles;
}

где условное выражение «если функция» не работает, я имею в виду первый цикл, counter == 0, как можно 0 == 1(quartiles)/4(quadro) * 10(numstore.size() ??

Ответы [ 6 ]

4 голосов
/ 08 марта 2012

Поскольку quartiles и quadro оба являются целыми числами, а первое всегда меньше второго (потому что так говорит оператор for), выражение:

quartiles / quadro * numstore.size()

будет всегда равным нулю, поскольку quartiles / quadro вычисляется первым. Следовательно, оператор if будет истинным только в первый раз в цикле.

Вы можете обойти это, переставив расчет:

quartiles * numstore.size() / quadro
2 голосов
/ 08 марта 2012

Вот как работает целочисленная арифметика. 1/4 обрезается до нуля.

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

(quartiles * numstore.size()) / quadro

Я использовал скобки, чтобы прояснить порядок оценки - вы можете их опустить, если хотите.

Обратите внимание, что при больших значениях вам нужно быть осторожным, чтобы умножение не переполнялось - возможно, путем преобразования в более широкий тип, или в число с плавающей запятой, или путем тщательного умножения и деления на меньшие коэффициенты. Это, вероятно, не проблема в этом случае.

0 голосов
/ 08 марта 2012

В C ++ оператор деления можно представить как два разных оператора : один работает с целочисленными операндами, а другой - с операндами с плавающей запятой. Если операнды имеют тип с плавающей запятой, оператор деления вернет значение с плавающей запятой.

http://www.learncpp.com/cpp-programming/eight-c-programming-mistakes-the-compiler-wont-catch/

Попробуйте:

float result = quartiles/quadro * numstore.size();

edit: исправление благодаря комментариям.

float result = quartiles/(float)quadro * numstore.size();

Достаточно преобразовать один из операндов в число с плавающей запятой.

0 голосов
/ 08 марта 2012

В C++ когда вы делите два целых числа, вы получаете целочисленное деление. Более того, * и / имеют одинаковый приоритет, поэтому синтаксический анализатор интерпретирует его как (quartiles / quadro) * numstore.size(). И (1 / 4) равно 0.

0 голосов
/ 08 марта 2012

квартили / квадро равно 0,25 и потому что квартили типа int квартили / квадро == 0

0 голосов
/ 08 марта 2012

Выражение quartiles/quadro * numstore.size() будет 0 для случая, когда квартили = 1 и квадро = 4. Это потому, что 1/4 округляется вниз до 0.

Может быть, это то, что вы имеете в виду: (quartiles * numstore.size()) / quadro

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