Prosty kalkulator

0

Witam wszystkich. Mam pewien problem z wykonaniem zadania. Treść zadanie to

"Napisz program, który działa jak prosty kalkulator z pamięcią obsługujący pięć operacji: dodawanie, odejmowanie, mnożenie i obliczanie reszty z dzielenia. Możesz użyć do tego notacji polskiej lub odwrotnej notacji polskiej.(Uwaga! Przyjmujemy, że wynikiem dzielenia oraz resztą z dzielenia przez 0 jest NaN.)"

Nie było by w tym nic trudnego (kalkulator to chyba jeden z prostszych programów do wykonania) gdyby nie fakt że mam to zrobić z użyciem tablic. Zupełnie nie wiem jak się za to zabrać. Nie jestem żadną pijawą więc nie musicie podawać mi całego kodu ale proszę o jakieś pomysły i przede wszystkim wytłumaczenie mi o co chodzi w tym zadaniu. Udało mi się dowiedzieć że do programu muszę podać na wejściu np

  • 5 7 (lub w odwrotnej notacji polskiej 5 7 )
    a wyświetlić się ma wynik z 5
    7

Mam czas do jutrzejszej nocy na zrobienie tego programu więc bardzo proszę o zaangażowanie i z góry dziękuję za wszelką pomoc.

P.S. W internecie widziałem sporo kalkulatorów na podstawie takiego polecenia ale żaden nie jest zrobiony z użyciem tablic więc teksty typu "poszukaj w google" mnie nie zadowolą

0

Łatwiej byłoby to robić za pomocą stosu niż tablic.
Ogólnie idea jest taka:

  1. Wczytujesz 1 liczbę i odkładasz ją na stos.

  2. Wczytujesz 2 liczbę i odkładasz ją na stos.

  3. Wczytujesz znak działania.

  4. Zdejmujesz 2 liczby ze stosu

  5. Wykonujesz odpowiednią operacje matematyczną i wynik znów wkladasz na stos
    Następnie kroki 2-5 powtarzasz aż nie wczytasz całego wejścia

Czyli wygląda to tak, dla przykładowego wejścia
2 3 + 4 *

Wczytujemy 2 i 3 i wrzucamy na stos (na stosie mamy {3, 2})
Wczytujemy znak +
Zdejmujemy ze stosu 2 i 3 do odpowiednich zmiennych (na stosie nie ma nic)
Wykonujemy 2+3 = 5 i wynik wkladamy na stos (na stosie mamy {5})
Wczytujemy 4 i odkładamy na stos (na stosie mamy {4,5})
Wczytujemy znak *
Zdejmujemy ze stosu 4 i 5 (na stosie nie ma nic)
Wykonujemy 4*5=20 i wynik odkładamy na stos
Nie ma już nic do wczytania wiec wynik zdejmujemy ze stosu

Oczywiście widać że potrzeba nam tylko 2 elementowego stosu, więc można zrobić go na tablicy.

0

@Shalom, dla takiego działania 1 2 3 4 5 6 7 8 9 10 + + + + + + + + + też wystarczy dwuelementowy stos?

0

Wyraziłem sie nie precyzyjnie, przepraszam ;)
Napisałem tylko szkic rozwiązania dla przypadku szczególnego na którym łatwiej objaśnić zasadę działania.
Oczywiście w przypadku ogólnym potrzeba większego stosu (dlatego też pisałem na początku że łatwiej byłoby rozwiązać to z użyciem stosu i opisując algorytm cały czas pisałem w konwencji rozwiązania ze stosem).
Rozwiązanie tablicowe jest po prostu nieoptymalne, bo trzeba by zaalokować na początek sporą tablicę, a jeśli będzie kończyc się miejsce to kombinować z realloc().
Implementacja stosu byłaby o wiele ładniejsza ;)

0

Jak napisał @Shalom, tablice są w tym zadaniu nienaturalne. Można natomiast za pomocą tablic naśladować stos, tworzysz na starcie "dużą" tablicę double[] args i tworzysz zmienną indeks typu int z początkową wartością -1. Odłożenie nowej liczby a na stos, to inkrementacja zmiennej indeks i przypisanie:

args[indeks]=a;

Pobranie liczby ze stosu, to odczytanie args[indeks] i zmniejszenie zmiennej indeks o 1. Jeżeli program ma być odporny na nieprawidłowe dane, to przed pobraniem liczby ze stosu powinieneś sprawdzić czy nie jest on pusty (tzn, czy indeks>=0). Powinieneś też sprawdzić czy po zakończeniu obliczeń stos jest pusty:
wejście 1 2 3 + jest niepoprawne, ale próby odczytu z pustego stosu nie będzie.

0

Wielkie dzięki za pomoc. Będę próbował sobie z tym poradzić. Miłego dnia [browar]

0

Powiodło Ci się z tym kalkulatorem [???]
Jestem bardzo ciekaw bo ma identyczne zadanie na "Techniki programowania" i czy mogę liczyć na twoją pomoc [???] [!!!]

0

No niestety nie udało mi się tego zrobić ale na moje szczęście mogę przynieść program w przyszły poniedziałek a do tego czasu dalej będę się z tym męczyć. Szczerze mówiąc dalej nie mam pomysłu. Koledzy w powyższych postach napisali mi jak zrobić to z użyciem stosu ale ja muszę mieć to na tablicach więc nie wiem czy mi się uda.

0

Ale jakiż to problem? Rozwiązanie jest IDENTYCZNE, tylko nieoptymalne i brzydsze.
Tworzysz tablicę o sporym rozmiarze i jakiś licznik, który określa na jakiej głębokości stosu jesteś.
Możesz też wejść na wyższy poziom abstrakcji i napisać stos na tablicy po prostu

class Stos
{
   int* table;
   int depth;
   int max;
  public:
   Stos(int m):depth(0),max(m) { table = new int[m]; }
   int pop()
   { 
      if(depth<0)
        return table[depth--];
      return -1;
   }
   void push(int x)
   {
     if(max>depth+1)
     {
       depth++;
       table[depth]=x;
     }
     else
       //realokacja której nie chce mi sie teraz pisać
   }
};  

Wklejasz sobie to do kodu. Tworzysz bp.

Stos stack;
//I w programie wrzucasz na stos za pomocą
stack.push(liczba);
//i zdejmuejsz
int x = stack.pop();
0

To mamy ten sam problem mój prof. od laborek też się zawziął na tablice.
i w tym tkwi problem. Schemat działania u mnie tak ma miej więcej wyglądać:

  1. tworze tablice
  2. wpisuje do niej działanie np: + 2 2; / 8 4; itp
  3. program ma przeszukać tablice w poszukiwani operatora.
  4. znaleziony operator przyrównać go do zawartych w 'switch'.
  5. potem wykonać działanie...
    Problem w tym by czytał białe znaki jako początek i koniec jeden z wartości podanych w tabeli.
    Jak to zapisać w C++ ???
0

Wkradło się kilka błęd

Powinno byc :

Stos(int m):depth(0),max(m) { table = new int[m]; }

Stos stack = new Stack(4) //oczywiscie liczba dowolna

Ale zasada całości tak jak przedstawił Shalom

0

no to rozwiązanie mam już podane na tacy ale myślę że to nie przejdzie bo koleś będzie wiedział że sam tego nie zrobiłem ze względu na to że nie miałem jeszcze klas (tzn na wykładach)

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