Advertisement
Trollkemada

Untitled

Jun 23rd, 2011
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.81 KB | None | 0 0
  1. /*
  2.  
  3. TODO:
  4.      -El ^ no funciona (debe ser por lo del espaccio
  5.      
  6.      
  7. */
  8.  
  9. #include <iostream>
  10. #include <math.h>
  11. using namespace std;
  12.  
  13. void limpiarEspacios(char v[]);
  14. float evaluar(char v[],int principio,int fin);
  15. int operaciones(char v[],int principio, int fin);
  16. int longitud(char v[]);
  17.  
  18. int main()
  19. {
  20.     char string[1000];
  21.     cout<<"Introduce una expresión: ";
  22.     fflush(stdin);
  23.     gets(string);
  24.     limpiarEspacios(string);
  25.     cout<<endl<<evaluar(string,0,longitud(string));
  26.     getchar();
  27.     main();
  28. }
  29.  
  30. // Conseguido en O(n) :D
  31. void limpiarEspacios(char v[])
  32. {
  33.      int acumulador=0;
  34.      for (int i=0;v[i]!='\0';i++)
  35.      {
  36.          while (v[i+acumulador]==' ') acumulador++;
  37.          v[i]=v[i+acumulador];
  38.          
  39.      }
  40. }
  41.          
  42.  
  43. float evaluar(char v[],int principio,int fin)
  44. {
  45.       float n1,n2,acu1,acu2;
  46.       char signo;
  47.       int i,j,r,dec;
  48.       bool punto;
  49.      
  50.       // Una mierda, pero funciona
  51.       if (operaciones(v,principio,fin)==0)
  52.       {
  53.                                           v[fin]='+';
  54.                                           v[fin+1]='0';
  55.                                           v[fin+2]='\0';
  56.       }
  57.      
  58.       // Caso base
  59.       if (operaciones(v,principio,fin)==1)
  60.       {
  61.             punto=false;
  62.             n1=acu1=0;
  63.             r=dec=0;
  64.             while(!(v[r]=='+' || v[r]=='*' || v[r]=='-' || v[r]=='-' || v[i]=='/' || v[i]=='^'))
  65.             {
  66.                               n1=n1*10+int(v[r])-int('0');
  67.                               r++;
  68.                               if (v[r]=='.')
  69.                               {
  70.                                     r++;
  71.                                     while (!(v[r]=='+' || v[r]=='*' || v[r]=='-' || v[r]=='-' || v[i]=='/' || v[i]=='^'))
  72.                                     {
  73.                                           //cout<<endl<<endl<<" PArte decimal hasta ahora: "<<acu1;
  74.                                           //getchar();
  75.                                           acu1=10*acu1+int(v[r])-int('0');
  76.                                           dec++;
  77.                                           r++;
  78.                                     }
  79.                                     //cout<<endl<<endl<<"procesado: parte entera = "<<n1<<" || parte decimal = "<<acu1;
  80.                                     dec--;
  81.                                     acu1=acu1/(10*pow(10,dec));
  82.                                     if (acu1!=0) n1=n1+acu1;
  83.                                     //cout<<endl<<"n1 = "<<n1;
  84.                               }
  85.             }
  86.             signo=v[r];
  87.             r++;
  88.             acu1=0;
  89.             dec=0;
  90.             n2=0;
  91.             while(r<fin)
  92.             {
  93.                               n2=n2*10+int(v[r])-int('0');
  94.                               r++;
  95.                               if (v[r]=='.')
  96.                               {
  97.                                     r++;
  98.                                     while (v[r]!='\0')
  99.                                     {
  100.                                           cout<<endl<<endl<<" PArte decimal hasta ahora: "<<acu1;
  101.                                           getchar();
  102.                                           acu1=10*acu1+int(v[r])-int('0');
  103.                                           dec++;
  104.                                           r++;
  105.                                     }
  106.                                     cout<<endl<<endl<<"procesado: parte entera = "<<n2<<" || parte decimal = "<<acu1;
  107.                                     dec--;
  108.                                     acu1=acu1/(10*pow(10,dec));
  109.                                     if (acu1!=0) n2=n2+acu1;
  110.                                     cout<<endl<<"n2 = "<<n2;
  111.                               }
  112.             }
  113.             cout<<endl<<endl<<" n1 = "<<n1<<" || n2 = "<<n2<<" || signo = "<<signo;
  114.             getchar();
  115.            
  116.             switch(signo)
  117.             {
  118.                          case '+':
  119.                               return n1+n2;
  120.                          case '-':
  121.                               return n1-n2;
  122.                          case '*':
  123.                               return n1*n2;
  124.                          case '/':
  125.                               return n1/n2;
  126.                          case '^':
  127.                               return pow(n1,n2);
  128.             }
  129.                              
  130.             getchar();
  131.       }
  132.      
  133.       return 5;
  134.                    
  135.                                                
  136.      
  137. }
  138.  
  139. int operaciones(char v[],int principio,int fin)
  140. {
  141.     int contador=0;
  142.     for(int i=principio;i<fin;i++) if( v[i]=='+' || v[i]=='*' || v[i]=='-' || v[i]=='-' || v[i]=='/' || v[i]=='^') contador++;
  143.     return contador;
  144. }
  145.  
  146. int longitud(char v[])
  147. {
  148.     for (int i=0;;i++) if (v[i]=='\0') return i;
  149. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement