Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Poma_095
0 / 0 / 0
Регистрация: 14.03.2014
Сообщений: 23
#1

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

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

Помогите написать программу!!


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


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

И желательно комментарии
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.03.2014, 13:15     STL: Сортировка слов по количеству согласных букв; вывод слов, встречающихся в списке более одного раза
Посмотрите здесь:
Сортировка слов по количеству в них букв C++
Максимальное из чисел встречающихся в заданной матрице более одного раза C++
C++ Максимальное из чисел, встречающихся в заданной матрице более одного раза
C++ Алгоритм выбора элементов, встречающихся в массиве более одного раза
Найти максимальное из чисел встречающихся в массиве более одного раза C++
Найти максимальное число из, встречающихся в матрице более одного раза C++
C++ Определить максимальное из чисел, встречающихся в заданной матрице более одного раза
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
John Prick
774 / 707 / 129
Регистрация: 27.07.2012
Сообщений: 2,026
Завершенные тесты: 3
14.03.2014, 14:02     STL: Сортировка слов по количеству согласных букв; вывод слов, встречающихся в списке более одного раза #2
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");
}
VladislavTepes
78 / 78 / 5
Регистрация: 27.06.2012
Сообщений: 555
Записей в блоге: 1
14.03.2014, 14:14     STL: Сортировка слов по количеству согласных букв; вывод слов, встречающихся в списке более одного раза #3
Список слов, встретившихся больше раза.
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;
}
Poma_095
0 / 0 / 0
Регистрация: 14.03.2014
Сообщений: 23
14.03.2014, 20:04  [ТС]     STL: Сортировка слов по количеству согласных букв; вывод слов, встречающихся в списке более одного раза #4
Небольшая поправка в условии, нужен ввод\вывод из файла и необходимы русские слова
И все же желательно с комментариями
Но спасибо большое и за это!
VladislavTepes
78 / 78 / 5
Регистрация: 27.06.2012
Сообщений: 555
Записей в блоге: 1
14.03.2014, 20:32     STL: Сортировка слов по количеству согласных букв; вывод слов, встречающихся в списке более одного раза #5
В случае с выводом слов, встретившихся более одного раза, мы просто копируем все содержимое вектора со словами в std::set. При этом значение уникализируются, и все дубликаты пропадут (т.к. во множестве не может быть одинаковых элементов). Потом с помощью std::set_difference мы от множества слов в списке (векторе) отнимаем множество слов в set (уникализированный набор слов). А по правилу, разность множеств А и В - можество, содержащее элементы А, не входящие в В.
John Prick
774 / 707 / 129
Регистрация: 27.07.2012
Сообщений: 2,026
Завершенные тесты: 3
14.03.2014, 22:07     STL: Сортировка слов по количеству согласных букв; вывод слов, встречающихся в списке более одного раза #6
Цитата Сообщение от 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, который все повторяющиеся элементы выведет в конец вектора.
Poma_095
0 / 0 / 0
Регистрация: 14.03.2014
Сообщений: 23
14.03.2014, 22:40  [ТС]     STL: Сортировка слов по количеству согласных букв; вывод слов, встречающихся в списке более одного раза #7
Вместо русского выдает иероглифы.
Что не пробовал делать не исправляет.


VladislavTepes, есть простой алгоритм std::unique, который все повторяющиеся элементы выведет в конец вектора.
Как его записать?
John Prick
774 / 707 / 129
Регистрация: 27.07.2012
Сообщений: 2,026
Завершенные тесты: 3
14.03.2014, 23:50     STL: Сортировка слов по количеству согласных букв; вывод слов, встречающихся в списке более одного раза #8
Цитата Сообщение от 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");
}

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


Т.к. код не свой не могу разобраться как сделать файловый ввод\вывод, подскажите!
John Prick
774 / 707 / 129
Регистрация: 27.07.2012
Сообщений: 2,026
Завершенные тесты: 3
15.03.2014, 00:05     STL: Сортировка слов по количеству согласных букв; вывод слов, встречающихся в списке более одного раза #10
Цитата Сообщение от Poma_095 Посмотреть сообщение
Я запускаю через builder 2006 может в этом дело?
Возможно. Тут с консольными кодировками в винде я не спец.
Я делал в MSVS 2008 Express
Poma_095
0 / 0 / 0
Регистрация: 14.03.2014
Сообщений: 23
15.03.2014, 00:14  [ТС]     STL: Сортировка слов по количеству согласных букв; вывод слов, встречающихся в списке более одного раза #11
Последний вопрос и тема закрыта.
Как тут организовать файловый ввод вывод? Кодом желательно, а то сам не разберусь.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.03.2014, 00:17     STL: Сортировка слов по количеству согласных букв; вывод слов, встречающихся в списке более одного раза
Еще ссылки по теме:
Определить максимальное из значений, встречающихся в заданной матрице более одного раза C++
C++ Определить максимальное из чисел, встречающихся в заданной матрице более одного раза
C++ Определить максимальное из чисел, встречающихся в заданной матрице более одного раза
C++ Определить максимальное из чисел, встречающихся в заданной матрице более одного раза
Найти максимальное из чисел встречающихся в данном одномерном массиве более одного раза C++

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

Или воспользуйтесь поиском по форуму:
John Prick
774 / 707 / 129
Регистрация: 27.07.2012
Сообщений: 2,026
Завершенные тесты: 3
15.03.2014, 00:17     STL: Сортировка слов по количеству согласных букв; вывод слов, встречающихся в списке более одного раза #12
Сообщение было отмечено автором темы, экспертом или модератором как ответ
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 байт, 7 просмотров)
Yandex
Объявления
15.03.2014, 00:17     STL: Сортировка слов по количеству согласных букв; вывод слов, встречающихся в списке более одного раза
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru