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: #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. |
|
carlosmay |
» 2016-06-18 18:07:20 |
|
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. |
|
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=9493Jednakż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: 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. |
|
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. |
|
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 |
|
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: #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; 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'; }
|
|
« 1 » |