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. static char getChar(string s) {
  2.   char t = s[0];
  3.   s = s.Substring(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. static int retrieveNum(string s) {
  2.   int num = 0;
  3.   if (s[0] == 40) {
  4.     num = result(s.Substring(s.IndexOf("(") + 1, s.IndexOf(")") - 1));
  5.     s = s.Substring(s.IndexOf(")") + 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. static int result(string s) {
  2.   int w = retrieveNum(s);
  3.   while (s.Length > 0 && s[0] != 61) {
  4.     switch (getChar(s)) {
  5.       case '*':
  6.         w *= retrieveNum(s);
  7.         break;
  8.       case '+':
  9.         w += retrieveNum(s);
  10.         break;
  11.       case '-':
  12.         w -= retrieveNum(s);
  13.         break;
  14.       case '/':
  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. static void Main(string[] args) {
  2.   Console.WriteLine("Wpisz wyrażenie:");
  3.   string s = Console.ReadLine();
  4.   Console.WriteLine("Wynik to {0}", result(s));
  5.   Console.ReadKey();
  6. }

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