Să considerăm o expresie aritmetică care conţine ca operanzi numai variabile al căror nume este format dintr-o singură literă mică a alfabetului englez. Valorile iniţiale ale variabilelor ce pot interveni în expresie sunt: a = 1
, b = 2
, …, z = 26
. În expresie pot fi utilizaţi doi operatori binari (+
şi –
, reprezentând adunarea şi respectiv scăderea) şi doi operatori unari (++
şi --
, reprezentând operatorul de incrementare şi respectiv operatorul de decrementare). Operatorii unari ++
şi ––
pot fi plasaţi numai înainte sau după o variabilă. Dacă operatorul unar ++
apare înaintea unei variabile, atunci valoarea variabilei este mărită cu 1
înainte ca valoarea variabilei să fie luată în calculul expresiei. De exemplu, valoarea expresiei ++c–b
este 2
, iar valoarea variabilei c
după evaluarea expresiei va fi 4
. Când operatorul unar ++
apare după variabilă, valoarea variabilei este mărită cu 1
după ce valoarea acelei variabile este folosită la calculul expresiei. De exemplu, valoarea expresiei c++–b
este 1
, iar valoarea variabilei c
după evaluarea expresiei va fi 4
. Operatorul ––
se comportă la fel, cu observaţia că valoarea variabilei se va micşora cu 1
. Operatorii unari au prioritate mai mare decât cei binari (mai exact, se execută mai întâi incrementările/decrementările, apoi adunările şi scăderile). În cazul în care există mai multe operaţii cu aceeaşi prioritate, acestea vor fi executate în ordine, de la stânga la dreapta.
Cerința
Scrieţi un program care să determine valoarea unei expresii, precum şi valorile finale ale variabilelor folosite în expresie.
Date de intrare
Fișierul de intrare eval.in
conţine pe prima linie expresia. Aceasta poate conţine şi spaţii.
Date de ieșire
Fișierul de ieșire eval.out
conţine pe prima linie un număr întreg care reprezintă valoarea expresiei, iar pe următoarele linii valorile variabilelor folosite în expresie, câte o valoare pe fiecare linie, în ordinea alfabetică a variabilelor.
Restricții și precizări
- Expresia va conţine cel puţin o variabilă.
- Numărul de caractere din expresie este mai mic decât
1000
- Expresia nu conţine nicio ambiguitate (de forma
a+++b
saua---b
) . - Operatorii
++
şi––
nu vor apărea simultan înainte şi după o variabilă (de exemplu,++a++
sau++a--
).
Exemplul 1:
eval.in
d -- + a – b
eval.out
3 1 2 3
Explicație
Valoarea expresiei este 3
a = 1
b = 2
d = 3
Exemplul 2:
eval.in
q- u -+ +a-c++ - ++ t
eval.out
-30 2 4 17 21 21
Explicație
Valoarea expresiei este -30
a = 2
c = 4
q = 17
t = 21
u = 21
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 eval:
#include <bits/stdc++.h>
#define LMax 1001
using namespace std;
char s[LMax];
int v[26], uz[26];
void eliminspatii()
{
int i;
for (i=0; s[i];)
if (s[i]==' ')
{s[i]=0;
strcat(s,s+i+1);
}
else i++;
}
void detvar()
{
int i;
for (i=0; s[i]; i++)
if (s[i]>='a' && s[i]<='z')
uz[s[i]-'a']=1;
}
int main()
{
int i, semn;
int e=0;
ifstream fin("eval.in");
ofstream fout("eval.out");
fin.getline(s,LMax);
fin.close();
for (i=0; i<26; i++) v[i]=i+1;
eliminspatii();
detvar();
i=0;
if (s[i]=='+')
{
if (s[i+1]!='+') {cout<<"Eroare in expresie\n"; return 0;}
if (s[i+2]>'z' || s[i+2]<'a'){cout<<"Eroare in expresie\n"; return 0;}
v[s[i+2]-'a']++;
e=v[s[i+2]-'a'];
i+=3;
}
else
if (s[i]=='-')
{
if (s[i+1]!='-') {cout<<"Eroare in expresie\n"; return 0;}
if (s[i+2]>'z' || s[i+2]<'a'){cout<<"Eroare in expresie\n"; return 0;}
v[s[i+2]-'a']--;
e=v[s[i+2]-'a'];
i+=3;
}
else
{
if (s[i]>'z' || s[i]<'a'){cout<<"Eroare in expresie\n"; return 0;}
e=v[s[i]-'a'];
i++;
}
if (s[i]=='+'&& s[i+1]=='+')
{v[s[i-1]-'a']++;
i+=2;}
else
if (s[i]=='-'&& s[i+1]=='-')
{v[s[i-1]-'a']--;
i+=2;}
//+/- operand
while (s[i])
{
if (s[i]=='+') semn=1;
else
if (s[i]=='-') semn=-1;
else
{cout<<"Eroare in expresie\n"; return 0;}
i++;
//ma ocup de operand
if (s[i]=='+')
{
if (s[i+1]!='+') {cout<<"Eroare in expresie\n"; return 0;}
if (s[i+2]>'z' || s[i+2]<'a'){cout<<"Eroare in expresie\n"; return 0;}
v[s[i+2]-'a']++;
e=e+semn*v[s[i+2]-'a'];
i+=3;
}
else
if (s[i]=='-')
{
if (s[i+1]!='-') {cout<<"Eroare in expresie\n"; return 0;}
if (s[i+2]>'z' || s[i+2]<'a'){cout<<"Eroare in expresie\n"; return 0;}
v[s[i+2]-'a']--;
e=e+semn*v[s[i+2]-'a'];
i+=3;
}
else
{
if (s[i]>'z' || s[i]<'a'){cout<<"Eroare in expresie\n"; return 0;}
e=e+semn*v[s[i]-'a'];
i++;
}
if (s[i]=='+'&& s[i+1]=='+')
{v[s[i-1]-'a']++;
i+=2;}
else
if (s[i]=='-'&& s[i+1]=='-')
{v[s[i-1]-'a']--;
i+=2;}
}
fout<<e<<'\n';
for (i=0; i<26; i++)
if (uz[i])
fout<<v[i]<<'\n';
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 .
Rezolvarea problemei #2212 eval
Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #2212 eval 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!