Principiante · cctype

Contar vocales

Lee una palabra y cuenta sus vocales. El juez incluye mayúsculas a propósito.

En una fraseRecorre la cadena y compara cada carácter con a, e, i, o, u en mayúscula y minúscula: las pruebas ocultas incluyen entrada toda en mayúsculas, así que comparar solo minúsculas descuenta.

El problema

Entrada: Una palabra (solo letras, puede ir en mayúsculas).

Salida: Cuántas vocales contiene, sin distinguir mayúsculas.

Ejemplo:

EntradaSalida
AEIOU5

Tu solución

main.cpp — tu solución
Entrada personalizada para «Ejecutar mi entrada»

La corrección corre en tu navegador contra pruebas ocultas. Un bucle infinito se corta a los 3 segundos — aun así, asegúrate de que todo bucle tenga salida. Tu código se guarda solo mientras escribes.

¿Atascado? Pistas

Pista 1 — tolower es tu aliado

De <cctype>: char c = tolower(s[i]); y compara con las cinco minúsculas.

Pista 2 — Condición del bucle

for (int i = 0; s[i] != '\0'; i++) — para en el terminador.

Solución (¡inténtalo primero!)
#include <iostream>
#include <cstring>
#include <cctype>
using namespace std;

int main() {
    char s[100];
    cin >> s;
    int count = 0;
    for (int i = 0; s[i] != '\0'; i++) {
        char lower = tolower(s[i]);
        if (lower == 'a' || lower == 'e' || lower == 'i' ||
            lower == 'o' || lower == 'u') count++;
    }
    cout << count << endl;
    return 0;
}

Sin tolower, la prueba AEIOU da 0. Siguiente: arrays 2D.

Análisis profundo

Por qué funciona

Clasificar por pertenencia —¿está este carácter en un conjunto?— es el caso base de todo analizador léxico y sintáctico que te encuentres.

El coste

O(n·k) con k = 5 comparaciones, es decir O(n). Una tabla de 256 entradas convierte k en constante.

Dónde falla

  • Contar solo minúsculas se salta la 'A'. Normaliza con tolower o prueba ambos casos.
  • tolower depende del locale: en turco la 'I' no pasa a 'i'.

Siguiente paso

Arrays de caracteres a escala: Invertir una cadena.

Dos cosas para recordar

  • Normaliza el caso antes de comparar caracteres.
  • Las pruebas de pertenencia piden una tabla, no una cadena de if.
🐞 Esta versión falla: ábrela y pruébala

Solo cuenta vocales minúsculas

#include <iostream>
#include <cstring>
using namespace std;

int main() {
    char s[100];
    cin >> s;
    int n = strlen(s), c = 0;
    for (int i = 0; i < n; i++) {
        if (s[i] == 'a' || s[i] == 'e' || s[i] == 'i' || s[i] == 'o' || s[i] == 'u') c++;
    }
    cout << c << endl;
    return 0;
}