Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: m@o_614 en 6 Diciembre 2013, 00:47 am



Título: basura en mi programa
Publicado por: m@o_614 en 6 Diciembre 2013, 00:47 am
Saludos estoy haciendo un programa que contiene un menu para elegir diferentes operaciones aritmeticas, ya se que no se puede usar fflush(stdin) para limpiar el buffer, pero ya le puse el fgets + sscanf en las partes donde crei que me daba problemas pero aun asi sigue con basura, tengo que cambiar cada uno de los scanf() que tengo en mi codigo por un fgets + sscanf???? lo que pasa es que son muchisimos y crei que con solo ponerle 2 seria mas que suficiente

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define TAM 5
  4. #define ARITMETICA_SIMPLE 1
  5. #define ARITMETICA_BINARIA 2
  6. #define FACTORIAL 3
  7. #define TABLA_MULTIPLICAR 4
  8. #define SALIR 5
  9. int main()
  10. {
  11.    //Variables de uso interno del programa
  12.    int continuar = 1,i,factorial = 1;
  13.    //Variables para entrada de datos
  14.    int opcion,numero1,numero2,numero_factorial,multiplicando,multiplicador;
  15.    char operador,buffer[TAM];
  16.    do
  17.    {
  18.        //Menu principal
  19.        printf("CALCULADORA v1.0\n\n");
  20.        printf("Elige una de las siguientes opciones:\n");
  21.        printf("1. Aritmetica simple con suma de enteros a+b\n");
  22.        printf("2. Aritmetica extendida binaria\n");
  23.        printf("3. Factorial de n (n!)\n");
  24.        printf("4. Detallar una tabla de multiplicar\n");
  25.        printf("5. Salir\n");
  26.        printf("Opcion a elegir? ");
  27.        fgets(buffer,sizeof(buffer),stdin);
  28.        sscanf(buffer,"%d",&opcion);
  29.        switch(opcion)
  30.        {
  31.            //Aritmetica simple con suma de enteros a+b
  32.            case ARITMETICA_SIMPLE:
  33.               printf("Dame el valor de a = ");
  34.               scanf("%d",&numero1);
  35.               printf("Dame el valor de b = ");
  36.               scanf("%d",&numero2);
  37.               printf("%d + %d = %d",numero1,numero2,numero1+numero2);
  38.               break;
  39.            //Aritmetica extendida binaria (+,-,*,/,%modulo)
  40.            case ARITMETICA_BINARIA:
  41.               printf("Escribe el operador (+,-,*,/,%%): ");
  42.               fgets(buffer,sizeof(buffer),stdin);
  43.               sscanf(buffer,"%c",&operador);
  44.               printf("\nDame el valor de a = ");
  45.               scanf("%d",&numero1);
  46.               printf("Dame el valor de b = ");
  47.               scanf("%d",&numero2);
  48.               switch(operador)
  49.               {
  50.                   case '+':
  51.                      printf("%d %c %d = %d\n",numero1,operador,numero2,numero1+numero2);
  52.                      break;
  53.                   case '-':
  54.                      printf("%d %c %d = %d\n",numero1,operador,numero2,numero1-numero2);
  55.                      break;
  56.                   case '*':
  57.                      printf("%d %c %d = %d\n",numero1,operador,numero2,numero1*numero2);
  58.                      break;
  59.                   case '/':
  60.                      printf("%d %c %d = %d\n",numero1,operador,numero2,numero1/numero2);
  61.                      break;
  62.                   case '%':
  63.                      printf("%d %c %d = %d\n",numero1,operador,numero2,numero1%numero2);
  64.                      break;
  65.                   default:
  66.                      printf("No hay un resultado calculable\n");
  67.                      printf("%d %c %d = 0\n",numero1,operador,numero2);
  68.               }
  69.               break;
  70.            //Factorial de n (n!)
  71.            case FACTORIAL:
  72.               printf("Dame el valor de n = ");
  73.               scanf("%d",&numero_factorial);
  74.               if(numero_factorial < 0)
  75.                  printf("El factorial de %d no esta definido\n",numero_factorial);
  76.               else if(numero_factorial == 0)
  77.                  printf("El factorial de 0 es 1\n");
  78.               else
  79.               {
  80.                   for(i = numero_factorial;i > 0;i--)
  81.                      factorial*=i;
  82.                   printf("El factorial de %d es %d\n",numero_factorial,factorial);
  83.               }
  84.               break;
  85.            //Detallar una tabla de multiplicar
  86.            case TABLA_MULTIPLICAR:
  87.               printf("Dame el multiplicando i = ");
  88.               scanf("%d",&multiplicando);
  89.               printf("Dame hasta cual multiplicador n= ");
  90.               scanf("%d",&multiplicador);
  91.               printf("Tabla de multiplicar del %d\n",multiplicador);
  92.               i = 1;
  93.               while(i <= multiplicador)
  94.               {
  95.                   printf("%d\tX\t%d\t=\t%d\n",multiplicando,i,multiplicando*i);
  96.                   i++;
  97.               }
  98.               break;
  99.            //Salida del programa
  100.            case SALIR:
  101.               continuar = 0;
  102.               break;
  103.            default:
  104.               printf("Opcion no valida!\n");
  105.        }
  106.        if(continuar)
  107.           system("pause");
  108.    }while(continuar);
  109.    return 0;
  110. }
  111.  

