Проблема в том, что когда ввод заканчивается, вызов 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 делают это в три этапа).