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

STL: Сортировка слов по количеству согласных букв; вывод слов, встречающихся в списке более одного раза

14.03.2014, 13:15. Показов 2741. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите написать программу!!


Сортировка слов по количеству согласных букв; вывод слов, встречающихся в списке более одного раза.


Использовать класс vector для хранения списка строк
Использовать класс string для хранения строк.
Использовать call back вызов для задания критерия сортировки

И желательно комментарии
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.03.2014, 13:15
Ответы с готовыми решениями:

Сформировать массив из встречающихся более 1 раза слов
Ребята помогите пожалуйста, 3 часа уже сижу, мозг кипит и не могу додуматься! Задача: Пользователь вводит набор слов, необходимо...

Получить файл g, образованный из файла f с исключением всех слов, встречающихся больше одного раза
Создать и заполнить текстовой файл f. Получить файл g, образованный из файла f с исключением всех слов, встречающихся больше одного раза, в...

Сортировка слов по количеству букв
Задача примерно такая: Мы вводим в консоль строку например - "Hi my name is Jin nise to meet you" Ответ должен придти - 2 3 4...

11
2393 / 1913 / 763
Регистрация: 27.07.2012
Сообщений: 5,553
14.03.2014, 14:02
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
/*
Сортировка слов по количеству согласных букв; вывод слов, встречающихся в списке более одного раза.
Использовать класс vector для хранения списка строк
Использовать класс string для хранения строк.
Использовать call back вызов для задания критерия сортировки
*/
 
#include <string>
#include <vector>
#include <algorithm>
#include <iostream>
#include <iterator>
#include <stdlib.h>
#include <ctime>
 
typedef std::vector<std::string> string_vector;
const unsigned short max_letters = 26;
const int N = 10;
 
char random_letter(void) { return static_cast<char>(rand() % max_letters + 'a'); }
 
bool is_consonant_letter(const char L)
{
    char consonant_letters[] = 
    { 'b', 'c', 'd', 'f', 'g',
      'h', 'j', 'k', 'l', 'm',
      'n', 'p', 'q', 'r', 's',
      't', 'v', 'w', 'x', 'z' };
    char * begin = consonant_letters;
    char * end = consonant_letters + sizeof(consonant_letters)/sizeof(consonant_letters[0]);
    return (std::find(begin, end, L) != end);
}
 
bool consonant_letter_count_compare(std::string & S1, std::string & S2)
{
    unsigned int L1 = std::count_if(S1.begin(), S1.end(), is_consonant_letter);
    unsigned int L2 = std::count_if(S2.begin(), S2.end(), is_consonant_letter);
    return (L1 < L2);
}
 
