Contar palabras
Recorrer no basta: hay que ir recordando dónde estabas.
1Por qué
Contar letras fue fácil: se avanza hasta el cero del final y se suma uno cada vez. Contar palabras no sale así, y por una razón que vale más que el ejercicio.
Una palabra no es un carácter: es un tramo. Mirando una letra suelta no puedes decir si empieza una palabra o si estás en medio de una — depende de lo que había antes. Y el texto no guarda esa información en ninguna parte.
La solución es llevarla tú, en una cajita aparte: «¿venía dentro de una palabra o no?». Eso se llama estado, y es una de las ideas que más lejos llegan. Un programa que analiza texto, uno que lee un archivo con formato, uno que entiende lo que escribes: todos avanzan de a un carácter recordando dónde estaban.
Con el estado puesto, la regla es corta. Si el carácter es un espacio, ya no estás dentro. Si no lo es y no estabas dentro, acaba de empezar una palabra: cuenta uno y anota que ahora sí estás. Y si no lo es y ya estabas, no pasa nada — es una letra más de la misma palabra.
Esa última rama es la que hace que «hola que tal» dé 3 y no 11.
2Míralo andar
Este programa funciona. Léelo, y después ejecútalo sin cambiar nada.
#include <stdio.h>int main(void){char t[30] = "hola que tal";int palabras = 0;int dentro = 0;for (int i = 0; t[i] != 0; i++){if (t[i] == ' ')dentro = 0;else if (dentro == 0){dentro = 1;palabras = palabras + 1;}}printf("%d\n", palabras);return 0;}
- línea 7
El estado. Empieza en 0 porque antes de la primera letra no estabas dentro de ninguna palabra. - línea 11
' 'con comillas simples es el carácter espacio. Un espacio siempre te deja fuera. - línea 13
Aquí está la idea entera: no es letra y ANTES no estabas dentro, así que esta letra empieza una palabra. - línea 16
Si ya estabas dentro no entra aquí, y por eso «hola» cuenta una vez y no cuatro.
3Ahora tú
Este programa lleva bien el estado pero nunca cuenta. Escribe la línea que suma una palabra, para que diga: 3
#include <stdio.h>int main(void){char t[30] = "hola que tal";int palabras = 0;int dentro = 0;for (int i = 0; t[i] != 0; i++){if (t[i] == ' ')dentro = 0;else if (dentro == 0){dentro = 1;}}printf("%d\n", palabras);return 0;}
↖︎ Tu línea va aquí, justo cuando se acaba de entrar en una palabra nueva.
Ejecutar
Lo que dice tu programa
↖︎ Escribe tu parte y dale a Ejecutar
Qué pasó
Aquí te aviso si tu programa hace algo raro.
4Qué guarda tu programa
La pila
↖︎ Ejecuta el programa para ver qué pasa por dentro