Rezolvare completă PbInfo #2228 expresie10

Se consideră o expresie formată din numere naturale şi perechi de paranteze drepte. Includerea între paranteze corespunde operației de calcul a câtului împărțirii întregi la 2 a valorii incluse între paranteze, iar alăturarea a două paranteze corespunde operației de adunare a valorilor subexpresiilor. Expresia poate fi calculată doar dacă este corectă, adică nu conține numere care să nu fie incluse între paranteze drepte, nu conține perechi de paranteze care să nu includă nici un număr sau nici o altă subexpresie şi perechile de paranteze se închid corect.

Cerința

Fiind dată o expresie construită conform descrierii să se decidă dacă este corectă şi în caz afirmativ să se calculeze valoarea acesteia.

Date de intrare

Fișierul de intrare expresie10.in conține pe prima linie o expresie formata numai din paranteze drepte şi numere naturale.

Date de ieșire

Fișierul de ieșire expresie10.out va conține pe prima linie valoarea expresiei în cazul în care aceasta este corectă. Dacă expresia din fişierul de intrare nu este corectă, atunci se va scrie mesajul expresie gresita.

Restricții și precizări

  • numerele care apar în expresii sunt întregi şi sunt cuprinse între 0 şi 30000
  • expresia din fișierul de intrare este formată din cel mult 200 de caractere

Exemplul 1:

expresie10.in

[[34][23[12][]

expresie10.out

expresie gresita

Explicație

Expresia este greşită deoarece parantezele nu se închid corect (de exemplu, prima paranteză nu se închide), nu toate numerele sunt incluse între paranteze si nu toate perechile de paranteze conţin numere sau subexpresii.

Exemplul 2:

expresie10.in

[4][[6][10]]

expresie10.out

6

Explicație

Valoarea expresiei este 6 deoarece
[6] = 3, [10] = 5, [4] = 2
[[6] [10]] = [(3 + 5)] = 4
deci [4][[6][10]] = 2 + 4 = 6.

Cum e corect?

cout < "As la info"; cout << "As la info"; cout >> "As la info";

Felicitări! Poți mai mult?

Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.

Greșit, dar nu-i bai!

Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.

Rezolvare

Iată rezolvarea de 100 de puncte pentru problema expresie10:

#include <bits/stdc++.h>
using namespace std;

ifstream fin("expresie10.in");
ofstream fout("expresie10.out");

char s[201];
int p, sum, x[200], k = 1;

int main()
{
    int i;
    fin >> s;
    x[0] = -1;
    for(i = 0; s[i]; i++)
        if(p >= 0)
        {
            if(s[i] == '[')
            {
                p++;
                x[k++] = -1;
                if (s[i + 1] == ']') break;///paranteza nu contine un numar!
            }
            else if(s[i] == ']')
            {
                p--;
                sum = 0;
                while(x[k] != -1)
                {
                    sum += x[k];
                    x[k--] = 0;
                }
                x[k++] = sum / 2;
            }
            else ///este cifra
            {
                if (s[i - 1] != '[') break;///numarul nu este precedat de paranteza deschisa!
                int c = 0;
                while(s[i] >= '0' && s[i] <= '9')
                    c = c * 10 + s[i++] - '0';
                if(s[i--] != ']') break;///nu urmeaza paranteza inchisa dupa numar!
                x[k] = c;
            }
        }

    if(p == 0 && !s[i])
    {
        sum = 0;
        while(x[k] != -1)
            sum += x[k--];
        fout << sum;
    }
    else fout << "expresie gresita";

    fin.close();
    fout.close();
    return 0;
}

Atenție

Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa Adresa de email.

Rezolvarea problemei #2228 expresie10

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #2228 expresie10 de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.

Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!