int main(void)
{
    setlocale(0, "rus");
    srand(static_cast<unsigned int>(time(NULL)));
 
    string_vector strings;
    for (int i = 0; i < N; ++i)
    {
        std::string str;
        int len = rand() % 30;
        for (int j = 0; j < len; ++j)
            str.push_back(random_letter());
        strings.push_back(str);
    }
 
    std::cout << "Исходный список строк: \n";
    std::copy(strings.begin(), strings.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
    std::cout << std::endl;
 
    std::sort(strings.begin(), strings.end(), consonant_letter_count_compare);
 
    std::cout << "Отсортированный список строк: \n";
    std::copy(strings.begin(), strings.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
    std::cout << std::endl;
 
    system("pause");
}
1
 Аватар для VladislavTepes
80 / 80 / 14
Регистрация: 27.06.2012
Сообщений: 555
Записей в блоге: 1
14.03.2014, 14:14
Список слов, встретившихся больше раза.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <vector>
#include <set>
#include <algorithm>
#include <iterator>
 
int main()
{
    std::vector<std::string> words_list = {"cat", "dog", "man", "woman", "cat"};
    std::set<std::string> unique_words_set(words_list.begin(), words_list.end());
    std::set_difference(words_list.begin(), words_list.end(), unique_words_set.begin(), unique_words_set.end(),  std::ostream_iterator<std::string>(std::cout, "\n"));
    return 0;
}
0
0 / 0 / 0
Регистрация: 14.03.2014
Сообщений: 23
14.03.2014, 20:04  [ТС]
Небольшая поправка в условии, нужен ввод\вывод из файла и необходимы русские слова
И все же желательно с комментариями
Но спасибо большое и за это!
0
 Аватар для VladislavTepes
80 / 80 / 14
Регистрация: 27.06.2012
Сообщений: 555
Записей в блоге: 1
14.03.2014, 20:32
В случае с выводом слов, встретившихся более одного раза, мы просто копируем все содержимое вектора со словами в std::set. При этом значение уникализируются, и все дубликаты пропадут (т.к. во множестве не может быть одинаковых элементов). Потом с помощью std::set_difference мы от множества слов в списке (векторе) отнимаем множество слов в set (уникализированный набор слов). А по правилу, разность множеств А и В - можество, содержащее элементы А, не входящие в В.
0
2393 / 1913 / 763
Регистрация: 27.07.2012
Сообщений: 5,553
14.03.2014, 22:07
Цитата Сообщение от Poma_095 Посмотреть сообщение
необходимы русские слова
Замените тут:
C++
1
const unsigned short max_letters = 26;
C++
1
const unsigned short max_letters = 33;
Тут замените на русскую 'а':
C++
1
char random_letter(void) { return static_cast<char>(rand() % max_letters + 'а'); }
Здесь введите все русские согласные:
C++
1
2
3
4
5
    char consonant_letters[] = 
    { 'b', 'c', 'd', 'f', 'g',
      'h', 'j', 'k', 'l', 'm',
      'n', 'p', 'q', 'r', 's',
      't', 'v', 'w', 'x', 'z' };
Цитата Сообщение от Poma_095 Посмотреть сообщение
нужен ввод\вывод из файла
Погуглите тут. Это не так сложно.

Цитата Сообщение от Poma_095 Посмотреть сообщение
И все же желательно с комментариями
Хорошие программисты комментарии не пишут.

Добавлено через 18 минут
VladislavTepes, есть простой алгоритм std::unique, который все повторяющиеся элементы выведет в конец вектора.
1
0 / 0 / 0
Регистрация: 14.03.2014
Сообщений: 23
14.03.2014, 22:40  [ТС]
Вместо русского выдает иероглифы.
Что не пробовал делать не исправляет.


VladislavTepes, есть простой алгоритм std::unique, который все повторяющиеся элементы выведет в конец вектора.
Как его записать?
0
2393 / 1913 / 763
Регистрация: 27.07.2012
Сообщений: 5,553
14.03.2014, 23:50
Цитата Сообщение от Poma_095 Посмотреть сообщение
есть простой алгоритм std::unique, который все повторяющиеся элементы выведет в конец вектора.
Как его записать?
Каюсь, был не прав. Этот алгоритм работает только в случае, когда одинаковые элементы находятся рядом. В этой задаче это не гарантируется.

Добавлено через 2 минуты
Цитата Сообщение от Poma_095 Посмотреть сообщение
Вместо русского выдает иероглифы.
Не знаю, у меня работает.
Кликните здесь для просмотра всего текста
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
/*
Сортировка слов по количеству согласных букв; вывод слов, встречающихся в списке более одного раза.
Использовать класс vector для хранения списка строк
Использовать класс string для хранения строк.
Использовать call back вызов для задания критерия сортировки
*/
 
#include <string>
#include <vector>
#include <algorithm>
#include <iostream>
#include <iterator>
#include <stdlib.h>
#include <ctime>
 
typedef std::vector<std::string> string_vector;
const unsigned short max_letters = 33;
const int N = 10;
 
char random_letter(void) { return static_cast<char>(rand() % max_letters + 'а'); } // "а" в русской раскладке
 
bool is_consonant_letter(const char L)
{
    char consonant_letters[] = 
    { 'б', 'в', 'г', 'д', 'ж',
      'з', 'к', 'л', 'м', 'н',
      'п', 'р', 'с', 'т', 'ф',
      'х', 'ц', 'ч', 'ш', 'щ',
      'ь', 'ъ' };
    char * begin = consonant_letters;
    char * end = consonant_letters + sizeof(consonant_letters)/sizeof(consonant_letters[0]);
    return (std::find(begin, end, L) != end);
}
 
bool consonant_letter_count_compare(std::string & S1, std::string & S2)
{
    unsigned int L1 = std::count_if(S1.begin(), S1.end(), is_consonant_letter);
    unsigned int L2 = std::count_if(S2.begin(), S2.end(), is_consonant_letter);
    return (L1 < L2);
}
 
int main(void)
{
    setlocale(0, "rus");
    srand(static_cast<unsigned int>(time(NULL)));
 
    string_vector strings;
    for (int i = 0; i < N; ++i)
    {
        std::string str;
        int len = rand() % 30;
        for (int j = 0; j < len; ++j)
            str.push_back(random_letter());
        strings.push_back(str);
    }
 
    std::cout << "Исходный список строк: \n";
    std::copy(strings.begin(), strings.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
    std::cout << std::endl;
 
    std::sort(strings.begin(), strings.end(), consonant_letter_count_compare);
 
    std::cout << "Отсортированный список строк: \n";
    std::copy(strings.begin(), strings.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
    std::cout << std::endl;
 
    system("pause");
}

Единственное что откуда-то пробел вылазит. Видимо, какие-то траблы с кодировкой.
0
0 / 0 / 0
Регистрация: 14.03.2014
Сообщений: 23
14.03.2014, 23:55  [ТС]
Я запускаю через builder 2006 может в этом дело?
Код только что скопировал, тоже самое.


Т.к. код не свой не могу разобраться как сделать файловый ввод\вывод, подскажите!
0
2393 / 1913 / 763
Регистрация: 27.07.2012
Сообщений: 5,553
15.03.2014, 00:05
Цитата Сообщение от Poma_095 Посмотреть сообщение
Я запускаю через builder 2006 может в этом дело?
Возможно. Тут с консольными кодировками в винде я не спец.
Я делал в MSVS 2008 Express
0
0 / 0 / 0
Регистрация: 14.03.2014
Сообщений: 23
15.03.2014, 00:14  [ТС]
Последний вопрос и тема закрыта.
Как тут организовать файловый ввод вывод? Кодом желательно, а то сам не разберусь.
0
2393 / 1913 / 763
Регистрация: 27.07.2012
Сообщений: 5,553
15.03.2014, 00:17
Лучший ответ Сообщение было отмечено Poma_095 как решение

Решение

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
/*
Сортировка слов по количеству согласных букв; вывод слов, встречающихся в списке более одного раза.
Использовать класс vector для хранения списка строк
Использовать класс string для хранения строк.
Использовать call back вызов для задания критерия сортировки
*/
 
#include <string>
#include <vector>
#include <algorithm>
#include <iostream>
#include <iterator>
#include <stdlib.h>
#include <ctime>
#include <fstream>
 
typedef std::vector<std::string> string_vector;
const unsigned short max_letters = 33;
const int max_string = 30;
const int N = 10;
 
char random_letter(void) { return static_cast<char>(rand() % max_letters + 'а'); } // "а" в русской раскладке
 
bool is_consonant_letter(const char L)
{
    char consonant_letters[] = 
    { 'б', 'в', 'г', 'д', 'ж',
      'з', 'к', 'л', 'м', 'н',
      'п', 'р', 'с', 'т', 'ф',
      'х', 'ц', 'ч', 'ш', 'щ',
      'ь', 'ъ' };
    char * begin = consonant_letters;
    char * end = consonant_letters + sizeof(consonant_letters)/sizeof(consonant_letters[0]);
    return (std::find(begin, end, L) != end);
}
 
bool consonant_letter_count_compare(std::string & S1, std::string & S2)
{
    unsigned int L1 = std::count_if(S1.begin(), S1.end(), is_consonant_letter);
    unsigned int L2 = std::count_if(S2.begin(), S2.end(), is_consonant_letter);
    return (L1 < L2);
}
 
int main(void)
{
    setlocale(0, "rus");
    srand(static_cast<unsigned int>(time(NULL)));
 
    string_vector strings;
    std::fstream input("input.txt");
    if (input.is_open())
    {
        while (!input.eof())
        {
            char str[max_string];
            input.getline(str, max_string);
            strings.push_back(std::string(str));
        }
    } else
    {
        std::cout << "Не удалось открыть файл\n" << std::endl;
        system("pause");
        return 0;
    }
 
    std::cout << "Исходный список строк: \n";
    std::copy(strings.begin(), strings.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
    std::cout << std::endl;
 
    std::sort(strings.begin(), strings.end(), consonant_letter_count_compare);
 
    std::cout << "Отсортированный список строк: \n";
    std::copy(strings.begin(), strings.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
    std::cout << std::endl;
 
    system("pause");
}
Вложения
Тип файла: txt input.txt (116 байт, 10 просмотров)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.03.2014, 00:17
Помогаю со студенческими работами здесь

Сортировка слов в предложении по количеству букв
не могу сделать задание отсортировать слова по количеству букв по возрастанию в предложении

Сортировка слов по количеству в них букв
Доброго времени суток. Нужно решить три задачки. Я с С++ сталкиваюсь только сейчас. 3)Используя STL написать программу для сортировки...

Сортировка слов по количеству букв в слове. SWI-Prolog
Помогите написать программу сортировки русских слов по количеству букв в строке, а если одинаковое количество букв, то по алфавиту. Слова в...

Определить количество слов, которые содержат более трех согласных букв в словах с нечетным номером
Всем привет, помогите решить задачку Составить программу, используя множественный тип. Дана непустая последовательность слов из...

Составьте список слов, которые встречаются в файле более одного раза
По сути задачии не сложные но все же. Если кто сделает буду очень благодарен Нашел на одном сайте код но форму под него запилить не...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
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 . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru