在 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
循环实际上不会读取任何内容 - 在文件开始之前您已经位于文件的末尾。
您应该将作为第二个循环的“主体”的代码合并到第一个循环中,并删除该“冗余”第二个循环。您还错误地分配了Min
和Max
变量:
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;
您还应该为您的Min
和Max
提供更好的初始值(除非您知道数据中会有正数和负数):
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 << fixed; cout.precision(3);
。而且您只需要代码中的第一行;设置将一直保留到更改为止。【参考方案2】:
这个循环读取文件中的所有数字:
while (input>>number)
counter++;
sum=sum+number;
在那个循环之后,input
已经在文件的末尾,下一个循环不会读取任何数字。
读取一次数字并在一个循环中完成所有处理。或者,将号码存储在 std::vector
中,然后继续处理。
此外,您永远不会在代码中修改 Min
和 Max
。这个循环是什么:
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;
我使用第一个数字来初始化min
和max
。如果您不这样做,0
不是 min
和 max
的良好初始值,但您可以使用 std::numerical_limits<double>::min
作为 max
和 std::numerial_limits<double>::max
的初始值作为 min
的初始值.
【讨论】:
有效!谢谢你。但我面临另一个问题.. 如果我有以下数字(逗号后两位数和逗号前四位数字): 0005.00 0005.23 52340.53 0000.01 0111.10 0001.00 2523.00 我怎样才能得到正确的答案?我得到了奇怪的结果。尽管我使用了愚蠢的方法: cout @Katreen 什么是“奇怪的结果”?顺便说一句,我错误地认为您正在使用int
号码,会解决这个问题
是的,你是对的。但我想使用其他类型的数字..对于整数它工作正常。以上是关于在 txt 文件中查找最小和最大数字的主要内容,如果未能解决你的问题,请参考以下文章