简体   繁体   English

我的中位数计算器中 Output 的问题

[英]Problem with Output in My Median Calculator

bool isEven(int num){
    if(num % 2 == 0){
        return true;
    }
    else {
        return false;
    }
}


int main() {
    int footballPlayer[] = {1,2,3,4};
    int lengthOfArray = sizeof(footballPlayer) / sizeof(footballPlayer[0]);
    int oddMedianFormula = lengthOfArray/2;
    int evenMedianFormula = lengthOfArray/2;
    if(isEven(lengthOfArray) == false) {
         cout << "The median is " << footballPlayer[oddMedianFormula] << endl;
    } else {
        if(isEven(footballPlayer[evenMedianFormula]) == true && isEven(footballPlayer[evenMedianFormula - 1] == true)) {
            cout << "The median is " << (footballPlayer[evenMedianFormula - 1] + footballPlayer[evenMedianFormula]) / 2 << endl;
        }
        else if(isEven(footballPlayer[evenMedianFormula]) == false && isEven(footballPlayer[evenMedianFormula - 1] == false)) {
            cout << "The median is " << (footballPlayer[evenMedianFormula - 1] + footballPlayer[evenMedianFormula]) / 2 << endl;
        }
        else {
            cout << "The median is " << ((footballPlayer[evenMedianFormula - 1] + footballPlayer[evenMedianFormula]) / 2) + 0.5 << endl;
        }
    }

    return 0;
}

output = 2; output = 2;

Why is my output an integer when one number is odd when I have clearly have added a half (0.5) to the output?为什么我的 output 是 integer,而当我显然已经将 output 加了一半(0.5)时,一个数字是奇数?

When you divide an integer by another integer, you simply get the floor of the mathematical value (as an integer).当您将 integer 除以另一个 integer 时,您只需得到数学值的下限(作为整数)。 Say for example: 1 / 2 = (int) floor(0.5) = 0 .比如说: 1 / 2 = (int) floor(0.5) = 0 The answers (they are correct) here have suggested (explicit) type casting your integer values to floating point data types.这里的答案(它们是正确的)建议(显式)将 integer 值转换为浮点数据类型。 But I would like to add up something.但我想补充一点。

You simply can put a point after 2 to make the compiler know you are performing division of floating point numbers.您只需在2之后加上一个点,让编译器知道您正在执行浮点数除法。 The numerator will be implicitly type converted into double in this case.在这种情况下,分子将隐式类型转换为double Don't get confused --> 2. is same as 2.0 .不要混淆 --> 2.2.0相同。 Here is your modified code:这是您修改后的代码:

#include <iostream>
using namespace std;

bool isEven(int num) {
  if (num % 2 == 0) {
    return true;
  } else {
    return false;
  }
}

int main() {
  int footballPlayer[] = {1, 2, 3, 4};
  int lengthOfArray = sizeof(footballPlayer) / sizeof(footballPlayer[0]);
  int oddMedianFormula = lengthOfArray / 2;
  int evenMedianFormula = lengthOfArray / 2;
  if (isEven(lengthOfArray) == false) {
    cout << "The median is " << footballPlayer[oddMedianFormula] << endl;
  } else {
    if (isEven(footballPlayer[evenMedianFormula]) == true &&
        isEven(footballPlayer[evenMedianFormula - 1] == true)) {
      cout << "The median is "
           << (footballPlayer[evenMedianFormula - 1] +
               footballPlayer[evenMedianFormula]) /
                  2.
           << endl;
    } else if (isEven(footballPlayer[evenMedianFormula]) == false &&
               isEven(footballPlayer[evenMedianFormula - 1] == false)) {
      cout << "The median is "
           << (footballPlayer[evenMedianFormula - 1] +
               footballPlayer[evenMedianFormula]) /
                  2.
           << endl;
    } else {
      cout << "The median is "
           << ((footballPlayer[evenMedianFormula - 1] +
                footballPlayer[evenMedianFormula]) /
               2.) +
                  0.5
           << endl;
    }
  }

  return 0;
}

I don't know why, but your code clearly looks overly complicated to me.我不知道为什么,但您的代码显然对我来说过于复杂。 I actually doubt if even your logic is correct.我什至怀疑你的逻辑是否正确。 If you just want to find the median, then I think this much code will be sufficient:如果你只是想找到中位数,那么我认为这么多代码就足够了:

#include <iostream>
#include <vector>

double findMedianSorted(const std::vector<int> &v) {
  auto n = v.size();
  return n % 2 ? v[n / 2] : (v[(n - 1) / 2] + v[n / 2]) / 2.;
}

int main() {
  std::vector<int> footballPlayer = {1, 2, 3, 4};
  std::cout << "Median is: " << findMedianSorted(footballPlayer);
}

Because you work with Integers.因为您使用整数。 You have to cast it as Double or Float.您必须将其转换为 Double 或 Float。

cout << "The median is " << (float)(footballPlayer[evenMedianFormula - 1] + footballPlayer[evenMedianFormula]) / 2 << endl;

Something like this should fix the problem这样的事情应该可以解决问题

That's because you're doing integer division.那是因为你在做 integer 除法。 division of integer types always returns an integer even if the result is in the float. integer 类型的除法总是返回 integer,即使结果是浮点数。 cast any of your variable into float and it should work.将您的任何变量转换为 float,它应该可以工作。 What is the behavior of integer division? integer师的行为是什么?

Did some changes to your code -对您的代码做了一些更改 -

bool isEven(int num)
{
    return !(num % 2);
}

int main()
{
    int footballPlayer[] = {1, 2, 3, 4};
    int lengthOfArray = sizeof(footballPlayer) / sizeof(footballPlayer[0]);

    int oddMedianFormula = lengthOfArray / 2;
    int evenMedianFormula = lengthOfArray / 2;

    if (isEven(lengthOfArray))
    {
        if (isEven(footballPlayer[evenMedianFormula]) && isEven(footballPlayer[evenMedianFormula - 1]))
        {
            cout << "The median is " << (float)(footballPlayer[evenMedianFormula - 1] + footballPlayer[evenMedianFormula]) / 2 << endl;
        }
        else if (!isEven(footballPlayer[evenMedianFormula]) && !isEven(footballPlayer[evenMedianFormula - 1]))
        {
            cout << "The median is " << (float)(footballPlayer[evenMedianFormula - 1] + footballPlayer[evenMedianFormula]) / 2 << endl;
        }
        else
        {
            cout << "The median is " << (float)((footballPlayer[evenMedianFormula - 1] + footballPlayer[evenMedianFormula]) / 2) + 0.5 << endl;
        }
    }
    else
    {
        cout << "The median is " << footballPlayer[oddMedianFormula] << endl;
    }

    return 0;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM