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

prosty kalkulator nie dziala:(

Ostatnio zmodyfikowano 2011-06-29 18:35
Autor Wiadomość
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:
C/C++
#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

 
P-34175
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
P-34176
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ć.

C/C++
#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;
   
   
}

P-34419
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:

C/C++
#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" )
    {
        //dalsza część kodu
    }
}
P-34420
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!
P-34958
« 1 »
  Strona 1 z 1