https://github.com/Quanti994/Console-Calculator
Jak w temacie - klikanie w pozycję numer 6 nie działa.
Proszę poza tym o ocenę kodu.
Wątek przeniesiony 2020-04-02 11:08 z C/C++ przez Patryk27.
https://github.com/Quanti994/Console-Calculator
Jak w temacie - klikanie w pozycję numer 6 nie działa.
Proszę poza tym o ocenę kodu.
ncurses
oraz podobnych bibliotekach do tworzenia tui
(text user interface).CMake
/ Makefile
.https://github.com/Quanti994/Console-Calculator/blob/master/calculator.cpp#L53-L80
https://github.com/Quanti994/Console-Calculator/blob/master/calculator.cpp#L17-L47
https://github.com/Quanti994/Console-Calculator/blob/master/calculator.cpp#L98-L123
Tyle powtórzonego kodu, gdyby tylko można było tego jakoś uniknąć... ;)
https://github.com/Quanti994/Console-Calculator/blob/master/main.cpp#L29-L58
indentacja--
To tak na szybkie spojrzenie, nie wgłębiałem się w kod. Uzależnienie od jednej platformy zauważył już Patryk27.
kq napisał(a):
https://github.com/Quanti994/Console-Calculator/blob/master/calculator.cpp#L53-L80
https://github.com/Quanti994/Console-Calculator/blob/master/calculator.cpp#L17-L47
https://github.com/Quanti994/Console-Calculator/blob/master/calculator.cpp#L98-L123Tyle powtórzonego kodu, gdyby tylko można było tego jakoś uniknąć... ;)
Wsadzenie tego do funkcji nie zwracających wartości byłoby ok ? Bo tylko to mi na myśl przychodzi...
Nie, zobacz co tam się powtarza i staraj się generalizować. Np. zamiast tego:
double calculator::addNumbers()
{
double a = numbers.top();
numbers.pop();
double b = numbers.top();
return a+b;
}
double calculator::subNumbers()
{
double a = numbers.top();
numbers.pop();
double b = numbers.top();
return b-a;
}
double calculator::multiNumbers()
{
double a = numbers.top();
numbers.pop();
double b = numbers.top();
return a*b;
}
double calculator::diviNumbers()
{
double a = numbers.top();
numbers.pop();
double b = numbers.top();
return b/a;
}
void calculator::calculate()
{
switch(operation)
{
case ADD:
numbers.push(addNumbers());
historyOperation.push_back(" = ");
historyOperation.push_back(std::to_string(numbers.top()));
historyOperation.push_back(std::to_string(numbers.top()));
resetBufor();
break;
case SUB:
numbers.push(subNumbers());
historyOperation.push_back(" = ");
historyOperation.push_back(std::to_string(numbers.top()));
historyOperation.push_back(std::to_string(numbers.top()));
resetBufor();
break;
case MULTI:
numbers.push(multiNumbers());
historyOperation.push_back(" = ");
historyOperation.push_back(std::to_string(numbers.top()));
historyOperation.push_back(std::to_string(numbers.top()));
resetBufor();
break;
case DIVI:
numbers.push(diviNumbers());
historyOperation.push_back(" = ");
historyOperation.push_back(std::to_string(numbers.top()));
historyOperation.push_back(std::to_string(numbers.top()));
resetBufor();
break;
}
}
Możesz sobie zrobić (pisane w poście):
double calculator::binary_operation(std::function<double(double, double)> const& f)
{
double a = numbers.top();
numbers.pop();
double b = numbers.top();
numbers.pop();
return f(a, b);
}
void calculator::perform_operation(std::function<double(double, double)> const& f)
{
numbers.push(binaryOperation(f));
historyOperation.push_back(" = ");
historyOperation.push_back(std::to_string(numbers.top()));
historyOperation.push_back(std::to_string(numbers.top()));
resetBufor();
}
void calculator::calculate()
{
switch(operation)
{
case ADD:
perform_operation(std::plus{});
break;
case SUB:
perform_operation(std::minus{});
break;
case MULTI:
perform_operation(std::multiplies{});
break;
case DIVI:
perform_operation(std::divudes{});
break;
}
a i to ostatnie można zamienić na jakieś std::map, jeśli kejsów jest więcej.
Niestety dalej jak wpisuje 6 jako opcje wyswietlenia historii operacji to program totalnie nie reaguje :/ i nie wyswietla historii operacji tylko prosi o podanie numeru operacji (inne operacje działają)
Ten temat jest dot. recenzji/oceny kodu, a pierwszy post explicite wyłącza z niej niedziałającą historię operacji ;)
https://github.com/Quanti994/Console-Calculator/blob/master/main.cpp#L27-L55 - ciężko się połapać co tu się dzieje, dodałbym jakąś funkcję do wprowadzania danych.
Nie mam w tej chwili czasu ściągać i testować, ale przejedź wykonanie programu pod debuggerem i zobacz co się dzieje, to powinno dużo wyjaśnić.
void calculator::enterOperation(size_t numberOperation)
{
if(numberOperation!=HISTORY) calculatorStatus = INTRODUCTION_NEXT_NUMBER;
switch(numberOperation)
{
case ADD:
operation = ADD;
calculatorBufor.push_back(" + ");
historyOperation.push_back(" + ");
break;
case SUB:
operation = SUB;
calculatorBufor.push_back(" - ");
historyOperation.push_back(" - ");
break;
case MULTI:
operation = MULTI;
calculatorBufor.push_back(" * ");
historyOperation.push_back(" * ");
break;
case DIVI:
operation = DIVI;
calculatorBufor.push_back(" / ");
historyOperation.push_back(" / ");
break;
case EXIT:
exit(0);
break;
case HISTORY:
this->showHistoryOperation();
break;
}
}
Problem rozwiązany - ta metoda nie jest statyczna,zatem potrzeba było uzycia wskaznika this
Program działa jak nalezy - nie ma jeszcze kontroli "nie dziel przez zero" i restrykcji dot. pomylki wyboru operacji