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 comenziSCRIE
executate. - Dacă cerința este 2, fișierul de ieșire
gcl.out
va conține rezultatele afișate de comenzileSCRIE
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 comenzileREPETA
este un număr natural,0 ≤ n ≤ 10
. - Nu pot exista comenzi
REPETA
imbricate. Mai exact, după comandaREPETA
și până la comandaSTOP
care
marchează sfârșitul comenziiREPETA
nu poate apărea o altă comandăREPETA
. - Valorile calculate în expresii sunt, la orice moment, numere întregi din intervalul
[-2
31
, 2
31
-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 .
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!