Strona główna » Algorytmy » Artykuły » Prosty kalkulator
 

Prosty kalkulator

Cel

Napisanie programu, który pozwoli wpisać użytkownikowi wyrażenie matematyczne, aby je obliczył i wypisał wynik na ekranie. Przykładowo dla 4 * 6 + 2 = otrzymamy:

  1. 26

Ze względu na fakt, że zapis może zawierać białe znaki, ale nie musi to dane będą początkowane interpretowane jako ciąg znaków, a dopiero potem program będzie szukał operatorów oraz liczb.

Implementacja

Funkcja pomocnicza

getChar() to funkcja pomocnicza, której działanie polega na pobraniu i usunięciu pierwszego znaku z wyrażenia. Pomoże to nam iterować każdy znak w wyrażeniu dokładnie raz. Jest ona używana przede wszystkim do usunięcia nawiasów z obliczanego wyrażenia.

C++
C#
  1. char getChar(string &s){
  2.   char t = s[0];
  3.   s = s.substr(1, s.length());
  4.   return t;
  5. }

Wybieranie wyrażeń

Z kolei do pobierania liczby z łańcucha znaków służy funkcja retrieveNum(), której zadanie polega na pobieraniu liczby z łańcucha znaków. Jej działanie opiera się na fakcie, że cyfry są reprezentowane w tablicy ASCII od 48 do 57.

C++
C#
  1. int retrieveNum(string &s){
  2.   int num = 0;
  3.   if(s[0] == 40){
  4.     num = result(s.substr(s.find("(") + 1, s.find(")") - 1));
  5.     s = s.substr(s.find(")") + 1);
  6.     return num;
  7.   }
  8.   while(s[0] >= 48 && s[0] <= 57){
  9.     num = num * 10 + (getChar(s) - 48);
  10.   }
  11.   return num;
  12. }

(2.) Przyjmij, że wczytana liczba to 0. (3. - 7.) W przypadku, gdy zostanie wykryty nawias to (4.) najpierw oblicz wyrażenie w nawiasie. (8.) Jednak, gdy wczytujesz liczby to (9.) dołączaj kolejne cyfry do zmiennej num dopóki (8.) wczytujesz cyfry. (11.) Na koniec zwróć zmienną num.

Wykonywanie działań

Ostatnia funkcja result() spaja cały kod w całość. Za argument przyjmujemy tu wprowadzony łańcuch znaków. Przyjmujemy aktualną wartość wyrażenia równą pierwszemu czynnikowi.

C++
C#
  1. int result(string s){
  2.   int w = retrieveNum(s);
  3.   while(s.length() > 0 && s[0] != 61){
  4.     switch(getChar(s)){
  5.       case 42:
  6.         w *= retrieveNum(s);
  7.         break;
  8.       case 43:
  9.         w += retrieveNum(s);
  10.         break;
  11.       case 45:
  12.         w -= retrieveNum(s);
  13.         break;
  14.       case 47:
  15.         w /= retrieveNum(s);
  16.         break;
  17.     }
  18.   }
  19.   return w;
  20. }

Następnie w pętli, aż do osiągnięcia znaku równości "=" lub do osiągnięcia długości 0 wprowadzonego wyrażenia sprawdzamy pierwszy znak, który będzie rozpoznany jako operator, a następnie przy użyciu funkcji switch określamy co ma zrobić program. Liczbę po operatorze otrzymujemy poprzez wywołanie funkcji retrieveNum().

Na sam koniec funkcja zwraca wartość numeryczną podanego wyrażenia. Takie rozwiązanie pozwala na rekurencyjne wywoływanie funkcji obliczającej co wykorzystujemy pzry obliczaniu wartości w nawiasach.

Testowanie programu

Poniższa funkcja main() wczytuje od użytkownika wyrażenie do obliczenia, a następnie oblicza jego wartość i wypisuje je na ekran.

C++
C#
  1. int main(){
  2.   string s = "";
  3.   cin >> s;
  4.   cout << result(s) << endl;
  5.   system("PAUSE");
  6.   return 0;
  7. }

Uwaga: Należy zauważyć, że program uwzględnia tylko podstawowe operatory i nie przestrzega zasad wykonywania działań.