Rvnikita
Member | Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору Sleepwalker Да исходник рабочий! evilman Спасибо огромное... вот переделываю тут эту прогу под мои нужды... Сам начинающий, поэтому есть проблемсы.... =( Но ничего, справимся! Ещеб найти исходник проги, перущей производную.. Например как реализованно в Agrapher'e Добавлено А вот и проблеммы: Вроде написал, но не пашет... Более того при компиляции и запуске, все ок, но в самом конце, программа вылетает... ХЗ почему.... причем дебагил, именно в конце! Есть небольшие проблемсы с вычислением для Х больше 100 иль меньше 10 т.е не для двухзначных чисел! Но это устраним, а вот че делать с проблемсой не знаю =((( Может обращаюсь кудато туда, куда не стоит??? Вот пока что у меня получилось: Код: #include <graphics.h> #include <ctype.h> #include <conio.h> #include <iostream.h> #include <string.h> #include <dos.h> #include <stdlib.h> #include <math.h> int sizenum(int a); int a=0; double z; char *temp; char *temp2; char charnum(int x,int num) { num=sizenum(x)-num; int res=x,ost; for(int i=1;i<=num+1;i++) { ost=res%10; res=res/10; } return (char)(ost+48); } int sizenum(int a) { int i; for(i=0;;i++) { if(!(a/(pow(10,i))>=1)) {break;} } return (i); } // 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(int abs,char *s, int &err, int a=0, int z=-1) { strlwr(s); //Meniaet regist vsei stroki v nignii int m=sizenum(abs); for(int n=0;n<strlen(s);n++) { if(s[n]=='x') //Zameniaem vse x na 1 { s=(char*)realloc(s,sizeof(char)*(strlen(s)+m)); int c=(strlen(s)+m-1); s[c]=0; for(;c>=n+2;c--) { s[c-1]=s[c-2]; } for(int k=n,i=1;i<=m;k++,i++) { s[k]=charnum(abs,i); } // cout<<"!!"<<strlen(s)<<"!!"; // for(int b=0;b<m;b++) // {s[n+b]=(char)(abs+48); } // cout<<"\n\n l"<<s[n+b]<<" d"<<n<<" \n\n";} } } 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; } } //обработка операторов // + - ^ for(i=z;i>=a;i--) { if(s[i]==')')k++; //считаем скобки if(s[i]=='(')k--; if(s[i]=='+'&&k==0) // + detected return calcul(abs,s,err,a,i-1)+calcul(abs,s,err,i+1,z); if(s[i]=='-'&&k==0) // - detected return calcul(abs,s,err,a,i-1)-calcul(abs,s,err,i+1,z); if(s[i]=='^'&&k==0) // - detected return pow(calcul(abs,s,err,a,i-1),calcul(abs,s,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(abs,s,err,a,i-1)*calcul(abs,s,err,i+1,z); if(s[i]=='/'&&k==0) // / detected return calcul(abs,s,err,a,i-1)/calcul(abs,s,err,i+1,z); } //скобки if(s[a]=='(' && s[z]==')') return calcul(abs,s,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(abs,s,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(abs,s,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(abs,s,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(abs,s,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(abs,s,err,a+4,i-1); arg2=calcul(abs,s,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; } void main() { int driver, mode; driver=DETECT; //mode=0; initgraph(&driver, &mode, "c:\\work\\tc\\bgi\\"); char *f; cin>>f; //cout<<calcul(f,0); /*for(int x=0;x<10;x++) { char t[155]; strcpy(t,f); for(int n=0;n<strlen(f);n++) // { //Zameniaem vse x na 1 if(f[n]=='x') {f[n]=char(x+48); t[n]=char(x+48);} // } line(x,(int)calcul(f,0)*110+250,x+1,(int)calcul(t,0)*110+250); } */ //cout<<calcul(1,f,0,0,-1); for(int x=10;x<99;x++) { //cout<<x<<" "; //char temp[155],temp2[155]; if(a==0) {temp=(char*)malloc((strlen(f)+1)*sizeof(char)); temp2=(char*)malloc((strlen(f)+1)*sizeof(char)); a=1;} temp=(char*)realloc(temp,(strlen(f)+1)*sizeof(char)); temp2=(char*)realloc(temp2,(strlen(f)+1)*sizeof(char)); strcpy(temp,f); strcpy(temp2,f); //cout<<strlen(f); //cout<<calcul(x,temp,0,0,-1); line(x,-calcul(x,temp,0,0,-1)*3+250,x+1,-calcul(x+1,temp2,0,0,-1)*3+250); z=calcul(x,temp,0,0,-1); //cout<<calcul(x,temp,0,0,-1); delay(80); } getch(); } |
| Всего записей: 304 | Зарегистр. 09-01-2003 | Отправлено: 22:44 24-11-2003 | Исправлено: Rvnikita, 01:17 25-11-2003 |
|