de antemano gracias


Título: Re: basura en mi programa
Publicado por: vangodp en 6 Diciembre 2013, 01:55 am
Una función entonces :D

void obtenervalor( &variable  ){
   //aquí su código
}

 :silbar:


Título: Re: basura en mi programa
Publicado por: amchacon en 6 Diciembre 2013, 13:40 pm
Se le da más importancia al buffer de la que tiene...

El error que veo ahí esque no borras la pantalla entre cada bucle. En windows es con system("CLS");

Aparte de eso. ¿Cual es el problema que tiene? Detallalo más...


Título: Re: basura en mi programa
Publicado por: ivancea96 en 6 Diciembre 2013, 13:45 pm
Si no encuentras otra solución, lo que dijo vangodp, hacer una función para pedir la variable.
Ya en esa función, limpias el buffer, el stdin, y la habitación si quieres xD

Hasta puedes pasarle el mensaje a mostrar a la función jaja. Eso ya como tú lo decidas


Título: Re: basura en mi programa
Publicado por: Eternal Idol en 6 Diciembre 2013, 16:06 pm
Si, tenes que sacar todos, uno es suficiente para jode el buffer de ENTRADA. No confundan con la pantalla que es de salida.


Título: Re: basura en mi programa
Publicado por: Vaagish en 6 Diciembre 2013, 17:17 pm
Citar
tengo que cambiar cada uno de los scanf() que tengo en mi codigo por un fgets + sscanf???? lo que pasa es que son muchisimos

Cual es tu concepto de muchísimos, si el programa tiene 110 lineas?  :rolleyes:


Título: Re: basura en mi programa
Publicado por: m@o_614 en 6 Diciembre 2013, 19:54 pm
gracias por sus respuestas, en realidad no son tantos scanf, solo que queria ahorrarme líneas de código para que cada vez que tuviera que ingresar un dato no repitiera fgets +sscanf. Le hice unos cambios al codigo y ya funciona para todos los casos excepto para el de ARITMETICA_BINARIA, que me pide que le ingrese un operando (que es de tipo char) y en la funcion de ingresarDato, me dice que el sscanf me va a guardar  el dato en una variable de tipo int, como puedo corregir esto?? que el sscanf me pueda guardar datos tanto de tipo int como de tipo char??

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define TAM 5
  4. #define ARITMETICA_SIMPLE 1
  5. #define ARITMETICA_BINARIA 2
  6. #define FACTORIAL 3
  7. #define TABLA_MULTIPLICAR 4
  8. #define SALIR 5
  9.  
  10. void ingresarDato();
  11.  
  12. int main()
  13. {
  14.    //Variables de uso interno del programa
  15.    int continuar = 1,i,factorial = 1;
  16.    //Variables para entrada de datos
  17.    int opcion,numero1,numero2,numero_factorial,multiplicando,multiplicador;
  18.    char operador;
  19.    do
  20.    {
  21.        //Menu principal
  22.        printf("CALCULADORA v1.0\n\n");
  23.        printf("Elige una de las siguientes opciones:\n");
  24.        printf("1. Aritmetica simple con suma de enteros a+b\n");
  25.        printf("2. Aritmetica extendida binaria\n");
  26.        printf("3. Factorial de n (n!)\n");
  27.        printf("4. Detallar una tabla de multiplicar\n");
  28.        printf("5. Salir\n");
  29.        printf("Opcion a elegir? ");
  30.        ingresarDato(&opcion);
  31.        switch(opcion)
  32.        {
  33.            //Aritmetica simple con suma de enteros a+b
  34.            case ARITMETICA_SIMPLE:
  35.               printf("Dame el valor de a = ");
  36.               ingresarDato(&numero1);
  37.               printf("Dame el valor de b = ");
  38.               ingresarDato(&numero2);
  39.               printf("%d + %d = %d",numero1,numero2,numero1+numero2);
  40.               break;
  41.            //Aritmetica extendida binaria (+,-,*,/,%modulo)
  42.            case ARITMETICA_BINARIA:
  43.               printf("Escribe el operador (+,-,*,/,%%): ");
  44.               ingresarDato(&operador);
  45.               printf("\nDame el valor de a = ");
  46.               ingresarDato(&numero1);
  47.               printf("Dame el valor de b = ");
  48.               ingresarDato(&numero2);
  49.               switch(operador)
  50.               {
  51.                   case '+':
  52.                      printf("%d %c %d = %d\n",numero1,operador,numero2,numero1+numero2);
  53.                      break;
  54.                   case '-':
  55.                      printf("%d %c %d = %d\n",numero1,operador,numero2,numero1-numero2);
  56.                      break;
  57.                   case '*':
  58.                      printf("%d %c %d = %d\n",numero1,operador,numero2,numero1*numero2);
  59.                      break;
  60.                   case '/':
  61.                      printf("%d %c %d = %d\n",numero1,operador,numero2,numero1/numero2);
  62.                      break;
  63.                   case '%':
  64.                      printf("%d %c %d = %d\n",numero1,operador,numero2,numero1%numero2);
  65.                      break;
  66.                   default:
  67.                      printf("No hay un resultado calculable\n");
  68.                      printf("%d %c %d = 0\n",numero1,operador,numero2);
  69.               }
  70.               break;
  71.            //Factorial de n (n!)
  72.            case FACTORIAL:
  73.               printf("Dame el valor de n = ");
  74.               ingresarDato(&numero_factorial);
  75.               if(numero_factorial < 0)
  76.                  printf("El factorial de %d no esta definido\n",numero_factorial);
  77.               else if(numero_factorial == 0)
  78.                  printf("El factorial de 0 es 1\n");
  79.               else
  80.               {
  81.                   for(i = numero_factorial;i > 0;i--)
  82.                      factorial*=i;
  83.                   printf("El factorial de %d es %d\n",numero_factorial,factorial);
  84.               }
  85.               break;
  86.            //Detallar una tabla de multiplicar
  87.            case TABLA_MULTIPLICAR:
  88.               printf("Dame el multiplicando i = ");
  89.               ingresarDato(&multiplicando);
  90.               printf("Dame hasta cual multiplicador n= ");
  91.               ingresarDato(&multiplicador);
  92.               printf("Tabla de multiplicar del %d\n",multiplicador);
  93.               i = 1;
  94.               while(i <= multiplicador)
  95.               {
  96.                   printf("%d\tX\t%d\t=\t%d\n",multiplicando,i,multiplicando*i);
  97.                   i++;
  98.               }
  99.               break;
  100.            //Salida del programa
  101.            case SALIR:
  102.               continuar = 0;
  103.               break;
  104.            default:
  105.               printf("Opcion no valida!\n");
  106.        }
  107.        if(continuar)
  108.           system("pause");
  109.    }while(continuar);
  110.    return 0;
  111. }
  112.  
  113. void ingresarDato(void *dato)
  114. {
  115.    char buffer[TAM];
  116.    fgets(buffer,sizeof(buffer),stdin);
  117.    sscanf(buffer,"%d",dato);
  118. }
  119.  

gracias


Título: Re: basura en mi programa
Publicado por: rir3760 en 7 Diciembre 2013, 02:24 am
* Lo primero a cambiar es el prototipo de la funciona "ingresarDato" a:
Código
  1. void ingresarDato(int *num);
Ya que en C los paréntesis vacíos en una declaración indican un numero indeterminado de argumentos.

* Se deben evitar los comentarios como este:
Código
  1. //Variables de uso interno del programa
Porque su valor como documentación es nulo, en su lugar se debe indicar la intención.

* El problema principal se debe a que tratas de leer el operador como un entero, en su lugar debes leerlo como un carácter con:
Código
  1. printf ("Escribe el operador (+,-,*,/,%%): ");
  2. scanf(" %c", &operador);
  3. {
  4.   int ch;
  5.  
  6.   while ((ch = getchar()) != EOF && ch != '\n')
  7.      ;
  8. }

Lo anterior es solo la forma mas sencilla, lo mejor es modificar la función "ingresarDato" para que acepte dos argumentos: una dirección de memoria (de tipo "void *", esto para pasar cualquiera) y un entero que indique el tipo (int, char, etc.).

Un saludo


Título: Re: basura en mi programa
Publicado por: m@o_614 en 7 Diciembre 2013, 07:30 am
entonces el primer argumento de la función ingresarDato está bien no?? porque es *void

Código
  1. void ingresarDato(void *dato)
  2. {
  3.    char buffer[TAM];
  4.    fgets(buffer,sizeof(buffer),stdin);
  5.    sscanf(buffer,"%d",dato);
  6. }

ya solo le faltaria otro argumento para indicarle el tipo de dato, pero como se le puede pasar por argumento un tipo de dato y que este sea int??


Título: Re: basura en mi programa
Publicado por: ivancea96 en 7 Diciembre 2013, 11:52 am
Podrías sobrecargar la función para cada tipo de dato, por ejemplo.

Si fuera C++, podrías usar un Template.


Título: Re: basura en mi programa
Publicado por: Vaagish en 7 Diciembre 2013, 16:14 pm
@ivancea96: Me ganaste de mano jajaja estaba buscando la info para que la vea..

Citar
http://c.conclase.net/curso/?cap=021

Me parece que lo mas Pro que podes hacer en ese caso, es sobrecargar la funcion (como ya te dijo ivancea96)


Título: Re: basura en mi programa
Publicado por: leosansan en 7 Diciembre 2013, 18:37 pm
gracias por sus respuestas, en realidad no son tantos scanf, solo que queria ahorrarme líneas de código para que cada vez que tuviera que ingresar un dato no repitiera fgets +sscanf. Le hice unos cambios al codigo y ya funciona para todos los casos excepto para el de ARITMETICA_BINARIA, que me pide que le ingrese un operando (que es de tipo char) y en la funcion de ingresarDato, me dice que el sscanf me va a guardar  el dato en una variable de tipo int, como puedo corregir esto?? que el sscanf me pueda guardar datos tanto de tipo int como de tipo char??


Una alternativa es, análogamente a lo que haces en el Menú, donde las opciones se corresponden con un valor numérico, hacer lo mismo con las operaciones y así sigues usando la variable en formato int:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define ARITMETICA_SIMPLE 1
  4. #define ARITMETICA_BINARIA 2
  5. #define FACTORIAL 3
  6. #define TABLA_MULTIPLICAR 4
  7. #define SALIR 5
  8.  
  9. void ingresarDato(char *ch , int *dato);
  10.  
  11. int main()
  12. {
  13.    //Variables de uso interno del programa
  14.    int continuar = 1,i,factorial = 1;
  15.    //Variables para entrada de datos
  16.    int opcion,numero1,numero2,numero_factorial,multiplicando,multiplicador;
  17.    char operador;
  18.    do
  19.    {
  20.        //Menu principal
  21.        printf("CALCULADORA v1.0\n\n");
  22.        printf("Elige una de las siguientes opciones:\n");
  23.        printf("1. Aritmetica simple con suma de enteros a+b\n");
  24.        printf("2. Aritmetica extendida binaria\n");
  25.        printf("3. Factorial de n (n!)\n");
  26.        printf("4. Detallar una tabla de multiplicar\n");
  27.        printf("5. Salir\n");
  28.        ingresarDato("Opcion a elegir? ",&opcion);
  29.        switch(opcion)
  30.        {
  31.            //Aritmetica simple con suma de enteros a+b
  32.            case ARITMETICA_SIMPLE:
  33.               ingresarDato("Dame el valor de a = ",&numero1);
  34.               ingresarDato("Dame el valor de b = ",&numero2);
  35.               printf("%d + %d = %d",numero1,numero2,numero1+numero2);
  36.               break;
  37.            //Aritmetica extendida binaria (+,-,*,/,%modulo)
  38.            case ARITMETICA_BINARIA:
  39.               ingresarDato("Escribe el operador (1=+, 2=-, 3=*, 4=/, 5=%): ",&operador);
  40.               ingresarDato("\nDame el valor de a = ",&numero1);
  41.               ingresarDato("Dame el valor de b = ",&numero2);
  42.               switch(operador)
  43.               {
  44.                   case 1:
  45.                      printf("%d + %d = %d\n",numero1,numero2,numero1+numero2);
  46.                      break;
  47.                   case 2:
  48.                      printf("%d - %d = %d\n",numero1,numero2,numero1-numero2);
  49.                      break;
  50.                   case 3:
  51.                      printf("%d * %d = %d\n",numero1,numero2,numero1*numero2);
  52.                      break;
  53.                   case 4:
  54.                      printf("%d / %d = %d\n",numero1,numero2,numero1/numero2);
  55.                      break;
  56.                   case 5:
  57.                      printf("%d %% %d = %d\n",numero1,numero2,numero1%numero2);
  58.                      break;
  59.                   default:
  60.                      printf("No hay un resultado calculable\n");
  61.               }
  62.               break;
  63.            //Factorial de n (n!)
  64.            case FACTORIAL:
  65.               ingresarDato("Dame el valor de n = ",&numero_factorial);
  66.               if("Dame el valor de n = ",numero_factorial < 0)
  67.                  printf("El factorial de %d no esta definido\n",numero_factorial);
  68.               else if(numero_factorial == 0)
  69.                  printf("El factorial de 0 es 1\n");
  70.               else
  71.               {
  72.                   for(i = numero_factorial;i > 0;i--)
  73.                      factorial*=i;
  74.                   printf("El factorial de %d es %d\n",numero_factorial,factorial);
  75.               }
  76.               break;
  77.            //Detallar una tabla de multiplicar
  78.            case TABLA_MULTIPLICAR:
  79.               ingresarDato("Dame el multiplicando i = ",&multiplicando);
  80.               ingresarDato("Dame hasta cual multiplicador n= ",&multiplicador);
  81.               printf("Tabla de multiplicar del %d\n",multiplicador);
  82.               i = 1;
  83.               while(i <= multiplicador)
  84.               {
  85.                   printf("%d\tX\t%d\t=\t%d\n",multiplicando,i,multiplicando*i);
  86.                   i++;
  87.               }
  88.               break;
  89.            //Salida del programa
  90.            case SALIR:
  91.               continuar = 0;
  92.               break;
  93.            default:
  94.               printf("Opcion no valida!\n");
  95.        }
  96.        if(continuar)
  97.        system("pause");
  98.    }while(continuar);
  99.    return 0;
  100. }
  101.  
  102. void ingresarDato(char *ch , int *dato)
  103. {
  104.    printf("%s ",ch);
  105.    fflush (stdout);
  106.    scanf ("%d",dato);
  107. }
  108.  

Saluditos! ....


Título: Re: basura en mi programa
Publicado por: dato000 en 7 Diciembre 2013, 19:04 pm
Bueno, creo ya tienen cubierto todas las opciones, no?? pero yo me pregunto porque no separas las opciones de cada menu en otras funciones, se veria bueno, mejor no??

Código
  1. void ingresarDato(char *ch , int *dato)
  2. {
  3.    printf("%s ",ch);
  4.    fflush (stdout);
  5.    scanf ("%d",dato);
  6. }
  7.  

Me parece una buena opción usar parametros por referencia, así puede sobrecargarse sin mayor inconveniente cada variable, yo iba a decir que solo se usara para el valor númerico, pero puede que funcione bien para el caracter.

