logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Dev C++ - Jak zamienić string w... hmm... w coś ^^"

smoker 21 Paź 2006 12:46 1954 8
REKLAMA
  • #1 3138131
    smoker
    Poziom 18  
    Posty: 394
    Pomógł: 4
    Ocena: 5
    Otóż mam taki problem. Napisałem sobie propgram rysujący wykresy różnych funkcji. Wszystko działa dobrze, ale chciałbym go uprościć i zastosować inne wprowadzanie danych. Otóż zamiast wczytywania tylko współczynników a,b i c w równaniu kwadratowym i podstawiania ich pod wzór, o tak:

    cin >> a;
    cin >> b;
    cin >> c;

    while (cośtam)
    { y=a*pow(x,2)+b*x+c
    .
    .
    .

    Chcę wprowadzać dane na zasadzie :

    cin >> string s; <== tu wpisujemy całą funkcję, np 2*pow(x,3)+ 3*pow(x,2)-4*x-2

    while (cośtam)
    {y='s' <== i tu sa schody, jak zrobic aby podstawił stringa tak by jego zawartośc stała sie funkcją?


    Bardzo mi na tym zalezy, program ma 300 linijek z czego około 100 to wprowadzanie współczynników, a i funkcjonalnośc jest ograniczona, liczy tylko wielomiany do 7 stopnia i homografię ograniczoną do wzoru y=(ax+b)/(cx+d)
  • REKLAMA
  • #2 3138171
    krzychoocpp
    VIP Zasłużony dla elektroda
    Posty: 1866
    Pomógł: 387
    Ocena: 58
    Witam, zamiast ponownie wymyślać koło, może spróbuj użyć gotowego parsera, polecam ten: http://muparser.sourceforge.net/

    Jeśli nawet nie chcesz z niego skorzystać, to warto zobaczyć jak ten problem tam rozwiązano.

    Pozdrawiam, Krzysztof.
  • REKLAMA
  • #3 3138451
    smoker
    Poziom 18  
    Posty: 394
    Pomógł: 4
    Ocena: 5
    Niestety nie moge go użyć, program musi być w 100% mojego autorstwa (ocena w szkole). ale przyjżę się jak pokombinowac z tym :]
  • REKLAMA
  • Pomocny post
    #4 3138510
    Łuk_F
    Poziom 17  
    Posty: 257
    Pomógł: 34
    Ocena: 12
    Witam

    Żeby to zrobić tak jak chcesz to należy skorzystać z metody ONP (Odwrotna Notacja Polska)
    http://pl.wikipedia.org/wiki/ONP
  • REKLAMA
  • #5 3146747
    smoker
    Poziom 18  
    Posty: 394
    Pomógł: 4
    Ocena: 5
    Musiałbym sie nad tym zastanowić. A jak czytać takie wyrażenie aby otrzymać ONP? charem znak po znaku?
  • Pomocny post
    #6 3147141
    Svisstack
    Poziom 14  
    Posty: 60
    Pomógł: 8
    akurat tak sie skalda ze mam gotowy algorytm ktory zamienia wyrazenie na ONP, pisalem go na zawody programistyczne spoj.pl moze ci sie przydac; C++; zostal zakceptowany w 100% wiec dziala napewno poprawnie.
    Załączniki:
    • 480936-src.cpp (1.74 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #7 3180921
    smoker
    Poziom 18  
    Posty: 394
    Pomógł: 4
    Ocena: 5
    Poradziłem sobie juz z tym zagadnieniem, wrzucam kod dla potomnych ;)
    #include <cstdlib>
    #include <iostream>
    #include <math.h>
    
    using namespace std;
    char in[100], out[100], stos[100]; 
    float stos2[100],w,x;
    int i2,j2,k;
    int main()
    {
        cin >> in;
        i2=0;
        j2=0;
        k=0;
        while (in[i2] != NULL )
        {  
              switch (in[i2])
              {
                     case '1' :  out[j2]=in[i2]; j2++; break;
                     case '2' :  out[j2]=in[i2]; j2++; break;
                     case '3' :  out[j2]=in[i2]; j2++; break;
                     case '4' :  out[j2]=in[i2]; j2++; break;
                     case '5' :  out[j2]=in[i2]; j2++; break;
                     case '6' :  out[j2]=in[i2]; j2++; break;
                     case '7' :  out[j2]=in[i2]; j2++; break;
                     case '8' :  out[j2]=in[i2]; j2++; break;
                     case '9' :  out[j2]=in[i2]; j2++; break;
                     case '0' :  out[j2]=in[i2]; j2++; break;
                     case 'x' :  out[j2]=in[i2]; j2++; break;
                     case '+' :  if (stos[k] == '-') {    out[j2]=stos[k]; stos[k]='+'; j2++; break;}
                                 if (stos[k] == '+') {    out[j2]=stos[k]; stos[k]='+'; j2++; break;}
                                 if (stos[k] == '*') {    out[j2]=stos[k]; stos[k]='+'; j2++; break;}
                                 if (stos[k] == '/') {    out[j2]=stos[k]; stos[k]='+'; j2++; break;}
                                 if (stos[k] == '^') {    out[j2]=stos[k]; stos[k]='+'; j2++; break;}
                                 if (stos[k] == '(') {    stos[k+1]='+'; k++; break;}
                                 else                {    stos[k]='+'; break;}
                                 break;
                     case '-' :  if (stos[k] == '-') {    out[j2]=stos[k]; stos[k]='-'; j2++; break;}
                                 if (stos[k] == '+') {    out[j2]=stos[k]; stos[k]='-'; j2++; break;}
                                 if (stos[k] == '*') {    out[j2]=stos[k]; stos[k]='-'; j2++; break;}
                                 if (stos[k] == '/') {    out[j2]=stos[k]; stos[k]='-'; j2++; break;}
                                 if (stos[k] == '^') {    out[j2]=stos[k]; stos[k]='-'; j2++; break;}
                                 if (stos[k] == '(') {    stos[k+1]='-'; k++; break;}
                                 else                {    stos[k]='-'; break;}
                                 break;
                     case '*' :  if (stos[k] == '-') {    stos[k+1]='*'; k++; break;}
                                 if (stos[k] == '+') {    stos[k+1]='*'; k++; break;}
                                 if (stos[k] == '*') {    out[j2]=stos[k]; stos[k]='*'; j2++; break;}
                                 if (stos[k] == '/') {    out[j2]=stos[k]; stos[k]='*'; j2++; break;}
                                 if (stos[k] == '^') {    out[j2]=stos[k]; stos[k]='*'; j2++; break;}
                                 if (stos[k] == '(') {    stos[k+1]='*'; k++; break;}
                                 else                {    stos[k]='*'; break;}
                                 break;
                     case '/' :  if (stos[k] == '-') {    stos[k+1]='/'; k++; break;}
                                 if (stos[k] == '+') {    stos[k+1]='/'; k++; break;}
                                 if (stos[k] == '*') {    out[j2]=stos[k]; stos[k]='/'; j2++; break;}
                                 if (stos[k] == '/') {    out[j2]=stos[k]; stos[k]='/'; j2++; break;}
                                 if (stos[k] == '^') {    out[j2]=stos[k]; stos[k]='/'; j2++; break;}
                                 if (stos[k] == '(') {    stos[k+1]='/'; k++; break;}
                                 else                {    stos[k]='/'; break;}
                                 break;
                     case '^' :  if (stos[k] == '-') {    stos[k+1]='^'; k++; break;}
                                 if (stos[k] == '+') {    stos[k+1]='^'; k++; break;}
                                 if (stos[k] == '*') {    stos[k+1]='^'; k++; break;}
                                 if (stos[k] == '/') {    stos[k+1]='^'; k++; break;}
                                 if (stos[k] == '^') {    stos[k+1]='^'; k++; break;}
                                 if (stos[k] == '(') {    stos[k+1]='^'; k++; break;}
                                 else                {    stos[k]='^'; break;}
                                 break;
                     case '(' :                      {    stos[k+1]='('; k++; break; } 
                                 break;
                     case ')' :  while (1<2)
                                 {     if (stos[k]=='(') {stos[k] == NULL; k--; break; }
                                       out[j2]=stos[k];
                                       j2++;
                                       stos[k] == NULL;
                                       k--;
                                       }
                                       break;
                                       
              }
              i2++;
        } // koniec while
                     
                     while (k>=0) 
                           {
                              out[j2]=stos[k];
                              k--;
                              j2++;
                           }
                     j2=0;
                     cout << "Wyr ONP: " << endl;
                     while (out[j2] != NULL)
                           {
                              printf ("%c", out[j2]);
                              j2++;
                           }
                           cout << endl;
                           
        
        
        
        //------------I W DRUGA STRONĘ! ;P--------JA JA JA JA JAZDAAAAAAAAAAA!!!!---------------------------------------
        j2=0;
        k=0;
        i2=0;
        while (out[j2] != NULL)
        {
              switch (out[j2])
              {
                     case '1' : stos2[k]=1; k++; break;
                     case '2' : stos2[k]=2; k++; break;
                     case '3' : stos2[k]=3; k++; break;
                     case '4' : stos2[k]=4; k++; break;
                     case '5' : stos2[k]=5; k++; break;
                     case '6' : stos2[k]=6; k++; break;
                     case '7' : stos2[k]=7; k++; break;
                     case '8' : stos2[k]=8; k++; break;
                     case '9' : stos2[k]=9; k++; break;
                     case '0' : stos2[k]=0; k++; break;
                     case 'x' : stos2[k]=x; k++; break;
                     case '+' : w=stos2[k-2]+stos2[k-1]; k--; k--; stos2[k]=w; k++; break;
                     case '-' : w=stos2[k-2]-stos2[k-1]; k--; k--; stos2[k]=w; k++; break;
                     case '*' : w=stos2[k-2]*stos2[k-1]; k--; k--; stos2[k]=w; k++; break;
                     case '/' : w=stos2[k-2]/stos2[k-1]; k--; k--; stos2[k]=w; k++; break;
                     case '^' : w=pow(stos2[k-2],stos2[k-1]); k--; k--; stos2[k]=w; k++; break;
                     }
              j2++;
        } 
        cout << "Wynik: " << w << endl;
        
        
        
        
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    
  • #8 3192386
    Svisstack
    Poziom 14  
    Posty: 60
    Pomógł: 8
    masakra:D mozna bylo by to spokojnie zrobic w 40 linijkach kodu:)
  • #9 3201845
    bomber
    Poziom 24  
    Posty: 858
    Pomógł: 35
    Ocena: 21
    widze ze tu mamy pewnego cfaniaczka na forum ktory sobie punkciki chce nabic latow i szybko oj .. nieladnie
    (do admina)sorry za OT

Podsumowanie tematu

✨ Autor programu w Dev C++ chce uprościć wprowadzanie danych do rysowania wykresów funkcji, zastępując wczytywanie współczynników a, b, c w równaniu kwadratowym bezpośrednim wprowadzaniem całej funkcji jako stringa, np. "2*pow(x,3)+3*pow(x,2)-4*x-2". Problem polega na tym, jak przekształcić ten string w funkcję matematyczną, którą można obliczyć dla kolejnych wartości x. W odpowiedziach zaproponowano użycie gotowego parsera wyrażeń matematycznych muparser, jednak autor musi napisać własne rozwiązanie ze względu na wymogi szkolne. Sugerowano zastosowanie metody ONP (Odwrotna Notacja Polska) do parsowania i obliczania wartości funkcji. Autor otrzymał wskazówki dotyczące implementacji algorytmu konwersji wyrażenia na ONP oraz podzielił się fragmentem własnego kodu w C++, który realizuje to zadanie. Dyskusja zawiera także krytykę dotyczącą długości kodu i podejścia do rozwiązania.
Wygenerowane przez model językowy.
REKLAMA