矢量的最小值显示为 0

Minimum value of vector displays as 0

本文关键字:显示 最小值      更新时间:2023-10-16

我正在尝试显示向量的最大值和最小值(以及其他内容)。最大值显示正常,但最小值始终显示为 0。唯一一次它不是 0 时,它最终会显示数据列表的最终值。

#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
int main()
{
    fstream file;
    file.open("dataWin.txt");
    vector<float> dist;
    while(file.eof() == false)
    {
        string miles;
        getline(file, miles);
        float milesNum = atof(miles.c_str());
        dist.push_back(milesNum);
    }
    float max = 0.0;
    float min = 1.0;
    float sum = 0.0;
    float secHour = 3600;
    float lastRecord = 238857;
    for(int i = 0; i < dist.size(); i++)
    {
        if(dist[i] < min)
            min = dist[i];
        if(dist[i] > max)
            max = dist[i];
        sum += dist[i];
    }
    float avg = (float)sum / dist.size();
    float lastSeconds = (float)lastRecord / (float)avg;
    float deadline = (float)lastSeconds / (float)secHour;   
    cout << "National Aeronautics and Space Administration - NASA" << endl;
    cout << "EYES ONLY" << endl << endl;
    cout << "Statistics on solar object 326 Alba" << endl;
    cout << "Danger level: HIGH" << endl << endl;
    cout << "Maximum travel distance: " << max << " miles per second." << endl;
    cout << "Minimum travel distance: " << min << " miles per second." << endl;
    cout << "Average travel distance: " << avg << " miles per second." << endl << endl;
    cout << "WARNING! OBJECT 326 Alba WILL IMPACT IN " << deadline << " HOURS!" << endl;
    file.close();
    return 0;
}

如何获取要显示的列表的实际最小值?

问题是当输入结束时,getline调用将失败并且不会更新字符串,然后将空字符串转换为在atof调用中失败的浮点数(如果atof失败,它将返回0.0 ),并将该值推入向量。向量中的最小值现在已0,并且算法正确地将其生成为最小值。

如果你打算用C++编写代码,并假设输入的唯一内容是浮点数和空格,你可以通过直接读入浮点数来简化代码:

float miles;
while ( std::cin >> miles ) {
   dist.push_back( miles );
}

更简单的是,您可以通过使用 STL 中的迭代器和算法来完全避免循环:

std::vector<float> dist;
std::copy( std::istream_iterator<float>( std::cin ), std::istream_iterator<float>(),
           std::back_inserter( dist ) );
std::cout << "Max: " << *std::max_element( dist.begin(), dist.end() ) << "n";
std::cout << "Min: " << *std::min_element( dist.begin(), dist.end() ) << "n";
std::cout << "Sum: " << std::accumulate( dist.begin(), dist.end() ) << std::endl;

这只是为了展示使用现有算法可以做什么。在您的特定情况下,我会使用 std::copystd::istream_iterator s 来读取输入,但为了处理已经读取的数字,我会展开一个手动循环(以便所有最小值、最大值和总和都可以在一次传递中计算,上面的 STL 示例在三次传递中完成)。

这个:

while(file.eof() == false)
{
    string miles;
    getline(file, miles);

应该是:

string miles;
while( getline(file, miles) )
{

你从哪里开始需要调用 eof() 的想法?你没有,以你的方式这样做是错误的!