Проблема с моим кодом заключается в том, что 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;
}
Инициализируйте 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;
}
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;
}
Это я редактирую. Надеюсь, вы сможете получить ответ.
Инициализировать min до максимального целого значения:
<climits>
файл заголовка (см здесь для более подробной информации)min = INT_MAX
. Это будет отлично работать, но не будет работать так, как ожидалось, в случае отсутствия номеров в файле. Чтобы обойти это, вы должны использовать логическую переменную (инициализируется false
), и установить его на true
внутри в while
цикла. Таким образом, после выхода цикла вы сможете узнать, являются ли значения min
и max
реальными или просто начальные значения, которые не были изменены (другим способом было бы проверить после цикла, min
больше max
- если это так, то файл был пуст).
Также обратите внимание, что кажется, что цикл for
избыточен и даже не выполняется для первого числа.
Поскольку ваши номера являются int, попробуйте инициализировать min до INT_MAX и max до INT_MIN. Вы можете найти эти макросы в пределах.h.
min = max = number
, затем войти в цикл сnumCount
установленным в единицу. Выполнение того, что вы описываете, с его текущей логикой if-then-else-if будет иметь интересный и непреднамеренный побочный эффект, если список содержит либо одно значение, либо любую строго убывающую последовательность.max
никогда не будет очищен от начальногоstd::numeric_limits<int>::min()
.