Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Problem z petla while

Ostatnio zmodyfikowano 2019-10-09 19:43
Autor Wiadomość
newbieguy
Temat założony przez niniejszego użytkownika
Problem z petla while
» 2019-10-08 22:44:36
czesc wszystkim,czy ktos pomoglby znalezc rozwiazanie na moja petle do while w case 4 ? bylbym wdzieczny ;d
C/C++
#include <iostream>
#include <windows.h>

int main()
{
    {
        double liczba1, liczba2, wynik;
        char znak;
        std::cout << "Podaj liczbe pierwsza: ";
        std::cin >> liczba1;
        std::cin.clear();
        std::cin.sync();
        system( "cls" );
        std::cout << "Podaj liczbe druga:  ";
        std::cin >> liczba2;
        std::cin.clear();
        std::cin.sync();
        system( "cls" );
        if(( liczba1 == std::cin.fail() ) ||( liczba1 == std::cin.fail() ) )
        do
        {
            std::cout << "Wpisales zle liczby!\nWpisz je ponownie: ";
            std::cin >> liczba1, liczba2;
        } while(( liczba1 == std::cin.good() ) &&( liczba2 == std::cin.good() ) );
       
        system( "cls" );
        std::cout << "Dobrze,wiec wypisales: " << liczba1 << " i " << liczba2;
        std::cout << "\nCo chcesz zrobic?: \n[0] Wyjscie\n[1] Dodawanie\n[2] Odejmowanie\n[3] Mnozenie\n[4] Dzielenie\n[5] Potegowanie\n[6] Pierwiastkowanie\n";
        std::cin >> znak;
        switch( tolower( znak ) )
        {
        case '0':
            std::cout << "Wyszedles z programu!";
            return 0;
            break;
        case '1':
            system( "cls" );
            wynik = liczba1 + liczba2;
            std::cout << "Wynik wynosi: " << liczba1 << " + " << liczba2 << " = " << wynik << std::endl;
            break;
        case '2':
            system( "cls" );
            wynik = liczba1 - liczba2;
            std::cout << "Wynik wynosi: " << liczba1 << " - " << liczba2 << " = " << wynik << std::endl;
            break;
        case '3':
            system( "cls" );
            wynik = liczba1 * liczba2;
            std::cout << "Wynik wynosi: " << liczba1 << " * " << liczba2 << " = " << wynik << std::endl;
            break;
        case '4':
            wynik = liczba1 / liczba2;
            system( "cls" );
            if(( liczba1 == 0 ) ||( liczba2 == 0 ) )
            do
            {
                std::cout << "W matematyce nie dzieli sie przez zero ;/\n Nic sie nie dzieje,wpisz te liczby od nowa !:\n";
                std::cin >> liczba1;
                std::cin >> liczba2;
            } while(( liczba1 != 0 ) &&( liczba2 != 0 ) );
           
            std::cout << "Wynik wynosi: " << liczba1 << " : " << liczba2 << " = " << wynik << std::endl;
            break;
           
        }
P-175330
pekfos
» 2019-10-08 23:07:35
Warunek pętli powinien być przeciwny, taki jak w warunku. Też raczej powinieneś sprawdzać dzielenie przez zero zanim wykonasz dzielenie. Poza tym, po co wczytujesz od nowa lewy operand dzielenia? Nic nie szkodzi jeśli jest zerowy.
P-175331
newbieguy
Temat założony przez niniejszego użytkownika
» 2019-10-08 23:19:56
W którym dokładnie miejscu wczytuje od nowa tego operanda? Bo nie rozumiem ;/
P-175332
pekfos
» 2019-10-09 06:44:52
C/C++
std::cout << "W matematyce nie dzieli sie przez zero ;/\n Nic sie nie dzieje,wpisz te liczby od nowa !:\n";
std::cin >> liczba1; // <--
std::cin >> liczba2;
P-175335
newbieguy
Temat założony przez niniejszego użytkownika
» 2019-10-09 07:13:17
Czyli może być
Std::cin>>liczba1,liczba2;
P-175336
pekfos
» 2019-10-09 18:43:05
Jestem w stanie zaakceptować
C/C++
std::cin >> liczba2, liczba1;
biorąc pod uwagę, że liczba1 tu kompletnie nic nie robi (zamiast przecinka powinno być drugie >>). Chodzi mi o to, że nie ma potrzeby ponownie wczytywać liczba1. Gdy dzielisz liczba1 / liczba2, tylko liczba2 nie może być zerowa. Nie ma sensu porównywać z zerem obu liczb i obu wczytywać od nowa.

Poza tym jak patrzę na resztę kodu, a nie tylko "while w case 4", to:
C/C++
if(( liczba1 == std::cin.fail() ) ||( liczba1 == std::cin.fail() ) )
Ten zapis nie ma sensu. Robisz dokładnie to, co piszesz - porównujesz metry z kilogramami. Wczytaną liczbę, z informacją 0/1 informującą o powodzeniu ostatniej operacji. Na dodatek ta informacja została już zniszczona wywołaniem clear(). A co do sync(), w kursie jest czerwona ramka o tym, dlaczego nie powinno tego być w kodzie.
C/C++
std::cin >> liczba1, liczba2;
Jak wyżej,
std::cin >> liczba1 >> liczba2;
.
P-175338
newbieguy
Temat założony przez niniejszego użytkownika
» 2019-10-09 19:15:38
ahahaa
a z tym przecinkiem to się nie skapnalem bo pisalem rano ;D
C/C++
if(( liczba1 == std::cin.fail() ) ||( liczba1 == std::cin.fail() ) )
//tutaj miala byc liczba2 XD nie zauwazylem[/code][/code][/code]
template < typename T >
T io_read( const char * msg, const char * errmsg, std::istream & is = std::cin, std::ostream & os = std::cout )
{
    T result { };
    while(( os << msg ) && !( is >> result ) )
    {
        os << errmsg;
        is.clear();
        is.ignore( std::numeric_limits < std::streamsize >::max(), '\n' );
    }
    return result;
}
//a czy takie rozwiazanie przed wpisywaniem blednych informacji byloby dobre?
P-175340
pekfos
» 2019-10-09 19:43:10
C/C++
template < typename T >
T io_read( const char * msg, const char * errmsg, std::istream & is = std::cin, std::ostream & os = std::cout )
{
    T result { };
    while(( os << msg ) && !( is >> result ) )
    {
        os << errmsg;
        is.clear();
        is.ignore( std::numeric_limits < std::streamsize >::max(), '\n' );
    }
    return result;
}
Well, that escalated quickly.. Ja bym dał taki warunek pętli
C/C++
while( os << msg, !( is >> result ) )
w ten sposób błąd strumienia wyjściowego nie sprawia, że zostaje zwrócona błędna wartość. I jeśli chcesz wchodzić w taką ogólność, że przyjmujesz strumień wejściowy, to powinieneś jeszcze obsługiwać eofbit, inaczej będziesz mieć pętlę nieskończoną w przypadku wczytywania z pliku, który kończy się przed wczytaniem poprawnej wartości - co zresztą jest możliwe także dla standardowego wejścia. Nie zapominajmy też o innych typach znakowych, nie ma powodu żeby nie pójść na całość i użyć std::basic_istream<> i std::basic_ostream<>.
P-175341
« 1 »
  Strona 1 z 1