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

Lekcja 15 kalkulator

Ostatnio zmodyfikowano 2013-02-13 21:02
Autor Wiadomość
Eldakar
Temat założony przez niniejszego użytkownika
Lekcja 15 kalkulator
» 2013-02-13 18:52:14
napisałem troche inaczej niż było w poleceniu zadania ale to głównie w celach doświadczalnych

C/C++
#include <iostream>
int main()
{
    double a;
    double b;
    char znak = '+' || '-' || '*' || '/' || '=';
   
    do {
        std::cout << "0" << std::endl;
        std::cin >> a;
        std::cin >> znak;
       
        do {
            std::cin >> b;
           
            switch( znak )
            {
            case '-':
                std::cout << a - b << std::endl;
                a = a - b;
                std::cin >> znak;
                break;
               
            case '+':
                std::cout << a + b << std::endl;
                a = a + b;
                std::cin >> znak;
                break;
               
            case '/':
                if( b != 0 )
                {
                   
                    std::cout << a / b << std::endl;
                    a = a / b;
                    std::cin >> znak;
                }
                else
                {
                    std::cout << "error" << std::endl;
                    std::cin >> znak;
                }
                break;
               
            case '*':
                std::cout << a * b << std::endl;
                a = a * b;
                std::cin >> znak;
                break;
            }
           
           
        } while( znak != '=' && "error" /* error nie działa jak bym chciał */ );
       
        std::cin.clear();
        std::cin.sync();
       
    } while( a != 0 || znak != '/' );
   
    return 0;
}
(żeby program działał poprawnie wystarczy wpisywać na przemian liczba  znak  liczba znak...)

program działa bez zarzutów do momentu wpisania w miejsce znaku liczby i na odwrót (o co łatwo, szczególnie po dzieleniu przez 0, ponieważ mój program w tym wypadku daje możliwość zmiany działania a nie sprowadza go do wartości wyjściowej / początkowej czyli 0 ) lub wpisania litery
wtedy nie działa jak powinien

moje pytania:
1. czy po 15 lekcjach programowania jestem w stanie to naprawić, sprawić żeby po każdym błędnym znaku program wracał do pierwszego w zapisie 0
2. Jak przebudować ten program żeby po dzieleniu przez 0 i wyświetleniu 'wyniku' error program samoczynnie wracał do wartości początkowej 0 bez konieczności wpisywania znaku zerującego (u mnie to jest '=') , bo próbowałem wpisywać wszystko w założeniach while i nic nie działa
P-76242
Adam3423
» 2013-02-13 19:40:17
char znak = '+' || '-' || '*' || '/' || '=';
z tego co mi wiadomo tak sie nie inicjalizuje zmiennych;)


C/C++
case '/':
if( znak != '/' || b != 0 )
znak!='/'- tu nie potrzebne skoro zeby wejsc do tej instrukcji znakiem musialo byc dzielenie

poza tym zmiennej error w ogole nie uzywasz, a ją zdeklarowales to tez nie potrzebne
wiele nie pomoglem ale takie rzeczy mi sie w oczy rzucily;)
P-76243
Eldakar
Temat założony przez niniejszego użytkownika
» 2013-02-13 19:58:02
masz racje, poprawiłem
co do inicjalizacji, wydaje mi się że jest poprawna, to jak suma logiczna cyfr, tylko że ja wykorzystałem znaki :)
P-76245
Berux
» 2013-02-13 21:02:24
@Eldakar

Ta inicjalizacja nie jest poprawna. Popatrz
znak = '+' || '-' || '*' || '/' || '='
 , to wyrażenie logiczne. Nawet nie jest ono napisane poprawnie, bo tłumacząc to na instrukcje jakie ma wykonać kompilator będzie to wyglądało mniej więcej tak:

Przypisz do zmiennej o nazwie "znak" wartość '+' lub '-' lub '*' lub  '/' lub '='

Instrukcja sterująca "switch" przyjmuje jako argument(to argument?:)) wartość zmiennej, którą ma porównać z "case'ami".

Powinno być więc:

C/C++
#include <iostream>
int main()
{
    double a;
    double b;
    char znak;
   
    do {
        std::cout << "0" << std::endl;
        std::cin >> a;
        std::cin >> znak;
       
        do {
            std::cin >> b;
           
            switch( znak )
            {
            case '-':
                std::cout << a - b << std::endl;
                a = a - b;
                std::cin >> znak;
                break;
               
            case '+':
                std::cout << a + b << std::endl;
                a = a + b;
                std::cin >> znak;
                break;
               
            case '/':
                if( b != 0 )
                {
                   
                    std::cout << a / b << std::endl;
                    a = a / b;
                    std::cin >> znak;
                }
                else
                {
                    std::cout << "error" << std::endl;
                    std::cin >> znak;
                }
                break;
               
            case '*':
                std::cout << a * b << std::endl;
                a = a * b;
                std::cin >> znak;
                break;
            }
           
           
        } while( znak != '=' && "error" /* error nie działa jak bym chciał */ );
       
        std::cin.clear();
        std::cin.sync();
       
    } while( a != 0 || znak != '/' );
   
    return 0;
}

Ale ogólnie to gratulacje za sposób rozwiązywania wielu działań naraz, a nie pojedynczo (np. 3+ 3 = 9) :)
Dobrze Ci idzie. Życzę Ci powodzenia w dalszej przygodzie z C++.

/edit: Odpowiedzi na pytania:

1. Możesz. Właśnie Ci podałem sposób.

2. Zmień :
while( znak != '=' && "error" /* error nie działa jak bym chciał */ );
 na
C/C++
while( znak != '=' || a == 0 && znak == '/' || b == 0 && znak == '/' ); // tutaj masz powtarzanie dotyczące samego dzielenia jak się wpisze 0, a jak chcesz, żeby było jeszcze na mnożenie to dopisz :)

P-76249
« 1 »
  Strona 1 z 1