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

Найти с помощью функции isalpha слова с дефисом

11.04.2016, 22:58. Показов 2101. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток. Имеется ф-ция isalpha:
C++
1
2
3
4
bool isalpha_rus(char c) {
    return c >= 'а' && c <= 'я' || c >= 'А' && c <= 'Я'
        || c == 'ё' || c == 'Ё' || c == '-';
};
Как видите она проверяет наличие русских букв и слов, в которых есть тире. Но вот если в тексте есть просто в "-", и ли слова типа file-функция, то в первом случае оно пропускает тире как допустимое, а во втором пропускает
просто "-функция". Можно ли это как-то исправить?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.04.2016, 22:58
Ответы с готовыми решениями:

Аналог функции isalpha() (<cctype>)
Здравствуйте) Я так понял, функция isalpha() не работает с русскими буквами(?), пришлось написать свою версию для работы с русскими...

Regexp. Поиск слова с дефисом и без
Добрый день! В ходе написания одного макроса (для Word) столкнулся с такой проблемой: Word не находит слова с дефисом по маске c...

Слова с дефисом и без в результатах поиска
С некоторых пор заметил тенденцию. Запросы с дефисом и без него, например, &quot;ювелирный интернет-магазин&quot; и &quot;ювелирный интернет...

21
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
11.04.2016, 23:04
То, что объединено с помощью И, возьми в скобки.

Добавлено через 38 секунд
А чем не нравится стандартная isalpha()?
0
2 / 2 / 2
Регистрация: 03.03.2013
Сообщений: 104
11.04.2016, 23:09  [ТС]
nmcf, не помогло, все-равно выводит "-". А разве стандартной можно указать только русские буквы?
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
11.04.2016, 23:12
C++
1
2
3
4
bool isalpha_rus(char c) {
    return (c >= 'а' && c <= 'я') || (c >= 'А' && c <= 'Я')
        || c == 'ё' || c == 'Ё' || c == '-';
};
Я не понял, что там с минусом у тебя.
isalpha() понимает русские буквы, только нужно локаль переключить - setlocale().
0
2 / 2 / 2
Регистрация: 03.03.2013
Сообщений: 104
11.04.2016, 23:18  [ТС]
nmcf, минус - это тире, что бы проходили слова типа что-то, как-то и тд.
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
11.04.2016, 23:20
Твоя функция один символ проверяет, она не знает про слово ничего. Уровнем выше бери.
0
2 / 2 / 2
Регистрация: 03.03.2013
Сообщений: 104
11.04.2016, 23:24  [ТС]
nmcf, не совсем так, есть же главная ф-ция, которая считывает текст из фаила и записывает его в map:
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
int main() {
    setlocale(LC_ALL, "rus");
    time_t t = time(NULL);
    map<string, size_t> words;
    string w;
    fstream file("file.txt"), out_file("out_file.txt", fstream::out), out_file1("out_file1.txt", fstream::out);
    int it = file.get();//извлекает из входного потока один символ и возвращает его целочисленный код
    while (it != EOF) {
        while (it != EOF && isalpha_rus(it)) {
            w.push_back(it); // Добавление элемента в конец 
            it = file.get();
        }
        while (it != EOF  && !isalpha_rus(it = file.get()));
        if (!w.empty())
            ++words[w];
        w.clear();
    }
    if (!words.empty())
    for (auto &_pair : words)//диапазонный оператор (серийный). Справа диапазон, слева переменная, 
        //копия элемента диапазона с инициализацией по значению, & создает инициализацию по ссылке.
        out_file << _pair.first << " = " << _pair.second << endl;
    file.close(); out_file.close();
    cout << "Время:" << (time(NULL) - t) << endl;
    system("pause");
    return 0;}
Вот только если в тексте есть просто в "-", и ли слова типа file-функция, то в первом случае оно пропускает тире как допустимое, а во втором пропускает
просто "-функция".
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
11.04.2016, 23:30
В словах типа что-то не тире, а дефис. Так что ты хочешь? Чтобы смешанные русско-английские слова проходили?
Тебе надо сначала делить текст на слова, а потом уже слово анализировать.
0
2 / 2 / 2
Регистрация: 03.03.2013
Сообщений: 104
11.04.2016, 23:58  [ТС]
nmcf, вообще я хотел, что бы
1) если стоит просто "-" - isalpha его отсевало.
2) если есть слова типа слово не на русском-слово на русском, он мне пропускало лишь слово на руском, то есть
в слове file-функция, мне пропустило лишь функция (на данный момент выводит -функция).
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
12.04.2016, 00:02
Одной функцией isalpha() это не сделаешь. Дели текст на слова, после анализируй слово. Если смешанное, то дефис удалишь, нет - оставишь.
0
2 / 2 / 2
Регистрация: 03.03.2013
Сообщений: 104
13.04.2016, 20:06  [ТС]
nmcf, на деле все оказалось намного проще, просто надо было немного изменить условие.
C++
1
2
3
4
bool isalpha_rus(char c) {
    return c >= 'а' && c <= 'я' || c >= 'А' && c <= 'Я'
        || c == 'ё' || c == 'Ё' || (c == '-' && c != NULL + '-');
};
может кому-то пригодится.

