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

 

 


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Duda con bloque for al aumentar una variable
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Duda con bloque for al aumentar una variable  (Leído 2,138 veces)
greenchar

Desconectado Desconectado

Mensajes: 6


Ver Perfil
Duda con bloque for al aumentar una variable
« 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 (:


« Última modificación: 4 Agosto 2011, 05:46 am por greenchar » En línea

Shell Root
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.723


<3


Ver Perfil WWW
Re: Duda con bloque for al aumentar una variable
« Respuesta #1 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.  


« Última modificación: 4 Agosto 2011, 06:08 am por Shell Root » En línea

Por eso no duermo, por si tras mi ventana hay un cuervo. Cuelgo de hilos sueltos sabiendo que hay veneno en el aire.
Beakman

Desconectado Desconectado

Mensajes: 190



Ver Perfil WWW
Re: Duda con bloque for al aumentar una variable
« Respuesta #2 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.
« Última modificación: 4 Agosto 2011, 22:39 pm por CrisQC » En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Duda con bloque for al aumentar una variable
« Respuesta #3 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
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
greenchar

Desconectado Desconectado

Mensajes: 6


Ver Perfil
Re: Duda con bloque for al aumentar una variable
« Respuesta #4 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
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
La variable de tipo Object o la variable de bloque With no está establecida
Programación Visual Basic
rubeng 5 11,304 Último mensaje 17 Septiembre 2007, 00:04 am
por rubeng
Error 91: Variable de tipo object o la variable de bloque with no esta estableci
Programación Visual Basic
brus_k10 2 5,739 Último mensaje 16 Junio 2009, 16:20 pm
por cassiani
Duda con variable
Scripting
pity0926 2 1,717 Último mensaje 12 Abril 2011, 14:34 pm
por pity0926
Duda aumentar HZ ratón
Dudas Generales
Senior++ 7 5,538 Último mensaje 14 Agosto 2019, 21:52 pm
por RiKKu
[C] Crear una variable a la mitad de un bloque.
Programación C/C++
fafafa01 3 1,414 Último mensaje 11 Febrero 2017, 01:32 am
por ThunderCls
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines