elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Sigue las noticias más importantes de seguridad informática en el Twitter! de elhacker.NET


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [C] Problema con ejercicio
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 3 Ir Abajo Respuesta Imprimir
Autor Tema: [C] Problema con ejercicio  (Leído 9,828 veces)
dmacias

Desconectado Desconectado

Mensajes: 41


Ver Perfil WWW
[C] Problema con ejercicio
« en: 24 Febrero 2014, 16:38 pm »

Hola de nuevo
Sigo estudiando c en mis ratos libres y ya voy avanzando, pero estoy teniendo problemas con un ejercicio de los primeros que estoy haciendo con switch, no termino de ver que hago mal ( que seran muchas cosas  ;D )
El ejercicio es este:



Y lo que tengo hecho luego de mil pruebas es esto otro:

Código
  1. /*Programa del libro, Tema 4
  2.  * ejercicio 4.19, pagina 123
  3.  * Programa de calculos de ventas usando switch*/
  4.  
  5. #include <stdio.h>
  6.  
  7. int main()
  8. {
  9. float a = 2.98;
  10. float b = 4.50;
  11. float c = 9.98;
  12. float d = 4.49;
  13. float e = 6.87;
  14. int n;
  15. int x = 0;
  16. float total;
  17. float a1,b1,c1,d1,e1;
  18. float a2,b2,c2,d2,e2;
  19.  
  20. do{
  21. printf("Ingrese el codigo de producto (-1 para salir): ");
  22. scanf("%d", &x);
  23. printf("Ingrese las unidades vendidas: ");
  24. scanf("%d", &n);
  25.  
  26. while (x != -1){
  27. switch (x){
  28. case '1':
  29. a1 = a*n;
  30. a2 += a1;
  31. printf("Llega asta aki almenos"); /*chekeo*/
  32. break;
  33. case '2':
  34. b1 = b*n;
  35. b2 += b1;
  36. break;
  37. case '3':
  38. c1 = c*n;
  39. c2 += c1;
  40. break;
  41. case '4':
  42. d1 = d*n;
  43. d2 += d1;
  44. break;
  45. case '5':
  46. e1 = e*n;
  47. e2 += e1;
  48. break;
  49. case '\n':
  50. case '\t':
  51. case ' ':
  52. break;
  53. default:
  54. printf("Introdujo un codigo erroneo\n");
  55. break;
  56. } /*fin de switch*/
  57. } /*fin while interno*/
  58. } /*fin de do*/
  59. while (x != -1); /*condicion de do*/
  60.  
  61. total = a2+b2+c2+d2+e2;
  62. printf("El total vendido es %f \n", total);
  63. return 0;
  64.  
  65. }
  66.  

Cuando lo ejecuto, hace un ciclo infinito en printf("Itrodujo un codigo erroneo"), tal como este



Como si el valor de x no coincidiera con ningun case. La verdad que ya estoy hecho un lio  :rolleyes:

Gracias por adelantado  ::)


« Última modificación: 24 Febrero 2014, 17:12 pm por dmacias » En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Problema con ejercicio
« Respuesta #1 en: 24 Febrero 2014, 16:42 pm »

Código
  1. scanf("%d", &x);

x va a contener un número, 1, 2, 100, ...

Código
  1. case '1':

Aquí estás comparando x, que es un número, con '1'... que es un carácter.

La codificación ANSI tiene la mala costumbre de codificar los caracteres que representan números a partir de la posición 0x30, de tal forma que...

* '0' se codifica como 0x30
* '1' se codifica como 0x31
* '2' se codifica como 0x32

Queda claro entonces que 0 != '0'.

Si quitas las comillas simples y dejas esos case como números te debería funcionar.


En línea

dmacias

Desconectado Desconectado

Mensajes: 41


Ver Perfil WWW
Re: Problema con ejercicio
« Respuesta #2 en: 24 Febrero 2014, 16:49 pm »

Ok, voy a probar y vengo a contar
 ;D
En línea

xaps

Desconectado Desconectado

Mensajes: 157



Ver Perfil
Re: Problema con ejercicio
« Respuesta #3 en: 24 Febrero 2014, 16:50 pm »

Código
  1. scanf("%d", &x);

x va a contener un número, 1, 2, 100, ...

Código
  1. case '1':

Aquí estás comparando x, que es un número, con '1'... que es un carácter.

La codificación ANSI tiene la mala costumbre de codificar los caracteres que representan números a partir de la posición 0x30, de tal forma que...

* '0' se codifica como 0x30
* '1' se codifica como 0x31
* '2' se codifica como 0x32

Queda claro entonces que 0 != '0'.

Si quitas las comillas simples y dejas esos case como números te debería funcionar.
Lo que comentas es cierto, pero el fallo del bucle infinito no es ese. El fallo es que una vez entra en el bucle while no sale nunca. ¿Porque? Fácil, no actualiza la variable x.

Por cierto, el bucle while sobra.

