Hola<div><br></div><div>Me llamo Xan y estoy empezando a programar en C y me ha surgido un pequeño problema con un código de ejemplo de un manual con un bucle for anidado.</div><div><br></div><div>El código es el siguiente</div>
<div><br></div><div><div><i>/*************************** Tabla de frecuencias de letras adyacentes en un texto **********************/</i></div><div><i>#include <stdio.h></i></div><div><i>#include <ctype.h></i></div>
<div><i>#define DIM ('z'- 'a' + 1)   /* filas/columnas de la tabla */</i></div><div><i><br></i></div><div><i>void main(void)</i></div><div><i>{</i></div><div><i>    static int tabla[DIM][DIM];     /* Tabla de contingencias */</i></div>
<div><i>    char f, c;                      /* índices */</i></div><div><i>    char car;                       /* Carácter actual */</i></div><div><i>    char carant;                     /* Carácter anterior*/</i></div><div>
<i><br></i></div><div><i>    printf("Introducir texto. Para finalizar introducir la marca EOF\n\n");</i></div><div><i>    while ((car = getchar()) != EOF)</i></div><div><i>    {</i></div><div><i>        car = tolower(car);         /* convertir a minúsculas si procede*/</i></div>
<div><i>        if ((carant >= 'a' && carant <= 'z') && (car >= 'a' && carant <= 'z'))</i></div><div><i>            tabla[carant-'a'][car - 'a']++;</i></div>
<div><i>        carant = car;</i></div><div><i>    }</i></div><div><i><br></i></div><div><i>    /* Escribir tabla de frecuencias */</i></div><div><i>    printf(" ");</i></div><div><i>    for (c = 'a'; c<= 'z'; c++)</i></div>
<div><i>        printf("  %c", c);</i></div><div><i>    putchar ('\n');</i></div><div><i>    for (f = 'a'; f<= 'z'; f++);</i></div><div><i>    {</i></div><div><i>        putchar(f);</i></div>
<div><i>        for (c = 'a'; c<= 'z'; c++)</i></div><div><i>        printf("%3d", tabla[f-'a'][c - 'a']);</i></div><div><i>        putchar('\n');</i></div><div><i>    }</i></div>
<div><i>    fflush(stdin);</i></div><div><i>    printf ("Pulsa <Enter> para salir...");</i></div><div><i>    while (getchar() != '\n');</i></div><div><br></div><div><br></div><div>El problema reside en el doble bucle for:</div>
<div><br></div><div><div> <i>for (f = 'a'; f<= 'z'; f++);</i></div><div><i>    {</i></div><div><i>        putchar(f);</i></div><div><i>        for (c = 'a'; c<= 'z'; c++)</i></div><div>
<i>        printf("%3d", tabla[f-'a'][c - 'a']);</i></div><div><i>        putchar('\n');</i></div><div><i>    }</i></div></div><div><br></div><div><br></div><div>Depurando el programa y observando las variables f comienza con el valor 123 ('}') cuando debería empezar con el 97 ('a'). Lo curioso es que en el bucle de la variable c, que es idéntico, se ejecuta correctamente, tomando c los valores del 97 al 122 ('a' a 'z').</div>
<div><br></div><div>He cambiado el nombre a la variable, probar con valores numéricos en vez de caracteres, incluso he probado a realizar el bucle for con un int y asignar el valor después a la variable f, así</div><div><div>
<div><i>for (i = 97; i<= 122; i++);</i></div><div><i>    {</i></div><div><i>        f = i;</i></div><div><i>        putchar(f);</i></div><div><i>        for (c = 'a'; c<= 'z'; c++)</i></div><div><i>        printf("%3d", tabla[f-'a'][c - 'a']);</i></div>
<div><i>        putchar('\n');</i></div><div><i>    }</i></div></div></div><div><i><br></i></div><div>pero siempre empieza asignando el valor 123 (que es justo el siguiente con el que acaba el primer bucle for. Y lo que más me despista es que los dos bucles for para la variable c se ejecutan sin ningún problema (se empieza con el valor 'a' y acaba con el valor 'z'). He probado con Code::Blocks  y DevC++, por si fuera una cuestión del compilador y tambien pasa igual.</div>
<br>Si alguien puede echarme una mano me sería muy útil, pues no veo dónde puede estar el fallo.
</div><div><br></div><div>Muchas Gracias</div><div>Xan bellón</div>