Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: dmacias en 24 Febrero 2014, 16:38 pm



Título: [C] Problema con ejercicio
Publicado por: dmacias 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:

(http://www.dmaciasblog.com/wp-content/uploads/2014/02/captura-switch.png)

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

(http://www.dmaciasblog.com/wp-content/uploads/2014/02/captura-switch2.png)

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

Gracias por adelantado  ::)


Título: Re: Problema con ejercicio
Publicado por: eferion 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.


Título: Re: Problema con ejercicio
Publicado por: dmacias en 24 Febrero 2014, 16:49 pm
Ok, voy a probar y vengo a contar
 ;D


Título: Re: Problema con ejercicio
Publicado por: xaps 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


Título: Re: Problema con ejercicio
Publicado por: dmacias 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

(http://www.dmaciasblog.com/wp-content/uploads/2014/02/captura-switch3.png)

Gracias a los dos por la ayuda

Un saludo


Título: Re: [C] Problema con ejercicio
Publicado por: eferion 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?? :)


Título: Re: [C] Problema con ejercicio
Publicado por: dmacias 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


Título: Re: [C] Problema con ejercicio
Publicado por: dmacias 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.  

(http://www.dmaciasblog.com/wp-content/uploads/2014/02/captura-switch4.png)

Un saludo y muchas gracias por la ayuda  ;-)


Título: Re: [C] Problema con ejercicio
Publicado por: amchacon en 24 Febrero 2014, 21:53 pm
Código
  1. if (x != -1){
  2. }
¿Para que es ese if? :huh:


Título: Re: [C] Problema con ejercicio
Publicado por: dmacias 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


Título: Re: [C] Problema con ejercicio
Publicado por: rir3760 en 25 Febrero 2014, 01:27 am
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;
Eso sucede porque si no se inicializa una variable local su valor inicial es no definido o basura.

Con las variables a1, b1, etc. no hay problema porque lo primero que haces con ellas es asignarles un valor, por ejemplo:
Código
  1. case 1:
  2.   a1 = a * n;

Pero con las variables a2, b2, etc. lo primero que haces con ellas es utilizar su valor, por ejemplo:
Código
  1. case 1:
  2.   a1 = a * n;
  3.   a2 += a1; /* a2 = a2 + a1 == ALGUN_VALOR + a1 */

Y deberías sustituir esos dos grupos de variable (X1 y X2) por arrays, con ello el programa es mas fácil de desarrollar y mas corto.

Un saludo


Título: Re: [C] Problema con ejercicio
Publicado por: leosansan en 25 Febrero 2014, 05:55 am

En cualquier caso, inicializando las variables x2 a cero, ya que son sumas parciales,  puedes prescindir perfectamente de las x1 sin más que ir haciendo "a2 += a*n;", etc..

Código
  1. do{
  2.    printf("Ingrese el codigo de producto: 1-5 (-1 para salir): ");
  3.    scanf("%d", &x);
  4.    if (x==-1)
  5.      break;
  6.    else  if(x >= 1 && x <= 5){
  7.      printf("Ingrese las unidades vendidas: ");
  8.      scanf("%d", &n);
  9.      }
  10.      switch (x){
  11. case 1:
  12.      a2 += a*n;
  13.      break;
  14. case 2:
  15. b2 += b*n;
  16. break;
  17. case 3:
  18. c2 += c*n;
  19. break;
  20. case 4:
  21. d2 += d*n;
  22. break;
  23. case 5:
  24. e2 += e*n;
  25. break;
  26.        default:
  27.        printf("Introdujo un codigo erroneo\n");
  28.        break;
  29.    } /*fin de switch*/
  30. } /*fin de do*/
  31. while (1); /*condicion de do*/

¡¡¡¡ Saluditos! ..... !!!!


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





Título: Re: [C] Problema con ejercicio
Publicado por: dmacias en 25 Febrero 2014, 08:42 am
Citar
Y deberías sustituir esos dos grupos de variable (X1 y X2) por arrays, con ello el programa es mas fácil de desarrollar y mas corto.

Aun noi he estudidado eso, estoy empezando y obvio que no puedo usar algo que aun no se, es con lo poco que se y ando  :rolleyes: jajja

leosansan, ya veo que podria reducir las dos operaciones a una y asi ahorrarme las variables de 'x1', supongo que será cuestion de practica

No sabía que se podia hacer esto

Código
  1.    if (x==-1)
  2.     break
  3.  

Solo he visto break en switch, lo desconocia.

Y esto no lo entiendo

Código
  1. while (1); /*condicion de do*/
  2.  
Que es lo que valida esa condicion???? supongo que el 1 solo no será??

Gracias por pasaros y sigo estudiando, asi que no vayais muy lejos  :P

Un saludo


Título: Re: [C] Problema con ejercicio
Publicado por: eferion en 25 Febrero 2014, 09:06 am
No sabía que se podia hacer esto

Código
  1.    if (x==-1)
  2.     break
  3.  

Solo he visto break en switch, lo desconocia.

break sirve para salir de un bucle for o while o de una sentencia switch. Da igual donde lo pongas, si la ejecución del programa alcanza ese break, saldrás del bucle.

Y esto no lo entiendo

Código
  1. while (1); /*condicion de do*/
  2.  
Que es lo que valida esa condicion???? supongo que el 1 solo no será??

el contenido de un while se ejecuta mientras la condición evaluada sea cierta. Se considera cierta siempre y cuando su resultado no sea 0. En while(1), la condición NUNCA será 0, luego el bucle se ejecutará de forma perpetua hasta que se salga del mismo con un break o un return.


Título: Re: [C] Problema con ejercicio
Publicado por: dmacias en 25 Febrero 2014, 09:44 am
Entonces ahora entiendo el porque del break en if(x==-1), ya voy aprendiendolo.

Muchas gracias a todos

Un saludo


Título: Re: [C] Problema con ejercicio
Publicado por: leosansan en 25 Febrero 2014, 16:19 pm
......................................................................
No sabía que se podia hacer esto

Código
  1.    if (x==-1)
  2.     break
  3.  

Solo he visto break en switch, lo desconocia.

Y esto no lo entiendo

Código
  1. while (1); /*condicion de do*/
  2.  
Que es lo que valida esa condicion???? supongo que el 1 solo no será??


Provoca un bucle infinito que se rompe desde el "interior" del mismo,  como con el if-break, al cumplirse alguna condición.

¡¡¡¡ Saluditos! ..... !!!!


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




Título: Re: [C] Problema con ejercicio
Publicado por: xaps en 25 Febrero 2014, 18:29 pm
No creo que sea buena idea incitar a la gente que está empezando a programar a usar bucles sin condición de los que se saldrá mediante breaks, no es una buena práctica.

Yo te animo a que intentes hacer un bucle con condición y te olvides del break.

Saludos


Título: Re: [C] Problema con ejercicio
Publicado por: Gh057 en 25 Febrero 2014, 18:45 pm
hola dmacias ,coincido con xaps; personalmente no lo considero un buen hábito esos saltos sin control, me recuerda mucho a los famosos "goto"... nada mejor para aprender que tratar de definir que tipo de bucle necesitas ,si es interativo o  condicional, y si es posible o necesario que se realice una vez.

(por ejemplo en un menú, es usual que la condición de repetición es la opción distinta a las permitidas, complementándose con un mensaje por medio del default; en un bucle que se ejecute por lo menos una vez)

te recomiendo partir del algoritmo a implementar (puedes practicarlo de manera gráfica y en seudocódigo) y de ahí ya teniendo una idea clara de como sería tu estructura te pones a codificarlo. puede parecer al comienzo una gasto de tiempo extra, de hecho lo es, pero el tiempo invertido en ello cada vez será menor, y desarrollarás mejores aplicaciones. saludos


Título: Re: [C] Problema con ejercicio
Publicado por: leosansan en 25 Febrero 2014, 19:47 pm
Teniendo en cuenta que ya dmacias ha propuesto un código con la condición en el while, "recompongo" mi propuesta del while(1), esta vez con la condición incorporada al mismo, no quiero que por mi culpa se"revuelva"el patio: :silbar:


Código
  1. #include <stdio.h>
  2.  
  3. int main()
  4. {
  5. float a = 2.98;
  6. float b = 4.50;
  7. float c = 9.98;
  8. float d = 4.49;
  9. float e = 6.87;
  10. int n=0;
  11. int x = 0;
  12. float total=0;
  13. float a2=0,b2=0,c2=0,d2=0,e2=0;
  14.  
  15. do{
  16. printf("Ingrese el codigo de producto: 1-5 (-1 para salir): ");
  17. scanf("%d", &x);
  18. if(x >= 1 && x <= 5){
  19.      printf("Ingrese las unidades vendidas: ");
  20.      scanf("%d", &n);
  21. }
  22. switch (x){
  23. case 1:
  24. a2 += a*n;
  25. break;
  26. case 2:
  27. b2 += b*n;
  28. break;
  29. case 3:
  30. c2 += c*n;
  31. break;
  32. case 4:
  33. d2 += d*n;
  34. break;
  35. case 5:
  36. e2 += e*n;
  37. break;
  38. default:
  39. if (x!=-1)
  40.            printf("Introdujo un codigo erroneo\n");
  41. break;
  42. } /*fin de switch*/
  43. } /*fin de do*/
  44. while (x!=-1); /*condicion de do*/
  45. total = a2+b2+c2+d2+e2;
  46. printf("El total vendido es %1.2f \n", total);
  47. return 0;
  48.  }
  49.  

¡¡¡¡ Saluditos! ..... !!!!


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

P.D: Juraito, juraito que el código está bien indentado, pero no sé que pasa últimamente que al ponerlo en las Code se "desparrama". :o


(http://i1280.photobucket.com/albums/a497/leosansan/GRAFICOS%202/switch_zps7236ac86.jpg)


Título: Re: [C] Problema con ejercicio
Publicado por: Gh057 en 25 Febrero 2014, 21:32 pm
jaajaj por mi parte jamás ocurriría...! excelente aporte leosansan :laugh: dmacias fíjate que claro quedó ahora, por favor ténlo en cuenta para futuros ejercicios, así como la validación del ingreso,    saludos!


Título: Re: [C] Problema con ejercicio
Publicado por: dmacias en 26 Febrero 2014, 09:09 am
Gracias a los dos por tomaros la molestia , mirare con lupa ese codigo que me pone leosansan haber las diferencias con el mio y os voy robando tecnica con la vista ¬¬

Nos volveremos a ver con mas problemas  :xD

Un saludo



Título: Re: [C] Problema con ejercicio
Publicado por: Gh057 en 26 Febrero 2014, 11:35 am
buenísimo dmacias, como otra indicación te dejo link a la wiki sobre la rutina switch-case:

  -> http://es.wikipedia.org/wiki/Switch_case
 
en donde te dará un panorama más amplio de la correcta implementación de la sentencia break, el mismo se utiliza para evitar la ejecucción sucesiva de las siguientes opciones; por lo cual y por convención al dejar la opción "default" al final, puedes evitar la misma.

eso puede llevarte a buscar un listado de las funciones de la biblioteca ansi c para repasar su sintaxis, diferentes modos de empleo y si es posible, parámetros de entrada o si devuelven valores al ejecutarse. saludos!


Título: Re: [C] Problema con ejercicio
Publicado por: dmacias en 26 Febrero 2014, 12:05 pm
Me pongo a ello, buscare unos cuantos ejercicios mas usando switch para ganar soltura  ;-)  ;-)


