darvd29 Temat założony przez niniejszego użytkownika |
Lekcja 15 "Pętla do...while" » 2012-01-14 20:35:08 Siema! Po nauczeniu się tej lekcji chcę zrobić prosty kalkulator mający 5 opcji: [1] Dodawanie [2] Odejmowanie [3] Mnozenie [4] Dzielenie [5] Zakoncz program Co zresztą jest zadaniem domowym ale dopiero potem to zauważyłem :D Robię taki kalkulator od dawna. W 1 wersji wpisywalo sie 2 liczby i wyswietlone zostały wyniki z 4 typów działań. Później, za pomocą "if" i "else" zrobiłem opcje do wyboru, ale po obliczeniu program się zakańczał. Po tym ulepszyłem go jeszcze - zmieniłem if i else na switch i case. W najnowszej wersji użyłem do...while by program mógł obliczać cały czas, aż użytkownik go nie wyłączy. To koniec historii programu :PP A teraz przejdźmy do rzeczy. Oto kod: #include <iostream> int main() { int a; std::cout << "Programik sluzy do obliczania wynikow z dzialan. W liczbach z przecinkiem uzywaj kropki." << std::endl; do { std::cout << "Wybierz typ dzialania:" << std::endl << "[1] Dodawanie" << std::endl << "[2] Odejmowanie" << std::endl << "[3] Mnozenie" << std::endl << "[4] Dzielenie" << std::endl << "[0] Wylacz program" << std::endl; std::cin >> a; double x, z; switch( a ) { case 1: { std::cout << "Wprowadz 1 liczbe: \t"; std::cin >> x; std::cout << std::endl << "Wprowadz 2 liczbe: \t"; std::cin >> z; std::cout << std::endl << "Wynik z dodawania: \t" << x + z << std::endl << std::endl << std::endl; break; } case 2: { std::cout << "Wprowadz 1 liczbe: \t"; std::cin >> x; std::cout << std::endl << "Wprowadz 2 liczbe: \t"; std::cin >> z; std::cout << std::endl << "Wynik z odejmowania: \t" << x - z << std::endl << std::endl << std::endl; break; } case 3: { std::cout << "Wprowadz 1 liczbe: \t"; std::cin >> x; std::cout << std::endl << "Wprowadz 2 liczbe: \t"; std::cin >> z; std::cout << std::endl << "Wynik z mnozenia: \t" << x * z << std::endl << std::endl << std::endl; break; } case 4: { std::cout << "Wprowadz 1 liczbe: \t"; std::cin >> x; std::cout << std::endl << "Wprowadz 2 liczbe: \t"; std::cin >> z; std::cout << std::endl << "Wynik z dzielenia: \t" << x / z << std::endl << std::endl << std::endl; break; } default: { std::cout << "Nie istnieje taki typ dzialania." << std::endl << std::endl << std::endl; } } } while( a = 0 ); system( "PAUSE" ); return 0; }
Przepraszam że nie wpisałem kodu w funkcję (?) dla niego, próbowałem użyć <code> </code> ale nie działa :P A teraz problem - gdy napisałem ten programik, wszystko działało. Programik się zapętlał, obliczał itp. więc go zapisałem i wyłączyłem. Później, gdy chciałem się pochwalić przed kolegą (nic nie zmieniałem!), zapętlenie już nie działa. Po obliczeniu np. sumy jest "wciśnij dowolny klawisz aby kontynuować" i można tylko wyłączyć... Prawdopodobnie nieopatrznie coś zmieniłem - a teraz moje pytanie: Co jest tutaj źle? //SeaMonster131: Kolorowanie składni języka C++ |
|
konri1990 |
odpowiedz » 2012-01-14 20:47:12 Musisz zmienić warunek w pętli do{} while. Zmień = (podstawienie), na != (różne), i będzie dobrze:) Tak to powinno wyglądać:> while (a!=0); |
|
SeaMonster131 |
» 2012-01-14 20:53:20 } while( a = 0 ); = to operator przypisania :) == to operator porównania, lecz jak @up powiedział, musisz tutaj dać !=, ponieważ pętle do{}while można tak zapisac w Twoim wypadku: rob { to.. } dopoki( a != 0 );
Czyli pętla ma się wykonywać, dopóki a jest różne od 0. |
|
darvd29 Temat założony przez niniejszego użytkownika |
» 2012-01-15 11:14:55 Dzięki za pomoc! |
|
darvd29 Temat założony przez niniejszego użytkownika |
» 2012-01-15 20:31:36 Siema! Otwarłem znów temat, ponieważ mam problem z następną lekcją, a nie chcę znów zakładać nowego tematu :) Tak więc zadaniem w tamtej lekcji jest zrobienie gry liczbowej (autor czyta mi w myśli, już 2 raz każe zrobić to co ja chciałem bez jego zadania :D). Zrobiłem coś takiego, ale po wprowadzeniu 1 liczby program się wyłącza... Tzn. zapętlenie się zepsuło :) #include <iostream> #include <cstdlib> #include <ctime> int main() { int proba; srand( time( NULL ) ); int wylosowana =( rand() % 10 ); std::cout << "Witaj w grze liczbowej. Gra polega na tym, ze uzytkownik zgaduje liczbe, a program informuje czy sie udalo. Wpisuj liczby od 1 do 10." << std::endl; do { std::cout << "Podaj liczbe: \t"; std::cin >> proba; if( proba > wylosowana ) { std::cout << "Wylosowana liczba jest mniejsza od: " << proba << std::endl; } if( proba < wylosowana ) { std::cout << "Wylosowana liczba jest wieksza od: " << proba << std::endl; } if( proba == wylosowana ) { std::cout << "BRAWO!! Wygrales!!! Wylosowana liczba to: " << wylosowana << std::endl; } } while( proba == wylosowana ); system( "PAUSE" ); return 0; } Próbowałem też "na logikę", bo nie było o tym mowy, zrobić ograniczoną liczbę szans, powiedzmy 5. Zrobiłem to tak: #include <iostream> #include <cstdlib> #include <ctime> int main() { int szansa = 6; to od ilosci szans int proba; srand( time( NULL ) ); int wylosowana =( rand() % 10 ); std::cout << "Witaj w grze liczbowej. Gra polega na tym, ze uzytkownik zgaduje liczbe, a program informuje czy sie udalo. Wpisuj liczby od 0 do 10. Masz 5 szans." << std::endl; do { std::cout << "Pozostalo prob:" << szansa - 1 << std::endl << "Podaj liczbe: \t"; tu powinno mowic ile szans zostalo i wyliczac to: ) std::cin >> proba; if( proba > wylosowana ) { std::cout << "Wylosowana liczba jest mniejsza od: " << proba << std::endl; warunek 1 } if( proba < wylosowana ) { std::cout << "Wylosowana liczba jest wieksza od: " << proba << std::endl; warunek 2 } if( proba == wylosowana ) { std::cout << "BRAWO!! Wygrales!!! Wylosowana liczba to: " << wylosowana << std::endl; warunek 3 } if( szansa == 0 ) { std::cout << "Niestety przegrales. Sprobuj jeszcze raz." << std::endl; warunek 4 } } while( szansa == 0, proba == wylosowana ); tutaj dalem 2 rzeczy do nawiasu bo chcialem zrobic ze jesli jeden z tych warunkow jest spelniony to koniec zapetlenia.Ale pewnie przekombinowalem: P system( "PAUSE" ); return 0; } W tym drugim kodzie jest wiele rzeczy jak mówiłem "na logikę", gdyż ich nie było jeszcze w kursie. Moje pytanie - Jestem blisko rozwiązania czy to już całkiem trudniejszy poziom i będzie to za 15 lekcji :)? Ogólnie program jest chyba ok, ale po 1 ilość szans jest ciągle taka sama (chyba wiem czemu), po 2 zapętlenie także nie działa bo wpisałem 2 warunki czy co to tam jest :), a po 3 nawet jak się wygra to zapętlenie jest dalej. (Tak dokładniej to pkt.3 był a pkt.2 nie było zanim zacząłem kombinować z while i wpisywać 2 argumenty, bo przedtem było chyba while (szansa==0) ale jak pisałem ilość szans jest ciągle taka sama i program się nie kończy, tak samo jak jest while (proba==wylosowana)) Na koniec: wiem że trochę skomplikowałem sprawę, ale jeśli jacyś pomocni userzy są cierpliwi do takich noobów jak ja to proszę o pomoc :D |
|
SeaMonster131 |
» 2012-01-15 20:34:24 Siema! Otwarłem znów temat, ponieważ mam problem z następną lekcją, a nie chcę znów zakładać nowego tematu :) |
1 temat = 1 problem. |
|
darvd29 Temat założony przez niniejszego użytkownika |
» 2012-01-16 09:16:50 Siema... Kompilator non stop źle przypisuje klamry -.- Oto kod: #include <iostream> #include <cstdlib> #include <ctime> int main() { int proba, wybor; int szansa = 6; int a; do { srand( time( NULL ) ); int wylosowana =( rand() % 10 ); std::cout << "Witaj w grze liczbowej. Wybierz opcje:" << std::endl << "[1] Zasady" << std::endl << "[2] Graj" << std::endl << "[3] Wylacz" << std::endl; std::cin >> wybor; switch( wybor ) { case 1: { std::cout << "1. Komputer losuje liczbe z zakresu od 0 do 10. Ty musisz ja zgadnac." << std::endl; std::cout << "2. Masz 5 prob. Jesli nie zgadniesz - przegrywasz." << std::endl; std::cout << "3. Nie wpisuj liczb innych niz z zakresu podanego wyzej, bo gra sie scrashuje." << std::endl; std::cout << "Wpisz 1 aby rozpoczac gre: \t"; std::cin >> a; } case 2: { do { std::cout << "Pozostalo prob:" << szansa - 1 << std::endl << "Podaj liczbe: \t"; std::cin >> proba; if( proba > wylosowana ) std::cout << "Wylosowana liczba jest mniejsza od: " << proba << std::endl; if( proba < wylosowana ) std::cout << "Wylosowana liczba jest wieksza od: " << proba << std::endl; if( proba == wylosowana ) std::cout << "BRAWO!! Wygrales!!! Wylosowana liczba to: " << wylosowana << std::endl; if( szansa == 0 ) std::cout << "Niestety przegrales. Sprobuj jeszcze raz." << std::endl; } while( szansa != 0, proba != wylosowana ); } } while( wybor != 3 ); case 3: { std::cout << "Zapraszam ponownie! Autor: Dawid Data" << std::endl; } } system( "PAUSE" ); return 0; } Zapewne to dlatego że "switch" jest w instrukcji "do...while" a case 3 już poza nią... nie da się tego jakoś zrobić żeby działało? |
|
konri1990 |
» 2012-01-16 14:17:09 I dobrze myśli. Przyjrzyj się dokładnie swojemu programowi i jak zamykasz warunek w case 2:. Zaraz jak zamykasz jedna klamrą piszesz 2 klamrę która logicznie rzecz biorąc zamyka switcha. Nie wiem za bardzo co chcesz osiągnąć ale domyślam się, że poprostu ten kawełek kodu:
} while( wybor != 3 ); //kompilator mysli ze to jest klamra od switch
Musisz przenieść na koniec switcha. Nie powiem Ci gdzie bo myślę, że i tak za dużo już podpowiedziałem:) |
|
« 1 » 2 |