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
https://pastebin.com/XSntfSAx
Răspunsuri la întrebare
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...
E grea problema.. încerc sp folosesc două stive, una pentru operaţii, alta pentru valori. Multe întorsături logice...