Гид по технологиям

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

5 min read Программирование Обновлено 29 Dec 2025
Как подсчитать гласные, согласные, цифры и спецсимволы
Как подсчитать гласные, согласные, цифры и спецсимволы

Набор букв, цифр и специальных символов

Строка — это последовательность символов. Символы могут быть буквами (гласные и согласные), цифрами или специальными символами (включая пробелы и знаки пунктуации). В этой статье вы научитесь надёжно подсчитывать количество гласных, согласных, цифр и специальных символов в любой строке.

Что считается гласными, согласными и специальными символами

  • Гласные (в латинской раскладке): 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

Примечание: пробел считается специальным символом.

Алгоритм шаг за шагом

  1. Инициализируйте счётчики: totalVowels, totalConsonants, totalDigits, totalSpecialCharacters = 0.
  2. Пройдите по строке символ за символом.
  3. Для каждого символа выясните: буква ли это (латиница), цифра или прочий символ.
  4. Если буква: приведите к нижнему регистру и проверьте, входит ли в набор гласных (a,e,i,o,u). Если да — увеличьте totalVowels, иначе — totalConsonants.
  5. Если цифра — увеличьте totalDigits.
  6. Иначе — увеличьте 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: 6

Python: ясная и корректная реализация

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: 6

C: реализация для низкоуровневой обработки

#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.
  • Подумайте о производительности при очень длинных строках (используйте буферизацию и потоковую обработку).

Чек-лист для тестировщика:

  • Тест с пустой строкой.
  • Тест только с пробелами и спецсимволами.
  • Тест с цифрами и смешанными символами.
  • Тест с кириллицей/юникодом (если код ориентирован на латиницу — ожидаемое поведение должно быть описано).

Мини‑методология проверки качества:

  1. Разработать спецификацию (что считается гласной/согласной).
  2. Написать тесты (см. выше).
  3. Выполнить тесты на крайних случаях (пустая строка, только спецсимволы, длинные строки).
  4. Провести нагрузочное тестирование при необходимости.

Критерии приёмки

  • Корректно считает гласные, согласные, цифры и специальные символы для ASCII‑латиницы.
  • Обработка пустой строки возвращает все нули.
  • Для входов с Unicode поведение задокументировано (либо поддержка расширена, либо явно указано ограничение).

Тестовые случаи и приёмочные критерии

  1. Пустая строка: все счётчики = 0.
  2. “abc123! “ → гласные=1, согласные=2, цифры=3, спец=2 (включая пробел и ‘!’).
  3. “AEIOUaeiou” → гласные=10, остальные=0.
  4. Строка с кириллицей при реализации для латиницы → все кириллические символы считаются специальными, если не реализована поддержка 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 и составных символов необходима расширенная обработка.

Вызов к действию: попробуйте реализовать этот алгоритм на вашем языке и добавить тесты для крайних случаев — это классическая и полезная задача для интервью и практики.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Создать диаграмму в Excel и настроить её
Excel

Создать диаграмму в Excel и настроить её

Как извлечь таблицы из PDF в Excel и Power BI
Инструменты

Как извлечь таблицы из PDF в Excel и Power BI

Starlink: подключение в доме, машине, лодке, самолёте
Интернет

Starlink: подключение в доме, машине, лодке, самолёте

Краудфандинг на своём сайте: полное руководство
Краудфандинг

Краудфандинг на своём сайте: полное руководство

Как исправить ошибку 4013 на iPhone
Техподдержка

Как исправить ошибку 4013 на iPhone

Как организовать онлайн‑видео: лучшие методы
Технологии

Как организовать онлайн‑видео: лучшие методы