• Domingo 5 de Mayo de 2024, 16:08

Autor Tema:  Problema en C ayudiaaa porfaaa  (Leído 2666 veces)

rchamy

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Problema en C ayudiaaa porfaaa
« en: Lunes 15 de Septiembre de 2008, 08:43 »
0
Holaaa, soy nuevo en el foro, y me inscribi porq me lo recomendaron,espero que me puedan ayudar, necesito estu urgente
me pidieorn una calculadora, que haga lo basico (sumar, restar, multiplicar, dividir y potenciar ), solo dos digitos(ejemplo sumar: 1+1=2)
pero tambien me piden que convierta numeros
dec--->bin
dec--->oct
dec--->hex
bin--->dec
bin--->oct
bin--->hex
oct--->dec
oct--->bin
oct--->hex
hex--->oct
hex--->bin
hex--->dec

y aqui es donde muero  :wacko:  , no se, ni se me ocurre como hacerlo, tiene que ser con ciclos, no con librerias, si pueden ayudarme se los agradeceria mucho
de antemano muchas gracias aaa!! coloco el codigo de lo que he hecho, por cualquier ayudita que me hagan o recomendacion

Código: Text
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main()
  5. {
  6. int op,c=1;
  7. float n,n2,result,mult;
  8. char r='n';
  9.  
  10. printf("tt----CALCULADORA----n");
  11. do{
  12. printf("tt----n");
  13. printf("ttMENUn");
  14. printf("t1=Sumarnt2=Restarnt3=Multiplicarnt4=Dividirnt5=Potenciant6=SALIRn");
  15. printf("tElija su opcion:");
  16. scanf("%i",&op);
  17. switch(op)
  18.   {
  19. case 1:
  20.    printf("Ingrese primer numero:");scanf("%f",&n);
  21.    printf("Ingrese segundo numero:");scanf("%f",&n2);
  22.    result=n+n2;
  23.    printf("Resultado:%.fn",result);
  24.    r='s';
  25.     break;
  26. case 2:
  27.    printf("Ingrese primer numero:");scanf("%f",&n);
  28.    printf("Ingrese segundo numero:");scanf("%f",&n2);
  29.    result=n-n2;
  30.    printf("Resultado:%.fn",result);
  31.    r='s';
  32.     break;
  33. case 3:
  34.    printf("Ingrese primer numero:");scanf("%f",&n);
  35.    printf("Ingrese segundo numero:");scanf("%f",&n2);
  36.    result=n*n2;
  37.    printf("Resultado:%.fn",result);
  38.    r='s';
  39.     break;
  40. case 4:
  41.    printf("Ingrese primer numero:");scanf("%f",&n);
  42.    printf("Ingrese segundo numero:");scanf("%f",&n2);
  43.    result=n/n2;
  44.    printf("Resultado:%.2f",result);
  45.    r='s';
  46.     break;
  47. case 5:
  48. result=1;  
  49. printf("Ingrese numero base:");scanf("%f",&n);
  50.    printf("Elevado a:");scanf("%f",&n2);
  51.    for(c=1;c<=n2;c++){
  52.    result=result*n;
  53.  
  54.    }
  55.    printf("Resultado:%.f",result);
  56.    r='s';
  57.     break;
  58. case 6:
  59.    printf("Graciasn");
  60.    r='n';
  61.     break;
  62. default:
  63.    printf("Opcion erronea, vuelva a intentarlon");
  64.    r='s';
  65.   }
  66. }while(r=='s');
  67.  
  68.  
  69. return EXIT_SUCCESS;
  70. }
  71.  
  72.  
  73.  
  74.  
  75.  
  76.  
  77.  

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Problema en C ayudiaaa porfaaa
« Respuesta #1 en: Lunes 15 de Septiembre de 2008, 09:41 »
0
¿Los números pueden ser reales o sólo enteros? Si son reales (como pone en tu código, float), indica qué formato de coma flotante pretendes usar para representar números con decimales en binario. Un saludo.

rchamy

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Re: Problema en C ayudiaaa porfaaa
« Respuesta #2 en: Lunes 15 de Septiembre de 2008, 10:01 »
0
los numeros son enteros, le coloque float por lo anterior(division, multiplicacion, suma, resta, etc) pero las conversiones son enteras
gracias por responder tan rapido  :rolleyes:
ojala puedas ayudarme

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Problema en C ayudiaaa porfaaa
« Respuesta #3 en: Lunes 15 de Septiembre de 2008, 10:52 »
0
Entonces tendrás que cambiarles el tipo antes de poder hacer las conversiones (sólo necesitas reales para el resultado de la división, para las demás operaciones no).

