簡體   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 是 integer,而當我顯然已經將 output 加了一半(0.5)時,一個數字是奇數?

當您將 integer 除以另一個 integer 時,您只需得到數學值的下限(作為整數)。 比如說: 1 / 2 = (int) floor(0.5) = 0 這里的答案(它們是正確的)建議(顯式)將 integer 值轉換為浮點數據類型。 但我想補充一點。

您只需在2之后加上一個點,讓編譯器知道您正在執行浮點數除法。 在這種情況下,分子將隱式類型轉換為double 不要混淆 --> 2.2.0相同。 這是您修改后的代碼:

#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;
}

我不知道為什么,但您的代碼顯然對我來說過於復雜。 我什至懷疑你的邏輯是否正確。 如果你只是想找到中位數,那么我認為這么多代碼就足夠了:

#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);
}

因為您使用整數。 您必須將其轉換為 Double 或 Float。

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

這樣的事情應該可以解決問題

那是因為你在做 integer 除法。 integer 類型的除法總是返回 integer,即使結果是浮點數。 將您的任何變量轉換為 float,它應該可以工作。 integer師的行為是什么?

對您的代碼做了一些更改 -

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