C++列表处理:将最小值初始化为列表的第一个值

C++ List Processing: initializing min to first value of list

本文关键字:列表 初始化 第一个 最小值 表处理 C++      更新时间:2023-10-16

我的代码遇到的问题是最小值总是读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/

将最小值初始化为可能的最大整数值:

  1. 包括<climits>头文件(有关详细信息,请参阅此处)
  2. 初始化min = INT_MAX

这将工作得很好,但如果文件中根本没有数字,则无法按预期工作。要解决此问题,您应该使用布尔变量(初始化为 false ),并将其设置为while循环中的true。因此,在循环退出后,您将能够判断 minmax 的值是真实的,还是只是尚未更改的初始值(另一种方法是在循环后测试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;
}

这是我编辑的。我希望你能得到你的答案。