为什么该双除数返回截断的数字?

时间:2020-10-28 01:35:07

标签: c++

我已经为此苦苦挣扎了一段时间,我可以猜到这有点像我使用size_type或函数的方式,但是只要我有一个均匀的输入并且试图找到中位数,程序就会将两个中间值相除,并输出一个截断的数字而没有我需要的十进制数字。

该程序旨在获取字符串映射,并将其分配给双精度向量的值。这样一来,您就可以跟踪在同一键下输入的数字。

我还添加了控制台外观的图片。从输出中,我希望中位数为5.5。

我尝试过将所有物体都铸造成单独漂浮的形状,但这也没有消除它。我怀疑它与size_type数据类型的结构有关,但我不确定。

主要

#include "Util.h"
#include <iostream>
#include <list>
#include <string>
#include <map>
#include <vector>

typedef std::map<std::string, std::vector<double>>::iterator mapStrVectorIt;

int main()
{

    std::map<std::string, std::vector<double>> dict;
    double x;
    std::string str;
    Util util;

    //Take in the inputs from the user in the format: string double, add the double to the respective vector
    while (std::cin >> str >> x) {
        dict[str].push_back(x);
    }

    //Outputs each key and the value/s associated with it
    for (mapStrVectorIt it = dict.begin(); it != dict.end(); ++it)
    {
        std::cout << (*it).first << ": ";
        std::vector<double> itVector = (*it).second;
        for (auto i = itVector.cbegin(); i != itVector.cend(); ++i)
        {
            std::cout << *i << " ";
        }
        std::cout << '\n';
    }

    std::cout << '\n' << "-----------------------------------------------------------------" << '\n';

    //Looks through every single vector in the map and calculates the median
    for (mapStrVectorIt it = dict.begin(); it != dict.end(); ++it)
    {
        
        std::vector<double> itVector = (*it).second;
        std::cout << '\n';
        std::cout << (*it).first << ": median = " << util.median(itVector);
        std::cout << '\n';
    }

}

实用程序

#ifndef GUARD_stats_h
#define GUARD_stats_h

#include <vector>
#include <algorithm>
#include <iostream>

class Util
{
public:
    Util() {};
    int median(std::vector<double>& v);
};
#endif

Util.cpp

#include "Util.h"
int Util::median(std::vector<double>& v) {

    typedef std::vector<double>::size_type sizeT;
    sizeT size = v.size();


    if (size == 0)
    {
        return 0;  // Undefined, really.
    }
    else if (size == 1)
    {
        return *(v.begin());
    }
    else
    {
        std::sort(v.begin(), v.end());
        if (size % 2 == 0)
        {
            std::cout << " even ";
            return (v[size / 2 - 1] + v[size / 2]) / 2;
        }
        else
        {
            return v[size / 2];
        }
    }

    
}

enter image description here

1 个答案:

答案 0 :(得分:1)

就像内森·皮尔森(Nathan Pierson)亲切提到的那样,中位数被声明为int返回类型...