Marian23

Expresie

Jan 14th, 2021
351
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <iostream>
  2. #include <cstring>
  3. #include <winbgim.h>
  4. #define MAX_LEN 100
  5. using namespace std;
  6.  
  7. enum Tipul {variabila_, constanta_, functie_, operator_, paranteza_deschisa, paranteza_inchisa};
  8.  
  9. struct ListaCuvinte{
  10.     char cuv[MAX_LEN][MAX_LEN];
  11.     int length = 0;
  12.     Tipul tipul[MAX_LEN];
  13. };
  14.  
  15. ListaCuvinte functie;
  16. HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
  17. bool expresiaEsteCorecta = true;
  18.  
  19. void init(){
  20.     strcpy(functie.cuv[0], "sin");
  21.     strcpy(functie.cuv[1], "cos");
  22.     strcpy(functie.cuv[2], "tan");
  23.     strcpy(functie.cuv[3], "ctg");
  24.     strcpy(functie.cuv[4], "ln");
  25.     strcpy(functie.cuv[5], "lg");
  26.     functie.length = 6;
  27. }
  28.  
  29. bool esteLitera(char c){
  30.     return ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) ? true : false;
  31. }
  32.  
  33. bool esteCifra(char c){
  34.     return (c >= '0' && c <= '9') ? true : false;
  35. }
  36.  
  37. bool esteNumeValidDeVariabila(char variabila[MAX_LEN]){
  38.     for(int i = 1; i < strlen(variabila) - 1; ++i){
  39.         if(esteCifra(variabila[i]) && esteLitera(variabila[i+1])){
  40.             return false;
  41.         }
  42.     }
  43.     return true;
  44. }
  45.  
  46. ListaCuvinte despartireExpresie(char expresie[MAX_LEN]){
  47.     ListaCuvinte lista;
  48.     for(int i = 0; i < strlen(expresie); ++i){
  49.         if(strchr("()*+-/^", expresie[i])){
  50.             lista.cuv[lista.length++][0] = expresie[i];
  51.             if(expresie[i] == '('){
  52.                 lista.tipul[lista.length-1] = paranteza_deschisa;
  53.             }
  54.             else if(expresie[i] == ')'){
  55.                 lista.tipul[lista.length-1] = paranteza_inchisa;
  56.             }
  57.             else{
  58.                 lista.tipul[lista.length-1] = operator_;
  59.             }
  60.         }
  61.         for(int j = 0; j < functie.length; ++j){
  62.             if(strncmp(expresie+i, functie.cuv[j], strlen(functie.cuv[j])) == 0){
  63.                 strcpy(lista.cuv[lista.length++], functie.cuv[j]);
  64.                 i += strlen(functie.cuv[j])-1;
  65.                 lista.tipul[lista.length-1] = functie_;
  66.             }
  67.         }
  68.         if(esteLitera(expresie[i]) && !esteLitera(expresie[i-1])){
  69.             int lungimeVariabila = 0;
  70.             while(esteCifra(expresie[i]) || esteLitera(expresie[i])){
  71.                 lungimeVariabila++;
  72.                 i++;
  73.             }
  74.             strncpy(lista.cuv[lista.length++], expresie + (i - lungimeVariabila), lungimeVariabila);
  75.             lista.tipul[lista.length-1] = variabila_;
  76.             i--;
  77.         }
  78.         if(esteCifra(expresie[i]) && !esteCifra(expresie[i-1]) && !esteLitera(expresie[i-1])){
  79.             int lungimeNumar = 0;
  80.             while(esteCifra(expresie[i])){
  81.                 lungimeNumar++;
  82.                 i++;
  83.             }
  84.             strncpy(lista.cuv[lista.length++], expresie + (i - lungimeNumar), lungimeNumar);
  85.             lista.tipul[lista.length-1] = constanta_;
  86.             i--;
  87.         }
  88.     }
  89.     return lista;
  90. }
  91.  
  92. void testareValid(ListaCuvinte listaTokeni){
  93.     int scorParanteze = 0;
  94.     bool eAfisatMesajPentruParanteze = false;
  95.     for(int i = 0; i < listaTokeni.length - 1; ++i){
  96.         if(scorParanteze < 0 && !eAfisatMesajPentruParanteze){
  97.             cout << "Parantezele sunt puse gresit!\n";
  98.             eAfisatMesajPentruParanteze = true;
  99.             expresiaEsteCorecta = false;
  100.         }
  101.         if(listaTokeni.tipul[i] == operator_){ ///cazul operator
  102.             if(listaTokeni.tipul[i+1] == operator_ || listaTokeni.tipul[i+1] == paranteza_inchisa){
  103.                 cout << "Dupa un operator poate urma o variabila, o functie, o constanta sau o paranteza deschisa!\n";
  104.                 expresiaEsteCorecta = false;
  105.             }
  106.         }
  107.         if(listaTokeni.tipul[i] == variabila_){ ///cazul variabila
  108.             if(!(listaTokeni.tipul[i+1] == operator_ || listaTokeni.tipul[i+1] == paranteza_inchisa)){
  109.                 cout << "Dupa o variabila poate urma un operator sau o paranteza inchisa!\n";
  110.                 expresiaEsteCorecta = false;
  111.             }
  112.             if(!esteNumeValidDeVariabila(listaTokeni.cuv[i])){
  113.                 cout << "Variabila " << listaTokeni.cuv[i] << " are nume gresit!\n";
  114.                 expresiaEsteCorecta = false;
  115.             }
  116.         }
  117.         if(listaTokeni.tipul[i] == constanta_){ /// cazul constanta
  118.             if(!(listaTokeni.tipul[i+1] == operator_ || listaTokeni.tipul[i+1] == paranteza_inchisa)){
  119.                 cout << "Dupa o constanta poate urma un operator sau o paranteza inchisa!\n";
  120.                 expresiaEsteCorecta = false;
  121.             }
  122.         }
  123.         if(listaTokeni.tipul[i] == functie_){ /// cazul functie
  124.             if(listaTokeni.tipul[i+1] != paranteza_deschisa){
  125.                 cout << "Dupa un nume de functie poate urma doar o paranteza deschisa!\n";
  126.                 expresiaEsteCorecta = false;
  127.             }
  128.         }
  129.         if(listaTokeni.tipul[i] == paranteza_deschisa){ /// cazul paranteza deschisa
  130.             scorParanteze++;
  131.             if(listaTokeni.tipul[i+1] == paranteza_inchisa || (listaTokeni.tipul[i+1] == operator_ && !(listaTokeni.cuv[i+1][0] == '+' || listaTokeni.cuv[i+1][0] == '-')) ){
  132.                 cout << "Dupa paranteza deschisa poate urma o alta paranteza deschisa, un nume de functie, o variabila, o constanta sau chiar operatorul unar + sau -!\n";
  133.                 expresiaEsteCorecta = false;
  134.             }
  135.         }
  136.         if(listaTokeni.tipul[i] == paranteza_inchisa){
  137.             scorParanteze--;
  138.             if(!(listaTokeni.tipul[i+1] == paranteza_inchisa || listaTokeni.tipul[i+1] == operator_)){
  139.                 cout << "Dupa paranteza inchisa poate urma o alta paranteza inchisa sau un operator!\n";
  140.                 expresiaEsteCorecta = false;
  141.             }
  142.         }
  143.     }
  144.  
  145.     if(listaTokeni.tipul[listaTokeni.length-1] == paranteza_inchisa){
  146.         scorParanteze--;
  147.     }
  148.     else if(listaTokeni.tipul[listaTokeni.length-1] == paranteza_deschisa){
  149.         scorParanteze++;
  150.         cout << "Expresia nu trebuie sa se termine cu paranteza deschisa!\n";
  151.         expresiaEsteCorecta = false;
  152.     }
  153.     else if(listaTokeni.tipul[listaTokeni.length-1] == functie_){
  154.         cout << "Expresia nu trebuie sa se termine cu o functie!\n";
  155.         expresiaEsteCorecta = false;
  156.     }
  157.     else if(listaTokeni.tipul[listaTokeni.length-1] == operator_){
  158.         cout << "Expresia nu trebuie sa se termine cu un operator!\n";
  159.         expresiaEsteCorecta = false;
  160.     }
  161.  
  162.     if(scorParanteze != 0 && !eAfisatMesajPentruParanteze){
  163.         cout << "Parantezele sunt puse gresit!\n";
  164.         expresiaEsteCorecta = false;
  165.     }
  166. }
  167.  
  168. int main(){
  169.     char expresie[MAX_LEN];
  170.     init();
  171.     cout << "Introduceti o expresie! \n>> ";
  172.     cin.get(expresie, MAX_LEN);    
  173.     SetConsoleTextAttribute(hConsole, 12);
  174.     ListaCuvinte lista = despartireExpresie(expresie);
  175.     int bvdiufnxkjn = 1; /// DE CEEEEEEEEEEEEEEEEE??????????????????????????
  176.     testareValid(lista);
  177.     if(expresiaEsteCorecta){
  178.         SetConsoleTextAttribute(hConsole, 10);
  179.         cout << "Expresia este corecta!\n";
  180.     }
  181.     SetConsoleTextAttribute(hConsole, 7);
  182.     return 0;
  183. }
RAW Paste Data