C++列表处理:将最小值初始化为列表的第一个值
C++ List Processing: initializing min to first value of list
我的代码遇到的问题是最小值总是读0。原因是因为我没有将其正确初始化为"random.txt"的第一个值。我该怎么做?
这是我的代码:
using namespace std;
int main()
{
ifstream inputFile;
//open file
inputFile.open("random.txt");
int numCount = 0;
int number, max, min, i, x;
double average, sum;
while(inputFile >> number)
{
for (i = 0; i < numCount; i++)
{
x = number;
if (x < min)
{
min = x;
}
else if (x > max)
{
max = x;
}
}
numCount++;
sum = number + sum;
}
if (numCount > 0)
{
average = sum/numCount;
}
inputFile.close();
cout << "Number of numbers is: " << numCount << endl;
cout << "Sum of numbers is: " << sum << endl;
cout << "Average of numbers is: " << average << endl;
cout << "Max of numbers is: " << max << endl;
cout << "Min of numbers is: " << min << endl;
return 0;
}
将
min
初始化为可能的最大值,max
初始化为可能的最低值。
喜欢
int min = std::numeric_limits<int>::max();
int max = std::numeric_limits<int>::min();
有关std::numeric_limits
的参考,请参阅此处。
正如 WhozCraig 在此答案的评论中暗示的那样,如果文件中的数字越来越低,并且没有值大于以前的值,那么您的if-else if
构造不是最好的。
您可能希望按照 WhozCraig 在评论中的建议进行操作,或者更改为两个单独的if
语句。
样本
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
std::ifstream inputFile("random.txt");
int number, max=0, min=0;
int numCount = 0;
double average=0, sum=0;
if (inputFile >> number)
{
min = max = number;
numCount = 1;
while(inputFile >> number)
{
if (number < min)
min = number;
else if (number > max)
max = number;
sum += number;
++numCount;
}
average = static_cast<double>(sum)/numCount;
}
cout << "Number of numbers is: " << numCount << endl;
cout << "Sum of numbers is: " << sum << endl;
cout << "Average of numbers is: " << average << endl;
cout << "Max of numbers is: " << max << endl;
cout << "Min of numbers is: " << min << endl;
return 0;
}
由于您的数字是 int,请尝试将 min 初始化为 INT_MAX,将 max 初始化为 INT_MIN。您可以在 limits.h 中找到这些宏。
http://www.cplusplus.com/reference/climits/
将最小值初始化为可能的最大整数值:
- 包括
<climits>
头文件(有关详细信息,请参阅此处) - 初始化
min = INT_MAX
。
这将工作得很好,但如果文件中根本没有数字,则无法按预期工作。要解决此问题,您应该使用布尔变量(初始化为 false
),并将其设置为while
循环中的true
。因此,在循环退出后,您将能够判断 min
和 max
的值是真实的,还是只是尚未更改的初始值(另一种方法是在循环后测试min
是否大于 max
- 如果是,则文件为空)。
另请注意,for
循环似乎是冗余的,甚至不会对第一个数字执行。
ifstream inputFile;
//open file
inputFile.open("random.txt");
int numCount = 0;
int number = 0, max = 0, min = 0, i = 0;
double average = 0, sum = 0;
bool first = true;
while (inputFile >> number)
{
if (first){
first = false;
max = min = number;
}
if (number < min)
{
min = number;
}
else if (number > max)
{
max = number;
}
numCount++;
sum = number + sum;
}
这是我编辑的。我希望你能得到你的答案。
相关文章:
- 复制列表初始化的隐式转换的等级是多少
- 标准是否使用多余的大括号(例如 T{{{10}}})定义列表初始化?
- 我使用向量来创建类对象列表.初始化向量时如何使用参数调用构造函数?
- C++11 中的混合列表初始化
- 我可以列表初始化 std::vector 并完美转发元素吗?
- 无法在声明时使用初始值设定项列表初始化常量字符*/字符串数组的向量
- C++20 从括号中的值列表初始化聚合,不支持内部数组
- 如何在向量列表初始化时避免对象复制以及如何延长临时的生存期
- 默认参数和空列表初始化
- 如何在列表初始化中放置额外的语句?
- C++列表初始化允许多个用户定义的转换
- 列表初始化是否将原子初始化为零
- 使用可变模板列表初始化数组,并放置new
- 使用整数初始化列表初始化长双精度的向量
- 直接列表初始化的自动规则
- 使用初始化列表初始化unique_ptr的容器,继续
- 如何修复"非聚合无法使用初始值设定项列表初始化" <map>
- 直接列表初始化和复制列表初始化之间的差异
- 为什么我可以在不使用赋值运算符的情况下使用列表初始化普通数组
- C++ - 使用类中的初始值设定项列表初始化动态集