[C++] projekt Kalkulator
-
- 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
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.
-
- 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
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:
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:
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ą.
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ę
}
-- 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;
}