Prosty kalkulator – co w tym kodzie jest nie tak?

0

Hej,Możecie mi wyjaśnić, co w tym kodzie jest nie tak?

#include <iostream>

using namespace std;

int main()
{
    char TypDzialania;
    int Liczba1,Liczba2,Wynik;

    cout << "Podaj typ dzialania matematycznego, ktore chcesz wykonac" << endl;
    cout << "Dodawanie(+),Odejmowanie (-),Mnozenie(*),Dzielenie(/)" << endl;
    cin >>TypDzialania;
    cout << "Podaj 2 liczby na ktorych chcesz wykonac dzialanie matematyczne" << endl;
    cin >>Liczba1>>Liczba2;

    if (TypDzialania = '+')
    {
      Wynik = Liczba1+Liczba2;
      cout <<Wynik;
      return 0;
    }
    if (TypDzialania = '-')
    {
      Wynik = Liczba1-Liczba2;
      cout <<Wynik;
      return 0;
    }
    if (TypDzialania = '*')
    {
      Wynik = Liczba1*Liczba2;
      cout <<Wynik;
      return 0;
    }
    if (TypDzialania = '/')
    {
      Wynik = Liczba1/Liczba2;
      cout <<Wynik;
      return 0;
    }
    else cout <<"Podaj prawidlowy typ dzialania matematycznego!";


    return 0;
}
0

Porównywania dokonuje się dwoma znakami równości, jeden to przypisanie.
Przykladowo:

(TypDzialania = '+')

Powinn być:

(TypDzialania == '+')

Kilka drobnych uwag:
using namespace nie jest zbyt zalecane
podobnie endl za każdym razem, "\n" wystarczy
te return 0 nie jest potrzebne, a wręcz nie powinno ich tyle być
zmienne należałoby zainicjować (UB)
nie zaszkodzi zastosować funkcje
wynik wystarczy wypisać raz
przejdź na Full-En

0
#include <iostream>

using namespace std;

double oblicz(double Liczba1, double Liczba2, char TypDzialania)
{
 // double Liczba1 = 0.00,Liczba2 = 0.00,Wynik= 0.00;
  double Wynik = 0.00;
  switch (TypDzialania)
  {
   case '+':
        {
            Wynik = Liczba1+Liczba2;
            cout <<Wynik;
            break;
        }    
       case '-':
        {
            Wynik = Liczba1-Liczba2;
            cout <<Wynik;
            break;
        }   
         case '*':
        {
            Wynik = Liczba1*Liczba2;
            cout <<Wynik;
            break;
        }  
         case '/':
        {
              
              if (Liczba2 == 0) 
              {
                 cout << "Niestety nie mozesz dzielic przez 0";
              }
              else 
              {
            Wynik = Liczba1/Liczba2;
            cout <<Wynik;
            }
            break;
        }         
         
   default:
           {
             cout << "Brak podanego dzialania. Podaj prawidlowe";    
           }      
         
  }
  

       
 return Wynik;       
}


int main()
{
    char TypDzialania;
    double Liczba1,Liczba2,Wynik;

    cout << "Podaj typ dzialania matematycznego, ktore chcesz wykonac\n\r";
    cout << "Dodawanie(+),Odejmowanie (-),Mnozenie(*),Dzielenie(/)\n\r" ;
    cin >>TypDzialania;
    cout << "Podaj 2 liczby na ktorych chcesz wykonac dzialanie matematyczne\n\r (np: 2 2)" ;
    cin >>Liczba1>>Liczba2;

    if (!isdigit(Liczba1) == true|| !isdigit(Liczba2) == true)
    {
           cout << "Podaj liczby!";                
                          
    }
    oblicz(Liczba1,Liczba2,TypDzialania);
   
getchar();
getchar();
    return 0;
}

Pomyśl nad tym zabezpieczeniem:

 if (!isdigit(Liczba1) == true|| !isdigit(Liczba2) == true)
    {
           cout << "Podaj liczby!";                
                          
    }

jak to sensownie zrobić i sprawdzić czy nie próbuje się wprowadzić liter.
Zdaje się, że tego się w prosty sposób nie da zrobić: http://www.cplusplus.com/forum/beginner/109874/

0

Co do pozyskania tylko liczby... to kiedyś używałem czegoś takiego...
jeśli dobrze pamiętam to kiedyś działało xD

int GetInt()
{int n=0; // input
//=====================================
std::cout<<"Enter int: ";             //
	std::cin>>n;                      //
//=====================================
if(!(std::cin.fail()))return n;       //
 std::cin.clear();                    //
 std::cin.ignore();                   //
while(std::cin.get()!='\n'){continue;}//
std::cout<<"Enter =ONLY= Int: ";      //
//=====================================
	while(true){                      //
		std::cin>>n;                  //
	 if(std::cin.fail()){             //
 std::cin.clear();                    //
 std::cin.ignore();                   //
while(std::cin.get()!='\n'){continue;}//
	continue;}
		else{
			return n;
		} // Hello //
	} //   I'm  //
} //   Tobi  //

a odnośnie tego switcha co ci kolega podał...
to czemu robić aż tak długiego ???

char Choice;
switch(Choice){
	case '+': return a+b;
	case '-': return a-b;
	case '*': return a*b;
	case '/': return if(a+b!=a)return (double)(a/b);
}

problema to ci kolega jeszcze wyżej wyjaśnił :P

a = b ; przypisanie
a(5) = b(3); i mamy a = 3 i b = 3

a == b ; porównanie,
a(5) == b(3) ; i mamy false w tym miejscu :)

0

Nie jest to idealne, ale na początkującego może wystarczy:

#include <iostream>


double oblicz(double num1, double num2, char sign)
{
  double result = 0;
  switch (sign)
  {
   case '+':
        {
            result = num1+num2;
             break;
        }    
       case '-':
        {
            result = num1-num2;
            break;
        }   
         case '*':
        {
            result = num1*num2;
             break;
        }  
         case '/':
        {
              result = num1/num2; 
            
              break;
        }         

   default:
           {
             std::cout << "Brak podanego dzialania. Podaj prawidlowe";    
           }      

  }

 return result;       
}

int main()
{
    char sign;
    double num1 = 0,
           num2 = 0;
           

    std::cout << "Podaj typ dzialania matematycznego, ktore chcesz wykonac\n";
    std::cout << "Dodawanie(+),Odejmowanie (-),Mnozenie(*),Dzielenie(/)\n" ;
    std::cin >>sign;
    std::cout << "Podaj 2 liczby na ktorych chcesz wykonac dzialanie matematyczne\n" ;
    std::cin >>num1>>num2;
    std::cout << oblicz(num1,num2,sign);           
   
    

}

Małe wyjaśnienie:
Nie ma potrzeby wypisywać cout<<result za każdym razem. Samo cout<<funkcja w main wystarczy.
Dzielenie przez 0 - błąd występuje przy liczbach całkowitych. Zmiennoprzecinkowe dają tu nieskończoność (taki urok g++).
W przypadku podania złego znaku program poprosi o liczby, a następnie wyświetli komunikat o złym działaniu oraz domyślny wynik(0)
W przypadku niepodania liczby - sam się zakończy podając domyślny wynik

Edit:
Opcja nr 2 - Nie robić jednej funkcji "oblicz", ale po jednej do każdego działania.

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