Ok, trochę poczytałem o stringach o operacjach, które można na nich wykonywać i uzyskałem taki kod:
#include <cstdlib>
#include <iostream>
#include <string.h>
#include <sstream>
#include <vector>
using namespace std;
class Parametr // klasa do zapamietywania rownan np. a=2
{
public:
string symbol;
int wartosc;
Parametr(string symbol, int wartosc);
};
Parametr::Parametr(string symbol, int wartosc)
{
this->symbol=symbol;
this->wartosc=wartosc;
}
///////////////////////////////////////////////////////////////////////
class Zliczaj // klasa do zapamietywania czesciowych wynikow
{
public:
char znak;
int wartosc;
Zliczaj(int wartosc, char znak);
};
Zliczaj::Zliczaj(int wartosc, char znak)
{
this->wartosc=wartosc;
this->znak=znak;
}
////////////////////////////////////////////////////////////////////////
class Calculator //glowna klasa kalkulatora
{
private:
string rownanie;
string symbol, str;
int wartosc;
int wynik;
vector <Parametr*> zmienne;
vector <Zliczaj*> zlicz;
public:
Calculator(){}
int StrToInt(string str);
int SprawdzRownanie(string rownanie);
int SprawdzReszte(string rownanie);
int UzyskajWynik();
int SprawdzBaze(string pomoc);
void Zapisz(string symbol, int wynik);
void Wyswietlanie();
};
///////////KONWERSJA STRINGA W L.C.///////////////////////////
int Calculator::StrToInt(string str)
{
stringstream zamien;
int temp;
zamien << str;
zamien >> temp;
return temp;
}
/////////////ZAPISANIE/NADPISANIE ROWNANIA DO BAZY////////////////////
void Calculator::Zapisz(string symbol, int wynik)
{
int n=0;
for(int i=0; i < zmienne.size(); i++)
{
if(zmienne[i]->symbol == symbol)
{
zmienne[i]->wartosc = wynik;
n=1;
break;
}
}
if(n==0)
zmienne.push_back(new Parametr(symbol, wynik));
}
////////////////ZLICZENIE DANYCH Z KONTENERA////////////////////
int Calculator::UzyskajWynik()
{
wynik=zlicz[0]->wartosc;
for(int i=1, j=0; i < zlicz.size(); i++, j++)
{
switch (zlicz[j]->znak)
{
case '+':
wynik+=zlicz[i]->wartosc;
break;
case '-':
wynik-=zlicz[i]->wartosc;
break;
case '*':
wynik*=zlicz[i]->wartosc;
break;
case ';':
vector<Zliczaj*>().swap(zlicz);
return wynik;
}
}
}
/////////////////////////////SPRAWDZENIE ROWNANIA///////////////////////
int Calculator::SprawdzRownanie(string rownanie)
{
int ro=0;
for(int i=0; i < rownanie.size(); i++)
{
if(rownanie[i] == '=')
ro = 1;
}
if(ro == 1)
{
for(int i=0; i < rownanie.size(); i++)
{
switch (rownanie[i])
{
case '=':
{
for(int m=i+1; m < rownanie.size(); m++)
{
if(rownanie[m] == '=')
{
cout << "Rownanie jest niepoprawne, zawiera zbyt wiele znakow rownosci.\n";
system("PAUSE");
return 0;
}
}
for(int k=i+1; k < rownanie.size(); k++)
{
if(rownanie[k] == '+' || rownanie[k] == '-' || rownanie[k] == '*' || rownanie[k] == '/')
{
ro=0;
break;
}
}
if(ro==0)
{
symbol.assign(rownanie.begin(), rownanie.begin() + i);
str.assign(rownanie.begin()+i+1, rownanie.end() );
rownanie.clear();
rownanie = str;
wynik = SprawdzReszte(rownanie);
if(wynik == 0)
{
return 0;
}
else
{
wartosc = UzyskajWynik();
Zapisz(symbol, wartosc);
cout << "Rownosc zostala dodana do bazy.\n";
cout << "Wynik rownania: " << wartosc;
system("PAUSE");
return 0;
}
}
else if(ro==1)
{
symbol.assign(rownanie.begin(), rownanie.begin() + i);
wartosc = StrToInt(str.assign(rownanie.begin()+i+1, rownanie.end() ) );
Zapisz(symbol, wartosc);
cout << "Rownosc zostala dodana do bazy.\n";
system("PAUSE");
return 0;
}
break;
}
default:
break;
}
}
}
else
{
for(int i=0; i < rownanie.size(); i++)
{
if(rownanie[i] == '+' || rownanie[i] == '-' || rownanie[i] == '*' || rownanie[i] == '/')
{
wynik = SprawdzReszte(rownanie);
if(wynik == 0)
{
return 0;
}
else
{
wartosc = UzyskajWynik();
cout << "Wynik rownania: " << wartosc << endl;
system("PAUSE");
return 0;
}
}
}
}
}
/////////////SPRAWDZANIE ROWNAN W BAZIE/////////////////////////////
int Calculator::SprawdzBaze(string pomoc)
{
cout << pomoc << endl;
for(int i=0; i < zmienne.size(); i++)
{
if(zmienne[i]->symbol == pomoc)
{
wartosc = zmienne[i]->wartosc;
return wartosc;
}
}
istringstream iss(pomoc);
int liczba;
if (iss >> liczba)
{
return wartosc = StrToInt(pomoc);
}
else
{
iss.clear();
cout << "W rownaniu znajduja sie nieoznaczone symbole.\n";
vector<Zliczaj*>().swap(zlicz);
system("PAUSE");
return 0;
}
}
/////////////////DODAWANIE DO KONTENERA OBLICZEN CZASTKOWYCH////////////////////////
int Calculator::SprawdzReszte(string rownanie)
{
string pomoc;
pomoc.clear();
for(int i=0; i < rownanie.size(); i++)
{
switch(rownanie[i])
{
case '+':
{
pomoc.assign(rownanie.begin(), rownanie.begin()+i );
str.assign(rownanie.begin()+i+1, rownanie.end() );
rownanie.clear();
rownanie = str;
wartosc = SprawdzBaze(pomoc);
if(wartosc == 0)
{
return 0;
}
else
{
zlicz.push_back(new Zliczaj(wartosc, '+' ));
SprawdzReszte(rownanie);
}
break;
}
case '-':
{
pomoc.assign(rownanie.begin(), rownanie.begin()+i );
str.assign(rownanie.begin()+i+1, rownanie.end() );
rownanie.clear();
rownanie = str;
wartosc = SprawdzBaze(pomoc);
if(wartosc == 0)
{
return 0;
}
else
{
zlicz.push_back(new Zliczaj(wartosc, '-' ));
SprawdzReszte(rownanie);
}
break;
}
case '*':
{
pomoc.assign(rownanie.begin(), rownanie.begin()+i );
str.assign(rownanie.begin()+i+1, rownanie.end() );
rownanie.clear();
rownanie = str;
wartosc = SprawdzBaze(pomoc);
if(wartosc == 0)
{
return 0;
}
else
{
zlicz.push_back(new Zliczaj(wartosc, '*' ));
SprawdzReszte(rownanie);
}
break;
}
case ';':
{
pomoc.assign(rownanie.begin(), rownanie.end()-1);
rownanie.clear();
wartosc = SprawdzBaze(pomoc);
if(wartosc == 0)
{
return 0;
}
else if(wartosc != 0)
{
zlicz.push_back(new Zliczaj(wartosc, ';' ));
return 1;
}
break;
}
default:
break;
}
}
}
////////////////////WYSWIETLANIE////////////////////////
void Calculator::Wyswietlanie()
{
if(zmienne.size() != 0)
{
for(int i=0; i < zmienne.size(); i++)
{
cout << "Parametr: " << zmienne[i]->symbol << " ";
cout << "Wartosc: " << zmienne[i]->wartosc << endl;
}
}
else
cout << "Brak danych.\n";
}
/////////////////////MAIN///////////////////////////////
int main()
{
string rownanie;
Calculator obiekt;
cout << "UWAGA! Skomplikowane rownania musisz zakonczyc srednikiem (Np. 'a=5', 'a=5+a;' .\n";
cout << "Jesli chcesz zakonczyc dzialanie programu wpisz 'STOP'.\n";
cout << "Jesli chcesz zobaczyc wprowadzone parametry wpisz 'SHOW'.\n";
cout << "Prosze podac rownanie:\n";
cin >> rownanie;
while(1)
{
if(rownanie.compare("STOP") == 0 || rownanie.compare("stop") == 0)
{
cout << "Program zakonczyl swoje dzialanie.\n";
break;
}
else if(rownanie.compare("show") == 0 || rownanie.compare("SHOW") == 0)
{
obiekt.Wyswietlanie();
cout << endl << endl;
cout << "Prosze podac kolejne rownanie.\n";
cin >> rownanie;
}
else
{
cout << obiekt.SprawdzRownanie(rownanie) << endl;
system("CLS");
cout << "Prosze podac kolejne rownanie.\n";
cin >> rownanie;
}
}
system("CLS");
cout << "Zapamietane rownania to:\n";
obiekt.Wyswietlanie();
system("PAUSE");
}
Mam jednak problem z wyświetlaniem, ponieważ zmienne w klasie Parametr są prywatne i nie wiem jak zrobić, żebym mógł je odczytać za pomocą klasy Calculator, jak już je tam zapiszę. Jak zmienię w klasie Parametr na 'public' to działa.
EDIT:
Napisałem więcej, sporo różnych założeń, natomiast dziwi mnie jedna rzecz. Przy przechwytywaniu rownania coś tam namotałem, natomiast kompilator nic nie krzyczy, a żeby było jeszcze ciekawiej, wynik jest poprawny.
EDIT:
Ok, program już napisałem, nieaktualne już. :)