/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Mi codigo de romanos a arabicos.

 
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
lordjusticiero



Registrado: 17 Ago 2007
Mensajes: 11

MensajePublicado: 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

MensajePublicado: 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

MensajePublicado: 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

MensajePublicado: 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

MensajePublicado: 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

MensajePublicado: 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
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com