[C++] projekt Kalkulator

wawek91
Użytkownik
Użytkownik
Posty: 795
Rejestracja: 2 cze 2010, o 08:56
Płeć: Mężczyzna
Lokalizacja: Tarnów
Podziękował: 14 razy
Pomógł: 66 razy

[C++] projekt Kalkulator

Post autor: wawek91 »

Witam mam do napisania Kalkulator w C++ na zasadzie podania wyrażenia w stringu i obliczenia przez program wyrażenia. Już praktycznie napisałem ten program tylko muszę go dopracować, a mianowicie póki co kalkulator działa na cyfrach (nie obsługuje liczb). Może powiem jak to zrobiłem. Najpierw string z wyrażeniem przekonwertowałem do tablicy znakowej. Każdy element tablicy to kolejny znaczek w wyrażeniu. Potem zamieniłem postać infiksową do postaci ONP. No i w końcu mając wyrażenie zapisane w ONP uwzględniając kolejność wykonywania działań obliczam wynik. Jednak właśnie muszę poprawić to, że jeśli po cyfrze występuję kolejna cyfra to, że jest to liczba dwucyfrowa (trzycyfrowa itd.). Moje pytanie brzmi: czy jest w bibliotece standardowej jakaś funkcja, która by mi dużo pomogła czy muszę sam ręcznie napisać taką funkcję sprawdzająca kolejne znaki występujące po cyfrze? W razie konieczności wrzucę kod, ale póki co się od tego powstrzymuję, bo zajmuje prawie 300linijek. Z góry dziękuję za pomoc.
Afish
Moderator
Moderator
Posty: 2828
Rejestracja: 15 cze 2008, o 15:45
Płeć: Mężczyzna
Lokalizacja: Seattle, WA
Podziękował: 3 razy
Pomógł: 356 razy

[C++] projekt Kalkulator

Post autor: Afish »

Prawdopodobnie będziesz musiał sam to zakodzi. Pomocna może być funkcja isdigit()
wawek91
Użytkownik
Użytkownik
Posty: 795
Rejestracja: 2 cze 2010, o 08:56
Płeć: Mężczyzna
Lokalizacja: Tarnów
Podziękował: 14 razy
Pomógł: 66 razy

[C++] projekt Kalkulator

Post autor: wawek91 »

isdigit() znam nawet właśnie teraz ją używałem. No nic to coś sam poklepie.

EDIT:
A takie jeszcze jedno pytanie. Ponieważ w algorytmie zamiany z postaci infiksowej na onp znaki spisywałem do kolejki i chciałbym później zwrócić tą kolejkę jako wynik funkcji, ponieważ w przeciwnym wypadku moja funkcja rozrasta się do dużych rozmiarów. No i moje pytanie brzmi jak (czy wogóle się da) zwrócić jako wynik funkcji tą strukturę queue, a jeśli się nie da to w jaki sposób np przepisać to do tablicy ponieważ próbowałem przepisywać znak po znaku, ale wtedy wpadają mi tam też różne krzaki.

-- 17 mar 2011, o 09:34 --

Natrafiłem na problem, który myslałem, że rozwiązałem. Mianowicie przy wprowadzaniu wyrażenia np: -3+2 stwierdziłem, że wystarczy w programie zmodyfikować wyrażenie do postaci 0-3+2 i wynik będzie wyświetlany poprawnie. Jednak teraz dopracowując projekt chciałem się zabrać za to, żeby kalkulator liczył też na liczbach, a nie tylko na cyfrach (jak do tej pory). Wiem jak to zrobić (przynajmniej tak mi się wydaję), na zasadzie sprawdzania czy kolejny element ciągu jest cyfrą i jeśli tak to przemnożyć poprzednią razy 10 i dodać tą kolejną. Program jednak mi się wywalał i zastanawiałem się czemu, a teraz wydaje mi się, ze to właśnie przez to 0. Że powstaje mi np liczba 0352 i komputer nie wie ocb. Także mam pytanie w jaki inny sposób to załatwić. Jak będzie potrzebny kod to wrzucę.

-- 17 mar 2011, o 09:57 --

Ok bo chyba jednak sam nie dojdę gdzie robię błąd tutaj jest fragment kodu sprawdzający czy kolejne elementy kolejki to cyfry i jeśli tak to 'tworzę' z nich liczbę, którą wrzucam na stos:

Kod: Zaznacz cały

if(isdigit(myqueue.front())) //jeśli na początku kolejki jest cyfra to wykonuj
  {
   dig += myqueue.front()-'0'; //do zmiennej pomocniczej przypisz cyfrę z kolejki zmniejszoną o '0'
   myqueue.pop(); //ściągnij tą cyfrę z kolejki
   while(isdigit(myqueue.front())) //dopóki na początku kolejki jest cyfra to wykonuj
   {
    dig *= 10; // przemnóż zmienną pomocniczą razy 10
    dig += myqueue.front()-'0'; // dodaj do niej cyfrę z początku kolejki pomniejszoną o '0'
    myqueue.pop(); // i ściągnij ją z kolejki
   }
   ONP.push(dig/*myqueue.front()-'0'*/); // wrzuć zmienną pomocniczą na stos (nie zwracać uwagi na zakomentowany fragment)
   myqueue.pop(); // tu też jest zagadka bo wydaję mi się, że nie powinno tego być ale jak to zakomentuje to program się wysypuję                          
  }    
I dla przykładu wpisując 12+2 wypisuje mi wynik 122 czyli tak jakby pomijał wszystkie znaki i brał pod uwagę jedynie cyfry w wyrażeniu no i robił z nich jedną liczbę, która jest wynikiem.

-- 17 mar 2011, o 14:42 --

Ok tamto naprawiłem, ale pojawił się kolejny problem. Kalkulator liczy tylko na liczbach 3 cyfrowych, ale wyniki jak np 10! podaje. W czym może leżeć błąd?

-- 17 mar 2011, o 15:18 --

A jednak nie jest dobrze. Kalkulator czasem liczy dobrze czasem nie. Błąd na pewno leży w tworzeniu z cyfr liczb, czyli tu:

Kod: Zaznacz cały

  if(isdigit(tab[i]))
  {                  
   dig = 0;
   while(isdigit(tab[i]))
   {
    dig *= 10;
    dig += tab[i] - '0';
    i++;                  
   }
   i--;
   myqueue.push(dig);
   continue;                   
  } 
Kiedy sobie wyświetliłem te zmienne dig, które są wrzucane do kolejki to czasem są dobrze tworzone liczby, a czasem np dla 1234 zmienna dig przyjmuje wartośc -46 o.O ? Nie mam pojęcia skąd to się bierze. dig jest char'em i tab jest tablicą znakową.
ODPOWIEDZ