Zadanie ze sprawdzeniem poprawności

0

Cześć, mam problem z zadankiem, program sprawdza, czy wyrażenie algebraiczne jest poprawne w składni, (czy nie ma np . +-)
mogę używać liczb,małych literek oraz znaków + - / *

Napisałem taki oto program, którego zadaniem jest najpierw wyszukanie pozycji znaków(wykonuje to dobrze, sprawdziłem)

a potem zapisanie tych pozycji do tabeli
następnie ma sprawdzić, czy znaki nie leżą obok siebie, znaczy, czy wartość z tabeli +1 nie jest równa następnej pozycji zapisane w tabeli( np. tab[1] +1 musi być różne od tab[2])

Program za każdym razem zwraca poprawność zapisu
Proszę o wytłumaczenie błędów myślowych/będów w kodzie oraz ewentualnie jakaś lepsza alternatywa, dziękuję

#include<math.h>
#include<cstdlib>
#include<iostream>
#include<cstring>
using namespace std;

int main()
{    string slowo= "2*a-b/c-8+5";
    int i,tab[slowo.size()];
    size_t t = -1;
  for(i=0;i<slowo.size();i++)
   {
    while((t=slowo.find_first_of("*-+/",t+1)) != string ::npos )
        tab[i]=t;}

    for(i=0;i<slowo.size();i++)
    {
        if(tab[i]+1!=tab[i+1])
        {
            cout<<"Jest to poprawnie zapisane w skladni wyrażenie algebraiczne"<<endl;
        }
        else
        {
            cout<<"nie jest"<<endl;
        }
    }

}
1
#include<cmath>
#include<cstdlib>
#include<iostream>
#include<cstring>
#include<vector>

int main()
{ 
    std::string str ("2a-b/c-8+5");
    std::vector<int> pos;
    std::size_t found = str.find_first_of("-+/*");
    while (found!=std::string::npos)
    {
        pos.push_back(found);
        found=str.find_first_of("-+/*",found+1);
    }
    for (std::vector<int>::iterator it = pos.begin() ; it != pos.end(); ++it)
    {
        if(*it - *(it+1) == -1)
        {
            std::cout<<"Niepoprawne wyrażenie\n";
            return 0;
        }
    }
    std::cout<<"Poprawne wyrażenie\n";
}
1

Ja bym najpierw string wejściowy zamienił na listę(scanner/tokenizer): a + b -> ['a', '+', 'b'], a potem funkcja sprawdzająca warunki:

  • wyrażenie musi się zaczynać literą, liczbą znakiem -, lub + (ten + jest wątpliwy, bo co to jest : + a + b, może być, Python to wykona, ale...);
  • po literze lub cyfrze musi być koniec listy lub operator;
  • po operatorze musi być litera lub cyfra.
    Czy coś pominąłem?
0
au7h napisał(a):
#include<cmath>
#include<cstdlib>
#include<iostream>
#include<cstring>
#include<vector>

int main()
{ 
    std::string str ("2a-b/c-8+5");
    std::vector<int> pos;
    std::size_t found = str.find_first_of("-+/*");
    while (found!=std::string::npos)
    {
        pos.push_back(found);
        found=str.find_first_of("-+/*",found+1);
    }
    for (std::vector<int>::iterator it = pos.begin() ; it != pos.end(); ++it)
    {
        if(*it - *(it+1) == -1)
        {
            std::cout<<"Niepoprawne wyrażenie\n";
            return 0;
        }
    }
    std::cout<<"Poprawne wyrażenie\n";
}

Dziękuję, ale będę musiał się jeszcze zapoznać z biblioteką vector, mam drobną prośbę, mógłbyś jeszcze dodać do programu sprawdzenie poprawności z użyciem nawiasów ? np. (a-b)/34+56 jeśli dałbyś radę, to poźniej poświęcił bym trochę czasu na analizę całości, dziękuję -

1

"nie , chyba wszystko, ewentualnie można dodać do tego jeszcze użycie nawiasów" z nawiasami będzie kolejny blok sprawdzanie czy wyrażenie jest poprawnie znawiasowane; jeden rodzaj nawiasóww?

0
lion137 napisał(a):

"nie , chyba wszystko, ewentualnie można dodać do tego jeszcze użycie nawiasów" z nawiasami będzie kolejny blok sprawdzanie czy wyrażenie jest poprawnie znawiasowane; jeden rodzaj nawiasóww?

tak, tylko jeden

1

To prosty algorytm z LIFO stackiem.

0
lion137 napisał(a):

To prosty algorytm z LIFO stackiem.

Jeszcze się z tego typu algortymem nie zapoznałem

0

To zależy od definicji wyrażenia arytmetycznego, ale w większości języków programowania a/-b jest poprawnym wyrażeniem arytmetycznym, to samo:
a*-b
a+-b
a--a
bo - jest traktowane jako unarny operator negacji.
Mało tego, jest jeszcze unarny operator +.

0
MarekR22 napisał(a):

To zależy od definicji wyrażenia arytmetycznego, ale w większości języków programowania a/-b jest poprawnym wyrażeniem arytmetycznym, to samo:
a*-b
a+-b
a--a
bo - jest traktowane jako unarny operator negacji.

Chodzi o popraawność względem zapisu jakim my się posługujemy w piśmie

0

Unarne operatory skomplikują sprawę, może je na razie pominąć.

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