Resultados 1 al 13 de 13

Duda con ejercicio en C

  1. #1 Duda con ejercicio en C 
    Iniciado
    Fecha de ingreso
    Oct 2006
    Mensajes
    20
    Descargas
    0
    Uploads
    0
    Estimados,

    Tengo este ejercicio que no puedo resolver. Supuestamente el programa tiene que tomar 2 numeros y 1 caracter. Si ese caracter es * - / + debe hacer la operacion que corresponde. Funciona entre tyodo bien, pero cuando hago las cuentas de * + / me duplica el resultado (ej: si el resultado es 4 me pone 44). Desde ya muchisimas gracias a quien pueda ayudarme por que me rompo la cabeza copn esto jejeje.
    NOTA: en el ejercicio estaba especificado que no se podia usar switch, solo if-else.

    MUCHAS GRACIAS!!

    #include <stdio.h>
    #include <conio.h>
    #include <math.h>

    void main()
    {
    int a,b,r;
    char c;

    printf("Ingrese los numeros a,b: \n");
    fflush(stdin);
    scanf("%d%d",&a,&b); //nuneros a y b ingresados

    printf("Ingrese el caracter: \n");
    fflush(stdin);
    scanf("%c",&c); //caracter ingresado
    if(c=='*' || c=='+' || c=='-' || c=='/') {
    if(c=='*') {
    r=a*b;
    printf("%d",r);
    } else
    if(c=='+') {
    r=a+b;
    printf("%d",r);
    } else
    if(c=='/') {
    r=a/b;
    printf("%d",r);

    } else
    r=a-b;
    printf("%d",r);

    else
    printf("Error");

    getch();
    }
    Citar  
     

  2. #2  
    Moderador Global Avatar de hystd
    Fecha de ingreso
    Jul 2005
    Ubicación
    1, 11, 21, 1211...
    Mensajes
    1.596
    Descargas
    58
    Uploads
    0
    No se como has podido compilarlo... porque tal y como está escrito ahí, el ultimo else no pertenece a ningun if. Dicho de otro modo, el penultimo else (cuando es la resta "a-b"), deberias encerrarla en un bloque con llaves, ya que si no lo pones, el compilador interpreta que solo pertenece al else la primera instrucción (r=a-b), y siempre, independientemente de la condición ejecutará el printf("%d2, r), es por eso la causa de que imprima dos veces el resultado.

    Aquí te dejo la corrección:

    #include <stdio.h>
    #include <conio.h>
    #include <math.h>

    void main()
    {
    int a,b,r;
    char c;

    printf("Ingrese los numeros a,b: \n");
    fflush(stdin);
    scanf("%d%d",&a,&b); //nuneros a y b ingresados
    printf("Ingrese el caracter: \n");
    fflush(stdin);
    scanf("%c",&c); //caracter ingresado
    if(c=='*' || c=='+' || c=='-' || c=='/') {
    if(c=='*') {
    r=a*b;
    printf("%d",r);
    }
    else
    if(c=='+') {
    r=a+b;
    printf("%d",r);
    }
    else
    if(c=='/') {
    r=a/b;
    printf("%d",r);
    }
    else
    {
    r=a-b;
    printf("%d",r);
    }
    }else{
    printf("Error");
    getch();
    }
    }

    Haz la prueba (no he tenido ocasión de comprobarlo), y me cuentas.

    Un saludo.
    El optimista tiene ideas, el pesimista... excusas

    Citar  
     

  3. #3  
    Avanzado
    Fecha de ingreso
    Jun 2006
    Ubicación
    Valhala
    Mensajes
    1.167
    Descargas
    4
    Uploads
    0
    lo raro que no te de fallo de compilacion. Te comento, justo en el penultimo else, no has puesto las llaves, porlo que el printf correspondiente a la resta se imprime siempre. Como un apunte mas, yo cambiaria todos esos printf por uno final que imprima el resultado, independientemente de la operacion.
    Quedaria algo asi:
    Código:
    #include <stdio.h>
    #include <conio.h>
    #include <math.h>
    
    void main()
    {
    int a,b,r;
    char c;
    
    printf("Ingrese los numeros a,b: \n");
    fflush(stdin);
    scanf("%d%d",&a,&b); //nuneros a y b ingresados
    
    printf("Ingrese el caracter: \n");
    fflush(stdin);
    scanf("%c",&c); //caracter ingresado
    if(c=='*' || c=='+' || c=='-' || c=='/') {
    // Comprobamos el tipo de operacion y la realizamos
    if(c=='*')  r=a*b;
    else if(c=='+') r=a+b;
    else if(c=='/') r=a/b;
    else r=a-b;
    // Imprimimos una sola vez el resultado
    printf("%d",r);
    }
    else
    printf("Error");
    
    getch();
    }
    Última edición por smaug_; 05-05-2008 a las 00:16
    http://www.project-longinus.es
    Citar  
     

  4. #4  
    Moderador Global
    Fecha de ingreso
    Aug 2005
    Mensajes
    6.279
    Descargas
    7
    Uploads
    0
    Me he permitido hacerle unos pequeños cambios

    Código:
    #include <stdio.h>
    #include <string.h>
    // #include <conio.h>
    // #include <math.h>
    #define EOL '\n'
    #define TAM_CAD 50
    
    void lee_cad (char *cadena) {
      fgets(cadena,TAM_CAD,stdin);
      cadena[(strlen(cadena))-1] = '\0';
    }
    
    long lee_int () {
      long int i;
      char cadena[TAM_CAD],sobra[TAM_CAD];
    
      lee_cad(cadena);
      i=strtol(cadena, (char **)sobra, 10);
      return i;
    }
    
    int lee_char ()
    {
        int letra ;
        int buffer ;
    
        letra = getchar () ;
        buffer = letra ;
    
        while ( buffer != EOF && buffer != EOL )
            buffer = getchar () ;
        return ( ( buffer != EOF ) ? letra : EOF ) ;
    }
    
    
    
    int main()
    {
    int n1, n2, a, b, r, c ;
    int basura ;
    
        printf("Ingrese los numeros a,b: \n");
        a = lee_int() ;
        b = lee_int() ;
        //nuneros a y b ingresados
    
        printf("Ingrese el caracter: \n");
        c = lee_char() ;
    
        switch (c) {
            case '*' :
                r=a*b;
                break ;
            case '+' :
                r=a+b;
                break ;
            case '/' :
                r=a/b;
                break ;
            case '-' :
                r=a-b;
                break ;
            default :
                break;
                printf("Error\n");
                return 1 ;
        }
        printf("Resultado: %i\n",r);
        getchar();
        return 0 ;
    }

    Salu2


    Keep on Rollin'

    . . . . . . . . . . . . . . . . . . . .
    [[ NORMAS DEL FORO ]]
    . . . . . . . . . . . . . . . . . . . .
    __________
    Citar  
     

  5. #5  
    Moderador Global Avatar de hystd
    Fecha de ingreso
    Jul 2005
    Ubicación
    1, 11, 21, 1211...
    Mensajes
    1.596
    Descargas
    58
    Uploads
    0
    que tiemblen los programadores que llega j8 pegando fuerte!!! xD
    El optimista tiene ideas, el pesimista... excusas

    Citar  
     

  6. #6  
    Moderador Global Avatar de hystd
    Fecha de ingreso
    Jul 2005
    Ubicación
    1, 11, 21, 1211...
    Mensajes
    1.596
    Descargas
    58
    Uploads
    0
    NOTICIA: "j8 vs CRC" en la detección de errores... (nuevas caracterísitcas: "corrección de errores"). El nuevo algoritmo, llamado j8, convierte un 2-PDU en un 3-SDU libre de errores, añadiendo unas cabeceras PCI muy sofisticadas xD

    Saludos
    El optimista tiene ideas, el pesimista... excusas

    Citar  
     

  7. #7  
    Moderador Global
    Fecha de ingreso
    Aug 2005
    Mensajes
    6.279
    Descargas
    7
    Uploads
    0
    juas xD

    No seas cruel xD

    Salu2


    Keep on Rollin'

    . . . . . . . . . . . . . . . . . . . .
    [[ NORMAS DEL FORO ]]
    . . . . . . . . . . . . . . . . . . . .
    __________
    Citar  
     

  8. #8  
    Avanzado
    Fecha de ingreso
    Jun 2006
    Ubicación
    Valhala
    Mensajes
    1.167
    Descargas
    4
    Uploads
    0
    jajajja, como se nota la experiencia del programador. Aunque se te ha olvidado una pega, no se puede hacer con switch :P
    http://www.project-longinus.es
    Citar  
     

  9. #9  
    Moderador Global
    Fecha de ingreso
    Aug 2005
    Mensajes
    6.279
    Descargas
    7
    Uploads
    0
    Cita Iniciado por smaug_ Ver mensaje
    jajajja, como se nota la experiencia del programador.
    es verdad, a hystd se le nota experiencia

    Cita Iniciado por smaug_ Ver mensaje
    Aunque se te ha olvidado una pega, no se puede hacer con switch :P
    ¿por qué??

    Salu2


    Keep on Rollin'

    . . . . . . . . . . . . . . . . . . . .
    [[ NORMAS DEL FORO ]]
    . . . . . . . . . . . . . . . . . . . .
    __________
    Citar  
     

  10. #10  
    Avanzado
    Fecha de ingreso
    Jun 2006
    Ubicación
    Valhala
    Mensajes
    1.167
    Descargas
    4
    Uploads
    0
    Cita Iniciado por IEEE Ver mensaje
    ...el resultado (ej: si el resultado es 4 me pone 44). Desde ya muchisimas gracias a quien pueda ayudarme por que me rompo la cabeza copn esto jejeje.
    NOTA: en el ejercicio estaba especificado que no se podia usar switch, solo if-else.



    }
    Por eso :P Aunque la diferencia es minima.
    http://www.project-longinus.es
    Citar  
     

  11. #11  
    Moderador Global Avatar de hystd
    Fecha de ingreso
    Jul 2005
    Ubicación
    1, 11, 21, 1211...
    Mensajes
    1.596
    Descargas
    58
    Uploads
    0
    [...]Aunque la diferencia es minima.
    Pues no recuerdo en qué documento de Microsoft decia que un switch-case era menos eficiente que una secuencia de if's... yo pienso que depende del compilador, no obstante creo que era para Visual Studio, todo es cuestion de desensamblar y ver qué instrucciones en ensamblador genera el compilador para ambos casos y para un compilador en concreto... desconozco si gcc y Visual Studio generan las mismas instrucciones x86, para un mismo programa. Habrá que hacer las pruebas...

    Un saludo
    El optimista tiene ideas, el pesimista... excusas

    Citar  
     

  12. #12  
    Moderador Global
    Fecha de ingreso
    Aug 2005
    Mensajes
    6.279
    Descargas
    7
    Uploads
    0
    Aaaaaahhhhhhh ese pequeño detalle xD

    Salu2


    Keep on Rollin'

    . . . . . . . . . . . . . . . . . . . .
    [[ NORMAS DEL FORO ]]
    . . . . . . . . . . . . . . . . . . . .
    __________
    Citar  
     

  13. #13  
    Avanzado
    Fecha de ingreso
    Jun 2006
    Ubicación
    Valhala
    Mensajes
    1.167
    Descargas
    4
    Uploads
    0
    Cita Iniciado por hystd Ver mensaje
    Pues no recuerdo en qué documento de Microsoft decia que un switch-case era menos eficiente que una secuencia de if's... yo pienso que depende del compilador, no obstante creo que era para Visual Studio, todo es cuestion de desensamblar y ver qué instrucciones en ensamblador genera el compilador para ambos casos y para un compilador en concreto... desconozco si gcc y Visual Studio generan las mismas instrucciones x86, para un mismo programa. Habrá que hacer las pruebas...

    Un saludo
    Por ahi lei que en php, tambien es mas eficiente usar la secuencia de ifs, que un switch.
    http://www.project-longinus.es
    Citar  
     

Temas similares

  1. Resolver este ejercicio JAVA
    Por gregowebs01 en el foro PROGRAMACION DESKTOP
    Respuestas: 2
    Último mensaje: 25-09-2012, 20:59
  2. problema con ejercicio de c++
    Por herc en el foro PROGRAMACION DESKTOP
    Respuestas: 7
    Último mensaje: 22-04-2012, 01:22
  3. ejercicio modula2
    Por Francis en el foro PROGRAMACION DESKTOP
    Respuestas: 0
    Último mensaje: 15-06-2010, 23:56
  4. ejercicio con paginas web
    Por ermp en el foro INTRUSION
    Respuestas: 1
    Último mensaje: 15-04-2009, 01:08
  5. Respuestas: 10
    Último mensaje: 18-08-2008, 18:35

Marcadores

Marcadores