Saludos
En línea

"The programmers of tomorrow are the wizards of the future" - Gave Newel
dmacias

Desconectado Desconectado

Mensajes: 41


Ver Perfil WWW
Re: Problema con ejercicio
« Respuesta #4 en: 24 Febrero 2014, 17:08 pm »

Citar
Lo que comentas es cierto, pero el fallo del bucle infinito no es ese. El fallo es que una vez entra en el bucle while no sale nunca. ¿Porque? Fácil, no actualiza la variable x.

Por cierto, el bucle while sobra.

Saludos

Si es verdad eso, había probado mil cosas ya y asi quedo  :rolleyes:

Solo me viene un ejemplo de codigo en el libro que estoy siguiendo y en el usan caracteres, no caí en que usaba las comillas por eso  >:(

Al final ha terminado asi :

Código
  1. /*Programa del libro, Tema 4
  2.  * ejercicio 4.19, pagina 123
  3.  * Programa de calculos de ventas usando switch*/
  4.  
  5. #include <stdio.h>
  6.  
  7. int main()
  8. {
  9. float a = 2.98;
  10. float b = 4.50;
  11. float c = 9.98;
  12. float d = 4.49;
  13. float e = 6.87;
  14. int n;
  15. int x = 0;
  16. float total;
  17. float a1,b1,c1,d1,e1;
  18. float a2,b2,c2,d2,e2;
  19.  
  20. do{
  21. printf("Ingrese el codigo de producto (-1 para salir): ");
  22. scanf("%d", &x);
  23. printf("Ingrese las unidades vendidas: ");
  24. scanf("%d", &n);
  25.  
  26. if (x != -1){
  27. switch (x){
  28. case 1:
  29. a1 = a*n;
  30. a2 += a1;
  31. break;
  32. case 2:
  33. b1 = b*n;
  34. b2 += b1;
  35. break;
  36. case 3:
  37. c1 = c*n;
  38. c2 += c1;
  39. break;
  40. case 4:
  41. d1 = d*n;
  42. d2 += d1;
  43. break;
  44. case 5:
  45. e1 = e*n;
  46. e2 += e1;
  47. break;
  48. case '\n':
  49. case '\t':
  50. case ' ':
  51. break;
  52. default:
  53. printf("Introdujo un codigo erroneo\n");
  54. break;
  55. } /*fin de switch*/
  56. } /*fin if*/
  57. } /*fin de do*/
  58. while (x != -1); /*condicion de do*/
  59.  
  60. total = a2+b2+c2+d2+e2;
  61. printf("El total vendido es %f \n", total);
  62. return 0;
  63.  
  64. }
  65.  

Ya solo me queda evitar que tras introducir -1 del valor centinela no me pida la cantidad de productos. Sigo al lio con el, al final aprendere y todo  ;D



Gracias a los dos por la ayuda

Un saludo
En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: [C] Problema con ejercicio
« Respuesta #5 en: 24 Febrero 2014, 17:32 pm »

Imagino que evitar que te pregunte por el número de unidades es algo con lo que podrás lidiar tu solo, no?? :)
En línea

dmacias

Desconectado Desconectado

Mensajes: 41


Ver Perfil WWW
Re: [C] Problema con ejercicio
« Respuesta #6 en: 24 Febrero 2014, 17:41 pm »

Solo vengo a por ayuda cuando ya no doy mas de mi, asi para la proxima me acuerdo  ;-)

Deja que me acabe el café y sigo liado con el, sale (si || si ||  le prendo fuego) xD .


Un saludo
En línea

dmacias

Desconectado Desconectado

Mensajes: 41


Ver Perfil WWW
Re: [C] Problema con ejercicio
« Respuesta #7 en: 24 Febrero 2014, 18:09 pm »

Bueno, aqui os vengo con el codigo final creo, almenos me funciona como creo que debe ser.

Al final he inicializado las variables "x2" por que algunas pruebas me daban resultados erroneos, creo que ese podia ser el problema.

Seguire haciendole pruebas haber si falla.



Código
  1. /*Programa del libro, Tema 4
  2.  * ejercicio 4.19, pagina 123
  3.  * Programa de calculos de ventas usando switch*/
  4.  
  5. #include <stdio.h>
  6.  
  7. int main()
  8. {
  9. float a = 2.98;
  10. float b = 4.50;
  11. float c = 9.98;
  12. float d = 4.49;
  13. float e = 6.87;
  14. int n = 0;
  15. int x = 0;
  16. float total;
  17. float a1,b1,c1,d1,e1;
  18. float a2,b2,c2,d2,e2;
  19.  
  20. do{
  21. printf("Ingrese el codigo de producto (-1 para salir): ");
  22. scanf("%d", &x);
  23. if (x >= 1 && x <= 5){
  24. printf("Ingrese las unidades vendidas: ");
  25. scanf("%d", &n);
  26. if (x != -1){
  27. }
  28. }
  29. switch (x){
  30. case 1:
  31. a1 = a*n;
  32. a2 += a1;
  33. break;
  34. case 2:
  35. b1 = b*n;
  36. b2 += b1;
  37. break;
  38. case 3:
  39. c1 = c*n;
  40. c2 += c1;
  41. break;
  42. case 4:
  43. d1 = d*n;
  44. d2 += d1;
  45. break;
  46. case 5:
  47. e1 = e*n;
  48. e2 += e1;
  49. break;
  50. case -1:
  51. break;
  52. case '\n':
  53. case '\t':
  54. case ' ':
  55. break;
  56. default:
  57. printf("Introdujo un codigo erroneo\n");
  58. break;
  59. } /*fin de switch*/
  60. } /*fin de do*/
  61. while (x != -1); /*condicion de do*/
  62.  
  63. total = a2+b2+c2+d2+e2;
  64. printf("\nEl total vendido es %f \n", total);
  65. return 0;
  66.  
  67. }
  68.  



Un saludo y muchas gracias por la ayuda  ;-)
En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: [C] Problema con ejercicio
« Respuesta #8 en: 24 Febrero 2014, 21:53 pm »

Código
  1. if (x != -1){
  2. }
¿Para que es ese if? :huh:
En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
dmacias

Desconectado Desconectado

Mensajes: 41


Ver Perfil WWW
Re: [C] Problema con ejercicio
« Respuesta #9 en: 24 Febrero 2014, 22:26 pm »

Código
  1. if (x != -1){
  2. }
¿Para que es ese if? :huh:
La verdad, no lo se, solo supuse que como el anterior if filtra los mayores de 1 y menores de 5, pense que cuando metiera -1 del centinerla me mandaria al cuerno pero no lo he probado sin el.

Por cierto, el codigo de arriba no es el final, lo tuve que copiar mal o al pegarlo algo falló.
es este
Código
  1. /*Programa del libro, Tema 4
  2.  * ejercicio 4.19, pagina 123
  3.  * Programa de calculos de ventas usando switch*/
  4.  
  5. #include <stdio.h>
  6.  
  7. int main()
  8. {
  9. float a = 2.98;
  10. float b = 4.50;
  11. float c = 9.98;
  12. float d = 4.49;
  13. float e = 6.87;
  14. int n = 0;
  15. int x = 0;
  16. float total;
  17. float a1,b1,c1,d1,e1;
  18. float a2,b2,c2,d2,e2;
  19. a2=b2=c2=d2=e2= 0;
  20. do{
  21. printf("Ingrese el codigo de producto (-1 para salir): ");
  22. scanf("%d", &x);
  23. if (x >= 1 && x <= 5){
  24. printf("Ingrese las unidades vendidas: ");
  25. scanf("%d", &n);
  26. }
  27. switch (x){
  28. case 1:
  29. a1 = a*n;
  30. a2 += a1;
  31. break;
  32. case 2:
  33. b1 = b*n;
  34. b2 += b1;
  35. break;
  36. case 3:
  37. c1 = c*n;
  38. c2 += c1;
  39. break;
  40. case 4:
  41. d1 = d*n;
  42. d2 += d1;
  43. break;
  44. case 5:
  45. e1 = e*n;
  46. e2 += e1;
  47. break;
  48. case -1:
  49. break;
  50. case '\n':
  51. case '\t':
  52. case ' ':
  53. break;
  54. default:
  55. printf("Introdujo un codigo erroneo\n");
  56. break;
  57. } /*fin de switch*/
  58. } /*fin de do*/
  59. while (x != -1); /*condicion de do*/
  60.  
  61. total = a2+b2+c2+d2+e2;
  62. printf("\nEl total vendido es %f \n", total);
  63. return 0;
  64.  
  65. }
  66.  
  67.  

Sin esta linea, como comento en el comentario de arriba, el resultado a veces no es correcto

Código
  1. a2=b2=c2=d2=e2= 0;

Probare a comentar el if que me dices, haber que hace.

Lo edito sobre la marcha, funciona igual sin el if que comenta amchacon
En línea

Páginas: [1] 2 3 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[ problema ] ejercicio 100
Ejercicios
_mÙëK§™_ 2 4,986 Último mensaje 1 Diciembre 2007, 01:31 am
por Iñaki Viggers
Problema ejercicio
Programación C/C++
overxfl0w13 4 3,342 Último mensaje 30 Junio 2012, 11:43 am
por overxfl0w13
problema con un ejercicio « 1 2 »
Programación C/C++
espdante 12 6,799 Último mensaje 20 Agosto 2012, 13:52 pm
por avesudra
Problema con un ejercicio
Programación C/C++
gabyricardo92 6 3,339 Último mensaje 10 Julio 2013, 15:52 pm
por eferion
Problema con ejercicio de php
Desarrollo Web
T0p1t0 1 2,526 Último mensaje 19 Julio 2013, 15:39 pm
por T0p1t0
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines