Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 Аватар для Misuta
2 / 2 / 0
Регистрация: 27.10.2021
Сообщений: 129

Как найти букву в слове независимо от кириллицы или латиницы, кодировки и регистра?

28.11.2023, 06:07. Показов 479. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <iostream>
#include <vector>
#include <algorithm>
 
using namespace std;
 
bool hasThreeOs(const string& word) 
{
    int count = 0;
    for (char c : word) 
    {
        if (c == 'o' || c == 'O' || c == 'о' || c == 'О') 
        {
            count++;
        }
    }
 
    if (count >= 3)
    {
        count = 0;
        return true;
    }
        
    count = 0;
    return false;
}
 
int main() {
    setlocale(LC_ALL, "ru");
    const int size = 3;
    vector<string> words = { "газопрОвод", "водолей", "Ooops" };
 
    int totalWordsWithThreeOs = count_if(words.begin(), words.end(), hasThreeOs);
 
    cout << "Количество слов с тремя буквами 'о': " << totalWordsWithThreeOs << endl;
 
    return 0;
}

Есть какой то более изящный способ, чтобы не через цикл?

Добавлено через 17 минут
Вроде выше отдельно всё получилось, а здесь всё равно не получается посчитать( Что я делаю не так?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
// Определить структурный тип, описывающий книги домашней
// библиотеки(автор, название книги, издательство, год издания, стоимость).Заполнить
// структурный массив 10 - ю записями. Переписать из исходного массива в другой массив,
// информацию только о тех книгах, в название которых есть по 3 буквы «о». Затем
// вывести информацию, отсортированную по названию издательства по алфавиту.
// (рационально переставлять все поля структуры разом)
 
#include <iostream>
#include <string>
#include <algorithm>
 
using namespace std;
 
// Структура для представления книги
struct Book {
    string author;
    string title;
    string publisher;
    int year;
    double cost;
};
 
void main() {
    setlocale(LC_ALL, "ru");
 
    const int size = 1; // Задайте нужный размер массива книг
    Book library[size];
 
    // Ввод информации по книгам
    for (int i = 0; i < size; ++i) {
        cout << "Введите автора книги " << i + 1 << ": ";
        getline(cin, library[i].author);
 
        cout << "Введите название книги " << i + 1 << ": ";
        getline(cin, library[i].title);
 
        cout << "Введите издательство книги " << i + 1 << ": ";
        getline(cin, library[i].publisher);
 
        cout << "Введите год издания книги " << i + 1 << ": ";
        cin >> library[i].year;
 
        cout << "Введите стоимость книги " << i + 1 << ": ";
        cin >> library[i].cost;
 
        cin.ignore(); // Очищаем буфер после ввода чисел
    }
 
    // Подсчитываем количество книг с тремя буквами 'о' в названии
    int countWithO = 0;
    for (int i = 0; i < size; ++i) {
        int oCount = 0;
        for (char ch : library[i].title) {
            if (tolower(ch) == 'о' || tolower(ch) == 'О' || tolower(ch) == 'o' || tolower(ch) == 'O') {
                oCount++;
            }
        }
 
        if (oCount == 3) {
            countWithO++;
        }
    }
 
    // Создаем массив для книг с тремя буквами 'о' в названии
    Book* booksWithO = new Book[countWithO];
    int booksWithOCount = 0;
 
    // Переписываем информацию только о книгах с тремя буквами 'о' в названии
    for (int i = 0; i < size; ++i) {
        int oCount = 0;
        for (char ch : library[i].title) {
            if (tolower(ch) == 'о' || tolower(ch) == 'О' || tolower(ch) == 'o' || tolower(ch) == 'O') {
                oCount++;
            }
        }
 
        if (oCount == 3) {
            booksWithO[booksWithOCount++] = library[i];
        }
    }
 
    // Сортируем массив книг с тремя буквами 'о' в названии по названию издательства
    for (int i = 0; i < booksWithOCount - 1; ++i) {
        for (int j = 0; j < booksWithOCount - i - 1; ++j) {
            if (booksWithO[j].publisher > booksWithO[j + 1].publisher) {
                swap(booksWithO[j], booksWithO[j + 1]);
            }
        }
    }
 
    // Выводим информацию о книгах с тремя буквами 'о' в названии, отсортированную по названию издательства
    cout << "Информация о книгах с тремя буквами 'о' в названии, отсортированная по названию издательства:" << endl;
    for (int i = 0; i < booksWithOCount; ++i) {
        cout << "Автор: " << booksWithO[i].author << endl;
        cout << "Название: " << booksWithO[i].title << endl;
        cout << "Издательство: " << booksWithO[i].publisher << endl;
        cout << "Год издания: " << booksWithO[i].year << endl;
        cout << "Стоимость: " << booksWithO[i].cost << endl << endl;
    }
 
    delete[] booksWithO;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.11.2023, 06:07
Ответы с готовыми решениями:

Генерация случайных букв (не важно - латиницы или кириллицы)
Добрый день. Обращалась к просторам интернета, но так и не нашла нужной информации. Необходимо генерировать случайные 3 символа...

Макрос:заливка ячеек в зависимости от наличия кириллицы и/или латиницы
Добрый день, поставлена задача, чтобы происходила автоматическая заливка текста в зависимости от языка, на котором она написана. Если...

Как найти кол-во одинаковых элементов в списке, независимо от их регистра?
Как найти кол-во одинаковых элементов в списке, независимо от их регистра? Например есть 'abC' и 'AbC' , и мне нужно подчитать сколько...

8
Модератор
 Аватар для D1973
9924 / 6460 / 2457
Регистрация: 21.01.2014
Сообщений: 27,410
Записей в блоге: 3
28.11.2023, 06:43
я бы, таки, задействовал константу size и несколько переделал функцию bool hasThreeOs()
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <vector>
#include <algorithm>
 
using namespace std;
 
const int sizes = 3;
 
bool hasThreeOs(const string& word)
{
    int count = 0;
    for (char c : word)
        if (c == 'o' || c == 'O' || c == 'о' || c == 'О') count++;
    return (count >= sizes);
}
 
int main() {
    setlocale(LC_ALL, "");
    vector<string> words = {"газопрОвод", "водолей", "Ooops"};
    int totalWordsWithThreeOs = count_if(words.begin(), words.end(), hasThreeOs);
    cout << "Количество слов с тремя буквами 'о': " << totalWordsWithThreeOs << endl;
    return 0;
}
0
 Аватар для Misuta
2 / 2 / 0
Регистрация: 27.10.2021
Сообщений: 129
28.11.2023, 06:59  [ТС]
D1973, Подскажите пожалуйста во втором примере. Там массив а не вектор, и почему-то не получается
0
Модератор
 Аватар для D1973
9924 / 6460 / 2457
Регистрация: 21.01.2014
Сообщений: 27,410
Записей в блоге: 3
28.11.2023, 07:23
В строке 52 Вы объявляете переменную int oCount, в строке 59 Вы пытаетесь проверить значение, записанное в этой переменной. Но фишка в том, что переменная объявлена внутри блока строк 52 - 56 и за пределами этого блока просто не видна (см. понятие об области видимости переменных).

То же самое - строки 70-74. Дальше не смотрел.
0
 Аватар для Misuta
2 / 2 / 0
Регистрация: 27.10.2021
Сообщений: 129
28.11.2023, 07:57  [ТС]
D1973,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#include <iostream>
#include <string>
#include <algorithm>
 
using namespace std;
 
// Структура для представления книги
struct Book {
    string author;
    string title;
    string publisher;
    int year;
    double cost;
};
 
void main() {
    setlocale(LC_ALL, "ru");
 
    int oCount;
    const int size = 2; // Задайте нужный размер массива книг
    Book library[size];
 
    // Ввод информации по книгам
    for (int i = 0; i < size; ++i) {
        cout << "Введите автора книги " << i + 1 << ": ";
        getline(cin, library[i].author);
 
        cout << "Введите название книги " << i + 1 << ": ";
        getline(cin, library[i].title);
 
        cout << "Введите издательство книги " << i + 1 << ": ";
        getline(cin, library[i].publisher);
 
        cout << "Введите год издания книги " << i + 1 << ": ";
        cin >> library[i].year;
 
        cout << "Введите стоимость книги " << i + 1 << ": ";
        cin >> library[i].cost;
 
        cin.ignore(); // Очищаем буфер после ввода чисел
    }
 
    // Подсчитываем количество книг с тремя буквами 'о' в названии
    int countWithO = 0;
    for (int i = 0; i < size; ++i) {
        oCount = 0;
        for (char ch : library[i].title) {
            if (tolower(ch) == 'о' || tolower(ch) == 'О' || tolower(ch) == 'o' || tolower(ch) == 'O') {
                oCount++;
            }
        }
 
        if (oCount >= 3) {
            countWithO++;
        }
    }
 
    // Создаем массив для книг с тремя буквами 'о' в названии
    Book* booksWithO = new Book[countWithO];
    int booksWithOCount = 0;
 
    // Переписываем информацию только о книгах с тремя буквами 'о' в названии
    for (int i = 0; i < size; ++i) {
        oCount = 0;
        for (char ch : library[i].title) {
            if (tolower(ch) == 'о' || tolower(ch) == 'О' || tolower(ch) == 'o' || tolower(ch) == 'O') {
                oCount++;
            }
        }
 
        if (oCount >= 3) {
            booksWithO[booksWithOCount++] = library[i];
        }
    }
 
    // Сортируем массив книг с тремя буквами 'о' в названии по названию издательства
    for (int i = 0; i < booksWithOCount - 1; ++i) {
        for (int j = 0; j < booksWithOCount - i - 1; ++j) {
            if (booksWithO[j].publisher > booksWithO[j + 1].publisher) {
                swap(booksWithO[j], booksWithO[j + 1]);
            }
        }
    }
 
    // Выводим информацию о книгах с тремя буквами 'о' в названии, отсортированную по названию издательства
    cout << "Информация о книгах с тремя буквами 'о' в названии, отсортированная по названию издательства:" << endl;
    for (int i = 0; i < booksWithOCount; ++i) {
        cout << "Автор: " << booksWithO[i].author << endl;
        cout << "Название: " << booksWithO[i].title << endl;
        cout << "Издательство: " << booksWithO[i].publisher << endl;
        cout << "Год издания: " << booksWithO[i].year << endl;
        cout << "Стоимость: " << booksWithO[i].cost << endl << endl;
    }
 
    delete[] booksWithO;
}
Теперь всё работает, но только с латиницей(
Я так понимаю, это потому что русские буква занимают больше одного байта? Потому что в отладчике в char ch не буквы. Конкретно когда пытается прочитать русскую о, то в переменной вместо нее -82
0
Модератор
 Аватар для D1973
9924 / 6460 / 2457
Регистрация: 21.01.2014
Сообщений: 27,410
Записей в блоге: 3
28.11.2023, 08:03
Цитата Сообщение от Misuta Посмотреть сообщение
Теперь всё работает, но только с латиницей
функция tolower() (и противоположная ей toupper()) правильно работают только с латиницей, т.к. обрабатывают ASCII-код символа, а кириллица и прочие национальные алфавиты в это множество не попадают или попадают лишь частично. Поэтому не надо в Вашем случае ее использовать.
0
 Аватар для Misuta
2 / 2 / 0
Регистрация: 27.10.2021
Сообщений: 129
28.11.2023, 08:08  [ТС]
D1973, не помогло, всё тоже
Я так понимаю, это потому что русские буква занимают больше одного байта? Потому что в отладчике в char ch не буквы. Конкретно когда пытается прочитать русскую о, то в переменной вместо нее -82
0
Модератор
 Аватар для D1973
9924 / 6460 / 2457
Регистрация: 21.01.2014
Сообщений: 27,410
Записей в блоге: 3
28.11.2023, 08:28
Цитата Сообщение от Misuta Посмотреть сообщение
не помогло, всё тоже
у меня такая строка нормально отрабатывает:
C++
1
if ((c == 'o') || (c == 'O') || (c == 'о') || (c == 'О')) count++;
0
 Аватар для ram876
759 / 456 / 213
Регистрация: 19.12.2016
Сообщений: 1,815
28.11.2023, 10:56
На форуме есть пример для кириллицы tolower_rus
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.11.2023, 10:56
Помогаю со студенческими работами здесь

Как перебрать каждую букву в строке независимо от того русская буква или английская?
Прикол в том что с русскими буквами не работает а с англисйкими работает потому что они состоят из 1 байта а русские из двух как пофиксить...

Как считывать текст (кириллица) из файла независимо от кодировки?
Не подскажите как сделать, чтобы считывать текст(кириллица) с файла не зависимо от кодировки?

Конфликт латиницы и кириллицы
Добрый день, возникла проблема. Сделал простую форму на основе html и php, выборка осуществляется с помощью LIKE '%вводимое слово%'....

Как найти последнюю букву в слове?
Как?

Подсчет символов латиницы и кириллицы в richtextBox
Доброго времени суток. Дали задание Программа (локальная) для подсчета текстов разного формата. С возможностью подсчета текста в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru