#include <math.h> #include <string.h> // errorcodes for calcul() #define OK 0 #define ERR_UNKNOWN 1 // хз #define ERR_BREAKETS 2 // незакрытые скобки #define NO_ARG 3 // нет аргумента функции #define NOT_A_NUMBER 4 // невозможно преобразовать в число /* вычисляет значение заданного выражения s записывает код ошибки в err в случае ошибки возвращает 0 a и z - служебные параметры. */ float calcul(char *s, float x,int &err, int a=0, int z=-1) { char tmp[64]="0"; int i=0,k=0; float arg1=0, arg2=0; if(z==-1) //начало вычислений { z=strlen(s)-1; //определяем длину строки //проверка скобок for(i=z;i>=a;i--) { if(s[i]==')')k++; //считаем скобки if(s[i]=='(')k--; } if(k!=0) //незакрытые скобки { err=ERR_BREAKETS; return 0; } } // X if(s[a]=='x'&& a==z)return x; //обработка операторов // + - for(i=z;i>=a;i--) { if(s[i]==')')k++; //считаем скобки if(s[i]=='(')k--; if(s[i]=='+'&&k==0) // + detected return calcul(s,x,err,a,i-1)+calcul(s,x,err,i+1,z); if(s[i]=='-'&&k==0) // - detected return calcul(s,x,err,a,i-1)-calcul(s,x,err,i+1,z); } // * / for(i=z;i>=a;i--) { if(s[i]==')')k++; //считаем скобки if(s[i]=='(')k--; if(s[i]=='*'&&k==0) // * detected return calcul(s,x,err,a,i-1)*calcul(s,x,err,i+1,z); if(s[i]=='/'&&k==0) // / detected return calcul(s,x,err,a,i-1)/calcul(s,x,err,i+1,z); } //скобки if(s[a]=='(' && s[z]==')') return calcul(s,x,err,a+1,z-1); //обработка функций //sqrt if(s[a]=='s'&&s[a+1]=='q'&&s[a+2]=='r'&&s[a+3]=='t'&&s[a+4]=='('&&s[z]==')') { arg1=calcul(s,x,err,a+5,z-1); return sqrt(arg1); } //sin if(s[a]=='s'&&s[a+1]=='i'&&s[a+2]=='n'&&s[a+3]=='('&&s[z]==')') { arg1=calcul(s,x,err,a+4,z-1); return sin(arg1); } //cos if(s[a]=='c'&&s[a+1]=='o'&&s[a+2]=='s'&&s[a+3]=='('&&s[z]==')') { arg1=calcul(s,x,err,a+4,z-1); return cos(arg1); } //tan if(s[a]=='t'&&s[a+1]=='a'&&s[a+2]=='n'&&s[a+3]=='('&&s[z]==')') { arg1=calcul(s,x,err,a+4,z-1); return tan(arg1); } //pow if(s[a]=='p'&&s[a+1]=='o'&&s[a+2]=='w'&&s[a+3]=='('&&s[z]==')') { k=0; // ищем аргументы for(i=z-1;i>=a+4;i--) { if(s[i]==')')k++; //считаем скобки if(s[i]=='(')k--; if(s[i]==','&&k==0) // , detected { arg1=calcul(s,x,err,a+4,i-1); arg2=calcul(s,x,err,i+1,z-1); return pow(arg1,arg2); } } err=NO_ARG; // , так и не нашли } //обработка чисел for (i=0;i<=z-a;i++) { tmp[i]=s[a+i]; //проверка, число ли это if(!( tmp[i]=='1'|| tmp[i]=='2'|| tmp[i]=='3'|| tmp[i]=='4'|| tmp[i]=='5'|| tmp[i]=='6'|| tmp[i]=='7'|| tmp[i]=='8'|| tmp[i]=='9'|| tmp[i]=='0'|| tmp[i]=='.'|| tmp[i]=='-'|| tmp[i]=='E'|| tmp[i]=='e'|| tmp[i]==' ' ) ) { //не число err=NOT_A_NUMBER; return 0; } } tmp[z-a+1]='\0'; return atof(tmp); // баг err=ERR_UNKNOWN; return 0; } |