# PBinfo #2185 – expresie9 – Rezolvare C++

Sursa: Codul lui Andrei
Limbaj: C++
Autor rezolvare: Darius

## Enunț

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 valoarea 0 sau 1
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

## Cod sursă C++

```cpp
#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;
}
```

## Resurse

- [Pagina originală](https://codulluiandrei.ro/rezolvari/pbinfo/2185)
- [Sursa C++](https://codulluiandrei.ro/rezolvari/pbinfo/2185/cod.cpp)
- [Sursa pe GitHub](https://raw.githubusercontent.com/codulluiandrei/pbinfo/main/pbinfo-2185/main.cpp)
- [Cursuri de informatică pentru BAC](https://codulluiandrei.ro/academia/info-curs/pachet-cpp/)
