Interpretacja wyrażenia

0

Witam,
mam taki oto kod:

#include <cstdlib>
#include <iostream>
#include <conio.h>
#include <string.h>
#include <math.h>

using namespace std;

int main(int argc, char *argv[])
{
    int i=0;
    char tab[100], znak;
    string wyrazenie, bufor;
    
    cout<<"Podaj wyrazenie, ESC konczy wprowadzanie: ";
    do
    {
            znak=getch();
            tab[i]=znak;
            i++;
    }while(znak!=27);
    
    for(int j=0; j<i; j++)
    {
            if(tab[j]=='x' || tab[j]=='X') 
            {
                           tab[j]='3';
                           wyrazenie+=tab[j];
            }
            else
                           wyrazenie+=tab[j];
    }
            
            
            cout<<wyrazenie<<endl;    
    
    system("PAUSE");
    return EXIT_SUCCESS;
}

Chciałbym aby to wyrażenie wprowadzone przez usera zostało obliczone do zmiennej wartość (zmienna typu float). Jednak kompilator zwraca mi błąd, że nie mogę przypisać string do float. Czy ktoś wie może jak mam to wykonać?

0
fukoshi napisał(a):

nie mogę przypisać string do float

    string input;
    float x = .0;
    cin >> input;
    stringstream ss(input);
    ss >> x;

poza tym:

fukoshi napisał(a):

Witam,
mam taki oto kod:

#include <string.h>
#include <math.h>

ty chcesz korzystać z klasy string prawdopodobnie to znajduje się ona w nagłówku string. (odpowiednikiem string.h w c++ jest cstring)
math.h -> cmath

po co ci tablica char'ów skoro chcesz wykorzystać stringi?

0

No więc cały problem rozbija się o to, że chcę obliczyć wartość jaką wprowadzi user. Np. jak poda mi 'sin(x)+2*x-x^2 to program ma mu to wyliczyć i zwrócić wartość tego wyrażenia dla np.: x=3. Jeżeli masz jakiś lepszy pomysł jak to rozwiązać to napisz, jak widać w moim kodzie jest dużo kombinowania.

0

musisz przeparsować wejście. Zainteresuj się algorytmem odwrotnej notacji polskiej, będzie pomocny przy tym zadaniu.

0

Czytałem o odwrotnej notacji polskiej. Jednak zależy mi na tym, żeby user wprowadzał wyrażenie normalnie. Czy może chodzi Tobie o to, żeby user normalnie sobie to wprowadził, a ja w programie przerobię to na ONP i obliczę wartość, czy tak?

0

No tak. Istnieje algorytm konwersji zapisu infiksowego do onp. Gdy już będziesz miał w onp to zastosujesz algorytm obliczania wartości. Musisz tylko rozszerzyć podstawowe działania, bo chcesz aby były w nim również sinusy, cosinusy czy jakieś inne funkcje. Przypuszczam jednak, że nie powinno to być aż tak dużym utrudnieniem jeśli odpowiednio zaimplementujesz algorytm podstawowy.

0

Próbuję dodać do algorytmu Odwrotnej Notacji Polskiej dodatkowe funkcje ( żeby interpretował też sinusy, log, itd).
Wszystko działa fajnie, ale nie do końca. Jeżeli w wyrażeniu pojawia się sinus, albo inna z tych dodatkowych funkcji to obcina mi na wyjściu ostatnią literę:
Przykład:
dla: s i n 2 (oczywiście odpowiada to sin(2) )
zwraca: s i 2
Czy ktoś ma pomysł jak wyeliminować ten błąd?

Kod programu:

 #include <cstdlib>
#include <iostream>
#include <conio.h>
#include <string.h>
#include <math.h>

using namespace std;