Добавлено через 35 секунд
Но осталась небольшая проблемка, ранее мной не замечена. При сортировки ё выводится раньше чем а. То есть слово, допустим ёлка, после сортировки будет стоять раньше, чем слова на а. Возможно ли ё вернуть на свое место?
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
13.04.2016, 20:22
Как сортируешь? Стандартные функции должны учитывать ё.
0
2 / 2 / 2
Регистрация: 03.03.2013
Сообщений: 104
13.04.2016, 20:26  [ТС]
превращаю map в vector:
C++
1
    vector<pair<string, size_t>> line(words.begin(), words.end());
и с помощью класса:
C++
1
2
3
4
5
6
7
8
9
10
class GreaterSizeBup
{
public:
    GreaterSizeBup() {}
    bool operator()(const pair<string, size_t> &s1, const pair<string, size_t> &s2) const
    {
 
        return s2.first< s1.first;
    }
};
сортирую след. образом:
C++
1
2
3
    sort(line.begin(), line.end(), GreaterSizeBup());   //Сортировка по символам
    for (auto &_pair : line)
        out_file1 << _pair.first << " = " << _pair.second << endl;
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
13.04.2016, 20:36
Русская локаль включена?
0
2 / 2 / 2
Регистрация: 03.03.2013
Сообщений: 104
13.04.2016, 20:36  [ТС]
setlocale(LC_ALL, "rus");?
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
13.04.2016, 20:38
Да.
0
2 / 2 / 2
Регистрация: 03.03.2013
Сообщений: 104
13.04.2016, 20:40  [ТС]
Ну тогда да. Но, я ведь вывожу в фаил, к чему мне setlocale?
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
13.04.2016, 20:42
setlocale() влияет на работу функций типа isalpha() и прочих.
0
2 / 2 / 2
Регистрация: 03.03.2013
Сообщений: 104
13.04.2016, 20:46  [ТС]
nmcf, понятно, и в принципе выводит оно на русском, тут претензий нет. Но по всей видимости букву ё программа считает как отдельный символ, так как и, допустим я прописал бы % или \ и тд.
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
13.04.2016, 21:16
Видно, без напильника не получается.
Так попробуй.
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
class GreaterSizeBup
{
public:
    GreaterSizeBup() {}
    bool operator()(const pair<string, size_t> &s1, const pair<string, size_t> &s2) const
    {
      return lexicographical_compare(s2.first.begin(),s2.first.end(),s1.first.begin(),s1.first.end(), [](char a, char b)
      {
          if (a == 'Ё')
          {
              if (b >= 'А' && b <= 'Е') return false;
              if (b >= 'Ж' && b <= 'Я') return true;
          }
          else if (a == 'ё')
          {
              if (b >= 'а' && b <= 'е') return false;
              if (b >= 'ж' && b <= 'я') return true;
          }
          else if (b == 'Ё')
          {
              if (a >= 'А' && a <= 'Е') return true;
              if (a >= 'Ж' && a <= 'Я') return false;
          }
          else if (b == 'ё')
          {
              if (a >= 'а' && a <= 'е') return true;
              if (a >= 'ж' && a <= 'я') return false;
          }
          return a < b;
      });
    }
};
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.04.2016, 21:16
Помогаю со студенческими работами здесь

Как заменить в тексте слова, разделенные коротким дефисом на заданное в окне диалога слово.
Здравствуйте, помогите сделать макрос : Написать макрос нахождения и удаления в тексте всех слов, разделенных коротким дефисом. Вместо...

Можно ли применять встроенные функции isdigit и isalpha для структур?
Есть задание с структурами, надо вписать: 1) предмет 2) преподавателя 3) номер группы(цифра) 4) день недели(цифра) 5) количество...

Найти в тексте слова, начинающиеся на букву «л»: с помощью множеств
Уважаемые &quot;тыжпрограммисты&quot; и просто любители паскаля, нуждаюсь в помощи, ибо сам не в состоянии решить сие задание. (увы, не моя...

С помощью функции найти значение выражения
описать функцию Sign(X) целого типа,возвращающую для вещественного числа X следующие значения: -1, если X&lt;0; 0 если X=0; 1, если X&gt;0....

С помощью функции найти значение выражения
Описать функцию Sign(X) целого типа, возвращающую для вещественного числа X следующие значения: –1, если X &lt; 0; 0, если X = 0; 1, если X...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru