Informatică, întrebare adresată de Utilizator anonim, 8 ani în urmă

Implementați un algoritm care citește de la intrarea standard o expresie logică și scrie la ieșirea
standard rezultatul evaluării acestei expresii. Expresia logică de evaluat conține exclusiv
constantele T (TRUE) și F (FALSE), operatul unar ! (NOT), operatorii binari * (AND), + (OR) și ^ (XOR) și paranteze rotunde.
Exemplul 1
Intrare
T+F
Ieșire
T

Exemplul 2
Intrare
!!T*!!!((F)
Ieșire
T


boiustef: a doua oară postezi şi în exemplul 2 exresia logică e greşită, lipseşte o paranteză )
E grea problema.. încerc sp folosesc două stive, una pentru operaţii, alta pentru valori. Multe întorsături logice...
Utilizator anonim: DA, am postat inca o data pentru ca nu eram sigura daca intrebarea dispare dupa ceva timp sau nu:)) IAR exemplul doi nu e intocmai gresit pentru ca am intrebat si eu profesorul, iar acesta a spus ca acele paranteze sunt doar pentru derutare, ele nu se "iau in seama" cum ar veni, deci nu trebuiesc memorate niciunde, oarecum doar eliminate.
boiustef: o paranteză deschisă este eliminată la apariţia unei închise...
boiustef: Poftim şi linkul codului de pe pastebin ca să nu ai probleme la copiere...
https://pastebin.com/XSntfSAx

Răspunsuri la întrebare

Răspuns de boiustef
2

Răspuns:

#include <iostream>

#include <cstring>

#include <fstream>

using namespace std;

ifstream f("logica.in");

ofstream g("logica.out");

char c1[200], c2[200], op[]="(*+^!", val[]="FT", ch, expr[256];

short v1=-1,v2=-1, n, i;

int main()

{

  f >> expr;

  n=strlen(expr);

  c1[0]='\0'; c2[0]='\0';

  for (i=0; i<n; ++i)

  {

      if (strchr(op,expr[i]))

      {

          ++v1; c1[v1]=expr[i];

      }

      if (strchr(val,expr[i]))

      {

          ++v2; c2[v2]=expr[i];

          while (c1[v1]=='!')

           {

               if (c2[v2]=='F') c2[v2]='T';

               else c2[v2]='F';

               --v1;

           }

          if (c1[v1]=='*')

          {

              if (c2[v2]=='T'&& c2[v2-1]=='T') { --v2; c2[v2]='T'; }

              else { --v2; c2[v2]='F'; }

          }

      }

      if (expr[i]==')')

      {

         if (c1[v1]=='(')

         {

             while (c1[v1]=='(')

             {

                 --v1;

             }

              while (c1[v1]=='!')

           {

               if (c2[v2]=='F') c2[v2]='T';

               else c2[v2]='F';

               --v1;

           }

            if (c1[v1]=='*')

            {

              if (c2[v2]=='T'&& c2[v2-1]=='T') { --v2; c2[v2]='T'; }

              else { --v2; c2[v2]='F'; }

              --v1;

            }

         }

      }

  }

   i=0;

   while (i<=v1)

   {

       if (c1[i]=='+')

       {

           if (c2[i]=='F' && c2[i+1]=='F')

               c2[i+1]='F';

           else c2[i+1]='T';

       }

       else

       {

           if ((c2[i]=='T' && c2[i+1]=='T')||(c2[i]=='F' && c2[i+1]=='F'))

               c2[i+1]='F';

           else c2[i+1]='T';

       }

       ++i;

   }

  g << c2[v2];

}

Explicație:

Am simulat stive pe şiruri de caractere, adăugând caractere şi mişcînd indicele (vârfurile) la stânga când scoatem din stivă. O stivă am folosit pentru operatori şi paranteza deschisă, altă stivă pentru valorile T sau F.

Parcă lucrează bine.. :))) Am dat câteva exemple de expresii şi îmi dă rezultat corect.  Nu am folosit liste dinamice că e mai mult de scris, dar e realizabil acum când am simulat procesul. Cinstit, fac de prima dată asta...

Apropo, parcurgând expresia logică am creat stivele în care operaţiile negaţia, AND şi parantezele le evaluam pe parcurs. După acestea rămâne o stivă de operaţii OR şi XOR de aceeaşi prioritate  pe care le evaluez parcurgând de la stânga la dreapta.

Scuze că nu am creat ceva mai original...


Utilizator anonim: SCUZE??? pentru ce? haha, multumeeeesc
boiustef: cu plăcere
boiustef: vezi am pus mai sus şi lunk-ul de pe pastebin
Utilizator anonim: AM VAZUT, acum trebuie doar sa imi dau seama cu debug ul cum lucreaza:))
Utilizator anonim: desigur, pe langa explicatiile date de dvs. ;)
boiustef: :)) succese
Alte întrebări interesante