Título: Re: [C] Problema con ejercicio
Publicado por: leosansan en 26 Febrero 2014, 17:25 pm
Me pongo a ello, buscare unos cuantos ejercicios mas usando switch para ganar soltura  ;-)  ;-)

Y al mismo tiempo ejecuta el código anterior e introduce una letra en lugar de un número y ¡¡¡OHHHhhhh....!!!!, sorpresa, el  programa se mete en un bucle.

Eso se debe a no haber validado o comprobado que lo que se introduce es un número entero o cualquier otra cosa.

Aquí estaremos para lo que necesites  ;).


¡¡¡¡ Saluditos! ..... !!!!


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


Título: Re: [C] Problema con ejercicio
Publicado por: rir3760 en 27 Febrero 2014, 15:37 pm
No creo que sea buena idea incitar a la gente que está empezando a programar a usar bucles sin condición de los que se saldrá mediante breaks, no es una buena práctica.

Yo te animo a que intentes hacer un bucle con condición y te olvides del break.
Mas que una mala practica es una cuestión de estilos.

Una opción es utilizar un bucle con una salida al medio con la ventaja del mínimo de expresiones:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main(void)
  5. {
  6.   int num;
  7.   int rv;
  8.   int ch;
  9.  
  10.   while (1){
  11.      printf("Introduce un numero (1 .. 9): ");
  12.      fflush(stdout);
  13.      if ((rv = scanf("%d", &num)) == EOF)
  14.         return EXIT_FAILURE;
  15.      else
  16.         while ((ch = getchar()) != EOF && ch != '\n')
  17.            ;
  18.  
  19.      if (rv == 1 && num >= 1 && num <= 9)
  20.         break;
  21.  
  22.      puts("Entrada no valida");
  23.   }
  24.  
  25.   printf("Numero: %d\n", num);
  26.  
  27.   return EXIT_SUCCESS;
  28. }

