[C++] Kalkulator

#include 

#include 

using namespace std;

void main()

{

	int nLiczba1;

	cout << "Podaj pierwsza liczbe: " << endl;

	cin >> nLiczba1;


	int nLiczba2;

	cout << "Podaj druga liczba: " << endl;

	cin >> nLiczba2;


	int nOpcja;

	cout << "Wybierz działanie: " << endl;

	cout << "1. Dodawanie" << endl;

	cout << "2. Odejmowanie" << endl;

	cout << "3. Mnozenie" << endl;

	cout << "4. Dzielenie" << endl;

	cout << "0. Wyjscie" << endl;

	cout << "Wybrałeś: ";

	cin >> nOpcja;


	switch (nOpcja)

	{

	case 1: 

		{

		cout << nLiczba1 << " + " << nLiczba2 << " = " << nLiczba1 + nLiczba2; break;

		}

	case 2: 

		{

		cout << nLiczba1 << " - " << nLiczba2 << " = " << nLiczba1 - nLiczba2; break;

		}

	case 3: 

		{

		cout << nLiczba1 << " * " << nLiczba2 << " = " << nLiczba1 * nLiczba2; break;

		}

	case 4:

		if (nLiczba2 == 0)

		{

			cout << "Zero nie moze byc dzielnikiem!";

		}

		else

		{

		cout << nLiczba1 << " / " << nLiczba2 << " = " << nLiczba1 / nLiczba2; break;

		}

		case 0: 

		{

		cout << "Dziekuje za skorzystanie z mojego kalkulatora :)."; break;

		}

	default: 

		{

		cout << "Nieznana opcja!";

		}

	}

	getch();

}

Oto wymęczony przeze mnie (i tak z pomocą) kalkulator. Są w nim jednak pewne niedociągnięcia. Mianowicie, chciałbym, żeby te wszystkie (wybaczcie brak fachowych pojęć) int nLiczba zamienić na float fLiczba - wiadomo, w celu większej dokładności. Jednak MS Visual C++ po przekompilowaniu wyrzuca mi wtedy błąd (gdy mam wpisane wszędzie float fLiczba): “switch expression of type “float” i illegal” <<< jak to zmienić?

Tak poza tym, to nie jestem pewien konieczności tych wszystkich nawiasów klamrowych w każdym “case”. To by było chyba na tyle. :smiley:

Po co ci float w switch ?

Co do nawiasów klamrowych są dobrze, ale brakuje ci break przed końcem każdej opcji. Ew możesz se je odpuścić razem z break, jeśli nie masz niespodziewanych dodatkowych linii etc.

Jest OK, wszystko pięknie działa, ale od kiedy to np. 12 / 8 = 1 ? Właśnie o tą dokładność mi chodzi, żeby pokazywał liczby po przecinku, ale kiedy zmieniam na float fLiczba, to wyskakuje mi wyżej podany błąd.

  1. conio.h - nieprzenośne, DOS-owa biblioteka

  2. Powinno być int main(), a na końcu funkcji return 0;

  3. Zmienne nLiczba1 i nLiczba2 jak najbardziej mogą być typu zmiennoprzecinkowego (float, double lub long double), natomiast zmienna nOpcja musi być typu całkowitoliczbowego, zacytowany komunikat wskazuje na to, że z rozpędu zmieniłeś typ wszystkich zmiennych.

  4. Klamry wydają mi się zbędne, ale to raczej nie ma znaczenia (w tym przypadku)

Ogólnie kod można by zrealizować lepiej, oddzielić obliczenia od wyświetlania, bo w obecnym powtarzasz bardzo dużo kodu i wszelka modyfikacja jest trudna. Raczej radziłbym zrobić coś w stylu

float wynik; // jeśli chcesz typ float


switch(opcja) {

case 1: wynik = op1 + op2; break;

...

}

A wypisywanie osobno pod spodem.

OK, dzięki, a na co zmienić conio.h?

  1. Niczym i najpierw uruchomić konsolę, a dopiero później z jej poziomu program - ja tak robię.

  2. Jeśli używając biblioteki iostream:

    #include

    cin.sync();

    cin.get()

O ile robisz programy tylko dla siebie, edukacyjnie, to takie obejście problemu może ujść, ale w szerszym ujęciu, szczególnie jeśli program miałby być przenośny, to jest to złe rozwiązanie.

Dla siebie. Właściwie, to dopiero od kilku dni zacząłem to kapować - dzięki temu wielkiemu tutorialowi “Od zera do gier kodera” i z pomocą strony www.cplusplus.com bodajże. Wcześniejsza lektura - ABC Programowania w C++ - wydawnictwa HELION na nic mi się zdała. No może pamiętam tylko tyle, że jak chce coś wyrzucić na ekran to zamiast cout można użyć printf. Tylko tyle :smiley:

Czy nie prościej i wygodniej w “użytkowaniu”, będzie coś w tym stylu?

#include 

using namespace std;


int main()

  {

   while(true)

     {

      cout<<"Podaj wyrazenie np: 10+2 (!-koniec): ";

      double a,b;

      char op;

      if(cin>>a>>op>>b)

        {

         switch(op)

           {

            case '+': cout<
            case '-': cout<
            case '*': cout<
            case '/':

               if(b) cout<
               else cout<<"Pamietaj, cholero nie dziel przez zero"<
            break;

            default: cout<<"Nieznana operacja"<
           }

        }

      else

        {

         cin.clear();

         if(cin.get()=='!') break;

         cout<<"Niepoprawne wyrazenie"<
        }

      cin.sync();

     }

   return 0;

  }[/code]

Pokażę moją wersje kalkulatora w C++

#include 


using namespace std;

float dodaj(float a, float b);

float odejmij(float a, float b);

float mnozenie(float a, float b);

float dzielenie(float a, float b);


int main(){

	float a,b;

	char c;

	cout.width(48);

	cout << "Calc-Program" << endl;

	cout << "Wybierz odpowiednie działanie" << endl;

	cout << "(+) - dodawanie" << endl; 

	cout << "(-) - odejmowanie" << endl;

	cout << "(*) - mnozenie" << endl;

	cout << "(/) - dzielenie" << endl;

	cout << "Wybierz odpowiedni znak : " << endl;

	cin >> c;

	cout << "Podaj liczbe :" << endl;

	cin >> a;

	cout << "Podaj liczbe :" << endl;

	cin >> b;

	switch (c){

		case '+' : cout << dodaj(a,b) << endl;

			  break;

		case '-' : cout << odejmij(a,b) << endl;

			  break;

		case '*' : cout << mnozenie(a,b) << endl;

			  break;

		case '/' : cout << dzielenie(a,b) << endl;

			  break;

	default : cout << "Wybrełeś zły wybór!" << endl;

		      break;

	}

	system ("PAUSE");

	return 0;

}

float dodaj(float a, float b){

	return a + b;

}

float odejmij(float a, float b){

	return a - b;

}

float mnozenie(float a, float b){

	return a * b;

}

float dzielenie(float a, float b){

	return a / b;

}