在 txt 文件中查找最小和最大数字

Posted

技术标签:

【中文标题】在 txt 文件中查找最小和最大数字【英文标题】:Finding Min and Max numbers in a txt file 【发布时间】:2020-06-24 13:01:25 【问题描述】:

参考下图:

我在 .txt 文件中查找最小和最大数字时遇到问题。 该数字以每行一个数字的形式存储在文件中。程序应该遍历这些数字并找到最大和最小的数字。

更新:我解决了这个问题,但由于数字类型,我遇到了另一个问题。 假设我有以下数字: 0005.00 0005.23 52340.53 0000.01 0111.10 0001.00 2523.00

我怎样才能得到正确的答案?

#include<fstream>
#include<cstdlib>
#include<iostream>
#include <iomanip>
using namespace std;

int main()

int counter=0, number;
float  sum = 0, average=0;
char file_name [20];
cout << "enter filename: ";
cin >> file_name;
ifstream input;
input.open(file_name);
if (! input)

cout << "Can't open file" << file_name;
//exit (0);


input  >> number;
float min = number;
float max = number;

while (input>>number)

counter++;
sum=sum+number;
// Now, we can also check for Min/Max...
if (number > max) max = number;
if (number < min) min = number;

average=sum/counter;

cout<< fixed<<cout.precision(3);
cout<< "The average file in file test is was "<<average<<endl;
cout<< fixed<<cout.precision(3);
cout<<"The largest number is: "<<max<<endl;
cout<< fixed<<cout.precision(3);
cout<<"The smallest number is: "<<min<<endl;
input.close();
return 0;

当我运行它时,最小值和最大值为零!任何帮助表示赞赏。

【问题讨论】:

【参考方案1】:

您的第一个while 循环将读取到文件末尾;因此,您的第二个 while 循环实际上不会读取任何内容 - 在文件开始之前您已经位于文件的末尾。

您应该将作为第二个循环的“主体”的代码合并到第一个循环中,并删除该“冗余”第二个循环。您还错误地分配了MinMax 变量:

while (input>>number)

    counter++;
    sum=sum+number;
    // Now, we can also check for Min/Max...
    if (number > Max)
        Max = number;
    if (number < Min)
        Min = number;

average = sum / counter;

您还应该为您的MinMax 提供更好的初始值(除非您知道数据中会有正数和负数):

float number, sum = 0, average, Max = -FLT_MAX, Min = FLT_MAX;

请随时要求进一步澄清和/或解释。

【讨论】:

感谢您的回答。但我仍然有同样的问题! @Ktreen 您是否对代码进行了所有的更改? (另外,我在初始值中犯了一个小错误,我刚刚更正了。)您应该将初始 Min 设置为 FLT_MAX 并将初始 Max 设置为负值,或 -FLT_MAX 有效!谢谢你。但我面临另一个问题.. 如果我有以下数字(逗号后 2 位,逗号前 4 位): 0005.00 0005.23 52340.53 0000.01 0111.10 0001.00 2523.00 我怎样才能得到正确的答案?我得到了奇怪的结果。尽管我使用了愚蠢的方法: cout @Katreen 使用setprecision(3) 而不是cout.precision(3)。您当前拥有的是调用precision 函数,然后将其返回值写入输出流。 @Ktreen 或者您仍然可以调用该函数但不输出它:cout &lt;&lt; fixed; cout.precision(3);。而且您只需要代码中的第一行;设置将一直保留到更改为止。【参考方案2】:

这个循环读取文件中的所有数字:

while (input>>number)

    counter++;
    sum=sum+number;

在那个循环之后,input 已经在文件的末尾,下一个循环不会读取任何数字。

读取一次数字并在一个循环中完成所有处理。或者,将号码存储在 std::vector 中,然后继续处理。

此外,您永远不会在代码中修改 MinMax。这个循环是什么:

while (input>>number)

    if (number>Max)
    number=Max;
    else
    number=Min;

改为剪裁数字,使大于0 (Max) 的任何数字设置为0,而将任何其他数字设置为0 (Min)。

你可能想要一些类似的东西

double number;
input  >> number;
double min = number;
double max = number;
while ( input >> number)  
   if (number > max) max = number;
   if (number < min) min = number;

我使用第一个数字来初始化minmax。如果您不这样做,0 不是 minmax 的良好初始值,但您可以使用 std::numerical_limits&lt;double&gt;::min 作为 maxstd::numerial_limits&lt;double&gt;::max 的初始值作为 min 的初始值.

【讨论】:

有效!谢谢你。但我面临另一个问题.. 如果我有以下数字(逗号后两位数和逗号前四位数字): 0005.00 0005.23 52340.53 0000.01 0111.10 0001.00 2523.00 我怎样才能得到正确的答案?我得到了奇怪的结果。尽管我使用了愚蠢的方法: cout @Katreen 什么是“奇怪的结果”?顺便说一句,我错误地认为您正在使用 int 号码,会解决这个问题 是的,你是对的。但我想使用其他类型的数字..对于整数它工作正常。

以上是关于在 txt 文件中查找最小和最大数字的主要内容,如果未能解决你的问题,请参考以下文章

在Java中查找数组中的最小和最大数

我想要一个c程序来查找我使用数组编写的最大和最小数字有人可以帮助我如何在不使用数组的情况下制作[关闭]

如何从数组中的数字中找到最大和最小数字[重复]

从具有多列的 .txt 文件中查找最大值、最小值

如何在文件处理中从文本文件中找到每一行的最小值和最大值?

程序正在从文件中读取最大的数字,但不是最小的