Минимальное значение вектора отображается как 0 - PullRequest
0 голосов
/ 12 мая 2011

Я пытаюсь отобразить как максимальное, так и минимальное значение вектора (наряду с другими вещами). Максимальное значение отображается нормально, но минимальное значение постоянно отображается как 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;
}

Как получить фактическое минимальное значение списка для отображения?

Ответы [ 2 ]

2 голосов
/ 12 мая 2011

Проблема в том, что когда ввод заканчивается, вызов 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::copy и std::istream_iterator s для чтения ввода, но для обработки уже прочитанных чисел я бы развернул ручной цикл (чтобы все мин, макс и сумма могли быть вычислены за один проход, приведенные выше примеры STL делают это в три этапа).

1 голос
/ 12 мая 2011

Это:

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

должно быть:

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

Откуда вы берете идею, из которой вам нужно вызвать eof ()? Вы этого не делаете, и делать это так, как вы это делаете, неправильно!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...