Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- TODO:
- -El ^ no funciona (debe ser por lo del espaccio
- */
- #include <iostream>
- #include <math.h>
- using namespace std;
- void limpiarEspacios(char v[]);
- float evaluar(char v[],int principio,int fin);
- int operaciones(char v[],int principio, int fin);
- int longitud(char v[]);
- int main()
- {
- char string[1000];
- cout<<"Introduce una expresión: ";
- fflush(stdin);
- gets(string);
- limpiarEspacios(string);
- cout<<endl<<evaluar(string,0,longitud(string));
- getchar();
- main();
- }
- // Conseguido en O(n) :D
- void limpiarEspacios(char v[])
- {
- int acumulador=0;
- for (int i=0;v[i]!='\0';i++)
- {
- while (v[i+acumulador]==' ') acumulador++;
- v[i]=v[i+acumulador];
- }
- }
- float evaluar(char v[],int principio,int fin)
- {
- float n1,n2,acu1,acu2;
- char signo;
- int i,j,r,dec;
- bool punto;
- // Una mierda, pero funciona
- if (operaciones(v,principio,fin)==0)
- {
- v[fin]='+';
- v[fin+1]='0';
- v[fin+2]='\0';
- }
- // Caso base
- if (operaciones(v,principio,fin)==1)
- {
- punto=false;
- n1=acu1=0;
- r=dec=0;
- while(!(v[r]=='+' || v[r]=='*' || v[r]=='-' || v[r]=='-' || v[i]=='/' || v[i]=='^'))
- {
- n1=n1*10+int(v[r])-int('0');
- r++;
- if (v[r]=='.')
- {
- r++;
- while (!(v[r]=='+' || v[r]=='*' || v[r]=='-' || v[r]=='-' || v[i]=='/' || v[i]=='^'))
- {
- //cout<<endl<<endl<<" PArte decimal hasta ahora: "<<acu1;
- //getchar();
- acu1=10*acu1+int(v[r])-int('0');
- dec++;
- r++;
- }
- //cout<<endl<<endl<<"procesado: parte entera = "<<n1<<" || parte decimal = "<<acu1;
- dec--;
- acu1=acu1/(10*pow(10,dec));
- if (acu1!=0) n1=n1+acu1;
- //cout<<endl<<"n1 = "<<n1;
- }
- }
- signo=v[r];
- r++;
- acu1=0;
- dec=0;
- n2=0;
- while(r<fin)
- {
- n2=n2*10+int(v[r])-int('0');
- r++;
- if (v[r]=='.')
- {
- r++;
- while (v[r]!='\0')
- {
- cout<<endl<<endl<<" PArte decimal hasta ahora: "<<acu1;
- getchar();
- acu1=10*acu1+int(v[r])-int('0');
- dec++;
- r++;
- }
- cout<<endl<<endl<<"procesado: parte entera = "<<n2<<" || parte decimal = "<<acu1;
- dec--;
- acu1=acu1/(10*pow(10,dec));
- if (acu1!=0) n2=n2+acu1;
- cout<<endl<<"n2 = "<<n2;
- }
- }
- cout<<endl<<endl<<" n1 = "<<n1<<" || n2 = "<<n2<<" || signo = "<<signo;
- getchar();
- switch(signo)
- {
- case '+':
- return n1+n2;
- case '-':
- return n1-n2;
- case '*':
- return n1*n2;
- case '/':
- return n1/n2;
- case '^':
- return pow(n1,n2);
- }
- getchar();
- }
- return 5;
- }
- int operaciones(char v[],int principio,int fin)
- {
- int contador=0;
- for(int i=principio;i<fin;i++) if( v[i]=='+' || v[i]=='*' || v[i]=='-' || v[i]=='-' || v[i]=='/' || v[i]=='^') contador++;
- return contador;
- }
- int longitud(char v[])
- {
- for (int i=0;;i++) if (v[i]=='\0') return i;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement