用于查找最小,最大,平均值,中位数和众数的程序

问题描述 投票:-1回答:3

背景

编写一个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;
    }
}
c++ max min mode median
3个回答
0
投票

如果要使用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;
}

0
投票

中位数:

首先,您需要对数字进行排序。您可以将它们存储在数组中,然后使用排序算法,例如插入排序,选择排序等。对数组排序后,中位数是中间数。下面是用于插入排序实现的代码,假设您已将数字存储在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.

模式:

您可以有一个计数器来跟踪阵列中的每个数字。最常见的一种是模式。


0
投票

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

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

记住:

  • 当我使用C ++ 11的功能时,请不要忘记使用最新的-std=c++11标志进行编译。
  • [输入被EOF终止,或在控制台中,您可以通过按Ctrl + z然后按[[Enter终止它(如果您使用的操作系统与Windows不同,请使用相应的键)。” >
© www.soinside.com 2019 - 2024. All rights reserved.