Otra es un bucle "while ..." o "do ... while" con expresiones repetidas:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main(void)
  5. {
  6.   int num;
  7.   int rv;
  8.   int ch;
  9.   int ok;
  10.  
  11.   do {
  12.      printf("Introduce un numero (1 .. 9): ");
  13.      fflush(stdout);
  14.      if ((rv = scanf("%d", &num)) == EOF)
  15.         return EXIT_FAILURE;
  16.      else
  17.         while ((ch = getchar()) != EOF && ch != '\n')
  18.            ;
  19.  
  20.      ok = rv == 1 && num >= 1 && num <= 9;
  21.      if (!ok)
  22.         puts("Entrada no valida");
  23.   }while (!ok);
  24.  
  25.   printf("Numero: %d\n", num);
  26.  
  27.   return EXIT_SUCCESS;
  28. }

Una tercera es colocar toda la operación (en este caso lectura) en una función, mas o menos así:
Código
  1. while ((rv = fn(...)) == 0){
  2.   /* Entrada no valida o fuera de rango */
  3. }
  4. if (rv == EOF){
  5.   /* Error critico */
  6. }
  7.  
  8. /* ... (OK) */

----

P.D: Juraito, juraito que el código está bien indentado, pero no sé que pasa últimamente que al ponerlo en las Code se "desparrama".
Eso se debe a que en tu editor de texto estas indentando el código fuente con tabuladores en vez de espacios.

Un saludo


Título: Re: [C] Problema con ejercicio
Publicado por: dmacias en 27 Febrero 2014, 15:42 pm
Vaya, no entiendo ni la mitad de las cosas de esos codigos  :o supongo que conforme vaya avanzando en mis estudios ire viendo todas esas opciones.

De todos modos gracias por poner esas alternativas