int main(int argc, char *argv[])
{
    
    char stos[256],el[256], wyjscie[256];
    int ws = 0, i=0, j=0;

    do
    {
        cin >> el;

        if(isdigit(el[i])) 
        {
                           cout << el << " ";
                           wyjscie[j]=el[i];
        }
        else
            switch(el[i])
            {
                case '+': ;
                case '-': while(ws && stos[ws - 1] != '(' ) cout << stos[--ws] << " ";
                          wyjscie[j]=stos[ws];
                          stos[ws++] = el[i];                          
                          break;
                case '*': ;
                case '/': while(ws && stos[ws - 1] != '(' &&
                                      stos[ws - 1] != '+' &&
                                      stos[ws - 1] != '-') cout << stos[--ws] << " ";
                          wyjscie[j]=stos[ws];
                          stos[ws++] = el[i];
                          break;  
                case '^': while(ws && stos[ws - 1] == '^') cout << stos[--ws] << " ";
                          wyjscie[j]=stos[ws];
                          stos[ws++] = el[i];
                          break;
                case '(': stos[ws++] = '(';
                          break;
                case ')': while(stos[ws - 1] != '(') cout << stos[--ws] << " ";
                          ws--;
                          break;
                case 'c': while(ws && stos[ws - 1] != '(' ) cout << stos[--ws] << " ";
                          wyjscie[j]=stos[ws];
                          stos[ws++] = el[i];                          
                          break;
                case 'g': while(ws && stos[ws - 1] != '(' ) cout << stos[--ws] << " ";
                          wyjscie[j]=stos[ws];
                          stos[ws++] = el[i];                          
                          break;
                case 'i': while(ws && stos[ws - 1] != '(' ) cout << stos[--ws] << " ";
                          wyjscie[j]=stos[ws];
                          stos[ws++] = el[i];                          
                          break;
                case 'l': while(ws && stos[ws - 1] != '(' ) cout << stos[--ws] << " ";
                          wyjscie[j]=stos[ws];
                          stos[ws++] = el[i];                          
                          break;
                case 'n': while(ws && stos[ws - 1] != '(' ) cout << stos[--ws] << " ";
                          wyjscie[j]=stos[ws];
                          stos[ws++] = el[i];                          
                          break;
                case 'o': while(ws && stos[ws - 1] != '(' ) cout << stos[--ws] << " ";
                          wyjscie[j]=stos[ws];
                          stos[ws++] = el[i];                          
                          break;
                case 's': while(ws && stos[ws - 1] != '(' ) cout << stos[--ws] << " ";
                          wyjscie[j]=stos[ws];
                          stos[ws++] = el[i];                          
                          break;
                case 't': while(ws && stos[ws - 1] != '(' ) cout << stos[--ws] << " ";
                          wyjscie[j]=stos[ws];
                          stos[ws++] = el[i];                          
                          break;
                case '=': while(ws) cout << stos[--ws] << " ";
                          wyjscie[j]=stos[ws];
                          cout << " =\n\n";
                          break;
                
            }
        j++;
            
            

    } while(el[i] != '=');  
    
    system("PAUSE");
    return EXIT_SUCCESS;
}

WAŻNE: Ten program nie jest w całości mój! Jest to kod znaleziony na http://edu.i-lo.tarnow.pl/inf/utils/010_2010/0410.php.

0
fukoshi napisał(a):

Próbuję dodać do algorytmu Odwrotnej Notacji Polskiej dodatkowe funkcje ( żeby interpretował też sinusy, log, itd).
Wszystko działa fajnie, ale nie do końca. Jeżeli w wyrażeniu pojawia się sinus, albo inna z tych dodatkowych funkcji to obcina mi na wyjściu ostatnią literę:
Przykład:
dla: s i n 2 (oczywiście odpowiada to sin(2) )
zwraca: s i 2
Czy ktoś ma pomysł jak wyeliminować ten błąd?

Kod programu: [...]

WAŻNE: Ten program nie jest w całości mój! Jest to kod znaleziony na http://edu.i-lo.tarnow.pl/inf/utils/010_2010/0410.php.

Koniecznie musisz zrozumieć jak działa oryginalny kod, na który się powołujesz. To co ty dopisałeś (tak sądzę) to raczej nie nadaje się do niczego. To co ty dopisałeś wynika z tego, że tak naprawdę nie rozumiesz idei zawartej w oryginalnym kodzie.
Tak a propos sinusa. Użytkownika raczej wolałby podać na wejściu "sin(10) =" a nie "sin 10 =" bo po pierwsze jest to niezgodne z notacją matematyczną a po drugie użytkownika chciałby także podać na wejściu bardziej skomplikowane formuły np. "10 + 2 * sin(10 / 3 + 1) ="

0

Internet to coś pięknego. Znalazłem idealną bibliotekę do interpretacji takiego właśnie wyrażenia ( http://warp.povusers.org/FunctionParser/ )
Chcąc przetestować jak to działa otworzyłem manuala z tej stronki i postępowałem zgodnie z instrukcją ( http://warp.povusers.org/FunctionParser/fparser.html ).
Z tematu usage wykonałem wszystkie kroki, dodałem do projektu fparser.hh, fparser_gmpint.hh oraz fpconfig.hh. Dodałem też folder 'mpfr' , wkleiłem kod, który jest niżej i pojawiają się błędy Linkera. Dodałem do ustawień projektu (Project-> Project Options -> Parameters-> zakładka Linker) wpis: -lbgm, ale tym razem zwraca mi błąd "cannot find -lbgm". Co znaczy ten błąd to wiem, poszukałem biblioteki "gmp.h", dodałem do plików z kompilatora, ale nic to nie dało. Możliwe, że trzeba dodać coś jeszcze, jednak nie mam pojęcia co. Jeżeli ktoś znałby rozwiązanie takiego problemu to prosiłbym bardzo o przedstawienie go tutaj.

1 użytkowników online, w tym zalogowanych: 0, gości: 1