Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: greenchar en 4 Agosto 2011, 05:36 am



Título: Duda con bloque for al aumentar una variable
Publicado por: greenchar en 4 Agosto 2011, 05:36 am
Hola! (siento tener que publicar esto, pero por más que le di vueltas, no encuentro una respuesta)
Estoy practicando los bucles for y me surgió un "problema" que me saco de onda:
No encuentro como explicar mi "problema" sin antes mostrar la salida...

Salida:

i vale 0
i vale 1
i vale 2
i vale 3
i vale 4
imprime_i() INICIALIZADA
i vale 5


y aqui el codigo:
Código
  1. #include <stdio.h>
  2. void imprime_i(int x);
  3.  
  4. int main(){
  5.  int i, a = 5;
  6.  for(i=0; i < a; i++){
  7.    printf("i vale %d\n", i);
  8.  }
  9.  imprime_i(i);
  10.  return 0;
  11. }
  12.  
  13. void imprime_i(int x){
  14.  
  15.  printf("imprime_i() INICIALIZADA\n\
  16. i vale %d\n", x);
  17. }
  18.  
  19.  
  20.  

¿Por que se imprime 0 en el primer ciclo si se supone que se incrementa 1 y después se imprime? :-(
¿No se supone que tendría que valer 4 al final? :huh:

Aprovechando este post tengo una pregunta más:
Hice un programa que pide un valor numérico, pero al introducir una letra, se vuelve a repetir (como si fuera un bucle infinito) ¿como puedo hacer una excepción para controlar eso?

Gracias de antemano (:


Título: Re: Duda con bloque for al aumentar una variable
Publicado por: Shell Root en 4 Agosto 2011, 05:59 am
El ciclo inicializa en 0, realiza las acciones, termina el ciclo y realiza la condición de qué i < a, como es verdadero ahí incrementa en 1, realiza el mismo procedimiento hasta que no se cumpla la condición.

---

Lo que pasa es que lo como como si fuera el equivalente en caracter ASCII, es decir,
Código
  1.  #include <stdio.h>
  2.  int main()
  3.  {
  4.    int var = 'a';
  5.    int i   = 0;
  6.    for( i=1; i<=var; i++ )
  7.    {
  8.      printf( "Contador en: %i \n", i );
  9.    }
  10.    return 0;
  11.  }
El resultado es, -porque 'a' en ASCII es 97-
Código
  1. alex@shellroot:~/Escritorio$ gcc PoC.c
  2. alex@shellroot:~/Escritorio$ ./a.out
  3. Contador en: 1
  4. Contador en: 2
  5. Contador en: 3
  6. Contador en: 4
  7. Contador en: 5
  8. Contador en: 6
  9. Contador en: 7
  10. Contador en: 8
  11. Contador en: 9
  12. Contador en: 10
  13. Contador en: 11
  14. Contador en: 12
  15. Contador en: 13
  16. Contador en: 14
  17. Contador en: 15
  18. Contador en: 16
  19. Contador en: 17
  20. Contador en: 18
  21. Contador en: 19
  22. Contador en: 20
  23. Contador en: 21
  24. Contador en: 22
  25. Contador en: 23
  26. Contador en: 24
  27. Contador en: 25
  28. Contador en: 26
  29. Contador en: 27
  30. Contador en: 28
  31. Contador en: 29
  32. Contador en: 30
  33. Contador en: 31
  34. Contador en: 32
  35. Contador en: 33
  36. Contador en: 34
  37. Contador en: 35
  38. Contador en: 36
  39. Contador en: 37
  40. Contador en: 38
  41. Contador en: 39
  42. Contador en: 40
  43. Contador en: 41
  44. Contador en: 42
  45. Contador en: 43
  46. Contador en: 44
  47. Contador en: 45
  48. Contador en: 46
  49. Contador en: 47
  50. Contador en: 48
  51. Contador en: 49
  52. Contador en: 50
  53. Contador en: 51
  54. Contador en: 52
  55. Contador en: 53
  56. Contador en: 54
  57. Contador en: 55
  58. Contador en: 56
  59. Contador en: 57
  60. Contador en: 58
  61. Contador en: 59
  62. Contador en: 60
  63. Contador en: 61
  64. Contador en: 62
  65. Contador en: 63
  66. Contador en: 64
  67. Contador en: 65
  68. Contador en: 66
  69. Contador en: 67
  70. Contador en: 68
  71. Contador en: 69
  72. Contador en: 70
  73. Contador en: 71
  74. Contador en: 72
  75. Contador en: 73
  76. Contador en: 74
  77. Contador en: 75
  78. Contador en: 76
  79. Contador en: 77
  80. Contador en: 78
  81. Contador en: 79
  82. Contador en: 80
  83. Contador en: 81
  84. Contador en: 82
  85. Contador en: 83
  86. Contador en: 84
  87. Contador en: 85
  88. Contador en: 86
  89. Contador en: 87
  90. Contador en: 88
  91. Contador en: 89
  92. Contador en: 90
  93. Contador en: 91
  94. Contador en: 92
  95. Contador en: 93
  96. Contador en: 94
  97. Contador en: 95
  98. Contador en: 96
  99. Contador en: 97
  100.  


Título: Re: Duda con bloque for al aumentar una variable
Publicado por: Beakman en 4 Agosto 2011, 06:03 am
Cuando vos escribís esto:
Código
  1. for(i=0; i < a; i++)

El For comienza dándole el valor cero a i, no empieza por uno, incrementa cuando terminó de ejecutar lo que haya en el bloque.

Citar
¿No se supone que tendría que valer 4 al final?
No. En la última vuelta lo que hace el for es:

i = 5
¿ i es menor a a que vale 5 ? --> NO, son iguales así que sale del ciclo.
Cuando sale se llama a la función imprime_i(i); que imprime el valor de i, que quedó en 5 en la última vuelta del for.

Citar
Hice un programa que pide un valor numérico, pero al introducir una letra, se vuelve a repetir (como si fuera un bucle infinito) ¿como puedo hacer una excepción para controlar eso?

Lo que tenés que hacer es, ingresar una cadena.
Y luego podrías preguntar si el primer caracter, vector_de_caracteres[ 0 ] es igual al número que necesitás.


Título: Re: Duda con bloque for al aumentar una variable
Publicado por: rir3760 en 4 Agosto 2011, 10:44 am
Aprovechando este post tengo una pregunta más:
Hice un programa que pide un valor numérico, pero al introducir una letra, se vuelve a repetir (como si fuera un bucle infinito) ¿como puedo hacer una excepción para controlar eso?
Supongo por lo comentado que utilizas la función scanf para leer el valor. En ese caso se debe recordar que ella solo procesa los caracteres necesarios para la conversión, si esta falla los caracteres inválidos se quedan ahí (en el bufer de la entrada estándar).

Lo que debes hacer es verificar el valor de retorno de la función (esta es el numero de conversiones exitosas) y descartar el resto de la linea.

Por ejemplo:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main(void)
  5. {
  6.   int num;
  7.   int ok;
  8.   int ch;
  9.  
  10.   do {
  11.      printf("Introduce un numero (1 a 9): ");
  12.      fflush(stdout);
  13.      ok = scanf("%d", &num) == 1 && num >= 1 && num <= 9;
  14.  
  15.      /* Descartamos el resto de la linea */
  16.      while ((ch = getchar()) != EOF && ch != '\n')
  17.         ;
  18.   }while (!ok);
  19.  
  20.   printf("El numero es %d\n", num);
  21.  
  22.   return EXIT_SUCCESS;
  23. }

Un saludo


Título: Re: Duda con bloque for al aumentar una variable
Publicado por: greenchar en 4 Agosto 2011, 20:25 pm
Woah! :-[
Ya comprendí lo del  bucle for, i ya estaba en 5, por eso saltaba hacia imprime_i() :P, sobre lo de la excepción que quería hacer, voy a investigar e implementar lo que dicen.
Muchas gracias a todos  ;D