De cualquier formato a decimal es bastante sencillo. Coges el dígito y lo multiplicas por la base elevada a su posición en el número - 1 y sumas todos los resultados. Por ejemplo:

0xFE = 0xE * 16 ^ 0 + 0xF * 16 ^ 1
068 = 8 * 8 ^ 0 + 6 * 8 ^ 1
0101 = 1 * 2 ^ 0 + 0 * 2 ^ 1 + 1 * 2 ^ 2 + 0 * 2 ^ 3

De decimal a otro formato es la operación inversa. Coges el número y lo divides por el mayor divisor posible que coincida con una potencia de la base requerida. Te quedas con el resto como dígito de dicha posición y divides el cociente por la potencia inferior y así hasta llegar a la división por 1 (exponente 0).

Ánimo y a codificar  :)

rchamy

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Re: Problema en C ayudiaaa porfaaa
« Respuesta #4 en: Lunes 15 de Septiembre de 2008, 21:33 »
0
Gracias por responderme, de verdad agradezco tu ayuda...
ahora, para explicarme mejor, necesito sumar, dividir, multiplicar, restar y potenciar numeros reales, pero las conversiones deben ser enteras.
Mi problema esta en que si me ingresan un numero, por ejemplo en la conversion de binario a decimal, seria algo como esto:
Ingrese numero binario: 0101
Su numero en decimal es: y el numero

Pero...como tomo esos 0101 de a uno???
porque primero necesito el 1, despues el 0 y asi sucesivamente, y lo que me tomaria ahi seria el 0101 como un solo número...no se si me entiendas, es complicado,porque no quiero que tenga que presionar Intro entre cada dígito, y como estoy recien empezando no conozco ningún comando  para hacer lo que deseo.
Ojala puedas ayudarme, de verdad te agradezco la preocupación.
Aca te dejo el codigo un poco modificado pra empezar a hacer las conversiones, le falta mucho si, pero es la idea
Código: Text
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main()
  5. {
  6. int op,c=1,n3,conver;
  7. float n,n2,result,mult;
  8. char r='n';
  9.  
  10. printf("tt----CALCULADORA----n");
  11. do{
  12. printf("ttt----n");
  13. printf("tttMENUnn");
  14. printf("1=Sumartt7= Dec-->Bint13=Oct-->Binn");
  15. printf("2=Restart8= Dec-->Octt14=Oct=Decn");
  16. printf("3=Multiplicart9= Dec-->Hext15=Oct-->Hexn");
  17. printf("4=Dividirt10=Bin-->Dect16=Hex-->Binn");
  18. printf("5=Potenciat11=Bin-->Octt17=Hex-->Decn");
  19. printf("6=SALIRtt12=Bin-->Hext18=Hex-->Octn");
  20. printf("tt----------------n");
  21. printf("ttElija su opcion:");
  22. scanf("%i",&op);
  23.  
  24.  
  25. switch(op)
  26.   {
  27. case 1:
  28.    printf("Ingrese primer numero:");scanf("%f",&n);
  29.    printf("Ingrese segundo numero:");scanf("%f",&n2);
  30.    result=n+n2;
  31.    printf("Resultado:%.fn",result);
  32.    r='s';
  33.     break;
  34. case 2:
  35.    printf("Ingrese primer numero:");scanf("%f",&n);
  36.    printf("Ingrese segundo numero:");scanf("%f",&n2);
  37.    result=n-n2;
  38.    printf("Resultado:%.fn",result);
  39.    r='s';
  40.     break;
  41. case 3:
  42.    printf("Ingrese primer numero:");scanf("%f",&n);
  43.    printf("Ingrese segundo numero:");scanf("%f",&n2);
  44.    result=n*n2;
  45.    printf("Resultado:%.fn",result);
  46.    r='s';
  47.     break;
  48. case 4:
  49.    printf("Ingrese primer numero:");scanf("%f",&n);
  50.    printf("Ingrese segundo numero:");scanf("%f",&n2);
  51.    result=n/n2;
  52.    printf("Resultado:%.2f",result);
  53.    r='s';
  54.     break;
  55. case 5:
  56. result=1;
  57. printf("Ingrese numero base:");scanf("%f",&n);
  58.    printf("Elevado a:");scanf("%f",&n2);
  59.    for(c=1;c<=n2;c++){
  60.    result=result*n;
  61.  
  62.    }
  63.    printf("Resultado:%.f",result);
  64.    r='s';
  65.     break;
  66. case 6:
  67.    printf("Graciasn");
  68.    r='n';
  69.     break;
  70. case 7: //Esto me falta terminar, todos los otros case, pero necesito eso que te dije arriba para ver como lo puedo hacer
  71.    printf("Ingrese numero:");
  72.    scanf("%i",n3);
  73.  
  74.  
  75. default:
  76.    printf("Opcion erronea, vuelva a intentarlon");
  77.    r='s';
  78.   }
  79. }while(r=='s');
  80.  
  81. system("PAUSE");
  82.  
  83. return EXIT_SUCCESS;
  84. }
  85.  
  86.  

