Camelia este pasionată de operații aritmetice. Într-o zi, s-a gândit să evalueze valoarea unei expresii ce este formată din litere mici şi operatorii: +
, <
, >
. În expresie, fiecare literă va fi înlocuită cu numărul de ordine pe care îl are în alfabet (a=1
, b=2
etc.). Prietena ei, Mădălina i-a pregătit Cameliei mai multe expresii de acest tip, pe care să le evalueze și apoi să determine care este numărul cel mai mare, obținut dintr-un șir de litere, din expresiile date.
Cerința
Scrieţi un program care determină pentru un şir de n
expresii, formate din litere mici şi operatorii: +
, <
, >
, două cerinţe:
-cerinţa 1
: să determine numărul cel mai mare, obținut dintr-un șir de litere, din expresiile date;
-cerinţa 2
: să evalueze fiecare expresie și să afișeze valoarea ei.
Date de intrare
Fișierul de intrare expresie9.in
conţine pe prima linie două numere naturale t
şi n
, care reprezintă cerinţa (dacă t=1
se va rezolva cerinţa 1
, dacă t=2
se va rezolva cerinţa 2
) şi respectiv, numărul de expresii date. Pe fiecare dintre următoarele n
linii se află o expresie, formată din litere mici şi operatorii : +, <, >
.
Date de ieșire
Fișierul de ieșire expresie9.out
va conține, pentru cerința 1
numărul cel mai mare, obținut dintr-un șir de litere, din toate expresiile date în fișierul de intrare. Pentru cerința 2
, pe fiecare dintre primele n
linii ca fi valoarea fiecărei expresii, în ordinea dată în fișierul de intrare.
Restricții și precizări
0 < n ≤ 100
- Fiecare expresie conţine cel mult
80
de caractere ce pot fi litere mici ale alfabetului englez, unul sau mai mulți operatori+
,<
,>
- Fiecare expresie conţine cel puţin un operator
- Fiecare şir de litere din expresiile date conţine cel mult
60
de litere mici ale alfabetului englez - O expresie va conţine cel mult un operator de tipul:
<
,>
- O expresie ce conţine un operator de tipul:
<
,>
va avea valoarea0
sau1
- Expresiile date sunt corecte
Exemplul 1:
expresie9.in
1 2 abcd+cde a+cd+dbcd>abc
expresie9.out
4234
Explicație
Cerința este 1
. Numerele din expresiile date sunt în ordine: 1234
, 345
, 1
, 34
, 4234
, 123
. Cel mai mare este 4234
.
Exemplul 2:
expresie9.in
2 3 a+b<c abc+xy abc>ab+d
expresie9.out
0 2548 1
Explicație
Cerința este 2
: expresiile sunt:
a + b < c
echivalentă cu 1 + 2 < 3
, (a = 1
, b = 2
, c = 3
), 3 < 3
este fals, deci expresia are valoarea 0
abc + xy
, echivalentă cu 123 + 2425
are valoarea 2548
(abc = 123
, x = 24
, y = 25
)
abc > ab + d
, echivalentă cu 123 > 12 + 4
, are valoarea 1
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 expresie9:
#include <fstream>
#include <iostream>
#include<string.h>
using namespace std;
ifstream fin("expresie9.in");
ofstream fout("expresie9.out");
int s1[2000],s2[2000],n,t,a[1000],vmax[2000];
char c[1001],*p;
void scrie(int a[])
{
for(int i=a[0];i>=1;i--)fout<<a[i];
fout<<endl;
}
void scrie1(int a[])
{
int i;
for(int i=a[0];i>=1;i--)cout<<a[i];
cout<<endl;
}
void suma(int s[],int a[])//s=s+a
{
int i,t,nr;
nr=s[0];
if(a[0]>nr)nr=a[0];
for(i=1;i<=a[0];i++)s[i]=s[i]+a[i];
t=0;
for(i=1;i<=nr;i++)
{
s[i]=s[i]+t;
t=s[i]/10;
s[i]=s[i]%10;
}
if(t>0)
{
nr++;
s[nr]=1;
}
s[0]=nr;
}
void zero( int y[])
{
for(int i=0;i<1000;i++)y[i]=0;
}
void transf(char *p)
{
int i,lg,cod,u,v;
char aux;
lg=0;
for(i=0;i<strlen(p);i++)
{
cod=p[i]-'a'+1;
if(cod<=9)
{
lg++;
a[lg]=cod;
}
else
{
lg++;
a[lg]=cod/10;
lg++;
a[lg]=cod%10;
}
}
a[0]=lg;
u=1;v=lg;
while(u<v)
{
aux=a[u]; a[u]=a[v];a[v]=aux;
u++; v--;
}
}
int compara(int x[],int y[]) /// returnez 1, -1 sau 0
{
if(x[0]>y[0]) return 1;
if(x[0]<y[0])
return -1;
for(int i=x[0];i>=1;i--)
{
if(x[i]>y[i])return 1;
if(x[i]<y[i])return -1;
}
return 0;
}
void copie(int vmax[],int a[])
{
for(int i=0;i<=a[0];i++) vmax[i]=a[i];
}
void cerinta2()
{
int i,rez;
char sep[]="+<=>";
vmax[0]=1;
for(i=1;i<=n;i++)
{
fin.getline(c,1001);
p=strtok(c,sep);
while(p!=NULL)
{
zero(a);///a=0
transf(p);/// compun a
rez=compara(a,vmax);/// a>vmax
if(rez==1)copie(vmax,a);/// vmax=a
p=strtok(NULL,sep);
}
}
scrie(vmax);
}
void evaluare(char *d,int z[])
{
zero(z);
z[0]=1;
p=strtok(d,"+");
while(p!=NULL)
{
zero(a);///a=0
transf(p);/// compun a
//scrie1(a);
suma(z,a);
p=strtok(NULL,"+");
}
}
void cerinta1()
{
char *q,*r,aux[3];
int i,lg,j,rez,k;
for(k=1;k<=n;k++)
{
fin.getline(c,1000);
lg=strlen(c);
i=0;
while(c[i]!='<' &&c[i]!='>' && i<lg)
i++;
if(i==lg)
{
evaluare(c,s1);
scrie(s1);
zero(s1);
zero(a);
}
else
{
j=i;
strncpy(aux,c+i,2);
if(aux[1]=='=')aux[2]='\0';
else aux[1]='\0';
while(c[j]=='>' || c[j]=='<' || c[j]=='=')j++;
c[i]='\0';
evaluare(c,s1);
evaluare(c+j,s2);
rez=compara(s1,s2);
if(strlen(aux)==1)
if(aux[0]=='>')fout<< (rez==1)<<endl;
else fout<< (rez==-1)<<endl;
else
if(aux[0]=='>')fout<< (rez>=0)<<endl;
else fout<< (rez<=0)<<endl;
zero(s1);
zero(s2);
}
}
}
int main()
{
fin>>t>>n;
fin.get();
if(t==2)cerinta1();
else cerinta2();
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 #2185 expresie9
Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #2185 expresie9 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!