Ĺadny brzuch
Mam taki problem z interaktywnym kalkulatorem, gdzie wyrażenia będą wpisywane w postaci ONP. Ogólną koncepcje tego programu mam ale to się raczej kupy nie trzyma za bardzo wszystko. Pracuje na kompilatorze DevCpp 4.9.9.2 Tutaj jest treść zadanka, które musze zmachać:
Napisz program interaktywnego kalkulatora. Kalkulator ten powinien interpretować i obliczać wyrażenia zapisane w systemie ONP. Program ma odczytywać polecenia ze standardowego wejścia cin, wykonywać obliczenia i ewentualnie wypisywać wyniki na standardowe wyjście cout. Wszelkie komentarze i uwagi czynione przez program mają być wysyłane na standardowe wyjście dla błędów clog. Program powinien rozpoznawać trzy rodzaje poleceń:
set zm = wyrażenieONP
Utworzenie nowej zmiennej zm i przypisanie jej warości obliczonego wyrażenia wyrażenieONP. Jeśli zmienna zm była zdefiniowana już wcześniej, to należy tylko zmodyfikować przypisaną do niej wartość. Zmienne pamiętaj w kolekcji asocjacyjnej dostępnej w STL'u (na przykład map albo hash_map).
print wyrażenieONP
Obliczenie wartości wyrażenia wyrażenieONP i wypisanie jej na standardowym wyjściu. Wyrażenie będzie zapisane w postaci postfiksowej (Odwrotna Notacja Polska). Czytając kolejne tokeny wyrażenia program powinien je zamieniać na elementy obliczalne (zaprojektuj kompletną hierarchię klas związaną zliterałami, zmiennymi i funkcjami) i umieszczać w kolejce (standardowa kolekcja queue). Przy obliczaniu wartości wyrażenia należy się posłużyć stosem (standardowa kolekcja stack).
clear
Usunięcie wszystkich zmiennych zapamiętanych do tej pory w kolekcji asocjacyjnej. Do do kolekcji tej mogą trafiać tylko zmienne o nazwach różnych od nazw zaprogramowanych przez ciebie i zapamiętanych w innej kolekcji asocjacyjnej przeznaczonej dla funkcji i stałych (pi, e, abs, floor, ceil, frac, min, max, sin, cos, atan, acot, log, ln, power, exp, 3--argumentowa funkcja if i inne).
Po wydaniu każdego polecenia, jeśli było ono poprawnie zapisane, to należy je powtórzyć na standardowym wyjściu dla błedów, a jeśli było niepoprawne (nieznana komenda, źle sformułowane wyrażenie, błędna nazwa, błędny literał stałopozycyjny, czy nierozpoznany operator, funkcja lub zmienna) to należy wypisać stosowny komunikat o błędzie.
A tutaj są moje wypociny:
#include <iostream> #include <vector> #include <stack> #include <set> #include <string> #include "klasy.h" using namespace std; template <class Stack> void ONP::ShowStack (Stack stosy) { for (; stosy.empty(); stosy.pop()) cout << stosy.top() << endl; } template <class Queue> void ONP::ShowQueue(Queue q) { for(; !q.empty(); q.pop()) clog << q.front() << endl; } int ONP::dlugosc (char wyrazenie) { int rozmiar; rozmiar = sizeof(wyrazenie); return rozmiar; } void ONP::InstrukcjaSet(int wynikONP) { s.insert(wynikONP); } int ONP::jakiZnak(char znak) { if(znak == "+") return 1; if(znak == "-") return 2; if(znak == "*") return 3; if(znak == "/") return 4; if(znak == "^") return 5; return 6; } void ONP::kolejka(char wyrazenie) { q.clear(); char znak; int i; for (i = 0; i < dlugosc(wyrazenie); i++) { znak = wyrazenie[i]; q.push(znak); } ShowQueue(q); } void ONP::obliczONP(string wyrazenie) { clog << "Wpisane wyrazenie ma postac: " << wyrazenie << endl; int i, dzialanie, wynik; do { i = 0; char znak; clog << "W kolejce jest: " << kolejka(wyrazenie) << endl; clog << "Na stosie jest " << stosy.size() << "elementow ,czyli: " << ShowStack(stosy) << endl; znak = wyrazenie[i]; dzialanie = jakiZnak(znak); switch (dzialanie) { case 1: dodawanie(); break; case 2: odejmowanie(); break; case 3: mnozenie(); break; case 4: dzielenie(); break; case 5: potegowanie(); break; case 6: stosy.push(znak); break; } i++; } while(i < dlugosc(wyrazenie)); if(q.size() > 0 || stosy.size() > 1) { clog << "Wpisano niepoprawne wyrazenie ONP" << endl; } else { wynik = stosy.top(); stosy.pop(); clog << "Podane wyrazenie ONP ma wynik: " << wynik << endl; } }
Jeszcze jest plik z klasą ONP, ale to jest raczej szczegół oraz z działaniami, no i oczywiście main, w którym póki co za dużo nie ma. Wszystkie uwagi krytyczne przyjmę i wezmę do serca
Użytkownik misiunio18 edytował ten post 10 lipiec 2007, 17:40
Nie czytałem całości kodu, ale zauważyłem, że nie stosujesz przeładowania operatorów, np:
case 1: dodawanie(); break; case 2: odejmowanie(); break; case 3: mnozenie(); break; case 4: dzielenie(); break; case 5: potegowanie(); break;
Dodaj to kod będzie "ładniejszy" :D i bardziej praktyczny w użyciu.
Użytkownik Rafal88K edytował ten post 21 wrzesień 2007, 12:12
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
Napisz program interaktywnego kalkulatora. Kalkulator ten powinien interpretować i obliczać wyrażenia zapisane w systemie ONP. Program ma odczytywać polecenia ze standardowego wejścia cin, wykonywać obliczenia i ewentualnie wypisywać wyniki na standardowe wyjście cout. Wszelkie komentarze i uwagi czynione przez program mają być wysyłane na standardowe wyjście dla błędów clog. Program powinien rozpoznawać trzy rodzaje poleceń:
set zm = wyrażenieONP
Utworzenie nowej zmiennej zm i przypisanie jej warości obliczonego wyrażenia wyrażenieONP. Jeśli zmienna zm była zdefiniowana już wcześniej, to należy tylko zmodyfikować przypisaną do niej wartość. Zmienne pamiętaj w kolekcji asocjacyjnej dostępnej w STL'u (na przykład map albo hash_map).
print wyrażenieONP
Obliczenie wartości wyrażenia wyrażenieONP i wypisanie jej na standardowym wyjściu. Wyrażenie będzie zapisane w postaci postfiksowej (Odwrotna Notacja Polska). Czytając kolejne tokeny wyrażenia program powinien je zamieniać na elementy obliczalne (zaprojektuj kompletną hierarchię klas związaną zliterałami, zmiennymi i funkcjami) i umieszczać w kolejce (standardowa kolekcja queue). Przy obliczaniu wartości wyrażenia należy się posłużyć stosem (standardowa kolekcja stack).
clear
Usunięcie wszystkich zmiennych zapamiętanych do tej pory w kolekcji asocjacyjnej. Do do kolekcji tej mogą trafiać tylko zmienne o nazwach różnych od nazw zaprogramowanych przez ciebie i zapamiętanych w innej kolekcji asocjacyjnej przeznaczonej dla funkcji i stałych (pi, e, abs, floor, ceil, frac, min, max, sin, cos, atan, acot, log, ln, power, exp, 3--argumentowa funkcja if i inne).
Po wydaniu każdego polecenia, jeśli było ono poprawnie zapisane, to należy je powtórzyć na standardowym wyjściu dla błedów, a jeśli było niepoprawne (nieznana komenda, źle sformułowane wyrażenie, błędna nazwa, błędny literał stałopozycyjny, czy nierozpoznany operator, funkcja lub zmienna) to należy wypisać stosowny komunikat o błędzie.
A tutaj są moje wypociny:
#include <iostream> #include <vector> #include <stack> #include <set> #include <string> #include "klasy.h" using namespace std; template <class Stack> void ONP::ShowStack (Stack stosy) { for (; stosy.empty(); stosy.pop()) cout << stosy.top() << endl; } template <class Queue> void ONP::ShowQueue(Queue q) { for(; !q.empty(); q.pop()) clog << q.front() << endl; } int ONP::dlugosc (char wyrazenie) { int rozmiar; rozmiar = sizeof(wyrazenie); return rozmiar; } void ONP::InstrukcjaSet(int wynikONP) { s.insert(wynikONP); } int ONP::jakiZnak(char znak) { if(znak == "+") return 1; if(znak == "-") return 2; if(znak == "*") return 3; if(znak == "/") return 4; if(znak == "^") return 5; return 6; } void ONP::kolejka(char wyrazenie) { q.clear(); char znak; int i; for (i = 0; i < dlugosc(wyrazenie); i++) { znak = wyrazenie[i]; q.push(znak); } ShowQueue(q); } void ONP::obliczONP(string wyrazenie) { clog << "Wpisane wyrazenie ma postac: " << wyrazenie << endl; int i, dzialanie, wynik; do { i = 0; char znak; clog << "W kolejce jest: " << kolejka(wyrazenie) << endl; clog << "Na stosie jest " << stosy.size() << "elementow ,czyli: " << ShowStack(stosy) << endl; znak = wyrazenie[i]; dzialanie = jakiZnak(znak); switch (dzialanie) { case 1: dodawanie(); break; case 2: odejmowanie(); break; case 3: mnozenie(); break; case 4: dzielenie(); break; case 5: potegowanie(); break; case 6: stosy.push(znak); break; } i++; } while(i < dlugosc(wyrazenie)); if(q.size() > 0 || stosy.size() > 1) { clog << "Wpisano niepoprawne wyrazenie ONP" << endl; } else { wynik = stosy.top(); stosy.pop(); clog << "Podane wyrazenie ONP ma wynik: " << wynik << endl; } }
Jeszcze jest plik z klasą ONP, ale to jest raczej szczegół oraz z działaniami, no i oczywiście main, w którym póki co za dużo nie ma. Wszystkie uwagi krytyczne przyjmę i wezmę do serca
Użytkownik misiunio18 edytował ten post 10 lipiec 2007, 17:40
Nie czytałem całości kodu, ale zauważyłem, że nie stosujesz przeładowania operatorów, np:
case 1: dodawanie(); break; case 2: odejmowanie(); break; case 3: mnozenie(); break; case 4: dzielenie(); break; case 5: potegowanie(); break;
Dodaj to kod będzie "ładniejszy" :D i bardziej praktyczny w użyciu.
Użytkownik Rafal88K edytował ten post 21 wrzesień 2007, 12:12