如何计算用户输入列表的max,min和avg值

时间:2014-03-17 23:22:36

标签: c++ max average min

家伙!下周我将为c ++做一个期中考试,并给我一些练习。对于这个,我很难理解如何从用户输入的整数列表中获取最小值和平均值。任何帮助将不胜感激! :)

#include <iostream>
using namespace std;

int main()
{
    int max = 0;
    int min = 0;
    int num = 0;
    cout << "Enter a list of integers terminated by a negative number: " << endl;


    while(cin >> num)
    {
        if(num >= 0)
        {
            if (num > max)
            {
                max = num;
            }
            if (num < max)
            {

            }
        }
    }

    return 0;
}

4 个答案:

答案 0 :(得分:1)

#include <iostream>
#include <limits>

int main() {
    int max = std::numeric_limits<int>::min();
    int min = std::numeric_limits<int>::max();
    int num = -1;
    int count = 0;
    int sum = 0;

    while ( std::cin >> num && num >= 0) {
            count++;
            if (num > max) {
                max = num;
            }
            if (num < min) {
                min = num;
            }
            sum += num;
    }
    if ( count) {
        std::cout << "min: " << min << std::endl;
        std::cout << "max: " << max << std::endl;
        std::cout << "average: " << (double)sum / count << std::endl;  
    }
    return 0;
}

使用boost::accumulator

boost::accumulator提供了您可以轻松用于统计的工具:

#include <iostream>
#include <boost/accumulators/accumulators.hpp>
#include <boost/accumulators/statistics/stats.hpp>
#include <boost/accumulators/statistics/mean.hpp>
#include <boost/accumulators/statistics/min.hpp>
#include <boost/accumulators/statistics/max.hpp>
using namespace boost::accumulators;

int main() {
    // Define an accumulator set for calculating the mean, max, and min
    accumulator_set<double, features<tag::min, tag::max, tag::mean> > acc;

    int num = -1;
    bool empty = true;

    while ( std::cin >> num && num >= 0) {
        empty = false;
        acc( num);
    }

    if ( ! empty) {
        // Display the results ...
        std::cout << "Mean: " << mean( acc) << std::endl;
        std::cout << "Min: " << min( acc) << std::endl;
        std::cout << "Max: " << max( acc) << std::endl;  
    }

    return 0;
}

答案 1 :(得分:1)

以下是 C ++ 中的解决方案。它基本上是完整的,只是当输入负数时它不会退出(它将在任何非数字输入上退出)。

这个解决方案的优点是,只需要很少的额外工作,它应该(除非我发出另一个错误)适用于任何数字类型( average 的概念没有定义为非-numeric类型,所以没关系)只需更改main()中模板化函数调用的类型即可。如果你想要更简单的东西,那么早期的“仅整数”版本就在这个答案的编辑历史中。

#include <iostream>
#include <limits>
#include <algorithm>

template<typename T>
void listStats() {
    T min   = std::numeric_limits<T>::max();
    T max   = std::numeric_limits<T>::min();
    T sum   = static_cast<T>(0);
    T value;
    int count = 0; 

    while( std::cin >> value ) {
        max = std::max(max, value);
        min = std::min(min, value);
        sum += value;
        count++;
    }

    if( count > 0 ) {
        std::cout << "Minimum: " << min << std::endl;
        std::cout << "Maximum: " << max << std::endl;
        std::cout << "Average: " << sum/double(count) << std::endl;
    } else {
        std::cout << "No input" << std::endl;
    }
}

int main(void)
{
    listStats<int>();
    return 0;
}

答案 2 :(得分:-1)

你可以这样做:

int main()
{
    using namespace std;
    bool cont = true;
    int total = 0;
    int amount = 0;
    int average;
    int min = 0;
    int max = 0;
    int num;

    while(cont)
    {
        cin >> num;
        if(num < 0)
        {
            cont = false;
            break;
        }
        amount++;
        if(amount == 1)
        {
            min = num;
            max = num;
        }
        if(num < min) min = num;
        if(num > max) max = num;
        total += num;
    }

    int average = total/amount;
    printf("Min: %i \nMax: %i \nAverage: %i \n", min, max, average);
}

我实际上没有对此进行测试,但它应该正常工作。 此外,您可能希望将平均值设为浮点数,因为将其设为int可能不准确。如果平均值不是整数,则将向下舍入为整数。我只是把它变成了一个整数,因为你的所有值都是整数,但实际上它应该是double或float。

希望这有帮助。

答案 3 :(得分:-2)

首先,我想指出你不应该使用带有numeric_limits的方法,因为它在其他帖子中显示。这是一个非常糟糕的方法。要查找对象序列的最大值或最小值,您只需要定义类型operator <您应该始终尝试使用涵盖更多类型的常规方法。使用某些类型的某些特定特性会使您的代码不那么灵活和通用。这只是一种糟糕的编程风格。例如,假设您定义了类Point。您所需要的只是为此类定义operator <,以查找Point类型的对象序列的最大值或最小值。您不需要像其他人建议的那样为您的类Point专门化标准类std::numeric_limits。 :)此外,如果对象具有类型std::string,则此类没有std :: numeric-limits的特化。因此,如果您要求在输入的字符串中找到最大值和最小值,则必须重写代码。

