numeros
La manera de cómo contar la cantidad de palabras que una cadena contiene separador de silabas para ello tenemos que considerar que una cadena no siempre la cantidad de espacios más uno es igual a la cantidad de palabras, por ejemplo, podemos encontrarnos en la siguiente situación supongamos que la cadena ingresada sea la siguiente como vemos la cantidad de palabras es 2, sin embargo la cantidad de espacios es mucho mayor, ahora veamos cómo sería la situación si es que nosotros eliminamos los espacios sobrantes de modo que no haya un espacio al inicio ni tampoco espacios al final y que solamente haya un espacio entre cada palabra, es decir, que se quede de esta manera, en este caso si se cumpliría que la cantidad de palabras es igual a la cantidad de espacios más uno, solo en este caso, entonces lo que nosotros podríamos hacer para contar la cantidad de palabras, es primero limpiar la cantidad de espacios repetidos, en otras palabras, purgar la cadena para que tengamos el formato adecuado y allí poder recién contar la cantidad de palabras de una manera más sencilla, otra forma también sería contar la cantidad de veces en que aparece un espacio seguido de una letra, esto es más sencillo porque no es necesario estar modificando la cadena, entonces podemos tomar cualquiera de estas dos opciones, en esta ocasión vamos a usar la segunda opción para contar la cantidad de palabras, entonces, antes que todo, vamos a leer la cadena.
Nosotros en C++ podemos usar la clase string y valernos
de sus funciones para desarrollar los programas de una manera más sencilla,
esto es en el supuesto de que se nos esté pidiendo elaborar un programa
usando simplemente datos predefinidos como un arreglo de caracteres, entonces
tendríamos char cadena si es que queremos llamarlo con ese nombre y en
este caso, un máximo de 250 caracteres, entonces le pedimos al usuario que
ingrese una cadena de texto y pasamos a leer la cadena, para ello haremos uso
de la función getline que es un método del objeto "cin" y
sus argumentos son los siguientes como primer argumento, el lugar donde se va a
almacenar la cadena y como segundo argumento, el límite máximo de
caracteres que se admiten luego de haber leído la cadena, llamaremos a
nuestra función contar palabras y le enviaremos la cadena misma, entonces
nosotros diremos la cadena de texto ingresada contiene dicha cantidad de
palabras como estamos observando aquí, esto de aquí se va a reemplazar por la
cantidad de palabras que tiene la cadena en otras palabras,
nuestra función va a ser una función que nos va a devolver un
elemento, un tipo de datos de tipo entero, entonces pasamos a escribir la
función propiamente dicha primero, el prototipo de la función sería el
siguiente entero ContarPalabras y como argumento, sería la cadena, en este
caso es un arreglo de caracteres ahora definimos el cuerpo de la función
entonces la idea es recorrer toda la cadena y buscar las posiciones en las que
se cumple que hay un espacio seguido de una letra para identificar que se
trata de una letra, nosotros usaremos isalpha que es una función que nos
va a devolver verdadero si es que se trata de una letra si es que se ingresan
caracteres extraños no se consideraría como palabra si es que éste está
después de un espacio y por tanto se obviaría todo lo que está después, ¿a
qué me refiero con esto? que si en vez de la letra m acá estuviese un
caracter extraño que no es admitido por la función isalpha, en ese caso,
se contaría solamente una palabra, pero para este caso en específico las
cadenas las vamos a ingresar con caracteres conocidos con letras en otras
palabras y acá encontrar palabras entonces nosotros haremos un recorrido
mediante un for, empezaremos en i igual, mientras que i sea menor que,
aumentado de 1 en 1, eso es lo normal que nosotros usaríamos si es que
conociésemos el tamaño, la cantidad de caracteres que tiene nuestra
cadena, en este caso no, como estamos trabajando a bajo nivel, la manera
correcta de recorrer una cadena es verificando en cada instante que aún
hayamos llegado a la marca de fin de cadena, entonces en el for la
condición se establece en el centro, en este caso sería, el for se va a
seguir ejecutando mientras qué mientras que cadena sub i sea diferente de
la marca de fin de cadena.
En un primer momento tenía pensado escribir una
posición i que se evaluaría si es que es igual a un espacio y una posición i
más uno que evaluaría si es una letra lo que le sigue a esa posición i
pero no es correcto porque trataríamos de acceder a una posición siguiente
aún cuando hayamos llegado a la marca de fin de cadena, y habría error,
por lo tanto es conveniente que la posición empiece en uno, evaluamos si es que
la posición uno es una letra y que lo que le antecede es un espacio, en ese
caso contamos una palabra adicional y así no hay riesgo de tratar de
acceder a memoria que no ha sido asignada entonces escribimos lo siguiente
si la posición i menos 1 es igual a un espacio y además se cumple que es
una letra el elemento de la posición i de cadena entonces aumentamos la
cantidad de palabras no olvidemos entonces también inicializar este dato,
finalmente devolvemos dicha cantidad.
Suponiendo de que haya un espacio al inicio y lo que le
sigue sea una letra, no hay problema, pero suponiendo que al inicio se
encuentre un caracter haya un espacio y luego hayan más caracteres,
es decir algo como lo siguiente como nosotros empezamos en la posición 1
y comparamos con el anterior, es decir, comparamos que haya un espacio y
una letra esto no se va a cumplir y no contaríamos ninguna palabra acá,
como vemos, se está obviando un caso especial que en sí solamente ocurre para
la primera posición porque para el resto de las posiciones se va a evaluar
de manera normal, incluso si tuviéramos este otro caso con una d al final,
si se evaluaría porque la posición i llega hasta d ya no continúa porque
ya encontró una marca de fin de cadena pero llega hasta d y lo evalúa con
respecto a su posición anterior como acá se muestra, entonces la única
excepción sería que tenemos que además de evaluar esto, tenemos
que evaluar por separado, fuera del for, tenemos que evaluar por separado
la primera letra, el primer caracter de la cadena, en otras palabras si si
cad sub cero es letra, osea si isalpha el elemento de posición cero de cad sub
cero el elemento de posición cero de la cadena de caracteres cad es letra,
entonces aumentamos la cantidad de palabras nuevamente.
No debemos olvidar que aquí tenemos que usar el nombre
de cad ya que así lo estamos recibiendo como argumento acá también
había escrito mal, era un if entonces ahora vamos a probar el programa
ingresaremos una cadena con espacios al inicio, una palabra, otra palabra,
tres espacios entre una palabra y otra, otra cantidad de caracteres y
finalizaremos con espacios a pesar de todo esto el valor de la cantidad de
palabras debería darnos 4 y efectivamente el programa cumple con lo
especificado probaremos una vez más con otra cadena para demostrar que en
realidad no fue solamente coincidencia entonces escribimos espacio espacio
"abcd" espacio espacio "efg" espacio "hjk" y así
sucesivamente, en este caso debería contarse una palabra, dos, tres, cuatro,
cinco, seis, siete, ocho, nueve y diez, y el resultado es 7, ¿por qué no
10? porque debemos recordar que hemos usado la función isalpha es decir,
en la segunda condición nosotros no hemos puesto si es diferente el
espacio hemos puesto isalpha, eso quiere decir que solamente se cuenta la
palabra cuando hay un espacio y le continúa una letra, un espacio y
le continúa una letra y así ocurre con esta palabra, esta, esta, esta, esta,
esta y mente, pero no ocurre con los puntos porque los puntos no son
letras, por lo tanto corrijo lo que dije anteriormente y pues el
resultado es correcto que debe ser 7 ya que solamente se considera la
cantidad de palabras que empiezan con una letra y no signos de puntuación,
ni otro caracter que pueda resultar extraño