Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Wyrażenie logiczne string w instrukcji warunkowej if

Ostatnio zmodyfikowano 2018-02-20 07:52
Autor Wiadomość
sd5
Temat założony przez niniejszego użytkownika
[C++] Wyrażenie logiczne string w instrukcji warunkowej if
» 2018-02-19 22:29:15
Witam,

Otóż próbuję przedostać wyrażenie logiczne w formacie string (jako zdanie) do instrukcji warunkowej if.
Ma to wyglądać następująco:
C/C++
if( WYRAZ )
{
    //długa funkcja, treść mało ważna
}

Oczywiście, mój wyraz to będzie np: "i>5" lub "(wyrazDoSkorocenia == wyrazDoSkorocenia[i+1]) && (wyrazDoSkorocenia[i+1] == wyrazDoSkorocenia[i+2])"
Jeżeli wpiszę wyrażenie logiczne samodzielnie, funkcja działa, lecz jeżeli podam jako string dostanę komunikat o błędzie "could not convert 'XXX' from 'std::string {aka std::basic_string<char>}' to 'bool'|"

Moje pytania:
- czym się różni moje ręcznie wpisane wyrażenie logiczne, od wyrażenia w formie string (wyrazu)? Oba na pierwszy rzut oka są identyczne.
- czy można to jakoś prosto obejść? Przyznam, że me wyrażenie logiczne otrzymuję na podstawie kilku pętli, gdzie wyniki dodaję do siebie "string3 = string1 + string 2"
P-169530
YooSy
» 2018-02-19 23:00:23
Jeżeli wpiszę wyrażenie logiczne samodzielnie, funkcja działa
Jak to wpisujesz? Podaj przykład.

czym się różni ... wyrażenie logiczne, od wyrażenia w formie string (wyrazu)?
String nie jest wyrażeniem logicznym, lecz obiektem, reprezentującym łańcuch znaków.
( i < 5 )
 to zupełnie coś innego niż
( "i < 5" )
.
Jeśli chcesz mieć taką funkcjonalność w swoim kodzie, napisz parser, który będzie tłumaczył
zawartość stringa na wyrażenie logiczne.
std::basic_string
P-169531
pekfos
» 2018-02-19 23:06:33
Przyznam, że me wyrażenie logiczne otrzymuję na podstawie kilku pętli, gdzie wyniki dodaję do siebie "string3 = string1 + string 2"
Więc robisz to źle, operując na std::string.
P-169532
sd5
Temat założony przez niniejszego użytkownika
» 2018-02-19 23:29:58
Jak to wpisujesz? Podaj przykład.
Fragment kodu z funkcją:
C/C++
// iloscZnakow podaję na początku programu
string funkcjaWystapien( int iloscZnakow )
{
    string FWyrazDoSkrocenia;
   
    for( int i = 0; i < iloscZnakow; i++ )
    {
        //zamieniam int na string    
        ostringstream Liczba1;
        Liczba1 << i;
        string Liczba1S = Liczba1.str();
        cout << Liczba1S << endl;
       
        ostringstream Liczba2;
        Liczba2 << i + 1;
        string Liczba2S = Liczba2.str();
        cout << Liczba2S << endl;
       
        //łącze wyniki z sobą
        FWyrazDoSkrocenia = FWyrazDoSkrocenia + "(wyrazDoSkorocenia[" + Liczba1S + "] == wyrazDoSkorocenia[" + Liczba2S + "])";
        if( i < iloscZnakow - 1 )
             FWyrazDoSkrocenia = FWyrazDoSkrocenia + " && ";
       
    }
    return FWyrazDoSkrocenia;
}

DALSZY FRAGMENT KODU:

for( int i = 0; i < dlugosc - 2; i++ )
{
    if(( funkcjaWystapien( iloscZnakow ) ) )
    {
        iloscWystapien = obliczWystepowanieDanegoZnaku( wyrazDoSkorocenia, i );
        powtarzajacySieZnak = wyrazDoSkorocenia[ i ];
        wyrazDoSkorocenia.replace( i, iloscWystapien, powtarzajacySieZnak + konwersja( iloscWystapien ) );
        dlugosc = wyrazDoSkorocenia.length();
    }
}

Fragment kodu bez funkcji:
C/C++
for( int i = 0; i < dlugosc - 2; i++ )
{
    if(( wyrazDoSkorocenia == wyrazDoSkorocenia[ i + 1 ] ) &&( wyrazDoSkorocenia[ i + 1 ] == wyrazDoSkorocenia[ i + 2 ] ) )
    {
        iloscWystapien = obliczWystepowanieDanegoZnaku( wyrazDoSkorocenia, i );
        powtarzajacySieZnak = wyrazDoSkorocenia[ i ];
        wyrazDoSkorocenia.replace( i, iloscWystapien, powtarzajacySieZnak + konwersja( iloscWystapien ) );
        dlugosc = wyrazDoSkorocenia.length();
    }
}

@YooSy dziękuję Ci bardzo, rzuciłem oko na to czym jest parser i wydaje się dość mocno skomplikowany jak na mój poziom.
Istnieje może jakaś inna łatwiejsza metoda?

@pekfos mam świadomość, że robię to źle i chcę się nauczyć robić to lepiej.
P-169533
pekfos
» 2018-02-19 23:32:23
Czemu generujesz warunek, zamiast go obliczać?
P-169534
sd5
Temat założony przez niniejszego użytkownika
» 2018-02-20 06:59:53
P-169535
sd5
Temat założony przez niniejszego użytkownika
» 2018-02-20 07:00:39

Czemu generujesz warunek, zamiast go obliczać?
@pekfos ponieważ nie potrafię go obliczyć, a nie przychodzi mi nic do głowy co mógł bym wykonać zamiast generowania.
Wiem, że zależność jest następująca:
Usuwanie 2 liczb: ( wyrazDoSkorocenia == wyrazDoSkorocenia[ i + 1 ] )
Usuwanie 3 liczb: ( wyrazDoSkorocenia == wyrazDoSkorocenia[ i + 1 ] ) && ( wyrazDoSkorocenia[ i + 1 ] == wyrazDoSkorocenia[ i + 2 ] )
Usuwanie 4 liczb: ( wyrazDoSkorocenia == wyrazDoSkorocenia[ i + 1 ] ) && ( wyrazDoSkorocenia[ i + 1 ] == wyrazDoSkorocenia[ i + 2 ] ) && ( wyrazDoSkorocenia[ i + 2 ] == wyrazDoSkorocenia[ i + 3 ] )
itd...

Mogę np. zechcieć usuwać 10 liczb z rzędu. To zadanie, to coś jak trudniejszy FLAMASTE z spoj.
P-169536
YooSy
» 2018-02-20 07:52:34
Może niech funkcja zwraca wartość logiczną z porównania wyrażeń, a w pętli wywołuj tą funkcję dla kolejnych wyrażeń. Zwracane wartości obliczaj na bieżąco w tej pętli.
Coś takiego:
C/C++
bool wart_logiczna = func( wyr[ 0 ], wyr[ 1 ] );
for( size_t i = 1; i < wyr_size - 1; ++i ) {
    wart_logiczna = wart_logiczna && func( wyr[ i ], wyr[ i + 1 ] );
}
P-169537
« 1 »
  Strona 1 z 1