程序可以按以下方式查看

#include <iostream>

using namespace std;

int main()
{
    int max;
    int min;
    int num;
    int count;
    int sum;
    bool empty;

    cout << "Enter a list of integers terminated by a negative number: " << endl;

    sum = 0; count = 0; empty = true;

    while ( cin >> num && num >= 0 )
    {
        if ( empty )
        {
            max = num;
            min = num;
            empty = false;
        }
        else if ( max < num )
        {
            max = num;
        }
        else if ( num < min )
        {
            min = num;
        }

        ++count;
        sum += num;         
    }

    if ( !empty )
    {
        cout << "minimum value = " << min << endl;      
        cout << "maximum value = " << max << endl;      
        cout << "average value = " << sum / count << endl;      
    }

    return 0;
}

编写一个通用函数很简单,即使对于std::string类型的对象也可以使用它 例如

#include <iostream>
#include <string>
#include <tuple>


enum { MAX, MIN, SUM, CNT };

template <typename T>
bool GetInfo( std::tuple<T, T, T, size_t> &t )
{
    bool empty;
    T min;
    T max;
    T sum;
    T num;
    size_t cnt;

    sum = T(); cnt = 0; empty = true;

    while ( std::cin >> num && !( num < T() ) )
    {
        if ( empty )
        {
            max = num;
            min = num;
            empty = false;
        }
        else if ( max < num )
        {
            max = num;
        }
        else if ( num < min )
        {
            min = num;
        }

        sum = sum + num;
        ++cnt;
    }

    if ( !empty )
    {
        std::get<MAX>( t ) = max;
        std::get<MIN>( t ) = min;
        std::get<SUM>( t ) = sum;
        std::get<CNT>( t ) = cnt;
    }

    return !empty;
}


int main()
{
    std::tuple<std::string, std::string, std::string, size_t> t;

    std::cout << "Enter strings (Ctrl+Z - exit): ";

    bool non_empty = GetInfo( t );

    if ( non_empty )
    {
        std::cout << "maximum string is " << std::get<MAX>( t ) << std::endl;
        std::cout << "minimum string is " << std::get<MIN>( t ) << std::endl;
        std::cout << "total string   is " << std::get<SUM>( t ) << std::endl;
        std::cout << "average lemgth is " << std::get<SUM>( t ).size() / std::get<CNT>( t )
                                          << std::endl;
    }
}

如果要输入例如

abc def ghi 并在按下ENTER键后按Ctrl + Z

然后输出

Enter strings (Ctrl+Z - exit): abc def ghi
^Z
maximum string is ghi
minimum string is abc
total string   is abcdefghi
average lemgth is 3

实际上,此函数结合了两个标准算法:std::minmax_elementstd::accumulate以及用于输入迭代器的函数std::distance。标准算法std::minmax_element(或相应的算法std::min_elementstd::max_element)永远不会使用std::numeric_traits.编写它们使用适用于已定义operator <的所有类型的一般方法 您可以使用输入迭代器作为模板参数编写模板函数。

template <typename InputIterator, typename UnaryPredicate>
typename std::iterator_traits<InputIterator>::difference_type
GetInfo ( InputIterator first, InputIterator last, 
          std::tuple<typename std::iterator_traits<InputIterator>::value_type, 
                     typename std::iterator_traits<InputIterator>::value_type, 
                     typename std::iterator_traits<InputIterator>::value_type> &t, 
          UnaryPredicate unary_predicate );

我上面展示的模板功能也可以用以下方式编写

#include <iostream>
#include <string>
#include <functional>
#include <tuple>


enum { MAX, MIN, SUM };

template <typename T, typename UnaryPredicate>
size_t GetInfo( std::tuple<T, T, T> &t, UnaryPredicate unary_predicate )
{
    T min;
    T max;
    T sum;
    T num;
    size_t cnt;

    sum = T(); cnt = 0;

    while ( std::cin >> num && !unary_predicate( num ) )
    {
        if ( cnt == 0 )
        {
            max = num;
            min = num;
        }
        else if ( max < num )
        {
            max = num;
        }
        else if ( num < min )
        {
            min = num;
        }

        sum = sum + num;
        ++cnt;
    }

    if ( cnt != 0 )
    {
        std::get<MAX>( t ) = max;
        std::get<MIN>( t ) = min;
        std::get<SUM>( t ) = sum;
    }

    return cnt;
}

int main()
{
    std::tuple<int, int, int> t;

    std::cout << "Enter non-negaruve integers (-1 - exit): ";

    size_t cnt = GetInfo( t, std::bind2nd( std::equal_to<int>(), -1 ) );

    if ( cnt )
    {
        std::cout << "maximum value is " << std::get<MAX>( t ) << std::endl;
        std::cout << "minimum value is " << std::get<MIN>( t ) << std::endl;
        std::cout << "total value   is " << std::get<SUM>( t ) << std::endl;
        std::cout << "average value is " << std::get<SUM>( t ) / cnt
                                          << std::endl;
    }
}