Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: 05K4R1N en 3 Junio 2013, 21:42 pm



Título: Numeros Romanos
Publicado por: 05K4R1N en 3 Junio 2013, 21:42 pm
Para matar mi aburrimiento tuve que hacer esto y ahora ya me tuvo encerrado esto... ayudenme a corregirlo... donde esta el error?? !!
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <conio.h>
  4.  
  5. main(){
  6.       char romano[]={};
  7.       printf("Ingrese Numero Romando: ");
  8.       scanf("%s",&romano);
  9.       fflush(stdin);
  10.  
  11.       char rom[]={' ','I','V','X','L','C','D','M'};
  12.       int valor[]={0,1,5,10,50,100,1000};
  13.  
  14.       convertidor(romano,rom,valor);
  15. }
  16. void convertidor(char rom1[],char rom2[],int v[]){
  17.     int suma=0,anterior=0;
  18.     char letra=' ';
  19.     int i,j;
  20.     for(i=0;i<rom1.length;i++){
  21.                                letra=rom1[i];
  22.                                for(j=0;j<rom2.length;j++){
  23.                                                           if(letra==rom2[j]){
  24.                                                                              suma=suma+v[j];
  25.                                                                              if(anterior<valor[j]){
  26.                                                                                                    suma=suma-anterior*2;
  27.                                                                                                    anterior=valor[j];
  28.                                                                              }
  29.                                                                              else{
  30.                                                                                   anterior=valor[j];
  31.                                                                              }
  32.                                                           }
  33.                                }
  34.     }
  35.     printf("Numero: %d",suma);
  36. }
  37.  


Título: Re: Numeros Romanos
Publicado por: amchacon en 3 Junio 2013, 22:09 pm
Ese código no compila y tiene algunos errores que me cuesta entender que sean por accidente... No será para que te hagamos la tarea no?  :silbar:


Título: Re: Numeros Romanos
Publicado por: 05K4R1N en 3 Junio 2013, 22:11 pm
no nada que ver... solo entiendo que dice incompatibilidad de las variables del metodo convertidor, a parte parece que toy manejando mal los arreglos char... comenzando dsd alli los estoy manipulando bien?.... pienso q radica mi error alli...


Título: Re: Numeros Romanos
Publicado por: pacoperico en 3 Junio 2013, 22:22 pm
A ver, explicanos detalladamente como funciona el programa y que errores te da el compilador.


Título: Re: Numeros Romanos
Publicado por: 05K4R1N en 3 Junio 2013, 22:32 pm
Funciona así:

Usuario ingresa un número romano y para que pueda convertir mas sencillo de romano a decimal hice un arreglo char que solo alberga romanos y otro con numeros decimales.

Pasando ya todo al metodo convertidor con variables que serán fundamentales para la conversion el char del cual ingresa el usuario un numero romano, el otro arreglo de romanos que hice mas un arreglo de enteros, cree tres variables, suma para el cual se sumaran de forma acumulativa por medio del ciclo for que cree, una variable char letra que servirá para comparar la posición de cada letra con los 2 arreglos que cree en un principio digamos XVII
primero va X, entonces recorrera primero mediante el chat buscar X y luego su posición sera igual para el metodo de enteros que hice y me asigna a un valor entero para lo cual despues se acumulará con el siguiente que sera V y sucesivamente--.-
10 + 5....
En el caso espeial si tuviera CXC.... cree la condicion
if(anterior<v[j]) asi restará en lugar de sumar con el valor que almacenará con el valor anterior...

ERROR: está en que dice conflicting types for "convertidor"....


Título: Re: Numeros Romanos
Publicado por: dato000 en 3 Junio 2013, 22:42 pm
Ese código no compila y tiene algunos errores que me cuesta entender que sean por accidente... No será para que te hagamos la tarea no?  :silbar:

vamos

Vamos, has hecho tareas más dificiles no te hagas de rogar viejo XDDDD  :laugh: :laugh: :xD :xD ;-) ;-) :silbar: :silbar:

Mira te corregi el error de la longitud del arreglo, no puede usarse "length()" en un arreglo de caracteres, para ello, esta el "strlen()" que hace lo mismo, devuelve un numero entero con la longitud en un arreglo, puede usarse en un char, char[] y en string, funciona perfectamente.

Pero dejame decirte que hay algunas cosas te falta corregir, como la asignacion de la letra, y que pasa si es digamos un numero romano con una letra que antecede a una letra de un valor mayor, ahi no se suma sino que se resta, como cuando tienes "IV" o "IX", me entiendes

sigue trabajando, estamos para ayudarte, pero si quieres aprender a hacerlo bien, tienes que sufrir y llorar sangre, amchacon ha dejado guias que realmente te dejan dolores de cabeza XDDDDDD pero funcionan, no se que le pasa el día de hoy, sera por el lunes  :silbar: :silbar:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <conio.h>
  4.  
  5. main(){
  6.       char romano[]={};
  7.       printf("Ingrese Numero Romando: ");
  8.       scanf("%s",&romano);
  9.       fflush(stdin);
  10.  
  11.       char rom[]={' ','I','V','X','L','C','D','M'};
  12.       int valor[]={0,1,5,10,50,100,1000};
  13.  
  14.       convertidor(romano,rom,valor);
  15. }
  16. void convertidor(char rom1[],char rom2[],int valor[]){
  17.     int suma=0,anterior=0;
  18.  
  19.     // aqui hay un error, letra es un char
  20.     char letra=' ';
  21.     int i,j;
  22.  
  23.     printf("longitud char romano rom1: %d \n", strlen(rom1));
  24.     printf("longitud char romano rom2: %d \n\n", strlen(rom2));
  25.  
  26.     //strlen(<cadena>): Devuelve la longitud de la cadena sin tomar en cuenta
  27.     //el caracter de final de cadena.
  28.  
  29.     for(i=0; i<strlen(rom1) ;i++){
  30.        letra=rom1; //aqui tratas de asignar letra como un arreglo de caracteres
  31.  
  32.        for(j=0; j<strlen(rom2); j++){
  33.  
  34.           if(letra==rom2[j]){
  35.              suma=suma+valor[j];
  36.  
  37.              if(anterior<valor[j]){
  38.                suma=suma-anterior*2;
  39.                anterior=valor[j];
  40.              }
  41.              else{
  42.                anterior=valor[j];
  43.              }
  44.  
  45.           }
  46.        }
  47.     }
  48.     printf("Numero: %d", suma);
  49. }
  50.  


Título: Re: Numeros Romanos
Publicado por: 05K4R1N en 3 Junio 2013, 22:45 pm
jajajajaja me mataste de risa con tu comentario ;-) ;-) ;-) ;-) xD!!!! bueno toy iniciando en C pa que lo sepas ya que he estado muy pegado a tecnologia java y desarrollo de programacion movil jajaja y eso era lo que necesitaba del char con strlen jejeje no sabia pa serte sincero... bueno gracias con esto es mas que suficiente...  ;-)


Título: Re: Numeros Romanos
Publicado por: amchacon en 3 Junio 2013, 23:05 pm
vamos

Vamos, has hecho tareas más dificiles no te hagas de rogar viejo XDDDD  :laugh: :laugh: :xD :xD ;-) ;-) :silbar: :silbar:

Código
  1. #include <stdio.h>
  2. #include "Herramientas.h"
  3.  
  4. int main()
  5. {
  6. InitPistola(MUNICION_INFINITA);
  7.  
  8. char acierto = DispararPistola(dato000);
  9.  
  10. while (!acierto)
  11.  {
  12.    acierto = DispararPistola(dato000);
  13.  }
  14.  
  15.  puts("Muahahaha ^^");
  16.  
  17.  return 0;
  18. }

Mis disculpas, esque hay un cierto "personaje" que hacia eso a menudo (ponía código inconexo para que al final le hiciéramos la tarea).

amchacon ha dejado guias que realmente te dejan dolores de cabeza XDDDDDD pero funcionan, no se que le pasa el día de hoy, sera por el lunes  :silbar: :silbar

 :silbar: :silbar: :silbar: :silbar: :silbar:

 :silbar: :silbar: :silbar: :silbar: :silbar:


