Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <sstream>
- using namespace std;
- /** Realiza la suma de una cadena de números dados en formato string, separados entre comas. */
- int Add(string);
- /** Devuelve el número de divisiones */
- int numPartes(string);
- /**
- * Función main de prueba
- */
- int main()
- {
- cout << "Prueba Add(): " << Add("") << endl << endl;
- cout << "Prueba Add( 2 ): " << Add("2") <<endl << endl;
- cout << "Prueba Add( 8347 ): " << Add("8347") <<endl << endl;
- cout << "Prueba Add( 10\\n8 ): " << Add("10\n8") <<endl << endl;
- cout << "Prueba Add( 8,400 ): " << Add("8,400") <<endl << endl;
- cout << "Prueba Add( 5,5\\n5,4,5\\n100 ): " << Add("5,5\n5,4,5\n100") << endl << endl;
- 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;
- return 0;
- }
- /**
- * Realiza la suma de una cadena de números dados en formato string, separados entre comas.
- */
- int Add(string numeros){
- int NUMERO_PARTICIONES = numPartes(numeros); // ¿Cuántos números hay en la cadena?
- string parte[NUMERO_PARTICIONES];
- string auxiliar;
- int aux = 0,aux2;
- int pos, pos2, posBueno, resultado = 0;
- /** Case para 'n' != 0 y 1 */
- if(numeros.find(',')!=-1){
- parte[0]=numeros;
- for( int a=1; aux!=-1 || aux2!=-1; a++ ){
- auxiliar = parte[a-1];
- aux = 0;
- pos = auxiliar.find(',');
- pos2 = auxiliar.find("\n");
- /* Los dos aparecen en la string */
- if(pos!=-1 && pos2!=-1){
- if(pos<pos2) posBueno=pos; else posBueno=pos2; // Se toma el que aparece antes. El número menor.
- parte[a-1] = auxiliar.substr(aux, posBueno);
- parte[a] = auxiliar.substr(posBueno+1,auxiliar.length());
- }
- /* Aparece uno de los dos */
- if(pos==-1 && pos2!=-1){
- parte[a-1] = auxiliar.substr(aux, pos2);
- parte[a] = auxiliar.substr((pos>pos2?pos:pos2)+1,auxiliar.length());
- }
- /*Recalcula pos y pos2 */
- aux = parte[a].find(',');
- aux2 = parte[a].find("\n");
- }
- }
- /** Case 2 particiones y separador \n */ // No, no sé por qué no funciona sin esto...
- if(NUMERO_PARTICIONES==2){
- parte[0] = numeros.substr(0,(numeros.find("\n")==-1?numeros.find(','):numeros.find("\n")));
- parte[1] = numeros.substr((numeros.find("\n")==-1?numeros.find(','):numeros.find("\n"))+1,numeros.length());
- }
- /** Case un solo numero */
- if((numeros.find(',')==-1 && numeros.find("\n")==-1) || numeros.length()==1){ // Si no hay ninguna coma ni \n, o solo tiene un valor
- parte[0]=numeros;
- }
- /** Case ningún número */
- if(numeros.length()==0){
- return 0;
- }
- /** Conversión de strings a enteros y suma */
- for(int a=0; a<NUMERO_PARTICIONES; a++){
- std::stringstream(parte[a]) >> aux; // Convierte la string en un int.
- resultado += aux; // Se suma al resultado
- }
- return resultado;
- }
- /**
- * Devuelve el número de divisiones
- */
- int numPartes(string numeros){
- int aux, aux2, resultado = 1;
- string cortada = numeros;
- aux = cortada.find(',');
- aux2 = cortada.find("\n");
- while(aux!=-1 || aux2!=-1){ // Mientras uno de los dos aparezca (!=-1)...
- if(aux!=-1 && aux2!=-1) {
- cortada = cortada.substr((aux<aux2?aux:aux2)+1,cortada.length()); // Si los dos aparecen en la string, se toma el de menor posición.
- }
- /* Aparece uno de los dos*/
- else cortada = cortada.substr((aux>aux2?aux:aux2)+1,cortada.length()); // El mayor
- /* Continua */
- resultado++;
- aux = cortada.find(',');
- aux2 = cortada.find("\n");
- }
- return resultado;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement