Kalkulator pobierający liczby i znak działania działa nieprawidłowo

0

Witam mam za zadanie napisać program który będzie działać jak kalkulator oto polecenie:

Napisz program "kalkulator". Program pobiera od użytkownika liczbę, znak działania, liczbę. Wyświetla prawidłowy wynik i posiada zabezpieczenie na dzielenie przez 0.

Oto co jak na razie napisałem:

int main()
{
    cout<<"Podaj pierwsza liczbe: ";
    cin>>liczba1;
    cout<<"Podaj druga liczbe: ";
    cin>>liczba2;
    cout<<"Podaj znak dzialania ";
    cin>>znak;

    if(znak='+')
    {
        float wynik;
        wynik=liczba1+liczba2;
        cout<<"Oto wynik dzialania: "<< wynik <<endl;
    }

    if(znak='-')
    {
        float wynik;
        wynik=liczba1-liczba2;
        cout<<"Oto wynik dzialania: "<< wynik <<endl;
    }

    if(znak='*')
    {
        float wynik;
        wynik=liczba1*liczba2;
        cout<<"Oto wynik dzialania: "<< wynik <<endl;
    }

    return 0;
}

a oto to co mi się wyświetla obojętnie jaki znak równania wpiszę:

Podaj pierwsza liczbe: 3
Podaj druga liczbe: 2
Podaj znak dzialania -
Oto wynik dzialania: 5
Oto wynik dzialania: 1
Oto wynik dzialania: 6

Process returned 0 (0x0)   execution time : 2.872 s
Press any key to continue.

Proszę o pomoc!!!

1

Porównanie wartości to == a nie =

0

A no tak, tylko jeśli zmienie = na == to teraz przy uruchomieniu programu nie wyświetla mi się nic

2

Dodatkowo, po poprawieniu tego o czym napisał poprzednik:

if(znak=='+')
{
    float wynik;
    wynik=liczba1+liczba2;
    cout<<"Oto wynik dzialania: "<< wynik <<endl;
}

if(znak=='-')
{
    float wynik;
    wynik=liczba1-liczba2;
    cout<<"Oto wynik dzialania: "<< wynik <<endl;
}

if(znak=='*')
{
    float wynik;
    wynik=liczba1*liczba2;
    cout<<"Oto wynik dzialania: "<< wynik <<endl;
}

Takie warunki nie mają sensu, z kilku powodów. Po pierwsze, każdy z nich mimo wszystko jest sprawdzany – nie ma else. Po drugie, zmienna wynik powinna być zadeklarowana raz, a nie w każdym bloku pod warunkami. Po trzecie, wyświetlenie wyniku powinno być na końcu (poza warunkami), bo wykonywana jest dokładnie taka sama instrukcja. Po czwarte, aż się prosi, aby skorzystać z instrukcji wyboru zamiast warunków.

Obecny kod można skrócić do poniższej postaci:

float wynik;

switch(znak) {
  '+': wynik = liczba1 + liczba2; break;
  '-': wynik = liczba1 - liczba2; break;
  '*': wynik = liczba1 * liczba2; break;
}

cout << "Wynik: " << wynik << endl;

Można też pozbyć się zmiennej wynik, jeśli ta zmienna nie jest w dalszej części używana. W takim przypadku (bez tej zmiennej) możesz od razu wyświetlić wynik na ekranie – w switchu:

switch(znak) {
  '+': cout << "Wynik: " << liczba1 + liczba2 << endl; break;
  '-': cout << "Wynik: " << liczba1 - liczba2 << endl; break;
  '*': cout << "Wynik: " << liczba1 * liczba2 << endl; break;
}

Kod uprościł się solidnie. Jeszcze pozostało dzielenie. ;)

0

Tylko że muszę skorzystać tylko i wyłącznie z if nie mogę dawać żadnych switch,for,pętli czy innych takich

1
WuckeM napisał(a):

Tylko że muszę skorzystać tylko i wyłącznie z if nie mogę dawać żadnych switch,for,pętli czy innych takich

To Użyj else if

0
#include <iostream>
#include <string>

using namespace std;

