Duda con bloque for al aumentar una variable

Iniciado por greenchar, 4 Agosto 2011, 05:36 AM

0 Miembros y 1 Visitante están viendo este tema.

greenchar

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:
#include <stdio.h>
void imprime_i(int x);

int main(){
 int i, a = 5;
 for(i=0; i < a; i++){
   printf("i vale %d\n", i);
 }
 imprime_i(i);
 return 0;
}

void imprime_i(int x){

 printf("imprime_i() INICIALIZADA\n\
i vale %d\n", x);
}
   



¿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 (:

Shell Root

#1
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,
  #include <stdio.h>
  int main()
  {
    int var = 'a';
    int i   = 0;
    for( i=1; i<=var; i++ )
    {
      printf( "Contador en: %i \n", i );
    }
    return 0;
  }

El resultado es, -porque 'a' en ASCII es 97-
Código (bash) [Seleccionar]
alex@shellroot:~/Escritorio$ gcc PoC.c
alex@shellroot:~/Escritorio$ ./a.out
Contador en: 1
Contador en: 2
Contador en: 3
Contador en: 4
Contador en: 5
Contador en: 6
Contador en: 7
Contador en: 8
Contador en: 9
Contador en: 10
Contador en: 11
Contador en: 12
Contador en: 13
Contador en: 14
Contador en: 15
Contador en: 16
Contador en: 17
Contador en: 18
Contador en: 19
Contador en: 20
Contador en: 21
Contador en: 22
Contador en: 23
Contador en: 24
Contador en: 25
Contador en: 26
Contador en: 27
Contador en: 28
Contador en: 29
Contador en: 30
Contador en: 31
Contador en: 32
Contador en: 33
Contador en: 34
Contador en: 35
Contador en: 36
Contador en: 37
Contador en: 38
Contador en: 39
Contador en: 40
Contador en: 41
Contador en: 42
Contador en: 43
Contador en: 44
Contador en: 45
Contador en: 46
Contador en: 47
Contador en: 48
Contador en: 49
Contador en: 50
Contador en: 51
Contador en: 52
Contador en: 53
Contador en: 54
Contador en: 55
Contador en: 56
Contador en: 57
Contador en: 58
Contador en: 59
Contador en: 60
Contador en: 61
Contador en: 62
Contador en: 63
Contador en: 64
Contador en: 65
Contador en: 66
Contador en: 67
Contador en: 68
Contador en: 69
Contador en: 70
Contador en: 71
Contador en: 72
Contador en: 73
Contador en: 74
Contador en: 75
Contador en: 76
Contador en: 77
Contador en: 78
Contador en: 79
Contador en: 80
Contador en: 81
Contador en: 82
Contador en: 83
Contador en: 84
Contador en: 85
Contador en: 86
Contador en: 87
Contador en: 88
Contador en: 89
Contador en: 90
Contador en: 91
Contador en: 92
Contador en: 93
Contador en: 94
Contador en: 95
Contador en: 96
Contador en: 97
Por eso no duermo, por si tras mi ventana hay un cuervo. Cuelgo de hilos sueltos sabiendo que hay veneno en el aire.

Beakman

#2
Cuando vos escribís esto:
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.

CitarHice 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.

rir3760

Cita de: greenchar en  4 Agosto 2011, 05:36 AMAprovechando 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:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
   int num;
   int ok;
   int ch;
   
   do {
      printf("Introduce un numero (1 a 9): ");
      fflush(stdout);
      ok = scanf("%d", &num) == 1 && num >= 1 && num <= 9;
     
      /* Descartamos el resto de la linea */
      while ((ch = getchar()) != EOF && ch != '\n')
         ;
   }while (!ok);
   
   printf("El numero es %d\n", num);
   
   return EXIT_SUCCESS;
}


Un saludo
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

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