Español (ES)
Usuario anónimo
Iniciar sesión | Regístrate gratis
Foro de Software

Responder / Comentar
Foro Software
Por Ratchetmdt512
Hace 9 años / Respuestas: 15 / Lecturas: 393

Problema con mi codigo en c

[b]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 .[/b]

#include 
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(bEDITADO EL 08-11-2014 / 17:11 (EDITADO 2 VECES)
Noehg435Hace 9 años1
No lo he leído entero, pero creo que el problema está en que para el salto de línea has puesto 'n' y es '\n'. Si simplemente se ha copiado mal o algo y no es eso, dímelo, y lo leo con más atención.
1 VOTO
Ratchetmdt512Hace 9 años2
[b]Quiero que haga de convertidor de romanos a decimales pero no resta bien los caracteres pequeños a los grandes de delante solo suma [/b]
Noehg435Hace 9 años3
No entiendo bien a qué te refieres.
Tactica2302Hace 9 años4
@Noehg

Que quiere que el programa convierta MCMXVI correctamente a 1916, por ejemplo.

Si esto fuera hace un mes o dos igual podía escribir el programa yo solito de cero, porque había empezado a estudiar C en los ratos libres, pero ahora mismo lo he dejado un poco de lado y ya me he olvidado de mucho 
Noehg435Hace 9 años5
¿Qué son a y b? Si no me equivoco, b no está inicializado.
Ratchetmdt512Hace 9 años6
A es el primer numero que leo, que luego guardo en b para comparar y saber si resto o sumo .
Noehg435Hace 9 años7
¿Y dónde lo lees y cuándo lo guardas en b?
CyberBoy1257Hace 9 años8
No tengo el compilador en este momento, pero revisé tu código y fíjate en lo que estás haciendo. 

Por ejemplo, si quiero ingresar por consola IX (que sería 9).

- Primero ingresas I.
- Entra en el if del I y suma 1 a "suma".
- Guardas 1 en la variable "b".
- Luego te pide ingresar el siguiente caracter. En este caso ingresas X.
- Entra en el if del X y preguntas:
[code]               a=10;
               if(bEDITADO EL 13-11-2014 / 01:17 (EDITADO 2 VECES)
1 VOTORatchetmdt512Hace 9 años9
[b]Ok revisare el codigo entonces, gracias   [/b]
Ratchetmdt512Hace 9 años10
[b]En principio uso b para guardar a al final del trayecto para compararla con el siguiente para saber si he de sumar o restar.[/b]
Neo35871706Hace 9 años11
No quiero criticarte, pero tú código es bastante malo (obviando los fallos que pueda haber), entre las funciones globales innecesarias, tener que escanear los caracteres uno a uno, el medio millón de if-else, que se pueden hacer con un switch o un bucle si te lo montas bien, y la cantidad de código repetido.....

Me he montado un código en un par de minutos que debería funcionar correctamente:


#include  

// Sí, lo he escrito en inglés, algo que debería hacerse siempre para que el código lo entienda cualquier persona

int main(void) {
  
  char strScales[] = "IVXLCDM";
  int  scalesValues[] = {1,5,10,50,100,500,1000};
  
  printf("Introduce un numero en romano: ");
  char strNumber[20];
  scanf("%s", strNumber);
  
  int i = 0, value = 0, lastValue = 0;
  
  while(strNumber[i] != 0) {
    
    int scale = 0;
    
    // Check scale value of the selected char
    while(strNumber[i] != strScales[scale]) {
      if(strScales[scale++] == 0) { 
        printf("Invalid number");
        return 0;
      }
    }
    
    value += scalesValues[scale];
    
    if(i++) 
      if(lastValue < scalesValues[scale])
        value -= lastValue*2;
    
    lastValue = scalesValues[scale];
  }
  
  printf("%d", value);
  
  getchar();
  return 0;
}




Por cierto, el foro de 3Djuegos no deja poner barra invertida y se me come los espacios.
EDITADO EL 15-11-2014 / 05:21 (EDITADO 1 VEZ)
CyberBoy1257Hace 9 años12
@Neo3587 Parece que no leíste lo que dijo. No puede usar arrays (arreglos).

@Ratchetmdt Está bien el uso que le das a "b", pero al inicio de todo, "b" aun no almacena nada y asumes que tiene valor cero. Creo que los compiladores de ahora tienen eso solucionado pero antes, algunos reconocían basura si no lo inicializabas, es por eso que se recomienda que lo inicialices en cero en la declaración de variables. En todo caso, tampoco es que sea obligatorio si te funciona bien en tu compilador.
Neo35871706Hace 9 años13
@CyberBoy
Mostrar cita
@Neo3587 Parece que no leíste lo que dijo. No puede usar arrays (arreglos). @Ratchetmdt Está bien el uso que le das a "b", pero al inicio de todo, "b" aun no almacena nada y asumes que tiene valor cero. Creo que los compiladores de ahora tienen eso solucionado pero antes, algunos reconocían basura si no lo inicializabas, es por eso que se recomienda que lo inicialices en cero en la declaración de variables. En todo caso, tampoco es que sea obligatorio si te funciona bien en tu compilador.
Cierto, es que empecé a leer un poco su código y acabé pasando del resto ya que me parecía bastante ilegible, un asco que los profesores limiten la creatividad del alumno de esta forma.
Tactica2302Hace 9 años14
@Neo3587
Mostrar cita
Por cierto, el foro de 3Djuegos no deja poner barra invertida y se me come los espacios.
[code] /* Ejemplos de printf() printf("Muy buenas \\n"); printf("Un espacio: Dos espacios: Tres espacios: Cuatro espacios: \\n"); */ [/code] Dejar te deja, lo que pasa es que tienes que poner dos juntas porque en cada edición o previsualización desaparece una. Y por cierto, tu programa también es mejorable, lo de andar declarando e inicializando variables en medio del código es muy feo
  Cita:
Mostrar cita
un asco que los profesores limiten la creatividad del alumno de esta forma.
Se llama aprender a hacer las cosas conforme a unos requerimientos, hay toneladas de ejercicios similares en los mejores libros de C. El ejercicio que le piden está chupado, sólo necesita crear una función en lugar de repetir el mismo código 100 veces. Yo lo intenté pero ya digo, al dejarlo de lado ya me he olvidado @Yasinator Espero que seáis conscientes de este fallo y se corrija alguna vez, es especialmente grave que [code] tenga el mismo fallo y no sea un equivalente directo del PRE de HTML.
EDITADO EL 15-11-2014 / 13:41 (EDITADO 1 VEZ)
Tactica2302Hace 9 años15
@CyberBoy
Mostrar cita
@Ratchetmdt Está bien el uso que le das a "b", pero al inicio de todo, "b" aun no almacena nada y asumes que tiene valor cero. Creo que los compiladores de ahora tienen eso solucionado pero antes, algunos reconocían basura si no lo inicializabas, es por eso que se recomienda que lo inicialices en cero en la declaración de variables. En todo caso, tampoco es que sea obligatorio si te funciona bien en tu compilador.
Que yo sepa GCC lo sigue haciendo, y en mi opinión es una buena idea. Quien no inicializa variables como es debido se merece sufrir todos los tormentos
Responder / Comentar
Subir
Foros > Software > Problema con mi codigo en c

Hay 15 respuestas en Problema con mi codigo en c, del foro de Software. Último comentario hace 9 años.

  • Regístrate

  • Información legal
Juegos© Foro 3DJuegos 2005-2024. . SOBRE FORO 3DJUEGOS | INFORMACIÓN LEGAL