Foros del Web » Programación para mayores de 30 ;) » C/C++ »

suma de numeros separados por comas

Estas en el tema de suma de numeros separados por comas en el foro de C/C++ en Foros del Web. hola! tengo que hacer un programa en el que se le escriban número separados por comas de la siguiente forma. -a 1,2,3 -b 1,2,3 y ...
  #1 (permalink)  
Antiguo 31/10/2015, 17:25
 
Fecha de Ingreso: octubre-2015
Mensajes: 1
Antigüedad: 8 años, 5 meses
Puntos: 0
Pregunta suma de numeros separados por comas

hola!

tengo que hacer un programa en el que se le escriban número separados por comas de la siguiente forma.

-a 1,2,3 -b 1,2,3 y hacer la suma respectiva de 1+1; 2+2; 3+3 pero no sé como hacer que reciba los datos ni como poner la bandera en este caso -a y -b. ¿pueden ayudarme?
  #2 (permalink)  
Antiguo 01/11/2015, 03:35
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 2 meses
Puntos: 3
Respuesta: suma de numeros separados por comas

Se me ocurre algo asi:
Código C:
Ver original
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. int main(int argc, char* argv[])
  5. {
  6.    char strA[100],strB[100];
  7.    char *p1,*p2;
  8.    char separador[]=",";
  9.    int avance,n1,n2,total=0;
  10.  
  11.    printf("Introduce la primera secuencia de numeros separados por comas: ");
  12.    scanf("%s",strA);
  13.    printf("Introduce la segunda secuencia de numeros separados por comas: ");
  14.    scanf("%s",strB);
  15.  
  16.    //Punteros para recorrer ambas cadenas
  17.    p1=strA;
  18.    p2=strB;
  19.  
  20.    //Si alguna de las dos esta vacia pongo su puntero a null
  21.    if(strlen(p1)==0)
  22.       p1=NULL;
  23.    if(strlen(p2)==0)
  24.       p2=NULL;
  25.  
  26.    //Recorro este bucle hasta que ambos punteros apunten a NULL
  27.    while(p1 != NULL || p2 != NULL){
  28.       if(p1 != NULL){ //Si el puntero a la primera cadena apunta a NULL
  29.          avance=sscanf(p1,"%d",&n1); //Obtengo un numero
  30.          if(avance == -1){
  31.             //Este caso se da si intenta obtener un numero de una cadena vacia
  32.             avance=0; //Pongo el avance a 0
  33.             n1=0; //Pongo el numero a 0
  34.          }else if(avance == 0){
  35.             //Este caso se da al intentar obtener un numero y que no se pueda
  36.             //porque los caracteres no se corresponden
  37.             avance=1; //Hago que avance 1 posicion
  38.             n1=0; //Pongo el numero a 0
  39.          }
  40.          p1=strpbrk(p1+avance,separador); //Avanzo a la siguiente coma
  41.          if(p1!=NULL) //Si no obtuve NULL
  42.             p1++; //Paso la coma incrementando la direccion del puntero
  43.       }else{ //Si el puntero a la primera cadena es NULL
  44.          n1=0; //Pongo el numero a cero
  45.       }
  46.  
  47.       if(p2 != NULL){
  48.          avance=sscanf(p2,"%d",&n2);
  49.          if(avance == -1){
  50.             avance=0;
  51.             n2=0;
  52.          }else if(avance == 0){
  53.             avance=1;
  54.             n2=0;
  55.          }
  56.          p2=strpbrk(p2+avance,separador);
  57.          if(p2!=NULL)
  58.             p2++;
  59.       }else{
  60.          n2=0;
  61.       }
  62.       total += (n1+n2);
  63.       printf("%d + %d",n1,n2);
  64.       if(p1 != NULL || p2 != NULL)
  65.          printf(" + ");
  66.    }
  67.    printf(" = %d",total);
  68.    return 0;
  69. }

Solo comento una parte porque la otra es igual, es mas, podria crear una funcion y usarla para ambos casos:
Código C:
Ver original
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. char* ObtenerNumero(int *n, char *p, char separador)
  5. {
  6.    int avance;
  7.  
  8.    if(p != NULL){ //Si el puntero a la primera cadena apunta a NULL
  9.       avance=sscanf(p,"%d",n); //Obtengo un numero
  10.       if(avance == -1){
  11.          //Este caso se da si intenta obtener un numero de una cadena vacia
  12.          avance=0; //Pongo el avance a 0
  13.          *n=0; //Pongo el numero a 0
  14.       }else if(avance == 0){
  15.          //Este caso se da al intentar obtener un numero y que no se pueda
  16.          //porque los caracteres no se corresponden
  17.          avance=1; //Hago que avance 1 posicion
  18.          *n=0; //Pongo el numero a 0
  19.       }
  20.       p=strpbrk(p+avance,&separador); //Avanzo a la siguiente coma
  21.       if(p!=NULL) //Si no obtuve NULL
  22.          p++; //Paso la coma incrementando la direccion del puntero
  23.    }else{ //Si el puntero a la primera cadena es NULL
  24.       *n=0; //Pongo el numero a cero
  25.    }
  26.    return p;
  27. }
  28.  
  29. int main(int argc, char* argv[])
  30. {
  31.    char strA[100],strB[100];
  32.    char *p1,*p2;
  33.    char separador=',';
  34.    int n1,n2,total=0;
  35.  
  36.    printf("Introduce la primera secuencia de numeros separados por comas: ");
  37.    scanf("%s",strA);
  38.    printf("Introduce la segunda secuencia de numeros separados por comas: ");
  39.    scanf("%s",strB);
  40.  
  41.    //Punteros para recorrer ambas cadenas
  42.    p1=strA;
  43.    p2=strB;
  44.  
  45.    //Si alguna de las dos esta vacia pongo su puntero a null
  46.    if(strlen(p1)==0)
  47.       p1=NULL;
  48.    if(strlen(p2)==0)
  49.       p2=NULL;
  50.  
  51.    //Recorro este bucle hasta que ambos punteros apunten a NULL
  52.    while(p1 != NULL || p2 != NULL){
  53.       p1=ObtenerNumero(&n1,p1,separador);
  54.       p2=ObtenerNumero(&n2,p2,separador);
  55.       total += (n1+n2);
  56.       printf("%d + %d",n1,n2);
  57.       if(p1 != NULL || p2 != NULL)
  58.          printf(" + ");
  59.    }
  60.    printf(" = %d",total);
  61.    return 0;
  62. }

Intenta depurarlo para entender como funciona.
Editado:
Te preguntarás que que ventajas tiene usar una funcion en un caso tan simple y aqui un ejemplo:
Código C++:
Ver original
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. #define ELEMENTOS 4
  5.  
  6. char* ObtenerNumero(int *n, char *p, char separador)
  7. {
  8.    int avance;
  9.  
  10.    if(p != NULL){ //Si el puntero a la primera cadena apunta a NULL
  11.       avance=sscanf(p,"%d",n); //Obtengo un numero
  12.       if(avance == -1){
  13.          //Este caso se da si intenta obtener un numero de una cadena vacia
  14.          avance=0; //Pongo el avance a 0
  15.          *n=0; //Pongo el numero a 0
  16.       }else if(avance == 0){
  17.          //Este caso se da al intentar obtener un numero y que no se pueda
  18.          //porque los caracteres no se corresponden
  19.          avance=1; //Hago que avance 1 posicion
  20.          *n=0; //Pongo el numero a 0
  21.       }
  22.       p=strpbrk(p+avance,&separador); //Avanzo a la siguiente coma
  23.       if(p!=NULL) //Si no obtuve NULL
  24.          p++; //Paso la coma incrementando la direccion del puntero
  25.    }else{ //Si el puntero a la primera cadena es NULL
  26.       *n=0; //Pongo el numero a cero
  27.    }
  28.    return p;
  29. }
  30.  
  31. int main(int argc, char* argv[])
  32. {
  33.    char str[ELEMENTOS][100];
  34.    char *p[ELEMENTOS];
  35.    char separador=',';
  36.    int n[ELEMENTOS],total=0,i,noNull;
  37.  
  38.    for(i=0;i<ELEMENTOS;i++){
  39.       printf("Introduce la secuencia [%i] de numeros separados por comas: ",i);
  40.       scanf("%s",str[i]);
  41.  
  42.       //Punteros para recorrer ambas cadenas
  43.       p[i]=str[i];
  44.  
  45.       //Si alguna de las dos esta vacia pongo su puntero a null
  46.       if(strlen(p[i])==0)
  47.          p[i]=NULL;
  48.       else
  49.          noNull=1;
  50.    }
  51.  
  52.    //Recorro este bucle hasta que ambos punteros apunten a NULL
  53.    while(noNull != 0){
  54.       noNull=0;
  55.       printf("(");
  56.       for(i=0;i<ELEMENTOS;i++){
  57.          p[i]=ObtenerNumero(&n[i],p[i],separador);
  58.          total += n[i];
  59.          printf("%d",n[i]);
  60.          if(p[i] != NULL)
  61.             noNull=1;
  62.          if(i<ELEMENTOS-1)
  63.             printf(" + ");
  64.       }
  65.  
  66.       if(noNull==1)
  67.          printf(") + ");
  68.    }
  69.    printf(") = %d",total);
  70.    return 0;
  71. }

Solo con cambiar el valor de ELEMENTOS podras añadir o quitar elementos y sin tocar nada mas mientras que si lo hicieras sin funciones tendrias que estar añadiendo o quitando lineas de codigo.

Última edición por aguml; 01/11/2015 a las 04:03

Etiquetas: comas, numeros, programa, suma
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:08.