Lo que me pregunto es por el fflush(stdout), no seria necesario realizar uno para el scanf?? es decir, fflush(stdin) para limpiar el buffer de entrada del teclado??


Título: Re: basura en mi programa
Publicado por: rir3760 en 7 Diciembre 2013, 19:24 pm
ya solo le faltaria otro argumento para indicarle el tipo de dato, pero como se le puede pasar por argumento un tipo de dato y que este sea int?
No pasas el tipo, pasas un valor entero que indique el tipo. Por ejemplo:
Código
  1. enum tipo {INT, DOUBLE, CHAR};
  2.  
  3. /* ... */
  4.  
  5. void leer_valor(char const *msj, int tipo, void *p)
  6. {
  7.   int ch;
  8.  
  9.   printf("%s", msj);
  10.   fflush(stdout);
  11.  
  12.   switch (tipo){
  13.   case INT:
  14.      scanf("%d", (int *) p);
  15.      break;
  16.   case DOUBLE:
  17.      scanf("%lf", (double *) p);
  18.      break;
  19.   case CHAR:
  20.      scanf("%c", (char *) p);
  21.      break;
  22.   }
  23.  
  24.   while ((ch = getchar()) != EOF && ch != '\n')
  25.      ;
  26. }

Para utilizar la función basta con indicar que leer y pasar la dirección del objeto:
Código
  1. int main(void)
  2. {
  3.   int num;
  4.   char ch;
  5.  
  6.   leer_valor("Introduce un entero: ", INT, &num);
  7.   printf("El numero es %d\n", num);
  8.  
  9.   leer_valor("Introduce un caracter: ", CHAR, &ch);
  10.   printf("El caracter es %c\n", ch);
  11.  
  12.   return EXIT_SUCCESS;
  13. }
Falta agregar la validación en el caso de que la función scanf falle.

Lo que me pregunto es por el fflush(stdout), no seria necesario realizar uno para el scanf?? es decir, fflush(stdin) para limpiar el buffer de entrada del teclado?
fflush(stdout) es necesario para asegurarnos de que el texto se envié a la salida estándar, fflush(stdin) no se recomienda (se explica en el tema |Lo que no hay que hacer en C/C++. Nivel basico| (http://foro.elhacker.net/programacion_cc/lo_que_no_hay_que_hacer_en_cc_nivel_basico-t277729.0.html)), en su lugar se puede eliminar el resto de la linea con un bucle.

Un saludo


Título: Re: basura en mi programa
Publicado por: dato000 en 7 Diciembre 2013, 23:36 pm
ah vale no me acordaba de eso, gracias


Título: Re: basura en mi programa
Publicado por: m@o_614 en 9 Diciembre 2013, 16:50 pm
Ya pude hacer que el código me hiciera lo que le pido, sólo que en la función de ingresar dato en vez de ponerle un switch lo hice con if's, no se cuál de los dos será mejor o más eficiente,pero funciona

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define TAM 5
  4. #define ARITMETICA_SIMPLE 1
  5. #define ARITMETICA_BINARIA 2
  6. #define FACTORIAL 3
  7. #define TABLA_MULTIPLICAR 4
  8. #define SALIR 5
  9.  
  10. enum tipo{INT,CHAR};
  11. void ingresarDato(void *dato,int tipo);
  12.  
  13. int main()
  14. {
  15.    //Variables de uso interno del programa
  16.    int continuar = 1,i,factorial = 1;
  17.    //Variables para entrada de datos
  18.    int opcion,numero1,numero2,numero_factorial,multiplicando,multiplicador;
  19.    char operador;
  20.    do
  21.    {
  22.        //Menu principal
  23.        printf("CALCULADORA v1.0\n\n");
  24.        printf("Elige una de las siguientes opciones:\n");
  25.        printf("1. Aritmetica simple con suma de enteros a+b\n");
  26.        printf("2. Aritmetica extendida binaria\n");
  27.        printf("3. Factorial de n (n!)\n");
  28.        printf("4. Detallar una tabla de multiplicar\n");
  29.        printf("5. Salir\n");
  30.        printf("Opcion a elegir? ");
  31.        ingresarDato(&opcion,INT);
  32.        switch(opcion)
  33.        {
  34.            //Aritmetica simple con suma de enteros a+b
  35.            case ARITMETICA_SIMPLE:
  36.               printf("Dame el valor de a = ");
  37.               ingresarDato(&numero1,INT);
  38.               printf("Dame el valor de b = ");
  39.               ingresarDato(&numero2,INT);
  40.               printf("%d + %d = %d",numero1,numero2,numero1+numero2);
  41.               break;
  42.            //Aritmetica extendida binaria (+,-,*,/,%modulo)
  43.            case ARITMETICA_BINARIA:
  44.               printf("Escribe el operador (+,-,*,/,%%): ");
  45.               ingresarDato(&operador,CHAR);
  46.               printf("\nDame el valor de a = ");
  47.               ingresarDato(&numero1,INT);
  48.               printf("Dame el valor de b = ");
  49.               ingresarDato(&numero2,INT);
  50.               switch(operador)
  51.               {
  52.                   case '+':
  53.                      printf("%d %c %d = %d\n",numero1,operador,numero2,numero1+numero2);
  54.                      break;
  55.                   case '-':
  56.                      printf("%d %c %d = %d\n",numero1,operador,numero2,numero1-numero2);
  57.                      break;
  58.                   case '*':
  59.                      printf("%d %c %d = %d\n",numero1,operador,numero2,numero1*numero2);
  60.                      break;
  61.                   case '/':
  62.                      printf("%d %c %d = %d\n",numero1,operador,numero2,numero1/numero2);
  63.                      break;
  64.                   case '%':
  65.                      printf("%d %c %d = %d\n",numero1,operador,numero2,numero1%numero2);
  66.                      break;
  67.                   default:
  68.                      printf("No hay un resultado calculable\n");
  69.                      printf("%d %c %d = 0\n",numero1,operador,numero2);
  70.               }
  71.               break;
  72.            //Factorial de n (n!)
  73.            case FACTORIAL:
  74.               printf("Dame el valor de n = ");
  75.               ingresarDato(&numero_factorial,INT);
  76.               if(numero_factorial < 0)
  77.                  printf("El factorial de %d no esta definido\n",numero_factorial);
  78.               else if(numero_factorial == 0)
  79.                  printf("El factorial de 0 es 1\n");
  80.               else
  81.               {
  82.                   for(i = numero_factorial;i > 0;i--)
  83.                      factorial*=i;
  84.                   printf("El factorial de %d es %d\n",numero_factorial,factorial);
  85.               }
  86.               break;
  87.            //Detallar una tabla de multiplicar
  88.            case TABLA_MULTIPLICAR:
  89.               printf("Dame el multiplicando i = ");
  90.               ingresarDato(&multiplicando,INT);
  91.               printf("Dame hasta cual multiplicador n= ");
  92.               ingresarDato(&multiplicador,INT);
  93.               printf("Tabla de multiplicar del %d\n",multiplicador);
  94.               i = 1;
  95.               while(i <= multiplicador)
  96.               {
  97.                   printf("%d\tX\t%d\t=\t%d\n",multiplicando,i,multiplicando*i);
  98.                   i++;
  99.               }
  100.               break;
  101.            //Salida del programa
  102.            case SALIR:
  103.               continuar = 0;
  104.               break;
  105.            default:
  106.               printf("Opcion no valida!\n");
  107.        }
  108.        if(continuar)
  109.           system("pause");
  110.    }while(continuar);
  111.    return 0;
  112. }
  113.  
  114. void ingresarDato(void *dato,int tipo)
  115. {
  116.    char buffer[TAM];
  117.    fgets(buffer,sizeof(buffer),stdin);
  118.    if(tipo == INT)
  119.       sscanf(buffer,"%d",dato);
  120.    else if(tipo == CHAR)
  121.       sscanf(buffer,"%c",dato);
  122. }
  123.  

gracias


Título: Re: basura en mi programa
Publicado por: Vaagish en 9 Diciembre 2013, 17:32 pm
Citar
sólo que en la función de ingresar dato en vez de ponerle un switch lo hice con if's, no se cuál de los dos será mejor o más eficiente,pero funciona

Es indiferente,, pero para algo tan corto como 4 sentencias, creo que es mejor usar el if

Saludos!