Rezolvare completă PbInfo #2185 expresie9

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

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 Adresa de email.

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!