Rezolvare completă PbInfo #2471 gcl

Gigel a inventat un nou limbaj de programare pe care l-a numit GCL (Gigel Campion Language). În GCL pot fi utilizate maxim 26 variabile notate cu litere mici ale alfabetului englez. Valoarea inițială fiecărei variabile (la începutul execuției programului) este 0.

Un program în limbajul GCL este format dintr-o succesiune de comenzi, câte o comandă pe o linie.

Comanda Semnificație
INCEPE Marchează începutul programului (apare o singură dată la început).
var=expresie Variabilei var din partea stângă a semnului = i se atribuie valoarea expresiei din partea dreaptă. O expresie este formată din unul sau mai mulți termeni între care poate exista operatorul + sau operatorul – (semnificând adunare, respectiv scădere). Un termen poate fi o constantă, o variabilă sau o variabilă precedată de o constantă (ceea ce semnifică faptul că variabila este înmulțită cu constanta). De exemplu, a = 2b + 4 – c
REPETA n Indică începutul unui bloc de instrucțiuni care se va repeta de n ori.
STOP Indică sfârșitul unui bloc REPETA sau sfârșitul programului
SCRIE var Afișează o linie de forma următoare:
var = valoare
unde var reprezintă numele variabilei care se scrie, iar valoare reprezintă valoarea variabilei. Semnul = trebuie să fie precedat și urmat de câte un singur spațiu.

Cerința

Scrieți un program care citește un program scris limbajul GCL și rezolvă următoarele două cerințe:

1. determină numărul de comenzi SCRIE care se execută;
2. determină rezultatele afișate de comenzile SCRIE din programul scris în limbajul GCL.

Date de intrare

Fișierul de intrare gcl.in conține pe prima linie cerința (1 sau 2) apoi, pe liniile următoare un program corect
scris în limbajul GCL.

Date de ieșire

  • Dacă cerința este 1, fișierul de ieșire gcl.out va conține pe prima linie numărul de comenzi SCRIE executate.
  • Dacă cerința este 2, fișierul de ieșire gcl.out va conține rezultatele afișate de comenzile SCRIE din programul
    scris în limbajul GCL, în ordinea executării acestor comenzi.

Restricții și precizări

  • Programul în limbajul GCL va avea maxim 50 de linii de cel mult 100 de caractere.
  • Comenzile dintr-un program GCL pot conține oricâte spații, plasate oriunde, dar nu în interiorul cuvintelor cheie (REPETA , INCEPE, STOP , SCRIE ) și al constantelor.
  • Constantele care intervin în expresii sunt numere naturale, 0 ≤ constantă ≤ 2000 000 000.
  • Numărul n care apare în comenzile REPETA este un număr natural, 0 ≤ n ≤ 10 .
  • Nu pot exista comenzi REPETA imbricate. Mai exact, după comanda REPETA și până la comanda STOP care
    marchează sfârșitul comenzii REPETA nu poate apărea o altă comandă REPETA.
  • Valorile calculate în expresii sunt, la orice moment, numere întregi din intervalul [-231, 231-1].
  • Toate cuvintele cheie din comenzile GCL sunt scrise cu litere mari.
  • Pentru cerința 1 se acordă 40% din punctaj, iar pentru cerința 2 se acordă 60% din punctaj.

Exemplu 1:

gcl.in

1
INCEPE
 a = 1
 b = a
 SCRIE a
 SCRIE b
 REPETA 10
 c = a + b
 a = b
 b = c
 SCRIE c
 STOP
STOP

gcl.out

12

Exemplu 2:

gcl.in

2
INCEPE
 n = 10
 k = 1
 REPETA 9
 n = n + k
 SCRIE n
 k = 3 - k
 STOP
STOP 

gcl.out

n = 11
n = 13
n = 14
n = 16
n = 17
n = 19
n = 20
n = 22
n = 23

Exemplu 3:

gcl.in

2
INCEPE
 x = 1
 REPETA 10
 x = 2x
 STOP
 SCRIE x
STOP 

gcl.out

x = 1024 

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 gcl:

//Emanuela Cerchez -100 puncte
#include <fstream>
#define LGMAX 104
#define NRMAX 54

using namespace std;
ifstream fin("gcl.in");
ofstream fout("gcl.out");
char s[LGMAX];
char p[NRMAX][LGMAX];
int v[26];

void unu();
void doi();
void spatii(char *s);
int expresie (char *);

int main()
{char c;
 int cerinta;
 fin>>cerinta; fin.get(c);
 if (cerinta==1) unu();
     else doi();
 fout.close();
 return 0;
}

void unu()
{
  int total=0, nr=1, i;
  fin.getline(s,LGMAX);//Incepe
  while (fin.getline(s,LGMAX))
        {spatii(s);
         if (s[1]=='C') //scrie
             total+=nr;
             else
             if (s[1]=='T') //stop
                 nr=1;
                 else
                 if (s[1]=='E') //repeta
                   {nr=0; i=6;
                    while (s[i]>='0' && s[i]<='9')
                         {nr=nr*10+s[i]-'0'; i++;  }
                  }
                  else //atribuire
                  v[s[0]-'a']=expresie(s+2);
        }
   fout<<total<<'\n';
}

void spatii(char * s)
{int nrs=0, i;
 for (i=0; s[i]; i++)
      if (s[i]==' ')  nrs++;
          else s[i-nrs]=s[i];
 s[i-nrs]=0;
}

int expresie (char * s)
{int i, valoare=0, t1, semn, n;
 //primul termen
 i=0; semn=1;
 while (1)
       {if (s[i]>='a' && s[0]<='z') {t1=v[s[i]-'a'];i++;}
            else //constanta
            {n=0;
            while (s[i]>='0' && s[i]<='9') {n=n*10+s[i]-'0'; i++;}
            if (s[i]>='a' && s[0]<='z')
               {t1=n*v[s[i]-'a'];i++;}
               else t1=n;
            }
        valoare+=semn*t1;
        if (s[i]=='+') {semn=1; i++;}
           else
           if (s[i]=='-') {semn=-1; i++;}
              else break;
    }
 return valoare;
}

void doi()
{int i=0, unde, lg, nr=1, j;
 while (fin.getline(p[i],LGMAX))
        {spatii(p[i]); i++; }
 lg=i; i=1;
 while (1)
       {
         if (p[i][1]=='C') //scrie
            {
             fout<<p[i][5]<<" = "<<v[p[i][5]-'a']<<'\n';
             i++;
             }
             else
             if (p[i][1]=='T') //stop
                {if (nr==1) {i++; if (i==lg) break;}
                    else {nr--; i=unde;}
                }
                else
                if (p[i][1]=='E') //repeta
                  {
                   nr=0; j=6;
                   while  (p[i][j]>='0' && p[i][j]<='9')
                         {
                          nr=nr*10+p[i][j]-'0';
                          j++;
                         }
                   i++;
                   if (nr>0)
                      unde=i;
                      else
                      {
                       while (p[i][1]!='T') i++;
                       i++;
                      }
                  }
                  else //atribuire
                  {
                   v[p[i][0]-'a']=expresie(p[i]+2);
                   i++;
                  }
        }
}

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 #2471 gcl

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #2471 gcl 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!