float liczba1,liczba2,znak,wynik;

int main()
{
    cout<<"Podaj pierwsza liczbe: ";
    cin>>liczba1;
    cout<<"Podaj druga liczbe: ";
    cin>>liczba2;
    cout<<"Podaj znak dzialania ";
    cin>>znak;

    if(znak=='+')
    {
        wynik=liczba1+liczba2;
    }
    else
    {
        if(znak=='-')
        {
            wynik=liczba1-liczba2;
        }
        else
        {
            if(znak=='*')
            {
            wynik=liczba1*liczba2;
            }

        }
    }

    cout<<"Oto wynik dzialania: "<< wynik <<endl;

    return 0;
}

Po zmianie na if else to i tak nie pokaże mi wyniku bo kod jest błędny ale nie wiem jak go poprawić.

1
WuckeM napisał(a):

Tylko że muszę skorzystać tylko i wyłącznie z if […]

To przynajmniej pozbądź się dublowanego kodu. Pod każdym warunkiem wystarczy jedna instrukcja – ta wpisująca wynik obliczeń do zmiennej wynik (jeśli nadal chcesz jej używać) lub wyświetlająca dane na ekranie (wersja bez tej zmiennej).


Edit: wyprzedziłeś mnie ze swoim postem. Za dużo tych klamer.

WuckeM napisał(a):

Po zmianie na if else to i tak nie pokaże mi wyniku bo kod jest błędny ale nie wiem jak go poprawić.

Bo zmienna znak jest typu float, a nie char.

0

A no tak musi być char DZIĘKI wielkie :) teraz już działa.

0

Ale kod nie jest do końca zgodny z treścią zadania – brakuje dzielenia (ze sprawdzeniem czy druga liczba to 0).

0

Tak wiem to dopiero będę robił.
Ale mam jeszcze jedno pytanie jak zrobić takie działanie a=b%c jeśli liczby wcześniej zadeklarowałem jako float by działały w dzieleniu.

0
WuckeM napisał(a):

Ale mam jeszcze jedno pytanie jak zrobić takie działanie a=b%c jeśli liczby wcześniej zadeklarowałem jako float by działały w dzieleniu.

Takie działanie – a=b%c – to modulo, a Ty masz zaimplementować dzielenie. Użyłeś złego znaku działania, czy faktycznie potrzebujesz obliczyć modulo? A jeśli tak, to po co? Nie jest potrzebne do wykonania tego zadania.

0

@WuckeM: Jeszcze drobne uwagi do Twojego (pierwotnego) kodu -- chyba nic nie powtarzam, co Koledzy napisali (jeśli przeoczyłem i powtarzam, to przepraszam :)).

  1. Pokazałeś nam samą funkcję main. To implikuje, że wcześniej musi być coś takiego:
#include <iostream>

using namespace std;

float liczba1, liczba2;
char znak;

O ile using ... można wybaczyć (w krótkich programach, szczególnie testowo-edukacyjnych), to moim zdaniem jakiekolwiek użycie zmiennych globalnych (szczególnie przez początkującego) jest bardzo złe. Uczysz się złych nawyków programistycznych i będziesz cierpiał oduczając się ich. Wstaw te deklaracje zmiennych (a i using też możesz) poniżej int main() {.

  1. Nie wiem jakiego kompilatora używasz, ale warto kompilować z włączonymi ostrzeżeniami (na przykład w gcc to opcja -Wall). Przez pomyłkę zrobiłeś = zamiast == w ifach. Gdy kompilujesz bez ostrzeżeń Twój kod kompiluje się bez komunikatów, ale z włączonymi ostrzeżeniami (g++ -Wall x.cpp) daje:
x.cpp: In function ‘int main()’:
x.cpp:17:16: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
     if(znak='+')
                ^
x.cpp:24:16: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
     if(znak='-')
                ^
x.cpp:31:16: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
     if(znak='*')
                ^

Może komunikaty nie są jasne, ale przynajmniej zwracają uwagę na linijki, w których (według kompilatora) może być problem...

1 użytkowników online, w tym zalogowanych: 0, gości: 1