Título: Re: Numeros Romanos
Publicado por: 05K4R1N en 3 Junio 2013, 23:13 pm
por ultima vez no espero que me lo hagan ¬¬ !!!!


Título: Re: Numeros Romanos
Publicado por: leosansan en 3 Junio 2013, 23:40 pm
por ultima vez no espero que me lo hagan ¬¬ !!!!

Una pequeña variante operativa, sin el cero que no tiene sentido en los números romanos:

Código
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. int main(){
  5.    char romano [100]={0};
  6.    printf("Ingrese Numero Romano: ");
  7.    scanf ("%s",romano);
  8.    printf ("Romano: %s\n",romano);
  9.    char rom[8]={'I','V','X','L','C','D','M'};
  10.    int valor[7]={1,5,10,50,100,500,1000};
  11.    convertidor(romano, rom, valor);
  12.    return 0;
  13. }
  14. void convertidor ( char romano [], char rom [9],int valor [8])
  15. {
  16.    int suma=0,i,j;
  17.    for (i=0;i<strlen(romano);i++)
  18.        for (j=0;j<9;j++){
  19.            if (romano[i]==rom[j]){
  20.                suma+=valor [j];
  21.                break;
  22.            }
  23.            else
  24.                continue;
  25.        }
  26.    printf ("Numero: %d",suma);
  27. }
  28.  

