Problema con mi codigo

Iniciado por Naluem, 8 Noviembre 2014, 13:03 PM

0 Miembros y 1 Visitante están viendo este tema.

Naluem

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.

lluvplay

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.
* Determinismo Causal !! Estamos Programados Para Necesitar Respuestas!!

* No deberías copiar un código, sin antes haber comprendido porque funciona de esa manera !

Naluem

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 .

plataplomo2948

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;
    }