double MainWindow::onp_licz(string test[],int wielkosc){
double S[wielkosc],wynik; // stos
int p = 0; // wskaźnik stosu
string e; // element wyrażenia ONP
double v1, v2; // argumenty operacji
stringstream ss; // strumień łańcuchowy
int i = 0;
while (true) // w pętli przetwarzamy wyrażenie ONP
{
e = test[i++];
if (e == "=") break; // sprawdzamy koniec wyrażenia
ss.str(""); // usuwamy wszelki tekst ze strumienia
ss.clear(); // czyścimy błędy konwersji z poprzednich wywołań
ss << e; // odczytany element umieszczamy w strumieniu
if (ss >> v1) // konwertujemy na liczbę i sprawdzamy, czy nie było błędu
// liczba
S[p++] = v1; // umieszczamy ją na stosie
else
{ // operator
v2 = S[--p]; // pobieramy ze stosu dwa argumenty
v1 = S[--p];
switch (e[0]) // wykonujemy operacje wg operatora
{
case '+': v1 += v2; break;
case '-': v1 -= v2; break;
case '*': v1 *= v2; break;
case '/': v1 /= v2; break;
}
S[p++] = v1; // wynik umieszczamy na stosie
}
}
wynik = S[--p];
return wynik;
}
void MainWindow::konwerterONP(char *wynik, char *s)
{
char x, y;
while (x = *s++) { /* krok 1 */
if (((x >= '0') && (x <= '9')) || (x == '.')) { /* krok 2 */
/* kopiowanie calej liczby z wejscia na wyjscie */
do
*wynik++ = x;
while (x = *s, (((x >= '0') && (x <= '9')) || (x == '.')) && s++);
*wynik++ = ' ';
/* krok 1 */
} else if (((x >= 'A') && (x <= 'Z')) ) { /* krok 2 */
/* kopiowanie calej liczby z wejscia na wyjscie */
do
*wynik++ = x;
while (x = *s, (((x >= 'A') && (x <= 'Z'))) && s++);
*wynik++ = ' ';
} else if (x == '(') /* krok 3 */
push((double)'(');
else if (x == ')') /* krok 4 */
while ((y = (char)pop()) != '(')
*wynik++ = y, *wynik++ = ' ';
else { /* krok 5 */
while (y = (char)pop(),
y && ((y == '^') ||
((y == '*') || (y == '/')) && (x != '^') ||
((y == '+') || (y == '-')) && (x != '*') &&
(x != '/')&& (x != '^')))
*wynik++ = y, *wynik++ = ' ';
push((double)y);
push((double)x);
}
}
while (x = (char)pop()) /* krok 6 */
*wynik++ = x, *wynik++ = ' ';
*wynik = '\0'; /* zakonczenie lancucha wyjsciowego */
}
jedna funkcja zmienia na zapis ONP np 2+2= zmienia na 2 2 + =
zaś druga liczy np z 2 2 + = wynik jest 4
char* sy = new char;
char* wy = new char;
sy=x.toLocal8Bit().data();
konwerterONP(wy, sy);