Pisanie programu z rozbudowaną treścią
Ostatnio zmodyfikowano 2019-06-10 22:20
izab21 Temat założony przez niniejszego użytkownika |
Pisanie programu z rozbudowaną treścią » 2019-05-26 21:01:41 Mam napisać taki program , a nie mam kompletnie pomysłu na to :
Wyrażeniem nawiasowym nazwiemy niepusty ciąg składający się z nawiasów otwierających i zamykających. Powiemy, że wyrażenie jest poprawne, jeżeli każdy nawias otwierający można sparować z zamykającym, występującym po nim, tak aby ciąg nawiasów znajdujących się pomiędzy nimi również był poprawnym wyrażeniem nawiasowym. Na przykład (()())() jest poprawnym wyrażeniem nawiasowym , ale )( i ()( już nie. Innymi słowy poprawne wyrażenie nawiasowe ma tyle samo nawiasów otwierających i zamykających oraz licząc od początku wyrażenia nawiasowego liczba nawiasów otwierających jest cały czas nie mniejsza od liczby nawiasów zamykających. Napisz program który poprosi użytkownika o wprowadzenie ciągu nawiasowego (nie więcej niż 30 znaków) a następnie sprawdzi czy wczytany ciąg jest poprawnym wyrażeniem nawiasowym i wypisze odpowiedni komunikat na ekranie. |
|
pekfos |
» 2019-05-26 21:28:15 Utwórz zmienną na licznik i ustaw na zero. Przejdź po wszystkich znakach, dodaj do licznika 1 jeśli '(', odejmij jeśli ')'. Jeśli liczba wyjdzie ujemna, błąd. Jeśli nie skończysz z zerem, błąd. |
|
nanoant20 |
» 2019-06-08 23:19:13 wersja robocza #include <iostream> #include <cstring> #include <stack>
using namespace std;
int main() { stack < char > stos; string wyrazenie = "(({(a)}[g])a(({c++20()}[]))()()())"; int licznik = 0; for( unsigned int i = 0; i < wyrazenie.length(); i++ ) { if( wyrazenie[ i ] ) { stos.push( wyrazenie[ i ] ); } if( wyrazenie[ i ] == '(' ) { licznik++; continue; } if( !stos.empty() ) { if( wyrazenie[ i ] == ')' ) { licznik--; } if( wyrazenie[ i ] != ')' ) { stos.top(); stos.pop(); } } if( licznik < 0 ) break; } cout << endl; licznik == 0 ? cout << "Wyrazenie " << wyrazenie << " jest poprawne": cout << "Ciag nawiasowy " << wyrazenie << " nie jest zgodny"; cout << endl << "\nPo usunieciu innych znakow\n" "sprawdzam co zostalo na stosie:" << endl; stack < char > temp; for( unsigned int el = stos.size(); el >= stos.empty(); --el ) { temp.push( stos.top() ); stos.pop(); } while( !temp.empty() ) { cout << temp.top() << " "; temp.pop(); } cout << endl; cin.get(); cin.get(); return 0; }
|
|
pekfos |
» 2019-06-09 14:46:06 nanoant20: Twój kod jest błędny. Nie działa dla dowolnego błędnego ciągu nawiasów, w którym jest tyle samo otwierających co zamykających i który nie zaczyna się od ')'. Stos miałby tu sens, gdyby wyrażenie mogło zawierać nawiasy różnego typu. Tu jest całkowicie redundantny, wystarczy sam licznik. |
|
nanoant20 |
» 2019-06-09 16:54:35 faktycznie, stos jest tu całkowicie bezużyteczny. Poprawiony kod. #include <iostream> #include <cstring>
using namespace std;
int main() { string wyrazenie = "(()(()())())"; int licznik = 0; for( unsigned int i = 0; i < wyrazenie.length(); i++ ) { switch( wyrazenie[ i ] ) { case '(': licznik++; break; case ')': licznik--; break; } if( licznik < 0 ) break; } cout << "Stan licznika: " << licznik << endl; if( licznik == 0 ) cout << "Wyrażenie " << wyrazenie << " jest poprawne."; else cout << "Ciag nawiasowy " << wyrazenie << " nie jest zgodny."; cout << endl; cin.get(); cin.get(); return 0; }
|
|
sppmacd |
» 2019-06-10 11:15:26 Napisz program który poprosi użytkownika o wprowadzenie ciągu nawiasowego (nie więcej niż 30 znaków) |
Np. if( wyrazenie.size() > 30 ) cout << "Wyrazenie jest za dlugie!" << endl;
|
|
nanoant20 |
» 2019-06-10 12:12:19 string tekst; cin >> tekst; tekst.resize( 10 ); cout << tekst << endl;
|
|
pekfos |
» 2019-06-10 22:20:46 Napisz program który poprosi użytkownika o wprowadzenie ciągu nawiasowego (nie więcej niż 30 znaków) |
To wymaganie..? Brzmi bardziej jak "nie nauczyliśmy was std::string, wystarczy tablica na 30 znaków". |
|
« 1 » |