Pętla cin bez wprowadzania danych

0

Cześć,

Dostałem polecenie "Napisz program minimum, który czyta ze standardowego wejscia liczby rzeczywiste do napotkania konca
pliku i wypisuje na standardowe wyjscie najmniejsza z nich. Jezeli nie wprowadzono zadnej liczby, program
nic nie wypisuje. Program załacza tylko plik nagłówkowy iostream."
Kod napisałem, działa połowicznie. Mianowicie jeżeli jakieś dane są wprowadzone to oczywiście je czyta i wyświetla poprawny wynik jednak jeżeli nie podam żadnych danych tj. na wejściu wpiszę od razu Ctrl/Z to program zamiast nic nie wypisać to wypisuję jakąś liczbę. Czy mógłbym prosić o wskazówkę co robię źle?
Kod poniżej:

#include <iostream>

int main() 
{
    double min;
    std::cin >> min;
    for (double value; std::cin >> value;) 
    {
        if (value < min)
        min = value;
    }
std::cout << min << std::endl;
}
4

Jesteś bardzo blisko. Sprawdź czy wczytałeś pierwszą liczbę, tak jak sprawdzasz wszystkie pozostałe. Jeśli się nie udało - return

2

ostatnia linijka powoduje wypisanie wartości min niezależnie czy jest poprawna czy nie. Po skończeniu pętli zawsze zostanie wypisana.

0

Wydaje mi się, że udało mi się już naprawić kod dzięki Waszym wskazówkom. Jednak nie rozumiem czemu return musi mieć wartość 0. Jeżeli próbowałem zostawić samo return to kompilator wyrzucał błąd. Byłbym wdzięczny za wyjaśnienie.
Kod poniżej:

#include <iostream>

int main() 
{
    double min;
    std::cin >> min;
    if (std::cin.fail())
    {
    return 0;   
    }
    else
    {
        for (double value; std::cin >> value;) 
        {
            if (value < min)
            min = value;
        }
    }
std::cout << min << std::endl;
}
3

Typ zwracany z main to int, więc musisz zwrócić jakiegoś inta. I tak przekombinowałeś, można tak:

if(!(std::cin >> min))
    return 0;
1

Poczułem się studentem, a aktywność @Bartosz Gruszkowski mi się podoba.
Co powiecie na rozwiązanie z NaN, a bez pierwszego pobrania ?

#include <iostream>
#include <limits>
#include <cmath>

int main() 
{
    double min = std::numeric_limits<double>::quiet_NaN();
//    std::cin >> min;
    for (double value; std::cin >> value;) 
    {
        if (std::isnan(min) || value < min)
            min = value;
    }
 if( std::isnan(min))
    std::cout << "Nie ma" << std::endl
else
   std::cout << min << std::endl;
return 0;
}
0

Bardzo dziękuję wszystkim za wskazówki i tłumaczenie.
Program już działa, także temat do zamknięcia.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0