Advertisement
nRikee

String Calculator (3)

Jul 10th, 2012
137
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.83 KB | None | 0 0
  1. #include <iostream>
  2. #include <sstream>
  3.  
  4. using namespace std;
  5.  
  6. /** Realiza la suma de una cadena de números dados en formato string, separados entre comas. */
  7. int Add(string);
  8. /** Devuelve el número de divisiones */
  9. int numPartes(string);
  10.  
  11. /**
  12.   * Función main de prueba
  13.   */
  14. int main()
  15. {
  16.     cout << "Prueba Add(): " << Add("") << endl << endl;
  17.     cout << "Prueba Add( 2 ): " << Add("2") <<endl << endl;
  18.     cout << "Prueba Add( 8347 ): " << Add("8347") <<endl << endl;
  19.     cout << "Prueba Add( 10\\n8 ): " << Add("10\n8") <<endl << endl;
  20.     cout << "Prueba Add( 8,400 ): " << Add("8,400") <<endl << endl;
  21.     cout << "Prueba Add( 5,5\\n5,4,5\\n100 ): " << Add("5,5\n5,4,5\n100") << endl << endl;
  22.     cout << "Prueba Add( 1,2,3\\n4\\n5,6,7,8,9,10\\n1000 ): " << Add("1,2,3\n4\n5,6,7,8,9,10\n1000") << endl << endl;
  23.  
  24.     return 0;
  25. }
  26.  
  27. /**
  28.   * Realiza la suma de una cadena de números dados en formato string, separados entre comas.
  29.   */
  30. int Add(string numeros){
  31.     int NUMERO_PARTICIONES = numPartes(numeros); // ¿Cuántos números hay en la cadena?
  32.     string parte[NUMERO_PARTICIONES];
  33.     string auxiliar;
  34.     int aux = 0,aux2;
  35.     int pos, pos2, posBueno, resultado = 0;
  36.  
  37.     /** Case para 'n' != 0 y 1 */
  38.     if(numeros.find(',')!=-1){
  39.         parte[0]=numeros;
  40.  
  41.         for( int a=1; aux!=-1 || aux2!=-1; a++ ){
  42.             auxiliar = parte[a-1];
  43.             aux = 0;
  44.  
  45.             pos = auxiliar.find(',');
  46.             pos2 = auxiliar.find("\n");
  47.  
  48.             /* Los dos aparecen en la string */
  49.             if(pos!=-1 && pos2!=-1){
  50.                 if(pos<pos2) posBueno=pos; else posBueno=pos2; // Se toma el que aparece antes. El número menor.
  51.                 parte[a-1] = auxiliar.substr(aux, posBueno);
  52.                 parte[a] = auxiliar.substr(posBueno+1,auxiliar.length());
  53.             }
  54.             /* Aparece uno de los dos */
  55.             if(pos==-1 && pos2!=-1){
  56.                 parte[a-1] = auxiliar.substr(aux, pos2);
  57.                 parte[a] = auxiliar.substr((pos>pos2?pos:pos2)+1,auxiliar.length());
  58.             }
  59.  
  60.             /*Recalcula pos y pos2 */
  61.             aux = parte[a].find(',');
  62.             aux2 = parte[a].find("\n");
  63.         }
  64.     }
  65.  
  66.     /** Case 2 particiones y separador \n */ // No, no sé por qué no funciona sin esto...
  67.     if(NUMERO_PARTICIONES==2){
  68.         parte[0] = numeros.substr(0,(numeros.find("\n")==-1?numeros.find(','):numeros.find("\n")));
  69.         parte[1] = numeros.substr((numeros.find("\n")==-1?numeros.find(','):numeros.find("\n"))+1,numeros.length());
  70.     }
  71.  
  72.     /** Case un solo numero */
  73.     if((numeros.find(',')==-1 && numeros.find("\n")==-1) || numeros.length()==1){ // Si no hay ninguna coma ni \n, o solo tiene un valor
  74.         parte[0]=numeros;
  75.     }
  76.     /** Case ningún número */
  77.     if(numeros.length()==0){
  78.         return 0;
  79.     }
  80.  
  81.     /** Conversión de strings a enteros y suma */
  82.     for(int a=0; a<NUMERO_PARTICIONES; a++){
  83.         std::stringstream(parte[a]) >> aux; // Convierte la string en un int.
  84.         resultado += aux; // Se suma al resultado
  85.     }
  86.     return resultado;
  87. }
  88.  
  89. /**
  90.   *  Devuelve el número de divisiones
  91.   */
  92. int numPartes(string numeros){
  93.     int aux, aux2, resultado = 1;
  94.     string cortada = numeros;
  95.     aux = cortada.find(',');
  96.     aux2 = cortada.find("\n");
  97.  
  98.     while(aux!=-1 || aux2!=-1){ // Mientras uno de los dos aparezca (!=-1)...
  99.         if(aux!=-1 && aux2!=-1) {
  100.             cortada = cortada.substr((aux<aux2?aux:aux2)+1,cortada.length()); // Si los dos aparecen en la string, se toma el de menor posición.
  101.         }
  102.         /* Aparece uno de los dos*/
  103.         else cortada = cortada.substr((aux>aux2?aux:aux2)+1,cortada.length()); // El mayor
  104.  
  105.         /* Continua */
  106.         resultado++;
  107.         aux = cortada.find(',');
  108.         aux2 = cortada.find("\n");
  109.     }
  110.  
  111.     return resultado;
  112. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement