【问题标题】:Program for finding min, max, average, median and mode查找最小值、最大值、平均值、中值和众数的程序
【发布时间】:2015-12-24 12:48:55
【问题描述】:

背景

编写一个 C++ 程序,接受用户输入的一组数字,并输出最大值、最小值、平均值、中位数和众数。我们知道模式可以有多个,因此请编写代码,以便在必要时输出多种模式。

示例输入

输入整数,完成后输入字母。

-2 3 3 5 6 4 4 8 9 9 9 1 -2 10 10 10

样本输出

Your numbers are: -2 -2 1 3 3 4 4 5 6 8 9 9 9 10 10 10
Max: 10  
Min: -2  
Average: 5.4375  
Median: 5.5  
Mode: 9 10 (3) 

我的代码

#include <iostream>
using namespace std;

void main()
{
    double value, sum;
    double average, minimum, maximum;
    int count;
    // initialise
    sum = 0.0;
    count = 0;
    cout << "Enter a value: ";
    cin >> value;
    minimum = value;
    maximum = value;
    while (value >= 0.0)
    {
        // process value
        sum += value;
        count++;
        if (value > maximum)
            maximum = value;
        else if (value < minimum)
            minimum = value;
        // get next value
        cout << "Enter a value: ";
        cin >> value;
    }
    if (count == 0)
        cout << "No data entry" << endl;
    else
    {
        average = sum / count;
        cout << "There were " << count << " numbers" << endl;
        cout << "Average was " << average << endl;
        cout << "Minimum was " << minimum << endl;
        cout << "Maximum was " << maximum << endl;
    }
}

【问题讨论】:

  • 你有没有尝试过或让我们做你的功课?
  • 我已经尝试过了,这是我目前的代码,它不会让我粘贴它,因为它太长了
  • 您需要做的不仅仅是将您的代码包含在您的帖子中。你需要说的不仅仅是你的任务是什么。比如你到底遇到了什么问题,编译器或链接器错误,如果程序运行你得到什么输出以及为什么出错。
  • 不知道如何计算中位数和众数
  • while (value &gt;= 0.0) 不允许您输入负数。

标签: c++ max min mode median


【解决方案1】:

如果要使用STL,可以这样写(使用c++11):

#include <iostream>
#include <sstream>
#include <string>
#include <vector>
#include <set>
#include <map>
#include <algorithm>
template<typename A, typename B>
std::pair<B,A> flip_pair(const std::pair<A,B> &p)
{
    return std::pair<B,A>(p.second, p.first);
}
template<typename A, typename B>
std::multimap<B,A> flip_map(const std::map<A,B> &src)
{
    std::multimap<B,A> dst;
    std::transform(src.begin(), src.end(), std::inserter(dst, dst.begin()), 
                   flip_pair<A,B>);
    return dst;
}
int main() {
  std::string line;
  std::cout << "Enter numbers: ";
  std::getline(std::cin, line);
  std::istringstream iss(line);
  std::vector<int> elements;
  elements.reserve(1000);
  std::string elem;
  while (std::getline(iss, elem, ' ')) {
    try {
      elements.push_back(std::stoi(elem));
    } catch (...) {  }
  }
  double sum = 0.0;
  std::size_t n = elements.size();
  std::sort(elements.begin(), elements.end());
  std::cout << "max=" << elements.back() << std::endl;
  std::cout << "min=" << elements.front() << std::endl;
  for (auto &x: elements) {
    sum += x;
  }
  if (n == 0) return 1;
  std::cout << "avg=" << sum / n << std::endl;
  if (n == 1) {
    std::cout << "med=" << elements[0] << std::endl;
  }
  else if (n % 2 == 0) {
    std::size_t i = n/2;
    std::cout << "med=" << (double)(elements[i] + elements[i-1]) / 2.0 << std::endl;
  }
  else {
    std::cout << "med=" << elements[n/2] << std::endl;
  }
  std::set<int> elements_set;
  for (auto &x: elements) {
    elements_set.insert(x);
  }
  std::map<int, std::size_t> elements_count;
  for (auto &x: elements_set) {
    elements_count.insert(std::pair<int, std::size_t>(x, std::count(elements.begin(), elements.end(), x)));
  }
  std::multimap<std::size_t, int> count_elements;
  count_elements = flip_map(elements_count);
  std::cout << "mod: ";
  std::size_t count_mod = count_elements.rbegin()->first;
  for (auto &x: count_elements) {
    if (x.first == count_mod) {
      std::cout << x.second << ", ";
    }
    else {  }
  }
  std::cout << "(" << count_mod << ")" << std::endl;
  return 0;
}

