Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: Naluem en 8 Noviembre 2014, 13:03 PM

Título: Problema con mi codigo
Publicado por: Naluem en 8 Noviembre 2014, 13:03 PM
Buenas este año empiezo ingeniería informática y me he quedado encallado en una de mis practicas. Tengo que hacer un convertidor de números romanos a decimales solo se me permite procesar I V X L D M y el salto de linea para cualquier otro tengo que sacar mensaje de error y salir . Este es mi código, a ver si alguien me echa un cable .

#include <stdio.h>
char n;
int suma=0;
int a;
int b;
int main () {
printf("Escribe un numero en romano \n");
scanf("%c",&n);
   if (n=='I' || n=='V' || n=='X' || n=='L' || n=='C' || n=='D' || n=='M' || n=='\n'){
       while (n!='\n'){
           if (n=='I') {
                   a=1;
                   if(b<a) { suma=suma+(a-b); }
                   else { suma=suma+(a+b);}
           }
           if (n=='V') {
                   a=5;
                   if(b<a) { suma=suma+(a-b); }
                   else { suma=suma+(a+b); }
           }
           if (n=='X') {
                   a=10;
                   if(b<a) { suma=suma+(a-b); }
                   else { suma=suma+(a+b); }
           }
           if (n=='L') {
                   a=50;
                   if(b<a) { suma=suma+(a-b); }
                   else { suma=suma+(a+b); }
           }
           if (n=='C') {
                   a=100;
                   if(b<a) { suma=suma+(a-b); }
                   else { suma=suma+(a+b); }
           }
           if (n=='D') {
                   a=500;
                   if(b<a) { suma=suma+(a-b); }
                   else { suma=suma+(a+b); }
           }
           if (n=='M') {
                   a=1000;
                   if(b<a) { suma=suma+(a-b); }
                   else { suma=suma+(a+b); }
           }
           b=a;
           scanf("%n",&n);
       }

   }
   else {
       fprintf(stderr,"ERROR: El numero introducido no es correcto \n");
       return -1;
   }
printf("Este es el numero: %i",suma);
   return 0;
}





Solo se me permiten usar condicionales if, else if, else y bucles while y for. Nada de arrays . Ni break.


Cuando ejecuto me reconoce si es uno de los caracteres permitidos y saca mensaje de error si no es el esperado, pero cuando pongo uno de los esperados no hace nada.
Título: Re: Problema con mi codigo
Publicado por: lluvplay en 8 Noviembre 2014, 14:24 PM
Buenos días Sr. ratchetmdt.

Con la intención de ayudarle he realizado 2 cambios en su codificación y su programa funciona sintaxticamente. Se las listo a continuación:
1. Siempre se deben inicializar las variables en C/C++ porque sino las llena de basura (variable a = 0, b= 0 ).
2. La variable char se debe leer con %c (entiendo que aquí tal vez se confundió -- refiriéndome al segundo sacanf que tiene).
Citarscanf("%n",&n);

Luego de esto he logrado que corra correctamente, mas no tiene la logica cuando ingreso VVV = 25 eso es falso debe ser = 15.


#include <stdio.h>
char n;
int suma=0;
int a = 0;
int b = 0;
int main () {
printf("Escribe un numero en romano \n");
scanf("%c",&n);
    if (n=='I' || n=='V' || n=='X' || n=='L' || n=='C' || n=='D' || n=='M' || n=='\n'){
        while (n!='\n'){
            if (n=='I') {
                    a=1;
                    if(b<a) { suma=suma+(a-b); }
                    else { suma=suma+(a+b);}
            }
            if (n=='V') {
                    a=5;
                    if(b<a) { suma=suma+(a-b); }
                    else { suma=suma+(a+b); }
            }
            if (n=='X') {
                    a=10;
                    if(b<a) { suma=suma+(a-b); }
                    else { suma=suma+(a+b); }
            }
            if (n=='L') {
                    a=50;
                    if(b<a) { suma=suma+(a-b); }
                    else { suma=suma+(a+b); }
            }
            if (n=='C') {
                    a=100;
                    if(b<a) { suma=suma+(a-b); }
                    else { suma=suma+(a+b); }
            }
            if (n=='D') {
                    a=500;
                    if(b<a) { suma=suma+(a-b); }
                    else { suma=suma+(a+b); }
            }
            if (n=='M') {
                    a=1000;
                    if(b<a) { suma=suma+(a-b); }
                    else { suma=suma+(a+b); }
            }
            b=a;
            scanf("%c",&n);
        }

    }
    else {
        fprintf(stderr,"ERROR: El numero introducido no es correcto \n");
        return -1;
    }
printf("Este es el numero: %i",suma);
    return 0;
}


Si tienes problemas con la lógica para la conversión lo indicas y se te puede ayudar.

Cordiales Saludos.
Título: Re: Problema con mi codigo
Publicado por: Naluem en 8 Noviembre 2014, 14:38 PM
Lo unico que me piden es que sume y reste bien , que se repita mas de 3 veces me dicen que  no lo debo de contemplar.

Gracias por la correccion del fallo .
Título: Re: Problema con mi codigo
Publicado por: plataplomo2948 en 8 Noviembre 2014, 19:44 PM
aun que sus instruciones no son tan claras, pra mi eso funciona

ese codigo tiene varias complicaciones que no son necesarios, pero eso funciona. yo le recomendaria a hacerlo de nnuevo, y poner algo como

if n == X
    suma = 10
if n == I
    suma = 1

if memcmp(n, "XX", 2) == 0
    suma = 20

etc

suerte


    #include <stdio.h>
    char n;
    int suma=0;
    int a;
    int b;
    int main () {
    printf("Escribe un numero en romano \n");
    scanf("%c",&n);
       if (n=='I' || n=='V' || n=='X' || n=='L' || n=='C' || n=='D' || n=='M' || n=='\n')
      {
           // tiene que sacar eso, porque ese condicion va a ser infinito y no es nesecario
           //while (n!='\n')
           //{
               if (n=='I') {
                       a=1;
                       // a que refiere con "b"? b no tiene valor... seria mejor
                      // y menos codigo a simplamente escribir " suma = 1 "
                       if(b<a)
                      {
                         // aun que en ASM no tiene mucha diferencia, en C es mejor escribalo asi
                         // suma=suma+(a-b);
                         suma += (a - b)

                      }
                       else { suma=suma+(a+b);}
               }
               if (n=='V') {
                       a=5;
                       if(b<a) { suma=suma+(a-b); }
                       else { suma=suma+(a+b); }
               }
               if (n=='X') {
                       a=10;
                       if(b<a) { suma=suma+(a-b); }
                       else { suma=suma+(a+b); }
               }
               if (n=='L') {
                       a=50;
                       if(b<a) { suma=suma+(a-b); }
                       else { suma=suma+(a+b); }
               }
               if (n=='C') {
                       a=100;
                       if(b<a) { suma=suma+(a-b); }
                       else { suma=suma+(a+b); }
               }
               if (n=='D') {
                       a=500;
                       if(b<a) { suma=suma+(a-b); }
                       else { suma=suma+(a+b); }
               }
               if (n=='M') {
                       a=1000;
                       if(b<a) { suma=suma+(a-b); }
                       else { suma=suma+(a+b); }
               }
               b=a;
               scanf("%n",&n);
          // }
     
       }
       else {
           fprintf(stderr,"ERROR: El numero introducido no es correcto \n");
           return -1;
       }
    printf("Este es el numero: %i",suma);
       return 0;
    }