Saluditos!!. ....(http://st.forocoches.com/foro/images/smilies/ciao.gif)


Título: Re: Numeros Romanos
Publicado por: dato000 en 3 Junio 2013, 23:46 pm
por ultima vez no espero que me lo hagan ¬¬ !!!!

XDDDDDDDDDD bien dicho amigo mio, como te quedo esa amchacon XDDDD  :laugh: :laugh: :laugh:

la de leo esta mejor, puesto que usa de una vez las variables que fueron llamadas a la función, es mucho mejor, aunque es confuso al principio XD


Título: Re: Numeros Romanos
Publicado por: leosansan en 4 Junio 2013, 01:03 am

la de leo esta mejor, puesto que usa de una vez las variables que fueron llamadas a la función, es mucho mejor, aunque es confuso al principio XD

No veo donde puede estar la confusión, salvo porque no explico ni pijo lo que va haciendo el código, mea culpa.

En esencia se va pasando cada caracter de la cadena introducida, romano, a la función y en ella se va comparando con los caracteres/valores en romano, que conforman el array rom. Caso de encontrar una coincidencia retorno el equivalente en decimal de la variable valor. Así de sencillo.

Lo que no entendí fue el uso, a mi parecer innecesario, de la variable anterior.

No dejo de reconocer que el código que posteo 05K4R1N era muy deficiente, le faltaba el tipo int de la función main, el correspondiente return 0, el uso de .lengh, más cercano al C++ y alejado del C -creo que ahí confundió conceptos-, la presencia de la librería conio.h -para nada-, el uso de la función  indeseable fflush(stdin) y el resto de código muy disperso/descuidado.

Pero, en fin, parece que algo se lo había currado.

Tampoco entiendo el uso de una función para algo tan simple y  a la que sólo se le va a llamar una vez, para eso no hacen falta tantas alforjas. Mi criterio es reservar el uso de funciones para casos repetitivo, códigos muy complejos o que se va a trabajar entre varios y cada uno se va a encargar de una parte/función, pero en este caso ¡puafffff!, me sobra la función. Si la puse fue porque imagino será una tarea que le piden haga con una función.

Saluditos!. ... ..
(http://st.forocoches.com/foro/images/smilies/ciao.gif)


Título: Re: Numeros Romanos
Publicado por: dato000 en 4 Junio 2013, 03:13 am
Hey eso de la confusión es cuando se comienza a trabajar programación, siempre es "confuso" ver como trabaja C, solo era eso, siempre es dificil empezar, solo decia eso.  :silbar: :silbar:


Título: Re: Numeros Romanos
Publicado por: 05K4R1N en 4 Junio 2013, 04:21 am
dat000 lo que sucede es que recien toy comenzando con lenguaje C y si hice varias cosas innecesarias, vaya que me estan dando un jalon de orejas ustedes aunque si deberia agradecerles por eso =)... por otro lado les digo que no volverá a ocurrir


Título: Re: Numeros Romanos
Publicado por: ecfisa en 4 Junio 2013, 04:48 am
Hola 05K4R1N.

Otra opción:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. char *DecToRom(int num);
  5.  
  6. int main()
  7. {
  8.  int num;
  9.  printf("Numero decimal:");
  10.  scanf("%d",&num);
  11.  while(getchar()!='\n');
  12.  printf("%d en numeros romanos: %s\n",num,DecToRom(num));
  13.  getchar();
  14.  return 0;
  15. }
  16.  
  17. char *DecToRom(int num)
  18. {
  19.  char *uni[] = {"","I","II","III","IV","V","VI","VII","VIII","IX"};
  20.  char *dec[] = {"","X","XX","XXX","XL","L","LX","LXX","LXXX","XC"};
  21.  char *cen[] = {"","C","CC","CCC","CD","D","DC","DCC","DCCC","CM"};
  22.  char *udm[] = {"","M","MM","MMM"};
  23.  char result[50];
  24.  
  25.  strcpy(result, udm[num/1000]);
  26.  strcat(result, cen[num/100%10]);
  27.  strcat(result, dec[num/10%10]);
  28.  strcat(result, uni[num%10]);
  29.  return (char*)result;
  30. }
  31.  

Saludos.


Título: Re: Numeros Romanos
Publicado por: KaL3o en 4 Junio 2013, 04:51 am

Código
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. int main(){
  5.    char romano [100]={0};
  6.    printf("Ingrese Numero Romano: ");
  7.    scanf ("%s",romano);
  8.    printf ("Romano: %s\n",romano);
  9.    char rom[8]={'I','V','X','L','C','D','M'};
  10.    int valor[7]={1,5,10,50,100,500,1000};
  11.    convertidor(romano, rom, valor);
  12.    return 0;
  13. }
  14. void convertidor ( char romano [], char rom [9],int valor [8])
  15. {
  16.    int suma=0,i,j;
  17.    for (i=0;i<strlen(romano);i++)
  18.        for (j=0;j<9;j++){
  19.            if (romano[i]==rom[j]){
  20.                suma+=valor [j];
  21.                break;
  22.            }
  23.            else
  24.                continue;
  25.        }
  26.    printf ("Numero: %d",suma);
  27. }
  28.  

El problema con ese codigo es que si ingresas por ejemplo el cuatro (IV) el va a decir que es seis...

salu2 :)

Advertencia - mientras estabas escribiendo, una nueva respuesta fue publicada. Probablemente desees revisar tu mensaje.


Título: Re: Numeros Romanos
Publicado por: leosansan en 4 Junio 2013, 05:32 am
El problema con ese codigo es que si ingresas por ejemplo el cuatro (IV) el va a decir que es seis...

Pues no, no se puede ingresar el IV, sólo los símbolos que el usuario estimó considerar:

(http://i1280.photobucket.com/albums/a497/leosansan/GRAFICOS1/romano1_zpsbf49f0d7.jpg)

Otra cosa es que hubiese incluido a:

(http://i1280.photobucket.com/albums/a497/leosansan/GRAFICOS1/romano2_zps4821121e.jpg)

En cuyo sencillamente caso habría que considerar a un caracter y su anterior.

Pero eso sería otra cosa distinta a la propuesta por 05K4R1N.

Si estas interesado en el tema publica el avance de lo que lleves y con gusto te echaré una manita.

Saluditos! .... ..
(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)


Título: Re: Numeros Romanos
Publicado por: KaL3o en 4 Junio 2013, 07:03 am

Lo que no entendí fue el uso, a mi parecer innecesario, de la variable anterior.
te lo decia por esto q tu mismo dices q no lo entendias... Pero bueno si dices q esta bien no pasa nada  ;-)

Volviendo a lo q planteaba quien puso el hilo

Funciona así:

Usuario ingresa un número romano y para que pueda convertir mas sencillo de romano a decimal hice un arreglo char que solo alberga romanos y otro con numeros decimales.

mirar los numeros romanos :)
https://es.wikipedia.org/wiki/Numeraci%C3%B3n_romana