【讨论】:

    【解决方案2】:

    中位数:

    首先,您需要对数字进行排序。您可以将它们存储在数组中,然后使用排序算法,例如插入排序,选择排序等。一旦对数组进行排序,中位数就是中间数。下面是插入排序实现的代码,假设您将数字存储在arr[] 中,length 是数组的长度。

        void insertion_sort(double arr[], int length) {
          int i, j;
          double tmp; 
          for (i = 1; i < length; i++) {
            j = i;
            while (j > 0 && arr[j - 1] > arr[j]) {
              tmp = arr[j];
              arr[j] = arr[j - 1];
              arr[j - 1] = tmp;
              j--;
            }//end of while loop
            print_array(arr,5);
          }//end of for loop
        }//end of insertion_sort.
    

    模式:

    您可以使用计数器来跟踪数组中的每个数字。最常见的是模式。

    【讨论】:

    • 你有O(n^2)的排序复杂度,为什么不使用内置排序呢?
    • 没错!但是,问题不在于复杂性。我只是举了一个例子,你可以使用任何你想要的排序。
    • 如果不考虑复杂性,那你为什么要为新手使用复杂的代码?
    【解决方案3】:

    以下代码是您的代码的编辑版本,可以正常工作:

        #include <iostream>
        #include <map>
        #include <vector>
        #include <algorithm>
        using namespace std;
    
        int main()
        {
            double value, sum;
            double average, minimum=(double)INFINITY, maximum=-(double)INFINITY, median;
            map<int,int>modes;
            vector<int>data;
            int count,mxmode=0;
            // initialise
            sum = 0.0;
            count = 0;
            cout << "Enter a value (To end, press Ctrl+Z and Enter): ";
    
            while (cin >> value)
            {
                // process value
                sum += value;
                count++;
                if (value > maximum)
                    maximum = value;
    
                if (value < minimum)
                    minimum = value;
    
                modes[ value ]++;
                mxmode = max(mxmode, modes[value]);
                data.push_back(value);
    
                // get next value
                cout << "Enter a value (To end, press Ctrl+Z and Enter): ";
            }
            if (count == 0)
                cout << "No data entry" << endl;
            else
            {
                average = sum / count;
    
                sort(data.begin(), data.end());
    
                if(data.size()%2==0) median = ( data[ data.size()/2 - 1 ] + data[ data.size()/2 ] )/2.0;
                else median = data[ data.size()/2 ];
    
                cout << "There were " << count << " numbers" << endl;
                cout << "Average was " << average << endl;
                cout << "Minimum was " << minimum << endl;
                cout << "Maximum was " << maximum << endl;
                cout << "Median was " << median << endl;
                cout << "Mode was";
    
                for (auto &x: modes)
                    if(x.second == mxmode) cout<<" "<<x.first;
    
                cout<<" ("<<mxmode<<")" << endl;
            }
        }
    

    记住:

    • 不要忘记使用最新的-std=c++11 标志编译它,因为我使用了 C++11 的特性。
    • 输入由EOF 终止,或者在控制台中,您可以通过按 Ctrl + z 然后 Enter 来终止它(如果您使用的操作系统与 Windows 不同)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-11
      • 1970-01-01
      • 1970-01-01
      • 2015-01-16
      • 1970-01-01
      • 2016-12-29
      • 2016-01-05
      • 2017-07-24
      相关资源
      最近更新 更多