kalkulator na funkcjach

0

Witam, próblowałem troche rozbudować zadanie domowe z jednego z serwisów do nauki C++, postanowiłem cały kalkulator napisać na funkacj jednak w wyniku bierze mi jakąś wartość ze stosu(jak się domyślam). Prawdopodobnie występuje tu jakiś błąd w argumentach funkcji/zwracanej wartości przez funkcje jednak studiując ten dział nie moge się domyśleć na czym ten błąd polega. Prosze o wskazówki. Mam jeszcze jedno pytanie, czy moge w dwóch funkcjach używać stałej o tej samej nazwie skoro są widoczne tylko wewnątrz funkcji-czyli czy moge nazwać w każdym przypadku(odejmowania, dodawania, mnożenia, dzielenia) stałe jako int a i int b?

#include <iostream>

using namespace std;
int Addition(int AddA, int AddB)
{
    return AddA+AddB;
}
int Substraction (int SubstractA, int SubstractB)
{
    return SubstractA-SubstractB;
}

int Multiplication (int MultipA, int MultipB)
{
    return MultipA*MultipB;
}

int Division (int DivisA, int DivisB)
{
    return DivisA%DivisB;
}



int GetAmount(int CorrectNumber)
{
do
    {cin.clear();
    cin.sync();
    cin>>CorrectNumber;
    if(cin.good()==0)
        cout<<"To nie jest liczba!"<<endl;
    } while(cin.good()==0);
    return CorrectNumber;

}
int main()
{   int FirstNumber, SecondNumber, SwitchChoice, Score;
    cout<<"Wpisz swoja liczbe"  << endl;
    GetAmount(FirstNumber); cout<<endl;
    cout<<"Wpisz druga liczbe"; cout<<endl;
    GetAmount(SecondNumber); cout<<endl;
    cout<<"====================="<<endl;
    cout<<"1.Dodawanie"<<endl;
    cout<<"2.Odejmowanie"<<endl;
    cout<<"3.Mnozenie"<<endl;
    cout<<"4.Dzielenie"<<endl;
    cout<<"5.Wyjscie z programu"<<endl;
    do
     {
                    cin.clear();
                    cin.sync();
    cin>>SwitchChoice;
    if(cin.good()==0 && SwitchChoice>5 && SwitchChoice<0)
        cout<<"Wybierz prawidlowa opcje!";
     } while(cin.good()==0);

switch(SwitchChoice)
{  case 1:
    Score=Addition(FirstNumber, SecondNumber);
    cout<<Score;
    break;
   case 2:
       Score=Substraction(FirstNumber, SecondNumber);
       cout<<Score;
       break;
   case 3:
       Score=Multiplication(FirstNumber, SecondNumber);
       cout<<Score;
    break;
   case 4:
       Score=Division(FirstNumber, SecondNumber);
       cout<<Score;
    break;
   case 5:
    cout<<"Dziekuje za skorzystanie z kalkulatora"<<endl;
    goto exit;
    break;
}
exit:
    return 0;
} 

Program nie jest jeszcze skończony więc poboczne uwagi i tak pewnie poprawie później.

3

% to operator modulo - za dzielenie odpowiada /.

1

Popraw wcięcia, bo to jakaś masakra: http://format.krzaq.cc/.
Nie używaj goto, szczególnie że w tym przypadku jest bezużyteczne. Jeżeli jakiś kurs uczy goto, zmień go.

int GetAmount(int CorrectNumber)
{
    .... 
    cin>>CorrectNumber;
    ....
    return CorrectNumber;
}
....
GetAmount(FirstNumber);

Co się dzieje, gdy wywołujesz GetAmount(FirstNumber)?

  1. Przekazujesz do funkcji kopię zmiennej FirstNumber, a tam są jakieś śmieci.
  2. Wewnątrz funkcji operujesz na tej kopii.
  3. Zwracasz nową wartość tej kopii.
  4. Wyrzucasz ten wynik.
  5. Dalej operujesz na śmieciach obecnych w FirstNumber.
0

*Wartość zwracaną przypisz do zmiennej firstaNumber.
*Funkcja powinna być bezargumentowa (zmienna zwraca zainicjalizowana wewnątrz funkcji).

1

/ http://4programmers.net/Forum/C_i_C++/266852-kalkulator_-_optymalizacja?p=1228006#id1228006 /
http://4programmers.net/Forum/1214208

funkcja potega(liczba podstawa, liczba wykladnik) zwraca(liczbe)
  liczba ile_razy = wykladnik;
  liczba akumulator = podstawa;
  dopoki ile_razy --> 1 rob
      akumulator *= podstawa;
  wystarczy;
 
  zwroc akumulator;
wystarczy;
 
alias_funkcji(potega, potege);
 
 
program("N-ty kalkulatorek na forum") to
  staly slownik<znakow i akcji> slownik_akcji zawiera
    pare('+' i [](liczba a oraz 
                  liczba b){ zwroc a + b; }),
    pare('-' i [](liczba a oraz
                  liczba b){ zwroc a - b; }),
    pare('^' i [](liczba a oraz
                  liczba b){ zwroc potege(a, b); })
  wystarczy;
 
  liczba a, b;
  znak decyzja;
 
  wypisz << "podaj [a] [znak] [b]: " << koniec_linii;
  pobierz >> a >> decyzja >> b;
 
  liczba wynik = wartosc_slownika(slownik_akcji, decyzja)(a, b);
 
  wypisz << a << " " << decyzja << " " << b << " = " << wynik << koniec_linii;
wystarczy;

Jeśli chcesz, możesz do tego dorzucić menu: http://4programmers.net/Forum/C_i_C++/256774-menu_w_programie_konsolowym_tablica_string_czy_zmienna_z_ifami_co_lepsze?p=1170628#id1170628

http://4programmers.net/Forum/Newbie/174071-kalklulator_konsolowy_-_ocena_kodu_i_wskazowki?p=1088658#id1088658

#include <iostream>
#include <string>
#include <map>
#include <functional>
using namespace std;
 
double add(double a, double b){
    return a+b;
}
double subtract(double a, double b){
    return a-b;
}
double multiply(double a, double b){
    return a*b;
}
double divide(double a, double b){
    return a/b;
}
 
int main() {
    map<string, function<double(double, double)>> functions = {
        {"+", add},
        {"-", subtract},
        {"*", multiply},
        {"/", divide}
    };
    string inFuncName;
    double a, b;
    while(cin>>a>>inFuncName>>b)
        cout << a << inFuncName << b 
        << " = " << functions[inFuncName](a, b) << endl;
    return 0;
}
#include <iostream>
#include <string>
#include <map>
#include <functional>
using namespace std;
 
int main() {
    map<string, function<double(double, double)>> functions = {
        {"+", [](double a, double b){return a+b;}},
        {"-", [](double a, double b){return a-b;}},
        {"*", [](double a, double b){return a*b;}},
        {"/", [](double a, double b){return a/b;}}
    };
    string inFuncName;
    double a, b;
    while(cin>>a>>inFuncName>>b)
        cout << a << inFuncName << b 
        << " = " << functions[inFuncName](a, b) << endl;
    return 0;
}

Kalkulator w petli

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