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

Continue w pętli nic nie daje

Ostatnio zmodyfikowano 2016-06-19 01:37
Autor Wiadomość
szymon170
Temat założony przez niniejszego użytkownika
Continue w pętli nic nie daje
» 2016-06-18 17:57:19
Witam. Poprawiłem mój kod kalkulatora (jeśli chcecie wiedzieć dlaczego zobaczcie mój poprzedni temat). Teraz ten mały kalkulator jest prawie gotowy. Chciałem tylko do niego dodać to, żeby przy skończonym działaniu powracał do początku if. Zastanawiałem się nad umieszczeniem goto, ale wszędzie każdy pisze że goto to najgorsze co może być (chociaż nie wiem dlaczego). Postanowiłem więc umieścić if w pętli, a potem po każdym działaniu dodać continue. Jednakże continue nie działa i pętla zachowuje się jak bez niego - po skończonym działaniu zapętla się w części z działaniem. Skutkuje to tym, że np. po skończonym dodawaniu program znów prosi o cyfry żeby potem je dodać. Nie rozumiem też tego, bo pętla była założona na wszystkie funkcje, nie tylko np. dodawanie.

Kod:

C/C++
#include <iostream>
#include <string>
using namespace std;

int main() {
    cout << "Welcome to the C++ Calculator" << endl;
    cout << "What do you want to do?" << endl << endl;
   
    cout << "Add - Type \"A/a\"" << endl;
    cout << "Substract - Type \"S/s\"" << endl;
    cout << "Multiply - Type \"M/m\"" << endl;
    cout << "Divide - Type \"D/d\"" << endl;
    cout << "Exit - Type \"E/e\"" << endl;
   
    string type;
   
    cin >> type;
    while( true ) {
        if(( type == "a" ) ||( type == "A" ) ) {
            double Addend1;
            double Addend2;
            cout << "Please, type here the first number:" << endl;
            cin >> Addend1;
            cout << endl << "Please, type here the second number:" << endl;
            cin >> Addend2;
            cout << endl << "The result of this is " <<( double ) Addend1 + Addend2 << endl << endl;
            continue;
        }
       
        else if(( type == "s" ) ||( type == "S" ) ) {
            double Minuend;
            double Subtrahend;
            cout << "Please, type here the first number:" << endl;
            cin >> Minuend;
            cout << endl << "Please, type here the second number:" << endl;
            cin >> Subtrahend;
            cout << endl << "The result of this is " <<( double ) Minuend - Subtrahend << endl << endl;
            continue;
        }
       
        else if(( type == "m" ) ||( type == "M" ) ) {
            double Factor1;
            double Factor2;
            cout << "Please, type here the first number:" << endl;
            cin >> Factor1;
            cout << endl << "Please, type here the second number:" << endl;
            cin >> Factor2;
            cout << endl << "The result of this is " <<( double ) Factor1 * Factor2 << endl << endl;
            continue;
        }
       
        else if(( type == "d" ) ||( type == "D" ) ) {
            double Dividend;
            double Divider;
            cout << "Please, type here the first number:" << endl;
            cin >> Dividend;
            cout << endl << "Please, type here the second number:" << endl;
            cin >> Divider;
            cout << endl << "The result of this is " <<( double ) Dividend / Divider << endl << endl;
            continue;
        }
       
        else if(( type == "e" ) ||( type == "E" ) ) {
            cout << "Thank you for using this software." << endl << endl;
            return 0;
        }
       
        else {
            cout << "That is not the correct answer. Make shure that you type the first letter of" << endl;
            cout << "The action that you want to perform (e.g you type \"a\" or \"A\" when you want to" << endl;
            cout << "perform adding." << endl << endl;
            continue;
        }
    }
   
}
Dodam jeszcze że przy kompilowaniu nie ma żadnych błędów.
P-149246
carlosmay
» 2016-06-18 18:07:20
To już jest któryś tam post na forum i nadal masz w głębokim poważaniu jego zasady.
http://cpp0x.pl/kursy​/Porady-dla-uzytkownikow-cpp0x-​pl​/Zakladanie-tematow-na-forum​/483

