Problem z pętlą
Ostatnio zmodyfikowano 2013-04-15 20:05
MisiekFazi Temat założony przez niniejszego użytkownika |
Problem z pętlą » 2013-04-15 16:31:17 Otóż nie wiem czemu w funkcji jest opuszczana pętla i przechodzi dalej #include <iostream> using namespace std;
int wczytajLiczbe() { double a; char b; do { cin >> a; b = a; if( b = a ); else cout << "Podales zle dane " << endl; clear.sync(); } while( b != a ); }
int main() { std::cout << "Podaj liczbe: "; int liczba = wczytajLiczbe(); std::cout << "Podales liczbe: " << liczba << std::endl; return 0; }
|
|
m4tx |
» 2013-04-15 17:01:49 1. Nie zwracasz żadnej wartości we wczytajLiczbe() . 2. if( b = a ); - znak równości (=) to operator przypisania, nie porównania. I tak swoją drogą - skoro w przypadku, gdy warunek jest prawdziwy i tak nic nie robisz, to można po prostu zanegować: if( b != a ) lub: if( !( b == a ) ) 3. Nie możesz porównywać 2 zmiennych o różnych typach, to nie PHP (tzn. możesz, ale porównywanie chara z doublem nie ma najmniejszego sensu). 4. Jaki sens ma w ogóle to przypisywanie? Jak chcesz sprawdzić, czy użytkownik podał liczbę, sprawdzaj flagi błędów. 5. Funkcja ma zwracać wartość typu int , a ty używasz tylko double i char ... 6. char może przechować tylko 1 znak, przy 2- i więcej-cyfrowych liczbach sobie nie powczytujesz. 7. Ten kod kompiluje Ci się bez warningów? :) Jeśli tak to włącz sobie najwyższy level warningów w ustawieniach IDE. 8. Kurs C++. |
|
MisiekFazi Temat założony przez niniejszego użytkownika |
» 2013-04-15 18:20:02 Tak wiem że nie było powrotu (zwrotu ) bo gdy się coś psuło to sprawdzałem czy jest to spowodowane. Ale i po poprawieniu nic się nie zmieniło lub nadal o czymś nie pamiętam. #include <iostream> using namespace std;
int wczytajLiczbe() { int a; do { cin >> a; if( !cin.good() ); cout << "Podales zle dane " << endl; cin.clear(); cin.sync(); } while( cin.fail() ); return a; }
int main() { std::cout << "Podaj liczbe: "; int liczba = wczytajLiczbe(); std::cout << "Podales liczbe: " << liczba << std::endl; return 0; }
|
|
Bajt |
» 2013-04-15 19:43:00 Po if'ie masz nie mieć średnika. Poza tym, kiedy masz więcej niż jedną linijkę instrukcji w if'ie to dajesz klamry. Może cały czas, wczytujesz poprawne dane? |
|
MisiekFazi Temat założony przez niniejszego użytkownika |
» 2013-04-15 19:59:11 No nie najpierw daje liczbę a potem literę i tak na przekór kończy program ale wypisuje że dana była zła. #include <iostream> using namespace std;
int wczytajLiczbe() { int a; do { cin >> a; if( !cin.good() ) { cout << "Podales zle dane " << endl; cin.clear(); cin.sync(); } } while( cin.fail() ); return a; }
int main() { std::cout << "Podaj liczbe: "; int liczba = wczytajLiczbe(); std::cout << "Podales liczbe: " << liczba << std::endl; return 0; }
|
|
m4tx |
» 2013-04-15 20:03:07 No nie najpierw daje liczbę a potem literę i tak na przekór kończy program ale wypisuje że dana była zła. |
No bo jak czyścisz flagi błędów w tym if ie to one są już wyczyszczone, gdy dochodzi do sprawdzenia warunku while( cin.fail() ); . Ponieważ flagi błędów są już wyczyszczone, to i fail() zwróci false . Rozwiązanie? Możesz np. czyścić flagi na początku pętli do..while. |
|
MisiekFazi Temat założony przez niniejszego użytkownika |
» 2013-04-15 20:05:38 Ok dziękuję bardzo za pomoc . Działa |
|
« 1 » |