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

Pisanie programu z rozbudowaną treścią

Ostatnio zmodyfikowano 2019-06-10 22:20
Autor Wiadomość
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.
P-174723
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.
P-174724
nanoant20
» 2019-06-08 23:19:13
wersja robocza

C/C++
#include <iostream>
#include <cstring>
#include <stack>

using namespace std;

int main()
{
    stack < char > stos;
    //string wyrazenie = "(({()}[])(({()}[]))()()())";
    string wyrazenie = "(({(a)}[g])a(({c++20()}[]))()()())";
    //test dla: "(()())()" dla: ")(" dla: "()(" dla: "())" dla: ")()("
    int licznik = 0;
   
    /*
            LEGENDA stack from the site cpp0x.pl
            push - umieszczenie nowego elementu na szczycie stosu;
            pop - zdjęcie istniejącego elementu ze szczytu stosu;
            empty - informacja czy stos jest pusty;
            size - zwraca ilość elementów umieszczonych na stosie;
            top - zwraca wartość szczytowego elementu na stosie.
        */
   
    for( unsigned int i = 0; i < wyrazenie.length(); i++ )
    {
        if( wyrazenie[ i ] )
        {
            stos.push( wyrazenie[ i ] );
        }
        if( wyrazenie[ i ] == '(' )
        {
            licznik++;
            //cout << "\nlicznik++ = " << licznik << endl;
            continue;
        }
       
        if( !stos.empty() )
        {
            if( wyrazenie[ i ] == ')' )
            {
                licznik--;
                //cout << "\nlicznik-- = " << licznik << endl;
            }
            if( wyrazenie[ i ] != ')' )
            {
                stos.top();
                //cout << " rm: " << stos.top();
                stos.pop();
            }
        }
        if( licznik < 0 )
             break;
       
    }
   
    cout << endl;
    licznik == 0 ? cout << "Wyrazenie " << wyrazenie << " jest poprawne": cout << "Ciag nawiasowy " << wyrazenie << "  nie jest zgodny";
    //licznik == 0 ? cout << "Wyrazenie jest poprawne" : cout << "Ciag nawiasowy nie jest zgodny";
    cout << endl << "\nPo usunieciu innych znakow\n"
    "sprawdzam co zostalo na stosie:" << endl;
   
    //dodatkowy stos dla sztuczki
    stack < char > temp;
   
    for( unsigned int el = stos.size(); el >= stos.empty(); --el )
    //for (unsigned int el = stos.size(); el > 0; --el)
    //while (!stos.empty())
    {
        temp.push( stos.top() );
        stos.pop();
    }
    //nastapil rewers
    while( !temp.empty() )
    {
        cout << temp.top() << " ";
        temp.pop();
    }
   
    cout << endl;
    cin.get();
    cin.get();
    return 0;
}
P-174779
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.
P-174781
nanoant20
» 2019-06-09 16:54:35
faktycznie, stos jest tu całkowicie bezużyteczny.
Poprawiony kod.

C/C++
#include <iostream>
#include <cstring>

using namespace std;

int main()
{
    string wyrazenie = "(()(()())())";
    //test dla: "(()())()" dla: ")(" dla: "()(" dla: ")()("
    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;
}
P-174782
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.
C/C++
if( wyrazenie.size() > 30 )
     cout << "Wyrazenie jest za dlugie!" << endl;

P-174784
nanoant20
» 2019-06-10 12:12:19
C/C++
string tekst;
cin >> tekst;
tekst.resize( 10 ); //or any size
cout << tekst << endl;
P-174785
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".
P-174786
« 1 »
  Strona 1 z 1