Ignorancja == temat bezużyteczny.
Nikt nie będzie wklejał kodu u siebie i kombinował o co w nim chodzi.
P-149247
szymon170
Temat założony przez niniejszego użytkownika
» 2016-06-18 18:15:53
Ale co ja takiego źle zrobiłem poza brakiem wstawienia znacznika kodu? Przecież opisałem problem i udostępniłem też mój kod, więc samemu można zobaczyć co jest nie tak.
P-149248
carlosmay
» 2016-06-18 18:28:30
wszędzie każdy pisze że goto to najgorsze co może być (chociaż nie wiem dlaczego).
http://cpp0x.pl/forum/temat/​?id=9493

Jednakże continue nie działa i pętla zachowuje się jak bez niego - po skończonym działaniu zapętla się w części z działaniem.
continue
 działa prawidłowo, tylko type wprowadzane jest przed pętlą, a później już nie ma możliwości zmiany opcji,
więc zapętla się na jednym ifie.

Sugestia:
  • podziel kod na funkcje
  • skorzystaj z instrukcji wielokrotnego wyboru 'switch...case', kod zyska na czytelności
  • zabezpiecz program przed wczytaniem błędnych danych
  • zabezpiecz program przed dzieleniem przez zero
  • zapoznaj się z techniką debugowania

edit:
Ale co ja takiego źle zrobiłem poza brakiem wstawienia znacznika kodu?
Bardzo ciężko czyta się niesformatowany kod. Samo sprawdzanie odkąd dokąd sięgają klamry,
i czy prawidłowo dzielą kod na bloki jest bardzo uciążliwe.
Przecież opisałem problem i udostępniłem też mój kod, więc samemu można zobaczyć co jest nie tak.
Opis jest, ale szukanie błędów w logice w tym bałaganie jest... (cenzura) niewygodne i czasochłonne.
P-149249
szymon170
Temat założony przez niniejszego użytkownika
» 2016-06-18 18:37:29
Dziękuję za tę odpowiedź, naprawiła mój problem. Temat uważam za zamknięty.
PS. Według mnie jeśli kogoś poprawiasz to w swojej odpowiedzi możesz podać możliwe rozwiązanie. Od wskazywania błędów w temacie jest raczej administracja.
P-149250
mateczek
» 2016-06-18 22:47:38
poza tym w pętli masz cały ciąg instrukcji "else if" więc continue wydaje się być zbędne
P-149257
carlosmay
» 2016-06-19 01:37:55
Według mnie jeśli kogoś poprawiasz to w swojej odpowiedzi możesz podać możliwe rozwiązanie.
Podpowiedź zadziałała.

Przykład:
C/C++
#include <iostream>

double addition( double a, double b )
{
    return a + b;
}

double subtraction( double a, double b )
{
    return a - b;
}

double multiplication( double a, double b )
{
    return a * b;
}

double division( double a, double b )
{
    return a / b;
}

auto main()->int
{
    char mathOperator;
    double firstNumber;
    double secondNumber;
   
    // wczytuj dane póki nie będą poprawne
    while( !( std::cin >> firstNumber >> mathOperator >> secondNumber ) ) {
        std::cin.clear();
        std::cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' );
    }
   
    switch( mathOperator ) {
    case '+':
        std::cout << firstNumber << " + " << secondNumber << " = "
        << addition( firstNumber, secondNumber );
        break;
    case '-':
        std::cout << firstNumber << " - " << secondNumber << " = "
        << subtraction( firstNumber, secondNumber );
        break;
    case '*':
        std::cout << firstNumber << " * " << secondNumber << " = "
        << multiplication( firstNumber, secondNumber );
        break;
    case '/':
        if( secondNumber != 0 ) {
            std::cout << firstNumber << " / " << secondNumber << " = "
            << division( firstNumber, secondNumber );
        }
        break;
        default:
        std::cerr << "error mathOperator\n";
    }
    std::cout << '\n';
}
P-149258
« 1 »
  Strona 1 z 1