prosty kalkulator nie dziala:(
Ostatnio zmodyfikowano 2011-06-29 18:35
nokaut Temat założony przez niniejszego użytkownika |
prosty kalkulator nie dziala:( » 2011-06-15 19:28:18 Witam Szukam bledu w moim kodzie, jednak jestem bezsilny. Dopiero sie ucze i prosze o wyrozumialosc. Jest to prosty kalkulator z zapytaniem w srodku czy uzytkownik jest pewien swoich poczynan:) kod: #include <iostream> int main( void ) { float liczba1; char znak; std::cout << "Podaj 1 liczbe: "; std::cin >> liczba1; std::cout << "rodzaj dzialania ( + - * czy /) ? "; std::cin >> znak; int odpowiedz; std::cout << "czy jestes pewien ? (1 = tak)"; std::cin >> odpowiedz; if( odpowiedz == 1 ) { switch( znak ) { case '+': { float liczba2; std::cout << "Podaj 2 liczbe: "; std::cin >> liczba2; std::cout << "wynik to : " <<( liczba1 + liczba2 ); break; } { case '-': float liczba2; std::cout << "Podaj 2 liczbe: "; std::cin >> liczba2; std::cout << "wynik to : " <<( liczba1 - liczba2 ); break; } { case '*': float liczba2; std::cout << "Podaj 2 liczbe: "; std::cin >> liczba2; std::cout << "wynik to : " <<( liczba1 * liczba2 ); break; } { case '/': float liczba2; std::cout << "Podaj 2 liczbe: "; std::cin >> liczba2; std::cout << "wynik to : " <<( liczba1 / liczba2 ); break; } default: std::cout << "tylko + - * lub /"; break; } else; std::cout << "to po co zawracasz mi glowe? "; } return 0; }
Fajnie by było jakby if działał tylko na słowo "tak" Probowalem tak: char odpowiedz; if (odpowiedz == 'tak') ale to tez nic nie dało:( Pozdrawiam |
|
absflg |
» 2011-06-15 20:29:20 Kod pisz w znacznikach [cpp][/cpp].
Char to typ znakowy (jeden bajt). Nie jest to ciąg znaków. Do obsługi ciągów znaków służy zwykle obiekt klasy string lub tablica zmiennych char.
Opis klasy string na cplusplus.com |
|
Ziemowit |
» 2011-06-21 20:08:44 Jakbyś jednak nie chciał używać klasy string tylko zrozumieć Twój błąd to: Typ char przechowuje maksymalnie jeden znak. Więc jeśli będziesz próbował wpisać do niego więcej niż jeden znak reszta znaków zostanie pominięta. Dajmy na to, gdy do zmiennej typu char wpisać chcesz słowo "Tak" w Twej zmiennej zapamiętane zostanie tylko 'T'. Co więcej zapis 'T', a "T" w kodzie diametralnie się różni. Pierwsze 'T' to znak, drugie "T" to już łańcuch. Jaka tu różnica? Ano gdy w kodzie piszesz "T" to tak naprawdę jest to "T\0". Czyli znak T i znak specjalny \0 będący znacznikiem dla komputera, że w tym oto miejscu kończy się tekst. Więc dalej wczytywać tekstu nie ma po co, a nawet nie wolno. Dlatego też jeśli chciałbyś sprawdzać czy użytkownik wpisał słowo "Tak" to do zapamiętania go musisz użyć, albo klasy string, albo tablicy char. Czyli np. char odpowiedz[4]. Co więcej jeśli zdecydujesz się na tablicę nie możesz potem porównać tej tablicy i Twojego "tak" w if'ie za pomocą operatora =. (Operator wtedy porówna adresy pierwszych znaków składających się na łańcuch tekstu, które na pewno będą różne.). Musisz to zrobić przy pomocy funkcji strcmp(tekst1, tekst2) porównującej czy oba ŁAŃCUCHY znaków są takie same. I tak możemy zrobić if( 0 == strcmp(odpowiedz, "tak") ) // jeśli w zmiennej odpowiedź jest słowo "tak". Tak to będzie działać. #include <iostream> int main( void ) { float liczba1; char znak; std::cout << "Podaj 1 liczbe: "; std::cin >> liczba1; std::cout << "rodzaj dzialania ( + - * czy /) ? "; std::cin >> znak; char odpowiedz[ 4 ]; std::cout << "czy jestes pewien ? (1 = tak)"; std::cin >> odpowiedz; if( 0 == strcmp( odpowiedz, "tak" ) ) { switch( znak ) { case '+': { float liczba2; std::cout << "Podaj 2 liczbe: "; std::cin >> liczba2; std::cout << "wynik to : " <<( liczba1 + liczba2 ); break; } { case '-': float liczba2; std::cout << "Podaj 2 liczbe: "; std::cin >> liczba2; std::cout << "wynik to : " <<( liczba1 - liczba2 ); break; } { case '*': float liczba2; std::cout << "Podaj 2 liczbe: "; std::cin >> liczba2; std::cout << "wynik to : " <<( liczba1 * liczba2 ); break; } { case '/': float liczba2; std::cout << "Podaj 2 liczbe: "; std::cin >> liczba2; std::cout << "wynik to : " <<( liczba1 / liczba2 ); break; } default: std::cout << "tylko + - * lub /"; break; } std::cout << "to po co zawracasz mi glowe? "; } else { std::cout << "Nie wybrales tak :("; } return 0; } |
|
Ziemowit |
» 2011-06-21 20:17:55 Acha. Tablica typu char musi mieć zawsze o jeden więcej miejsca niż maksymalna liczba znaków które chcesz w niej przechowywać. Dlaczego? Z powodów już wspomnianych. Dajmy na to, że masz tablicę: char tablica[3]; Wpisujesz do niej słowo "tak". Słowo to jest ŁAŃCUCHEM znaków, więc komputer musi wiedzieć, gdzie kończy się tekst do wczytywania potrzebuje więc tak naprawdę char tablica[4]!!! Aby w ostatnim elemencie tablicy dodać automatycznie przy wpisywaniu słowa znak '\0'. Czyli tak naprawdę naszą tablicę musimy zadeklarować jako: char tablica[4]; Jeśli do tablicy wpiszesz "tak" to wewnętrzna struktura będzie się jawić jako: tablica[0] == 't'; tablica[1] == 'a'; tablica[2] == 'k'; tablica[3] == '\0'; // znak końca linii informujący, że łańcuch się kończy. Co więcej gdybyś jednak chciał skorzystać z klasy string to kod będzie wyglądał tak: #include <iostream> #include <string> int main( void ) { float liczba1; char znak; std::cout << "Podaj 1 liczbe: "; std::cin >> liczba1; std::cout << "rodzaj dzialania ( + - * czy /) ? "; std::cin >> znak; std::string odpowiedz; std::cout << "czy jestes pewien ? (1 = tak)"; std::cin >> odpowiedz; if( odpowiedz == "tak" ) { } }
|
|
nokaut Temat założony przez niniejszego użytkownika |
Dziekuje! » 2011-06-29 18:35:17 Wielkie dzieki:)
Powiem szczerze. Nie spodziewałem się, że ktoś mi to tak przejrzyście wytłumaczy!:)
WIELKIE DZIEKI! |
|
« 1 » |