rfog

  • Miembro MUY activo
  • ***
  • Mensajes: 166
    • Ver Perfil
Re: Problema en C ayudiaaa porfaaa
« Respuesta #5 en: Lunes 15 de Septiembre de 2008, 22:40 »
0
A ver, no estoy siguiendo el hilo por completo, pero la mejor forma de hacer todo lo que quieres es trabajar con cadenas. Es decir, cuando tu preguntes por un número binario, acepta una cadena que sólo tenga unos y ceros. Luego esa cadena la puedes convertir al tipo adecuado mediante las funcionoes de C y C++ como atoi (ASCII to Integer), etc.

Lo mismo cuando sean otros números en otras bases. Cuando tengas la cadena, la recorres a ver si contiene dígitos válidos (por ejemplo, no aceptar nada mayor a 7 cuando pidas una cadena en octal, etc).

Y si tienes ganas, defines un formato, por ejemplo: "101001b2" sería un número en base 2, "877AF3b16" en hexadecimal, etc. E incluso podrías adelantarte y hacer un parser matemático completo. Por ejemplo: "toDec(10100b2)". y cosas así.
Microsoft Visual C++ MVP - Mi blog sobre programación: http://geeks.ms/blogs/rfog

rchamy

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Re: Problema en C ayudiaaa porfaaa
« Respuesta #6 en: Lunes 15 de Septiembre de 2008, 23:12 »
0
Citar
A ver, no estoy siguiendo el hilo por completo, pero la mejor forma de hacer todo lo que quieres es trabajar con cadenas. Es decir, cuando tu preguntes por un número binario, acepta una cadena que sólo tenga unos y ceros. Luego esa cadena la puedes convertir al tipo adecuado mediante las funcionoes de C y C++ como atoi (ASCII to Integer), etc.

Lo mismo cuando sean otros números en otras bases. Cuando tengas la cadena, la recorres a ver si contiene dígitos válidos (por ejemplo, no aceptar nada mayor a 7 cuando pidas una cadena en octal, etc).

Y si tienes ganas, defines un formato, por ejemplo: "101001b2" sería un número en base 2, "877AF3b16" en hexadecimal, etc. E incluso podrías adelantarte y hacer un parser matemático completo. Por ejemplo: "toDec(10100b2)". y cosas así.

ahora si que mori  :blink:  entendi si es que la mitad de lo que me dijiste, disculpa en todo caso, tengo toda la intencion de aprender y pongo todo de mi parte, estoy averiguando por internet, manuales, profesores, amigos y todo lo que pueda.
L o que pasa es que estoy recien empezando en C, y no se hacer todo lo que me dijiste, lo que me pidieron fue usar ciclos para las transformaciones, y para eso necesito separar el numero ingresado por digitos
porfavor ayudenme, estoy realmente perdido, pero el esfuerzo lo estoy haciendo
agradezco toda su ayuda, a los dos y al que responda el tema

rfog

  • Miembro MUY activo
  • ***
  • Mensajes: 166
    • Ver Perfil
Re: Problema en C ayudiaaa porfaaa
« Respuesta #7 en: Lunes 15 de Septiembre de 2008, 23:26 »
0
Es fácil.

Lo lees como una cadena de caracteres. Una cadena de caracteres es un array de la forma (por ejemplo)

char cad[20];

Como es un array, puedes recorrerlo elemento a elemento:

Código: Text
  1. int numero=0;
  2. int valorIntermedio;
  3. for(int i=0;i<20;i++)
  4. {
  5. valorIntermedio=cad[i]-'0';
  6. numero=+valorIntermedio*pow(10,i);
  7. }
  8.  

La primera línea del bucle te convierte un caracter ASCII en un número, ya que al restarle el valor '0' se queda en el número, ya que '0', '1', '2', '3' son números consecutivos dentro del ASCII.

En la segunda línea pow(10,i) obtiene 10 elevado a i, que se multiplica por valorIntermedio. Si valorIntermedio es 0, el resultado es 0, pero si es 1, el resultado será 1*10^i, que es la forma de convertir un dígito binario en decimal por posición .
Microsoft Visual C++ MVP - Mi blog sobre programación: http://geeks.ms/blogs/rfog

rchamy

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Re: Problema en C ayudiaaa porfaaa
« Respuesta #8 en: Martes 16 de Septiembre de 2008, 01:06 »
0
Muchas gracias, estoy en eso, tambien estaba tratando de convertir de decimal a binario, con un arreglo, pero me da un error
te mando el codigo
Código: Text
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main()
  4. {
  5. int a[15],n,c=0,j=14;
  6.  
  7.  
  8. printf("ingrese numero decimaln");
  9. scanf("%d",&n);
  10. for(c=0;c<=14;c++)
  11. {
  12. a[c]=n%2;
  13. n=n/2;
  14. }
  15. printf("Su numero binario es:n");
  16. for(j=14;j>=0;j--)
  17. {
  18. printf("%d",a[j]);
  19. }
  20.  
  21. system("PAUSE");
  22. return EXIT_SUCCESS;
  23. }
  24.  
  25.  

y este es el error que me da:
por ejemplo si coloco el numero 10 deberia salir 1010 base2
pero me sale 000000000001010
no se como quitar los ceros del principio
ojala puedas ayudarme

rfog

  • Miembro MUY activo
  • ***
  • Mensajes: 166
    • Ver Perfil
Re: Problema en C ayudiaaa porfaaa
« Respuesta #9 en: Martes 16 de Septiembre de 2008, 10:51 »
0
¿por que pones 14 en el bucle? En principio, ese número debe ser tan largo como el mayor número binario que puedas crear (así como el tamaño del array contenedor).

Quitar los ceros de la derecha no es una tarea trivial si quieres hacerlo a la vez que generas el número, pero si no te importa hacerlo después puedes crear un nuevo array de caracteres y copiarlo pero sin ceros. Algo así: ten un índice inicalizado a cero y nuevo array. Entra en un bucle sobre el array viejo empezando por la izquierda y ve saltando hasta que encuentres el primer uno. Cuando llegues a él, copia el resto del array en el nuevo.

NOTA: Existen funciones en la RTL para hacer esas cosas, como strchr, strrchr, strcpy, strncpy etc, pero como parece ser que la cosa va de copiar arrays etc, lo mejor es que lo hagas tu a mano.
Microsoft Visual C++ MVP - Mi blog sobre programación: http://geeks.ms/blogs/rfog

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Problema en C ayudiaaa porfaaa
« Respuesta #10 en: Martes 16 de Septiembre de 2008, 11:44 »
0
Os complicáis la vida... ¿Por qué no empiezas por el bit más alto y lo haces al revés? Un saludo.

rfog

  • Miembro MUY activo
  • ***
  • Mensajes: 166
    • Ver Perfil
Re: Problema en C ayudiaaa porfaaa
« Respuesta #11 en: Martes 16 de Septiembre de 2008, 12:04 »
0
Cita de: "m0skit0"
Os complicáis la vida... ¿Por qué no empiezas por el bit más alto y lo haces al revés? Un saludo.

Entonces tendría que invertir la cadena resultante, o empezar en la posición correcta, lo que en principio no es trivial.

La solución óptima es lo que ya dije: trabajar con cadenas de caracteres o en BCD o bien pasar el número decimal a una cadena en hexadecimal y luego traducir directamente los nibbles a binario. Así tendrá el número decimal convertido a hex y a binario a la vez. También vale en octal.
Microsoft Visual C++ MVP - Mi blog sobre programación: http://geeks.ms/blogs/rfog

rchamy

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Re: Problema en C ayudiaaa porfaaa
« Respuesta #12 en: Domingo 21 de Septiembre de 2008, 17:52 »
0
Muchas gracias!
se pasaron, y si no di una respuesta antes era porque estuve demasiado ocupado, pero en cuanto tuve tiempo lo hice
me ayudo muchos sus comentarios y respuestas para hacer funcionar mi codigo
muchas gracias!!
Adios