| Ver tema anterior :: Ver siguiente tema | | Autor | Mensaje |
|---|
lordjusticiero
Registrado: 17 Ago 2007 Mensajes: 11
| Publicado: 07/09/2007 6:07 am | | | Título: Mi codigo de romanos a arabicos. |
| Saludos....
| Código: | #include<iostream.h> void main() { int w,acum=0,acum1=0; char a[100]; cout<<"Ingrese la cantidad en romanos"<<endl; cin>>a;
for(w=0;w<=100;w++) { if((a[w]=='i') || (a[w]=='I')){ if((a[w+1]=='v') || (a[w+1]=='x') || (a[w+1]=='l') || (a[w+1]=='c') || (a[w+1]=='d') || (a[w+1]=='m') || (a[w+1]=='V') || (a[w+1]=='X') || (a[w+1]=='L') || (a[w+1]=='C') || (a[w+1]=='D') || (a[w+1]=='M')){ acum1=acum1+1; } else { acum=acum+1; } } else if((a[w]=='v') || (a[w]=='V')){ if((a[w+1]=='x') || (a[w+1]=='l') || (a[w+1]=='c') || (a[w+1]=='d') || (a[w+1]=='m') || (a[w+1]=='X') || (a[w+1]=='L') || (a[w+1]=='C') || (a[w+1]=='D') || (a[w+1]=='M')){ acum1=acum1+5; } else { acum=acum+5; } } else if((a[w]=='x') || (a[w]=='X')){ if((a[w+1]=='l') || (a[w+1]=='c') || (a[w+1]=='d') || (a[w+1]=='m') || (a[w+1]=='L') || (a[w+1]=='C') || (a[w+1]=='D') || (a[w+1]=='M')){ acum1=acum1+10; } else { acum=acum+10; } } else if((a[w]=='l') || (a[w]=='L')){ if((a[w+1]=='c') || (a[w+1]=='d') || (a[w+1]=='m') || (a[w+1]=='C') || (a[w+1]=='D') || (a[w+1]=='M')){ acum1=acum1+50; } else { acum=acum+50; } } else if((a[w]=='c') || (a[w]=='C')){ if ((a[w+1]=='d') || (a[w+1]=='m') || (a[w+1]=='D') || (a[w+1]=='M')){ acum=acum-100; } else { acum=acum+100; } } else if((a[w]=='d') || (a[w]=='D')){ if ((a[w+1]=='m') || (a[w+1]=='M')){ acum1=acum1+500; } else { acum=acum+500; } } else if(a[w]=='m' || a[w]=='M') { acum1=acum1-1000; } } cout<<"El valor es = "<<acum-acum1<<endl; } |
|
| | Volver arriba | |  | digies
Registrado: 18 Nov 2005 Mensajes: 241 Ubicación: Cono Sur
| Publicado: 07/09/2007 4:23 pm | | | Título: |
| Hola
Coloca un título descriptivo de lo que pretendes.
Tu código no funciona. Puesto que no utilizas el paradigma orientado a objetos -lo haces todo estructurado-, ¿por qué no hacerlo simplemente en C?. De esa forma el programa será más veloz.
Yo lo haría así:
| Código: | #include <stdio.h> #include <stdlib.h> #include <string.h>
int main() { char strRomano1[15]; unsigned char b=0; int c, f, i, x, v=0, arabigo=0, p=0; printf("Ingresa el numero romano: "); gets(strRomano1); c= strlen(strRomano1); for(f=0; f<c; f++) { if(strRomano1[f]!='i' && strRomano1[f]!='v' && strRomano1[f]!='x' && strRomano1[f]!='l' && strRomano1[f]!='c' && strRomano1[f]!='d' && strRomano1[f]!='m') { printf("\nDato no valido\n\n\n"); b=1; break; } if(f>=3) if(strRomano1[f]==strRomano1[f-1]) if(strRomano1[f]==strRomano1[f-2]) if(strRomano1[f]==strRomano1[f-3] ) { printf("\nDato no valido\n\n\n"); b=1; break; } } if(b==0) { for(i=c-1; i>=0; i--) { if(strRomano1[i]=='i') x=1; if(strRomano1[i]=='v') x=5; if(strRomano1[i]=='x') x=10; if(strRomano1[i]=='l') x=50; if(strRomano1[i]=='c') x=100; if(strRomano1[i]=='d') x=500; if(strRomano1[i]=='m') x=1000; if(x<p) v=-1; else v=1; arabigo=arabigo+(x*v); p=x; } printf("\nNumero arabigo: %d\n\n\n", arabigo); } system("pause"); return 0; }
|
Ahora solo te faltaría implemetar un controlador de errores por si el usuario intenta ingresar, por ejemplo: "ic" ( IC no es un número romano). También el programa debería aceptar números romanos "en mayúsculas".
Un saludo. |
| | Volver arriba | |  | lordjusticiero
Registrado: 17 Ago 2007 Mensajes: 11
| Publicado: 07/09/2007 4:40 pm | | | Título: |
| Buenas noches en venezuela.... Estimado amigo mi codigo funciona perfecto, quisas a usted no porque usted no usa el mismo compilador que yo, usted no puede decir algo sin base, o porque no sepa usar c++.
Primero y principal:
Si usted revisara al menos un poquito se daria cuenta de el error:
| Código: | if((a[w]=='i') || (a[w]=='I')){ if((a[w+1]=='v') || (a[w+1]=='x') || (a[w+1]=='l') || (a[w+1]=='c') || (a[w+1]=='d') || (a[w+1]=='m') || (a[w+1]=='V') || (a[w+1]=='X') || (a[w+1]=='L') || (a[w+1]=='C') || (a[w+1]=='D') || (a[w+1]=='M')){ acum1=acum1+1; } |
El programa acepta mayusculas ahi claramente se puede ver en los if que ya esta establecido.
Segundo no puedo usar el lenguaje asi a lo malandro de C solo porque usted lo diga, usted deberia saber que no todos conocemos los lenguajes, y que algunos programan en un lenguaje y otros en otro, es decir es como que si yo le dijera a usted y porque no usas asp net, suponiendo que usted es un novato.
Lo del IC eso es el unico detalle que considero bueno pero lo demas ya lo sabia.
Por ultimo dejare en claro que mi intencion al poner el codigo es para ver si alguien le sirve o sencillamente le hace cambios en c++, recuerde que esta zona es para novatos. |
| | Volver arriba | |  | | digies
Registrado: 18 Nov 2005 Mensajes: 241 Ubicación: Cono Sur
| Publicado: 07/09/2007 6:04 pm | | | Título: |
| lordjusticiero
Cuando colocas un código en el foro, escribe en el inicio -cuerpo del mensaje- un texto desriptivo así lo podemos interpretar correctamente. Como no colocaste nada, solo "Saludos...." el usuario (como yo) no sabrá a ciencia cierta cual es la intención del mismo: corregir?, optimizar?, colocar otras versiones?, otras alternativas?, sugerir?.
| Cita: | | Estimado amigo mi codigo funciona perfecto |
No perfecto, porque como tu bien dices:
| Código: | Lo del IC eso es el unico detalle que considero bueno |
Pues no lo implementaste, entonces no es perfecto.
| Cita: | Si usted revisara al menos un poquito se daria cuenta de el error:
| Código: | if((a[w]=='i') || (a[w]=='I')){ if((a[w+1]=='v') || (a[w+1]=='x') || (a[w+1]=='l') || (a[w+1]=='c') || (a[w+1]=='d') || (a[w+1]=='m') || (a[w+1]=='V') || (a[w+1]=='X') || (a[w+1]=='L') || (a[w+1]=='C') || (a[w+1]=='D') || (a[w+1]=='M')){ acum1=acum1+1; }
|
|
De esto también me dí cuenta, por eso mi respuesta fue "... no funciona"; por lo tanto tu código no es perfecto.
| Cita: | Segundo no puedo usar el lenguaje asi a lo malandro de C solo porque usted lo diga, usted deberia saber que no todos conocemos los lenguajes, y que algunos programan en un lenguaje y otros en otro, es decir es como que si yo le dijera a usted y porque no usas asp net,
|
Mala interpretación de tu parte: solo lo sugerí y dí mi opinión al respecto.
| Cita: | Por ultimo dejare en claro que mi intencion al poner el codigo es para ver si alguien le sirve o sencillamente le hace cambios en c++,... |
Si tu intención era esa, repito, hubieras colocado un texto descriptivo a tal efecto.
| Cita: | | recuerde que esta zona es para novatos. |
Por eso los usuarios novatos deben disponer de sugerencias.
| Cita: | | El programa acepta mayusculas ahi claramente se puede ver en los if que ya esta establecido. |
En eso sí te doy la razón, se me pasó por alto (bueno... soy humano).
Resumiendo: Todo lo que dije en mi primer respuesta eran solo sugerencias y/o alternativas; y no imposiciones. ¿Acaso el foro no cumple esa tarea?
Un saludo. |
| | Volver arriba | |  | lordjusticiero
Registrado: 17 Ago 2007 Mensajes: 11
| Publicado: 07/09/2007 6:11 pm | | | Título: Respuesta |
| Queda claro que usted esta equivocado, porque para un novato ese codigo esta perfecto, y usted no tiene ningun derecho a decir lo contrario porque usted fue un novato alguna vez...
Segundo el titulo es claro mi codigo de este programa, usted le esta dando un mal uso a la parte de novatos...
Queda claramente que no tiene argumentos en c++ porque es ese el lenguaje que el programa usa, no siga sugiriendo amigo dejelo asi a la final yo nunca pedi su ayuda esta considero yo que es una zona de novatos hay su zona de expertos...
Queda bien claro que usted esta equivocado porque ese no es el sentido del programa.
Supongamos que yo hago un programa de una calculadora y usted me dice que 1/0 no debe decir error debe decir infinito, es mas o menos lo que usted me esta pidiendo, sencillamente es una conversion y funciona, es decir si fuese una calculadora y suma resta y multiplica para mi esta bien lo demas es sencillamente UNA GAFEDAD... |
| | Volver arriba | |  | rir3760

Registrado: 01 Oct 2004 Mensajes: 3657 Ubicación: Mexico
| Publicado: 07/09/2007 7:00 pm | | | Título: Re: Respuesta |
| | lordjusticiero escribió: | | Queda claro que usted esta equivocado, porque para un novato ese codigo esta perfecto |
Bordando en la pedanteria se puede decir que ningun codigo fuente es perfecto. Si pasamos a un plan mas terrenal podemos discutir si el codigo fuente de un programa es correcto o no, tu programa y esto lo digo como critica constructiva tiene algunas deficiencias.
| lordjusticiero escribió: | | y usted no tiene ningun derecho a decir lo contrario porque usted fue un novato alguna vez |
El que todos hayamos sido principiantes no es obstaculo (ni excusa) para no tratar de evitar que los principiantes cometan esos mismos errores.
| lordjusticiero escribió: | | Segundo el titulo es claro mi codigo de este programa, usted le esta dando un mal uso a la parte de novatos |
Lo siento pero no lo es, como ya comento digies el unico texto en tu mensaje es "Saludos" seguido del codigo fuente de tu programa, es valido pensar que uno se quede con la duda sobre cual es la intencion de tu mensaje.
| lordjusticiero escribió: | | Queda claramente que no tiene argumentos en c++ porque es ese el lenguaje que el programa usa |
Cuando digies te pregunto porque no utilizaste el lenguaje C en lugar de C++ lo hizo con argumentos: tu programa no utiliza ninguna de las caracteristicas de la POO y bien podria utilizar el lenguaje ya mencionado.
| lordjusticiero escribió: | | no siga sugiriendo amigo dejelo asi a la final yo nunca pedi su ayuda esta considero yo que es una zona de novatos hay su zona de expertos |
No hay zona de novatos ni de expertos, el foro "Principiantes C/C++" tiene como objetivo discutir sobre temas basicos tanto de C como de C++.
Regresando a tu programa algunas de las mejoras:
* Utilizar <iostream> * Cambiar el prototipo de la funcion main a "int main(){ ... }" * Indicar explicitamente el valor de retorno de main. * Incluir <cctype> y utilizar las funciones tolower y toupper.
* Este fragmento y otros similares:
| Código: | if ( (a[w+1] == 'v') || (a[w+1] == 'x') || (a[w+1] == 'l') || (a[w+1] == 'c') || (a[w+1] == 'd') || (a[w+1] == 'm') || (a[w+1] == 'V') || (a[w+1] == 'X') || (a[w+1] == 'L') || (a[w+1] == 'C') || (a[w+1] == 'D') || (a[w+1] == 'M') ){ acum1 = acum1 + 1; } else { acum = acum + 1; } |
Se puede hacer mas corto (pero no mas eficiente) eliminando los parentesis en las subexpresiones ya que no son necesarios asi como tambien los delimitadores de bloques "{" y "}".
La mejora principal consiste (despues de incluir <cctype> y <cstring>) en utilizar las funciones toupper y strchr, por ejemplo ese mismo bloque terminaria reducido a:
| Código: | if (strchr("VXLCDM", toupper(a[w + 1])) != NULL) acum1++; else acum++; |
Ya por ultimo si quieren discutir largo y tendido sobre el tema por mi no hay problema siempre y cuando lo hagan con un espiritu constructivo.
Un saludo _________________ The capacity to learn is a gift; The ability to learn is a skill; The willingness to learn is a choice. -- Rebec of Ginaz |
| | Volver arriba | |  | | |
| No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas
|
|
| |