Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cstring>
- #include <winbgim.h>
- #define MAX_LEN 100
- using namespace std;
- enum Tipul {variabila_, constanta_, functie_, operator_, paranteza_deschisa, paranteza_inchisa};
- struct ListaCuvinte{
- char cuv[MAX_LEN][MAX_LEN];
- int length = 0;
- Tipul tipul[MAX_LEN];
- };
- ListaCuvinte functie;
- HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
- bool expresiaEsteCorecta = true;
- void init(){
- strcpy(functie.cuv[0], "sin");
- strcpy(functie.cuv[1], "cos");
- strcpy(functie.cuv[2], "tan");
- strcpy(functie.cuv[3], "ctg");
- strcpy(functie.cuv[4], "ln");
- strcpy(functie.cuv[5], "lg");
- functie.length = 6;
- }
- bool esteLitera(char c){
- return ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) ? true : false;
- }
- bool esteCifra(char c){
- return (c >= '0' && c <= '9') ? true : false;
- }
- bool esteNumeValidDeVariabila(char variabila[MAX_LEN]){
- for(int i = 1; i < strlen(variabila) - 1; ++i){
- if(esteCifra(variabila[i]) && esteLitera(variabila[i+1])){
- return false;
- }
- }
- return true;
- }
- ListaCuvinte despartireExpresie(char expresie[MAX_LEN]){
- ListaCuvinte lista;
- for(int i = 0; i < strlen(expresie); ++i){
- if(strchr("()*+-/^", expresie[i])){
- lista.cuv[lista.length++][0] = expresie[i];
- if(expresie[i] == '('){
- lista.tipul[lista.length-1] = paranteza_deschisa;
- }
- else if(expresie[i] == ')'){
- lista.tipul[lista.length-1] = paranteza_inchisa;
- }
- else{
- lista.tipul[lista.length-1] = operator_;
- }
- }
- for(int j = 0; j < functie.length; ++j){
- if(strncmp(expresie+i, functie.cuv[j], strlen(functie.cuv[j])) == 0){
- strcpy(lista.cuv[lista.length++], functie.cuv[j]);
- i += strlen(functie.cuv[j])-1;
- lista.tipul[lista.length-1] = functie_;
- }
- }
- if(esteLitera(expresie[i]) && !esteLitera(expresie[i-1])){
- int lungimeVariabila = 0;
- while(esteCifra(expresie[i]) || esteLitera(expresie[i])){
- lungimeVariabila++;
- i++;
- }
- strncpy(lista.cuv[lista.length++], expresie + (i - lungimeVariabila), lungimeVariabila);
- lista.tipul[lista.length-1] = variabila_;
- i--;
- }
- if(esteCifra(expresie[i]) && !esteCifra(expresie[i-1]) && !esteLitera(expresie[i-1])){
- int lungimeNumar = 0;
- while(esteCifra(expresie[i])){
- lungimeNumar++;
- i++;
- }
- strncpy(lista.cuv[lista.length++], expresie + (i - lungimeNumar), lungimeNumar);
- lista.tipul[lista.length-1] = constanta_;
- i--;
- }
- }
- return lista;
- }
- void testareValid(ListaCuvinte listaTokeni){
- int scorParanteze = 0;
- bool eAfisatMesajPentruParanteze = false;
- for(int i = 0; i < listaTokeni.length - 1; ++i){
- if(scorParanteze < 0 && !eAfisatMesajPentruParanteze){
- cout << "Parantezele sunt puse gresit!\n";
- eAfisatMesajPentruParanteze = true;
- expresiaEsteCorecta = false;
- }
- if(listaTokeni.tipul[i] == operator_){ ///cazul operator
- if(listaTokeni.tipul[i+1] == operator_ || listaTokeni.tipul[i+1] == paranteza_inchisa){
- cout << "Dupa un operator poate urma o variabila, o functie, o constanta sau o paranteza deschisa!\n";
- expresiaEsteCorecta = false;
- }
- }
- if(listaTokeni.tipul[i] == variabila_){ ///cazul variabila
- if(!(listaTokeni.tipul[i+1] == operator_ || listaTokeni.tipul[i+1] == paranteza_inchisa)){
- cout << "Dupa o variabila poate urma un operator sau o paranteza inchisa!\n";
- expresiaEsteCorecta = false;
- }
- if(!esteNumeValidDeVariabila(listaTokeni.cuv[i])){
- cout << "Variabila " << listaTokeni.cuv[i] << " are nume gresit!\n";
- expresiaEsteCorecta = false;
- }
- }
- if(listaTokeni.tipul[i] == constanta_){ /// cazul constanta
- if(!(listaTokeni.tipul[i+1] == operator_ || listaTokeni.tipul[i+1] == paranteza_inchisa)){
- cout << "Dupa o constanta poate urma un operator sau o paranteza inchisa!\n";
- expresiaEsteCorecta = false;
- }
- }
- if(listaTokeni.tipul[i] == functie_){ /// cazul functie
- if(listaTokeni.tipul[i+1] != paranteza_deschisa){
- cout << "Dupa un nume de functie poate urma doar o paranteza deschisa!\n";
- expresiaEsteCorecta = false;
- }
- }
- if(listaTokeni.tipul[i] == paranteza_deschisa){ /// cazul paranteza deschisa
- scorParanteze++;
- if(listaTokeni.tipul[i+1] == paranteza_inchisa || (listaTokeni.tipul[i+1] == operator_ && !(listaTokeni.cuv[i+1][0] == '+' || listaTokeni.cuv[i+1][0] == '-')) ){
- cout << "Dupa paranteza deschisa poate urma o alta paranteza deschisa, un nume de functie, o variabila, o constanta sau chiar operatorul unar + sau -!\n";
- expresiaEsteCorecta = false;
- }
- }
- if(listaTokeni.tipul[i] == paranteza_inchisa){
- scorParanteze--;
- if(!(listaTokeni.tipul[i+1] == paranteza_inchisa || listaTokeni.tipul[i+1] == operator_)){
- cout << "Dupa paranteza inchisa poate urma o alta paranteza inchisa sau un operator!\n";
- expresiaEsteCorecta = false;
- }
- }
- }
- if(listaTokeni.tipul[listaTokeni.length-1] == paranteza_inchisa){
- scorParanteze--;
- }
- else if(listaTokeni.tipul[listaTokeni.length-1] == paranteza_deschisa){
- scorParanteze++;
- cout << "Expresia nu trebuie sa se termine cu paranteza deschisa!\n";
- expresiaEsteCorecta = false;
- }
- else if(listaTokeni.tipul[listaTokeni.length-1] == functie_){
- cout << "Expresia nu trebuie sa se termine cu o functie!\n";
- expresiaEsteCorecta = false;
- }
- else if(listaTokeni.tipul[listaTokeni.length-1] == operator_){
- cout << "Expresia nu trebuie sa se termine cu un operator!\n";
- expresiaEsteCorecta = false;
- }
- if(scorParanteze != 0 && !eAfisatMesajPentruParanteze){
- cout << "Parantezele sunt puse gresit!\n";
- expresiaEsteCorecta = false;
- }
- }
- int main(){
- char expresie[MAX_LEN];
- init();
- cout << "Introduceti o expresie! \n>> ";
- cin.get(expresie, MAX_LEN);
- SetConsoleTextAttribute(hConsole, 12);
- ListaCuvinte lista = despartireExpresie(expresie);
- int bvdiufnxkjn = 1; /// DE CEEEEEEEEEEEEEEEEE??????????????????????????
- testareValid(lista);
- if(expresiaEsteCorecta){
- SetConsoleTextAttribute(hConsole, 10);
- cout << "Expresia este corecta!\n";
- }
- SetConsoleTextAttribute(hConsole, 7);
- return 0;
- }
RAW Paste Data