Wątek przeniesiony 2020-04-02 11:08 z C/C++ przez Patryk27.

Program nie wyświetla historii operacji + ocena kodu

0

https://github.com/Quanti994/Console-Calculator

Jak w temacie - klikanie w pozycję numer 6 nie działa.
Proszę poza tym o ocenę kodu.

3
  1. Nie działa na Linuksie - poczytaj o ncurses oraz podobnych bibliotekach do tworzenia tui (text user interface).
  2. Przydałby się opis w jaki sposób można tę aplikację skompilować oraz uruchomić - poczytaj o CMake / Makefile.
1

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.

0
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-L123

Tyle 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...

1

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.

0

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ą)

0

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ć.

0
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

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