Обработка списка в C ++: инициализация min первым значением списка

0

Проблема с моим кодом заключается в том, что min всегда читает 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;
}
Теги:

4 ответа

2
Лучший ответ

Инициализируйте 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;
}
  • 1
    Он должен прочитать первое число, установить min = max = number , затем войти в цикл с numCount установленным в единицу. Выполнение того, что вы описываете, с его текущей логикой if-then-else-if будет иметь интересный и непреднамеренный побочный эффект, если список содержит либо одно значение, либо любую строго убывающую последовательность. max никогда не будет очищен от начального std::numeric_limits<int>::min() .
  • 1
    На самом деле, я ошибся, но только потому, что цикл for, который, кажется, ничего не делает, на самом деле «исправит» это, но я не уверен, что это было намерением. = P Без этого это определенно проблема. С его помощью он самокорректируется, но создает последовательность чтения-сравнения O (N ^ 2). Вы можете сделать это с помощью той же конструкции if-else-if, при условии, что начальные значения max и min являются одним из значений в последовательности (т. Е. Первым), и исключить цикл for в процессе.
Показать ещё 5 комментариев
0
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;
}

Это я редактирую. Надеюсь, вы сможете получить ответ.

0

Инициализировать min до максимального целого значения:

  1. Включите <climits> файл заголовка (см здесь для более подробной информации)
  2. Инициализировать min = INT_MAX.

Это будет отлично работать, но не будет работать так, как ожидалось, в случае отсутствия номеров в файле. Чтобы обойти это, вы должны использовать логическую переменную (инициализируется false), и установить его на true внутри в while цикла. Таким образом, после выхода цикла вы сможете узнать, являются ли значения min и max реальными или просто начальные значения, которые не были изменены (другим способом было бы проверить после цикла, min больше max - если это так, то файл был пуст).

Также обратите внимание, что кажется, что цикл for избыточен и даже не выполняется для первого числа.

0

Поскольку ваши номера являются int, попробуйте инициализировать min до INT_MAX и max до INT_MIN. Вы можете найти эти макросы в пределах.h.

http://www.cplusplus.com/reference/climits/

Ещё вопросы

Сообщество Overcoder
Наверх
Меню