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

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

5 min read Программирование Обновлено 17 Apr 2026
Счёт гласных, согласных, цифр и спецсимволов
Счёт гласных, согласных, цифр и спецсимволов

Алфавит и цифры

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

Примеры для понимания задачи

Пример 1: Пусть строка “Welcome 2 #MUO”.

Подсчёт гласных, согласных, цифр и спецсимволов

s = “Welcome 2 #MUO”

  • Гласных: 5 (e, o, e, U, O)
  • Согласных: 5 (W, l, c, m, M)
  • Цифр: 1 (2)
  • Специальных символов: 3 (# и два пробела)

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

Пример 2: Пусть строка “This Is @ InpuT String 2”.

s = “This Is @ InpuT String 2”

  • Гласных: 5 (i, I, I, u, i)
  • Согласных: 12 (T, h, s, s, n, p, T, S, t, r, n, g)
  • Цифр: 1 (2)
  • Специальных символов: 6 (@ и пять пробелов)

Подход (один проход)

Краткая идея:

  1. Инициализируем счётчики: гласные, согласные, цифры, спецсимволы = 0.
  2. Проходим по строке посимвольно.
  3. Для каждого символа определяем, является ли он буквой, цифрой или иным символом.
  4. Для букв переводим в нижний регистр и проверяем принадлежность к набору русских/латинских гласных (в этом примере — английские гласные a,e,i,o,u). Увеличиваем соответствующий счётчик.
  5. Для цифр увеличиваем счётчик цифр.
  6. Всё остальное считаем специальными символами (включая пробел, табуляцию и знаки).

Асимптотика: O(n) по времени и O(1) по дополнительной памяти (пара счётчиков).

На что обратить внимание (особые случаи)

  • Unicode: стандартный подход выше опирается на сравнения диапазонов ASCII. Для строк с буквами вне ASCII (кириллица, диакритика) требуется использовать библиотеки Unicode-aware (например, ICU, Python str.isalpha() + проверка набора гласных для языка).
  • Языковая локаль: набор гласных для русского языка отличается (а, е, ё, и, о, у, ы, э, ю, я). Учитывайте язык входных данных.
  • Пробелы и управляющие символы здесь отнесены к спецсимволам — при необходимости можно вынести пробелы в отдельную категорию.

C++: реализация

Ниже — корректный пример на C++ (исходный код форматирован и оставлен на английском языке в теле программы):

#include 
using namespace std;

void countCharactersCategory(string s)
{
    int totalSpecialCharacters = 0, totalDigits = 0, totalVowels = 0, totalConsonants = 0;

    for (int i = 0; i < s.length(); i++)
    {
        char c = s[i];

        // Alphabets family
        if ( (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') )
        {
            // Converting character to lower case
            c = tolower(c);

            // Vowels
            if (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u')
            {
                totalVowels++;
            }
            // Consonants
            else
            {
                totalConsonants++;
            }
        }
        // Digits family
        else if (c >= '0' && c <= '9')
        {
            totalDigits++;
        }
        // Special characters family
        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;
}

// Driver code
int main()
{
    // Test case: 1
    string s1 = "Welcome 2 #MUO";
    cout << "Input string: " << s1 << endl;
    countCharactersCategory(s1);

    // Test case: 2
    string s2 = "This Is @ InpuT String 2";
    cout << "Input string: " << s2 << endl;
    countCharactersCategory(s2);

    return 0;
}

Вывод этого примера соответствует приведённым выше примерам.

Исправленный и понятный Python-пример

Оригинальная версия Python в исходнике содержала ошибки форматирования. Ниже — исправленный и читабельный вариант, учитывающий ASCII-буквы. Для поддержки Unicode используйте методы str.isalpha() и отдельный список гласных языка.

def count_characters_category(s):
    total_special_characters = 0
    total_digits = 0
    total_vowels = 0
    total_consonants = 0

    vowels = set('aeiouAEIOU')

    for c in s:
        # Alphabets family (ASCII letters)
        if ('a' <= c <= 'z') or ('A' <= c <= 'Z'):
            if c in vowels:
                total_vowels += 1
            else:
                total_consonants += 1
        # Digits family
        elif '0' <= c <= '9':
            total_digits += 1
        # Special characters family
        else:
            total_special_characters += 1

    print("Total no. of vowels in the given string:", total_vowels)
    print("Total no. of consonants in the given string:", total_consonants)
    print("Total no. of digits in the given string:", total_digits)
    print("Total no. of special characters in the given string:", total_special_characters)

# Driver code
s1 = "Welcome 2 #MUO"
print("Input string:", s1)
count_characters_category(s1)

s2 = "This Is @ InpuT String 2"
print("Input string:", s2)
count_characters_category(s2)

Совет: чтобы поддерживать символы Unicode (например, кириллицу), замените проверки диапазонов на c.isalpha() и сравнивайте с набором гласных конкретного языка.

C: реализация

Ниже — C-реализация, аналогичная C++ версии и использующая функции из ctype.h:

#include 
#include 
#include 

void countCharactersCategory(char s[])
{
    int totalSpecialCharacters = 0, totalDigits = 0, totalVowels = 0, totalConsonants = 0;

    for (int i = 0; i < strlen(s); i++)
    {
        char c = s[i];

        // Alphabets family
        if ( (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') )
        {
            // Converting character to lower case
            c = tolower(c);

            // Vowels
            if (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u')
            {
                totalVowels++;
            }
            // Consonants
            else
            {
                totalConsonants++;
            }
        }
        // Digits family
        else if (c >= '0' && c <= '9')
        {
            totalDigits++;
        }
        // Special characters family
        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);
}

// Driver code
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: реализация

Простой пример на 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];

        // Alphabets family
        if ( (c >= "a" && c <= "z") || (c >= "A" && c <= "Z") ) {
            // Converting character to lower case
            c = c.toLowerCase();

            // Vowels
            if (c == "a" || c == "e" || c == "i" || c == "o" || c == "u") {
                totalVowels++;
            }
            // Consonants
            else {
                totalConsonants++;
            }
        }
        // Digits family
        else if (c >= "0" && c <= "9") {
            totalDigits++;
        }
        // Special characters family
        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);
}

// Test case: 1
var s1 = "Welcome 2 #MUO";
console.log("Input string:", s1);
countCharactersCategory(s1);

// Test case: 2
var s2 = "This Is @ InpuT String 2";
console.log("Input string:", s2);
countCharactersCategory(s2);

Альтернативные подходы и улучшения

  • Регулярные выражения: можно использовать regex, чтобы искать сразу все цифры (\d), пробелы (\s) или буквы (\p{L} при поддержке Unicode). Regex упрощает код, но может быть медленнее для очень больших строк в некоторых реализациях.
  • Unicode-aware: для многоязычных приложений используйте методы, распознающие буквы Unicode, и набор гласных для нужной локали.
  • Разделение пробелов отдельно: если важно знать количество пробелов — заведите отдельный счётчик.
  • Параллельная обработка: для очень длинных строк можно разбить на чанки и обрабатывать параллельно (требует аккуратного суммирования счётчиков).

Набор тестов и критерии приёмки

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

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

Тест-кейсы:

  • “” → 0,0,0,0
  • “AEIoU” → гласные = 5
  • “12345” → цифры = 5
  • “ ,.!?” → спецсимволы = 5
  • “Привет” (при поддержке Unicode) → считает буквы русского алфавита

Чеклист для интервью (роль: кандидат на позицию инженера)

  • Объяснить асимптотику O(n).
  • Уметь перечислить варианты для Unicode и локализации.
  • Показать как изменить код, чтобы считать пробелы отдельно.
  • Привести альтернативу на regex и обсудить плюсы/минусы.
  • Написать быстрый тестовый набор и показать результаты на примерах.

Краткая методология (шаги для реализации в задаче)

  1. Определить требования: ASCII или Unicode, считать пробелы отдельно или как спецсимвол.
  2. Выбрать языковую реализацию.
  3. Реализовать проход по строке с набором счётчиков.
  4. Добавить юнит-тесты и кейсы границ.
  5. Профилировать для больших данных при необходимости.

Короткий глоссарий

  • Гласные: буквы, которые обозначают звуки голоса (англ.: a,e,i,o,u).
  • Согласные: буквенные символы, не вошедшие в набор гласных.
  • Спецсимволы: все символы, не являющиеся буквами или цифрами (включая пробелы).

Итог

Подсчёт типов символов в строке — простая задача, которую удобно решать за один проход по строке. Основные сложности возникают при работе с Unicode и при различной трактовке пробелов/управляющих символов. В статье приведены готовые реализации и рекомендации по тестированию и расширению решения.

Важно: если вы ожидаете входные данные на другом языке (не английском), адаптируйте набор гласных или используйте Unicode-aware методы для корректной классификации.

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

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

CSS font-family: как менять шрифты на сайте
Frontend

CSS font-family: как менять шрифты на сайте

График амортизации кредита в Excel — пошагово
Финансы

График амортизации кредита в Excel — пошагово

Разгон Raspberry Pi 4 — безопасный пошаговый гид
Аппаратное обеспечение

Разгон Raspberry Pi 4 — безопасный пошаговый гид

Как запустить Windows 11 на Mac — варианты и советы
Mac

Как запустить Windows 11 на Mac — варианты и советы

Мошенничество с возвратом средств через техподдержку
Безопасность

Мошенничество с возвратом средств через техподдержку

Диагональная обрезка в Canva — как сделать эффектно
Дизайн

Диагональная обрезка в Canva — как сделать эффектно