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

Poprawne zagnieżdżenie if w ifie

Ostatnio zmodyfikowano 2017-05-16 23:15
Autor Wiadomość
latajacaryba
» 2017-05-14 23:30:53
Od tego jest to forum :DD

Najpierw sprawdź, czy to na pewno jest liczba:
C/C++
if( cin.good() == false )
{
    cout << "to nie liczba! sprobuj ponownie:\n";
    std::cin.clear(); // czyszczenie flagi bledu
    std::cin.sync(); // czyszczenie bufora cin, wiecej w tym temacie - http://cpp0x.pl/kursy/Kurs-C++/Poziom-1/Obsluga-strumienia-wejsciowego/12
    continue; // continue, pomija wykonywanie dalszych instrukcji aż do końca pętli
}
// w tym miejscu wiemy, ze 'a' to na pewno liczba, teraz tylko czy jest ona mniejsza od 200 i wieksza od 50:
else if( a > 200 || a < 50 ) // || oznacza 'lub'
{
    cout << "podales zla liczbe!, wpisz ja jeszcze raz! \n";
    continue;
}
przejdźmy do:
while( cin.good() && 50 < a && a < 200 );

wyrzuć cin.good (bo w naszym else if mamy już obsługę tego przypadku, jak pamiętasz wygląda ona nastepująco:
jeśli cin.good() == flase, to:
- czyścimy bufor i flage (na razie nie musisz wiedzieć co to, po prostu mają być tam te 2 instrukcje)
- wracamy dzięki
continue
 na początek pętli
)

wyrzuć też 50 < a && a < 200, bo mamy obsługę tej sytuacji (nasz else if)
i zrób pętle nieskończoną:
while(1){...}

Działanie continue:
https://zapodaj.net/df7b78b7861ec.png.html
P-161114
TheFandorn
Temat założony przez niniejszego użytkownika
» 2017-05-15 18:25:04
Ewidentnie zbliżamy się do zakończenia problemu. Wygląda na chwilę obecną to tak:
C/C++
#include <iostream>
int main() {
    int a;
    int b;
    using namespace std;
   
    cout << "Po wprowadzeniu dlugosci bokow prostokatu program obliczy i poda jego pole oraz obwod." << endl;
    cout << "Podaj dlugosc boku A. Musi sie ona miescic w przedziale od 50 do 200 jednostek." << endl;
    do
    {
        cin >> a;
        if( cin.good() == false )
        {
            cout << "to nie liczba! sprobuj ponownie! \n";
            std::cin.clear();
            std::cin.sync();
            continue;
        }
       
        else if( a > 200 || a < 50 )
        {
            cout << "podales zla liczbe!, wpisz ja jeszcze raz! \n";
            continue;
        }
        else
        {
            cout << "Wczytano liczbe A \n";
            continue;
        }
    }
    while( 1 );
   
    return 0;
}

Ale nie rozumiem jednej rzeczy. Jaki sens ma tutaj ta pętla jesli nie pozwala ona przejść programowi dalej (w obecnym stadium rozwoju zamknąć się)?
P-161155
karambaHZP
» 2017-05-15 18:31:43
Przerwij działanie pętli instrukcją
break
 lub zastosuj jedno z rozwiązań.
P-161156
TheFandorn
Temat założony przez niniejszego użytkownika
» 2017-05-15 18:39:45
Wielkie dzięki wszystkim za pomoc! Problem rozwiązany, program działa. Zamykam temat
P-161161
TheFandorn
Temat założony przez niniejszego użytkownika
» 2017-05-16 21:27:26
Uznałem, że skopiowanie kodu z wpisywania zmiennej a i zamienienie paru literek nada się jako kod do wprowadzenia zmiennej b się nada. Na szczęście dogłębniej sprawdziłem działanie programu i jednak nie działa. Program przy wprowadzaniu zmiennej b pozwala na wprowadzenie dowolnej liczby a ma przecież podane ograniczenia.

C/C++
#include <iostream>
using namespace std;
int main() {
    int a;
    int b;
   
    cout << "Po wprowadzeniu dlugosci bokow prostokatu program obliczy i poda jego pole oraz obwod. \nDlugosci bokow musza miescic sie w przedziale od 50 do 200 jednostek." << endl;
    cout << "\nPodaj dlugosc boku A." << endl;
    do
    {
        cin >> a;
        if( cin.good() == false )
        {
            cout << "to nie liczba! sprobuj ponownie!" << endl;
            std::cin.clear();
            std::cin.sync();
            continue;
        }
       
        else if( a > 200 || a < 50 )
        {
            cout << "podales zla liczbe!, wpisz ja jeszcze raz!" << endl;
            continue;
        }
        else
        {
            cout << "Wczytano liczbe A" << endl;
            break;
        }
    }
    while( 1 );
   
    cout << "\nPodaj dlugosc boku B." << endl;
   
    do
    {
        cin >> b;
        if( cin.good() == false )
        {
            cout << "to nie liczba! sprobuj ponownie!" << endl;
            std::cin.clear();
            std::cin.sync();
            continue;
        }
       
        else if( a > 200 || a < 50 )
        {
            cout << "podales zla liczbe!, wpisz ja jeszcze raz!" << endl;
            continue;
        }
        else
        {
            cout << "Wczytano liczbe B" << endl;
            break;
        }
    }
    while( 1 );
   
    cout << "\n\nPole tego prostokata wynosi:" << a * b << endl;
    cout << "\nObwod tego prostokata wynosi:" << a + a + b + b << endl;
   
    return 0;
}
P-161216
Chowan
» 2017-05-16 23:15:26
Bo masz przy wprowadzaniu b nie zmienione litery w else if. Pozostało skopiowane a.
P-161219
1 « 2 »
Poprzednia strona Strona 2 z 2