家伙!下周我将为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;
}
答案 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_element
和std::accumulate
以及用于输入迭代器的函数std::distance
。标准算法std::minmax_element
(或相应的算法std::min_element
和std::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;
}
}