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>