Как подсчитать гласные, согласные, цифры и специальные символы в строке

Строка — это последовательность символов. Символы могут быть буквами (гласные и согласные), цифрами или специальными символами (включая пробелы и знаки пунктуации). В этой статье вы научитесь надёжно подсчитывать количество гласных, согласных, цифр и специальных символов в любой строке.
Что считается гласными, согласными и специальными символами
- Гласные (в латинской раскладке): a, e, i, o, u (регистр игнорируется в большинстве примеров). Например, ‘A’ и ‘a’ оба считаются гласной.
- Согласные: любые буквы латинского алфавита, не являющиеся гласными.
- Цифры: символы 0–9.
- Специальные символы: всё, что не попало в предыдущие категории — пробелы, знаки пунктуации, символы типа @, #, $, а также символы других алфавитов (если код специально ориентирован только на латиницу).
Важно: в базовом алгоритме пробелы считаются специальными символами.
Примеры для понимания
Пример 1: строка “Welcome 2 #MUO”
s = “Welcome 2 #MUO”
- Гласные: e, o, e, U, O — всего 5
- Согласные: W, l, c, m, M — всего 5
- Цифры: 2 — всего 1
- Специальные символы: пробел, пробел, # — всего 3
Пример 2: строка “This Is @ InpuT String 2”
s = “This Is @ InpuT String 2”
- Гласные: i, I, I, u, i — всего 5
- Согласные: T, h, s, s, n, p, T, S, t, r, n, g — всего 12
- Цифры: 2 — всего 1
- Специальные символы: пять пробелов и знак @ — всего 6
Примечание: пробел считается специальным символом.
Алгоритм шаг за шагом
- Инициализируйте счётчики: totalVowels, totalConsonants, totalDigits, totalSpecialCharacters = 0.
- Пройдите по строке символ за символом.
- Для каждого символа выясните: буква ли это (латиница), цифра или прочий символ.
- Если буква: приведите к нижнему регистру и проверьте, входит ли в набор гласных (a,e,i,o,u). Если да — увеличьте totalVowels, иначе — totalConsonants.
- Если цифра — увеличьте totalDigits.
- Иначе — увеличьте totalSpecialCharacters.
Этот подход прост и эффективен для ASCII/латиницы. Для Unicode потребуется расширение (см. раздел “Когда этот метод не работает”).
Разбор альтернативных подходов и когда они лучше
- Regex (регулярные выражения): удобно и кратко для большинства языков (пример: /[aeiou]/i для гласных). Хорошо для быстрого прототипа, но может быть медленнее при большом объёме данных.
- Unicode категории (Unicode property escapes, например \p{L} и \p{Nd}): необходимы, если строка может содержать буквы не‑латинского алфавита (кириллица, иероглифы и т.д.).
- Библиотеки для нормализации и проверки кластеров символов: нужны для корректной обработки комбинирующих знаков и эмодзи.
Когда метод на основе простых диапазонов символов НЕ работает:
- Строка содержит кириллицу, греческие буквы или другие нелатинские буквы — тогда условие (c >= ‘a’ && c <= ‘z’) неверно.
- Строка содержит комбинирующие символы, составные графемы или эмодзи — их следует обрабатывать как отдельные единицы (grapheme clusters).
C++: рабочая реализация
#include
#include
#include
using namespace std;
void countCharactersCategory(const string &s)
{
int totalSpecialCharacters = 0, totalDigits = 0, totalVowels = 0, totalConsonants = 0;
for (size_t i = 0; i < s.length(); i++)
{
char c = s[i];
// Алфавит (латиница)
if ( (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') )
{
c = tolower(static_cast(c));
// Гласные
if (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u')
{
totalVowels++;
}
else
{
totalConsonants++;
}
}
// Цифры
else if (c >= '0' && c <= '9')
{
totalDigits++;
}
// Специальные символы
else
{
totalSpecialCharacters++;
}
}
cout << "Total no. of vowels in the given string: " << totalVowels << endl;
cout << "Total no. of consonants in the given string: " << totalConsonants << endl;
cout << "Total no. of digits in the given string: " << totalDigits << endl;
cout << "Total no. of special characters in the given string: " << totalSpecialCharacters << endl;
}
int main()
{
string s1 = "Welcome 2 #MUO";
cout << "Input string: " << s1 << endl;
countCharactersCategory(s1);
string s2 = "This Is @ InpuT String 2";
cout << "Input string: " << s2 << endl;
countCharactersCategory(s2);
return 0;
} Вывод (пример):
Input string: Welcome 2 #MUO
Total no. of vowels in the given string: 5
Total no. of consonants in the given string: 5
Total no. of digits in the given string: 1
Total no. of special characters in the given string: 3
Input string: This Is @ InpuT String 2
Total no. of vowels in the given string: 5
Total no. of consonants in the given string: 12
Total no. of digits in the given string: 1
Total no. of special characters in the given string: 6Python: ясная и корректная реализация
def countCharactersCategory(s):
totalSpecialCharacters = 0
totalDigits = 0
totalVowels = 0
totalConsonants = 0
for c in s:
# Алфавит (латиница)
if ('a' <= c <= 'z') or ('A' <= c <= 'Z'):
cl = c.lower()
if cl in ('a', 'e', 'i', 'o', 'u'):
totalVowels += 1
else:
totalConsonants += 1
# Цифры
elif '0' <= c <= '9':
totalDigits += 1
# Специальные символы
else:
totalSpecialCharacters += 1
print("Total no. of vowels in the given string:", totalVowels)
print("Total no. of consonants in the given string:", totalConsonants)
print("Total no. of digits in the given string:", totalDigits)
print("Total no. of special characters in the given string:", totalSpecialCharacters)
# Driver code
s1 = "Welcome 2 #MUO"
print("Input string:", s1)
countCharactersCategory(s1)
s2 = "This Is @ InpuT String 2"
print("Input string:", s2)
countCharactersCategory(s2)Вывод (пример):
Input string: Welcome 2 #MUO
Total no. of vowels in the given string: 5
Total no. of consonants in the given string: 5
Total no. of digits in the given string: 1
Total no. of special characters in the given string: 3
Input string: This Is @ InpuT String 2
Total no. of vowels in the given string: 5
Total no. of consonants in the given string: 12
Total no. of digits in the given string: 1
Total no. of special characters in the given string: 6C: реализация для низкоуровневой обработки
#include
#include
#include
void countCharactersCategory(char s[])
{
int totalSpecialCharacters = 0, totalDigits = 0, totalVowels = 0, totalConsonants = 0;
for (int i = 0; i < (int)strlen(s); i++)
{
char c = s[i];
if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'))
{
c = tolower((unsigned char)c);
if (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u')
{
totalVowels++;
}
else
{
totalConsonants++;
}
}
else if (c >= '0' && c <= '9')
{
totalDigits++;
}
else
{
totalSpecialCharacters++;
}
}
printf("Total no. of vowels in the given string: %d\n", totalVowels);
printf("Total no. of consonants in the given string: %d\n", totalConsonants);
printf("Total no. of digits in the given string: %d\n", totalDigits);
printf("Total no. of special characters in the given string: %d\n", totalSpecialCharacters);
}
int main()
{
char s1[] = "Welcome 2 #MUO";
printf("Input string: %s\n", s1);
countCharactersCategory(s1);
char s2[] = "This Is @ InpuT String 2";
printf("Input string: %s\n", s2);
countCharactersCategory(s2);
return 0;
} JavaScript: пример для браузера или Node.js
function countCharactersCategory(s) {
var totalSpecialCharacters = 0, totalDigits = 0, totalVowels = 0, totalConsonants = 0;
for (var i = 0; i < s.length; i++) {
var c = s[i];
if ((c >= "a" && c <= "z") || (c >= "A" && c <= "Z")) {
c = c.toLowerCase();
if (c == "a" || c == "e" || c == "i" || c == "o" || c == "u") {
totalVowels++;
} else {
totalConsonants++;
}
}
else if (c >= "0" && c <= "9") {
totalDigits++;
}
else {
totalSpecialCharacters++;
}
}
console.log("Total no. of vowels in the given string: " + totalVowels);
console.log("Total no. of consonants in the given string: " + totalConsonants);
console.log("Total no. of digits in the given string: " + totalDigits);
console.log("Total no. of special characters in the given string: " + totalSpecialCharacters);
}
var s1 = "Welcome 2 #MUO";
console.log("Input string: " + s1);
countCharactersCategory(s1);
var s2 = "This Is @ InpuT String 2";
console.log("Input string: " + s2);
countCharactersCategory(s2);Чек-листы и краткие методики (ценные практики)
Чек-лист для разработчика:
- Уточните входные данные: ожидается ли только латиница или возможна Unicode‑строка.
- Решите, считать ли пробелы спецсимволами (по умолчанию — да).
- Напишите модульные тесты для ASCII и для случаев с unicode.
- Подумайте о производительности при очень длинных строках (используйте буферизацию и потоковую обработку).
Чек-лист для тестировщика:
- Тест с пустой строкой.
- Тест только с пробелами и спецсимволами.
- Тест с цифрами и смешанными символами.
- Тест с кириллицей/юникодом (если код ориентирован на латиницу — ожидаемое поведение должно быть описано).
Мини‑методология проверки качества:
- Разработать спецификацию (что считается гласной/согласной).
- Написать тесты (см. выше).
- Выполнить тесты на крайних случаях (пустая строка, только спецсимволы, длинные строки).
- Провести нагрузочное тестирование при необходимости.
Критерии приёмки
- Корректно считает гласные, согласные, цифры и специальные символы для ASCII‑латиницы.
- Обработка пустой строки возвращает все нули.
- Для входов с Unicode поведение задокументировано (либо поддержка расширена, либо явно указано ограничение).
Тестовые случаи и приёмочные критерии
- Пустая строка: все счётчики = 0.
- “abc123! “ → гласные=1, согласные=2, цифры=3, спец=2 (включая пробел и ‘!’).
- “AEIOUaeiou” → гласные=10, остальные=0.
- Строка с кириллицей при реализации для латиницы → все кириллические символы считаются специальными, если не реализована поддержка Unicode.
Когда нужно расширить алгоритм (советы)
- Для поддержки кириллицы и других алфавитов используйте Unicode properties (в JS: /\p{L}/u, в Python: библиотека unicodedata или regex с поддержкой Unicode, в C++/C — внешние библиотеки ICU).
- Для корректной обработки эмодзи и комбинирующих знаков используйте понятие grapheme cluster (в Python — библиотека grapheme, в JS — Intl.Segmenter в современных средах).
Краткая галерея крайних случаев
- Только пробелы: все относятся к special.
- Многочисленные эмодзи: каждый эмодзи может занимать несколько кодовых точек — нужна специальная обработка.
- Знаки диакритики: могут образовывать комбинированные символы.
FAQ
Q: Будут ли русские буквы учитываться как гласные/согласные автоматически?
A: В приведённых примерах — нет. Код ориентирован на латинский алфавит. Для поддержки русского нужно расширить проверку на диапазоны Unicode или использовать специальные списки букв.
Q: Считаются ли пробелы специальными символами?
A: Да, в этой статье пробел считается специальным символом. При необходимости можно исключать пробелы из подсчёта специальных символов.
Q: Почему не использовать только регулярные выражения?
A: Regex удобен, но для сложного Unicode и производительности на больших входных данных иногда лучше явная итерация и проверка свойств символов.
Краткое резюме
- Базовый алгоритм прост: пройти по строке и относить каждый символ к одной из четырёх категорий.
- Для ASCII/латиницы приведённый код полностью работоспособен.
- Для Unicode и составных символов необходима расширенная обработка.
Вызов к действию: попробуйте реализовать этот алгоритм на вашем языке и добавить тесты для крайних случаев — это классическая и полезная задача для интервью и практики.
Похожие материалы
Создать диаграмму в Excel и настроить её
Как извлечь таблицы из PDF в Excel и Power BI
Starlink: подключение в доме, машине, лодке, самолёте
Краудфандинг на своём сайте: полное руководство
Как исправить ошибку 4013 на iPhone