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: 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" |
|
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 |
|
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. |
|
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ą: string funkcjaWystapien( int iloscZnakow ) { string FWyrazDoSkrocenia; for( int i = 0; i < iloscZnakow; i++ ) { ostringstream Liczba1; Liczba1 << i; string Liczba1S = Liczba1.str(); cout << Liczba1S << endl; ostringstream Liczba2; Liczba2 << i + 1; string Liczba2S = Liczba2.str(); cout << Liczba2S << endl; 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: 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. |
|
pekfos |
» 2018-02-19 23:32:23 Czemu generujesz warunek, zamiast go obliczać? |
|
sd5 Temat założony przez niniejszego użytkownika |
» 2018-02-20 06:59:53 |
|
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. |
|
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: 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 ] ); }
|
|
« 1 » |