Si estas interesado en el tema publica el avance de lo que lleves y con gusto te echaré una manita.
Solo señalaba alguna deficiencia obvia, pero gracias por ofrecerme tu ayuda

salu2 :)


Título: Re: Numeros Romanos
Publicado por: ecfisa en 6 Junio 2013, 02:01 am
Hola.

Disculpas 05K4R1N, ahora caigo que entendí tu consulta al revés... (msg #14)   :-[

Podría ser:
Código
  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<ctype.h>
  4.  
  5. #define NRO_ELEM(x) (sizeof(x) / sizeof(x[0]))
  6.  
  7. int RomToDec(char *nrom);
  8.  
  9. int main()
  10. {
  11.  char *roman = "MMMDLXXXIV";
  12.  printf("%s = %d",roman,RomToDec(roman));
  13.  getchar();
  14.  return 0;
  15. }
  16.  
  17. int RomToDec(char *nrom)
  18. {
  19.  char *NROROM[][9] = {
  20.    {"M","MM","MMM"},
  21.    {"C","CC","CCC","CD","D","DC","DCC","DCCC","CM"},
  22.    {"X","XX","XXX","XL","L","LX","LXX","LXXX","XC"},
  23.    {"I","II","III","IV","V","VI","VII","VIII","IX"}};
  24.  int fil, col;
  25.  int res =0, div = 1000;
  26.  char *aux = (char*) nrom;
  27.  
  28.  for(fil=0; aux[fil]; fil++) aux[fil] = toupper(aux[fil]);
  29.  for(fil=0; fil < NRO_ELEM(NROROM); fil++) {
  30.    col = (fil == 0 ? 2 : 8);
  31.    while ( col ) {
  32.      if (strncmp(NROROM[fil][col], aux, strlen(NROROM[fil][col]))==0) {
  33.        res += (col+1) * div;
  34.        aux = &aux[strlen(NROROM[fil][col])];
  35.      }
  36.      col--;
  37.    }
  38.   div /= 10;
  39.  }
  40.  return (int)res;
  41. }
  42.  

Saludos.


Título: Re: Numeros Romanos
Publicado por: edr89 en 6 Junio 2013, 04:12 am
...En cuyo sencillamente caso habría que considerar a un caracter y su anterior.

Pero eso sería otra cosa distinta a la propuesta por 05K4R1N.
Escribí un código distinto que no contempla los numeros IX, XL, etc, simplemente suma las letras, para algunos valores funciona, para otros no.

La idea no se como implementarla es:
1. Longitud del dato tecleado usando strlen().
2. Si es par leer primer y segundo caracter, revisar si hay alguna combinacion tipo IV, IX, XL, XC, CD, CM..., si verdadero restar digitos, de lo contrario sumar.
3. Si la longitud es impar se lee primer y segundo caracter, segundo y tercero, etc. Las condiciones son las mismas, buscar casos donde se tenga que restar y no sumar

Estoy pensando en algo como
Código
  1. //stringlenght = longitud de dato
  2.  
  3. if((stringlenght%2)==0) //Cuando la longitud es par
  4. {
  5.    for(i=0;i<(stringlenght-1);i+2)//lectura de primer caracter en par.
  6.    {
  7.        /*Aqui se me ocurre usar algo como isalpha()
  8.         Si I entonce digito=1
  9.         Si X ,digito= 10, etc
  10.         se asigna el valor del caracter a una variable PrimerDigito
  11.         */
  12.        for(j=1;numero_romano[j]!=NULL;j+2) //lectura de segundo caracter en par.
  13.        {
  14.            /*Aca tambien algo similar
  15.             si C = 100
  16.             si D...
  17.             tambien asignamos el valor del segundo caracter a SegundoDigito
  18.             */
  19.            if((PrimerDigito - SegundoDigito)<0)
  20.            {
  21.                //Si es negativo quiere decir que hay numeros tipo IV, IX, XL, etc
  22.                //entonces aqui se asigna el resultado de los dos digitos en una nueva variable global
  23.            }
  24.        }
  25.    }
  26. }
  27. else
  28. {
  29.    //Codigo para impar
  30. }

Esto es el codigo que solamente suma:
Código
  1. int main()
  2. {  
  3. int i,romano=0,caracteres=0;
  4.    char numero[10];
  5.    printf("Escribe un numero romano:");
  6.    gets(numero);
  7.    for(i=0;i<10;i++)
  8.    {
  9.        switch(numero[i])
  10.        {
  11.            case 'M': romano+=1000;
  12.                break;
  13.            case 'D': romano+=500;
  14.                break;
  15.            case 'C': romano+=100;
  16.                break;
  17.            case 'L': romano+=50;
  18.                break;
  19.            case 'X': romano+=10;
  20.                break;
  21.            case 'V': romano+=5;
  22.                break;
  23.            case 'I': romano+=1;
  24.                break;
  25.        }
  26.    }
  27.    printf("\n%d",romano);
  28. }

alguna idea?
saludos!!


Título: Re: Numeros Romanos
Publicado por: edr89 en 11 Junio 2013, 02:33 am
Encontre una forma para los numeros cuya longitud es par pero al correr el código se queda parado en la linea 21, meti un printf y esta arrojando el valor pero no continua :(

El compilador me esta dando una advertencia:
Incompatible implicit declaration of built-in function 'strlen'[Enabled by default]
(se me olvido agregar <string.h>)

Código
  1. #include <stdio.h>
  2. #include <ctype.h>
  3. #include <string.h>
  4. #define M 1000
  5. #define D 500
  6. #define C 100
  7. #define L 50
  8. #define X 10
  9. #define V 5
  10. #define I 1
  11. int main()
  12. {
  13.    int i,j,caracteres=0,arabigo[20]={0},resultado=0;
  14.    char numero[20];
  15.    printf("Escribe un numero romano:");
  16.    gets(numero);
  17.    caracteres = strlen(numero);
  18.    for(i=0;i<caracteres;i++) //Convertir minusculas a mayusculas
  19.    {
  20.        numero[i] = toupper(numero[i]);
  21.    }
  22. printf("caracteres: %d\n",caracteres);
  23.    for(i=0;i<caracteres;i++)
  24.    {
  25.        switch(numero[i])
  26.        {
  27.            case 'M':
  28.                {
  29.                    arabigo[i]= M;
  30.                    break;
  31.                }
  32.            case 'D':
  33.                {
  34.                    arabigo[i]= D;
  35.                    break;
  36.                }
  37.            case 'C':
  38.                {
  39.                    arabigo[i]= C;
  40.                    break;
  41.                }
  42.            case 'L':
  43.                {
  44.                    arabigo[i]= L;
  45.                    break;
  46.                }
  47.            case 'X':
  48.                {
  49.                    arabigo[i]= X;
  50.                    break;
  51.                }
  52.            case 'V':
  53.                {
  54.                    arabigo[i]= V;
  55.                    break;
  56.                }
  57.            case 'I':
  58.                {
  59.                    arabigo[i]= I;
  60.                    break;
  61.                }
  62.           }
  63.       }
  64.        if(caracteres==1)
  65.        {
  66.            resultado+= arabigo[0];
  67.        }
  68.        else if(caracteres%2==0) //Cuando el numero que escribimos es par.
  69.        {
  70.            for(j=0;j<caracteres;j+2)
  71.            {
  72.                if(arabigo[j]-arabigo[j+1]<0)
  73.                {
  74.                    resultado+=arabigo[j+1]-arabigo[j];
  75.                }
  76.                else
  77.                {
  78.                    resultado+= arabigo[j]+arabigo[j+1];
  79.                }
  80.            }
  81.        }
  82.        printf("El numero romano %s en arabigo es: %d",numero[20],resultado);
  83. }