Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
edol1
0 / 0 / 0
Регистрация: 17.03.2016
Сообщений: 36
1

Комплексная сортировка по частоте и алфавиту

15.10.2016, 17:06. Просмотров 878. Ответов 9
Метки нет (Все метки)

Всем привет Есть программа...
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
#include <iostream>
#include <conio.h>
#include <windows.h>
#include <string>
#include <vector>
#include <algorithm>
 
using namespace std;
 
const int   NOTFOUND = -1;
 
struct Elem {           // Описание структуры из 2-х компонент:
    string str;     //  строка для хранения слова
    int cnt;            //  счетчик кол-ва появлений слова
};
 
vector <Elem> list;     // Динамический массив структур 
 
                        // Функция сравнения двух элементов структур 
                        // по убыванию значения поля cnt (для sort())
bool cmp_by_cnt(const Elem& lh, const Elem& rh)
{
    return lh.cnt > rh.cnt;
}
 
// Получить очередное слово с клавиатуры и записать в str
// Возвращает true, если это слово не "quit"
// (string& - строка передаётся по ссылке!)
bool GetWord(string& str) {
    cin >> str;
 
    return str != "quit";
}
 
// Поиск слова Str в массиве List
// Возвращает индекс найденного элемента или NOTFOUND
// (const string& - строку нельзя модифицировать)
int Search(const string& str)
{
    for (int i = 0; i < list.size(); ++i)
        if (str == list[i].str) return i;
    
    return NOTFOUND;
}
 
void PrintList()
{
    for (int i = 0; i < list.size(); ++i)
        cout << "\nСлово <" << list[i].str << "> встретилось " << list[i].cnt << " раз";
}
 
int main() {
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    system("cls");
    system("color 0E");
 
    string s;       // Буфер для хранения очередного слова
    
    while (GetWord(s)) {
        int pos = Search(s);
        
        if (pos != NOTFOUND) { // Слово уже встречалось
            list[pos].cnt++;
        }
        else {
            Elem tmp;
            tmp.str = s;
            tmp.cnt = 1;
            list.push_back(tmp);
        }
    }
    sort(list.begin(), list.end(), cmp_by_cnt);
    PrintList();
 
    _getch();
    return 0;
}
Нужно сделать так, если попадаются слова с одинаковой частотой, то сортировать их по алфавиту.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.10.2016, 17:06
Ответы с готовыми решениями:

Сортировка по алфавиту
Ввести в компьютер такую информацию об автомобиле: фамилия и инициалы...

Сортировка по алфавиту
Ознакамливаюсь со структурами. Все прекрасно, осталось только отсортировать...

Сортировка по алфавиту
На вход подается некоторое количество описаний книг (автор, название,...

Сортировка по алфавиту
Не могу сообразить как по алфавиту отсортировать, что нужно изменить? Если...

Сортировка по алфавиту
Доброго времени суток. Имеется задача: Описать структуру с именем ORDER,...

9
Invader0x7F
Helper C/C++
281 / 158 / 122
Регистрация: 22.09.2016
Сообщений: 518
Завершенные тесты: 5
15.10.2016, 18:43 2
Подождите сейчас сделаю и выложу.

Добавлено через 1 час 22 минуты
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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#include <iostream>
#include <conio.h>
#include <windows.h>
#include <string>
#include <vector>
#include <algorithm>
 
using namespace std;
 
const int   NOTFOUND = -1;
 
struct Elem {           // Описание структуры из 2-х компонент:
    string str;     //  строка для хранения слова
    std::size_t cnt;            //  счетчик кол-ва появлений слова
};
 
vector <Elem> list;     // Динамический массив структур 
 
                        // Функция сравнения двух элементов структур 
                        // по убыванию значения поля cnt (для sort())
bool cmp_by_cnt(const Elem& lh, const Elem& rh)
{
    return lh.cnt > rh.cnt;
}
 
bool max_by_cnt(const Elem& lh, const Elem& rh)
{
    return lh.cnt < rh.cnt;
}
 
bool equal_key(string s1, string s2, std::size_t pos)
{
    for (std::size_t r = pos - 1; r >= 0 && pos > 0; r--)
        if (s1[r] != s2[r]) return false;
 
    return true;
}
 
// Получить очередное слово с клавиатуры и записать в str
// Возвращает true, если это слово не "quit"
// (string& - строка передаётся по ссылке!)
bool GetWord(string& str) {
    cin >> str;
 
    return str != "quit";
}
 
// Поиск слова Str в массиве List
// Возвращает индекс найденного элемента или NOTFOUND
// (const string& - строку нельзя модифицировать)
int Search(const string& str)
{
    for (std::size_t i = 0; i < list.size(); ++i)
        if (str == list[i].str) return i;
 
    return NOTFOUND;
}
 
void PrintList()
{
    for (std::size_t i = 0; i < list.size(); ++i)
        cout << "\nСлово <" << list[i].str << "> встретилось " << list[i].cnt << " раз";
}
 
int main() {
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    system("cls");
    system("color 0E");
 
    string s;       // Буфер для хранения очередного слова
 
    while (GetWord(s)) {
        int pos = Search(s);
 
        if (pos != NOTFOUND) { // Слово уже встречалось
            list[pos].cnt++;
        }
        else {
            Elem tmp;
            tmp.str = s;
            tmp.cnt = 1;
            list.push_back(tmp);
        }
    }
    sort(list.begin(), list.end(), cmp_by_cnt);
 
    std::vector<Elem>::iterator max_it;
    std::vector<Elem>::iterator list_it;
    max_it = std::max_element(list.begin(), list.end(), max_by_cnt);
 
    std::size_t max_len = 0;
    for (list_it = list.begin(); list_it != list.end(); list_it++)
        max_len = max(list_it->str.length(), max_len);
 
    std::size_t max_cnt = max_it->cnt;
    for (std::size_t cnt = 1; cnt <= max_cnt; cnt++)
    {
        for (std::size_t col = 0; col <= max_len; col++)
        {
            for (std::size_t row = 0; row < list.size(); row++)
            {
                std::size_t min_n = row;
                for (std::size_t t = row + 1; t < list.size(); t++)
                    min_n = ((list[t].str.length() < list[min_n].str.length()) &&
                        list[t].str[col] < list[min_n].str[col]) &&
                        (equal_key(list[t].str, list[min_n].str, col)) && 
                            (list[row].cnt == list[t].cnt) && (list[row].cnt == cnt) ? t : min_n;
 
                std::swap(list[row], list[min_n]);
            }
        }
    }
 
    PrintList();
 
    _getch();
    return 0;
}
1
edol1
0 / 0 / 0
Регистрация: 17.03.2016
Сообщений: 36
15.10.2016, 19:28  [ТС] 3
Invader0x7F, не работает, не сортирует слова по алфавиту, если частота одинакова
0
Invader0x7F
Helper C/C++
281 / 158 / 122
Регистрация: 22.09.2016
Сообщений: 518
Завершенные тесты: 5
15.10.2016, 19:40 4
Вот исправил кое-какие ошибки. Извините не досмотрел ранее. Проверяйте.
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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#include <iostream>
#include <conio.h>
#include <windows.h>
#include <string>
#include <vector>
#include <algorithm>
 
using namespace std;
 
const int   NOTFOUND = -1;
 
struct Elem {           // Описание структуры из 2-х компонент:
    string str;     //  строка для хранения слова
    std::size_t cnt;            //  счетчик кол-ва появлений слова
};
 
vector <Elem> list;     // Динамический массив структур 
 
                        // Функция сравнения двух элементов структур 
                        // по убыванию значения поля cnt (для sort())
bool cmp_by_cnt(const Elem& lh, const Elem& rh)
{
    return lh.cnt > rh.cnt;
}
 
bool max_by_cnt(const Elem& lh, const Elem& rh)
{
    return lh.cnt < rh.cnt;
}
 
bool equal_key(string s1, string s2, std::size_t pos)
{
    for (std::size_t r = pos - 1; r != 0 && pos > 0; r--)
        if (s1[r] != s2[r]) return false;
 
    return true;
}
 
// Получить очередное слово с клавиатуры и записать в str
// Возвращает true, если это слово не "quit"
// (string& - строка передаётся по ссылке!)
bool GetWord(string& str) {
    cin >> str;
 
    return str != "quit";
}
 
// Поиск слова Str в массиве List
// Возвращает индекс найденного элемента или NOTFOUND
// (const string& - строку нельзя модифицировать)
int Search(const string& str)
{
    for (std::size_t i = 0; i < list.size(); ++i)
        if (str == list[i].str) return i;
 
    return NOTFOUND;
}
 
void PrintList()
{
    for (std::size_t i = 0; i < list.size(); ++i)
        cout << "\nСлово <" << list[i].str << "> встретилось " << list[i].cnt << " раз";
}
 
int main() {
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    system("cls");
    system("color 0E");
 
    string s;       // Буфер для хранения очередного слова
 
    while (GetWord(s)) {
        int pos = Search(s);
 
        if (pos != NOTFOUND) { // Слово уже встречалось
            list[pos].cnt++;
        }
        else {
            Elem tmp;
            tmp.str = s;
            tmp.cnt = 1;
            list.push_back(tmp);
        }
    }
    sort(list.begin(), list.end(), cmp_by_cnt);
 
    std::vector<Elem>::iterator max_it;
    std::vector<Elem>::iterator list_it;
    max_it = std::max_element(list.begin(), list.end(), max_by_cnt);
 
    std::size_t max_len = 0;
    for (list_it = list.begin(); list_it != list.end(); list_it++)
        max_len = max(list_it->str.length(), max_len);
 
    std::size_t max_cnt = max_it->cnt;
    for (std::size_t cnt = 1; cnt <= max_cnt; cnt++)
    {
        for (std::size_t col = 0; col <= max_len; col++)
        {
            for (std::size_t row = 0; row < list.size(); row++)
            {
                std::size_t min_n = row;
                for (std::size_t t = row + 1; t < list.size(); t++)
                    min_n = (list[t].str.length() <= list[min_n].str.length()) &&
                        (list[t].str[col] < list[min_n].str[col]) &&
                        (equal_key(list[t].str, list[min_n].str, col)) && 
                            (list[row].cnt == list[t].cnt) && (list[row].cnt == cnt) ? t : min_n;
 
                std::swap(list[row], list[min_n]);
            }
        }
    }
 
    PrintList();
 
    _getch();
    return 0;
}
1
edol1
0 / 0 / 0
Регистрация: 17.03.2016
Сообщений: 36
15.10.2016, 19:48  [ТС] 5
Цитата Сообщение от Invader0x7F Посмотреть сообщение
Проверяйте.
Безрезультатно Вот...
0
Миниатюры
Комплексная сортировка по частоте и алфавиту  
Invader0x7F
Helper C/C++
281 / 158 / 122
Регистрация: 22.09.2016
Сообщений: 518
Завершенные тесты: 5
15.10.2016, 20:12 6
Очень сильно извиняюсь. Попробуйте теперь:
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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#include <iostream>
#include <conio.h>
#include <windows.h>
#include <string>
#include <vector>
#include <algorithm>
 
using namespace std;
 
const int   NOTFOUND = -1;
 
struct Elem {           // Описание структуры из 2-х компонент:
    string str;     //  строка для хранения слова
    std::size_t cnt;            //  счетчик кол-ва появлений слова
};
 
vector <Elem> list;     // Динамический массив структур 
 
                        // Функция сравнения двух элементов структур 
                        // по убыванию значения поля cnt (для sort())
bool cmp_by_cnt(const Elem& lh, const Elem& rh)
{
    return lh.cnt > rh.cnt;
}
 
bool max_by_cnt(const Elem& lh, const Elem& rh)
{
    return lh.cnt < rh.cnt;
}
 
bool equal_key(string s1, string s2, std::size_t pos)
{
    for (std::size_t r = pos - 1; r != 0 && pos > 0; r--)
        if (s1[r] != s2[r]) return false;
 
    return true;
}
 
// Получить очередное слово с клавиатуры и записать в str
// Возвращает true, если это слово не "quit"
// (string& - строка передаётся по ссылке!)
bool GetWord(string& str) {
    cin >> str;
 
    return str != "quit";
}
 
// Поиск слова Str в массиве List
// Возвращает индекс найденного элемента или NOTFOUND
// (const string& - строку нельзя модифицировать)
int Search(const string& str)
{
    for (std::size_t i = 0; i < list.size(); ++i)
        if (str == list[i].str) return i;
 
    return NOTFOUND;
}
 
void PrintList()
{
    for (std::size_t i = 0; i < list.size(); ++i)
        cout << "\nСлово <" << list[i].str << "> встретилось " << list[i].cnt << " раз";
}
 
int main() {
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    system("cls");
    system("color 0E");
 
    string s;       // Буфер для хранения очередного слова
 
    while (GetWord(s)) {
        int pos = Search(s);
 
        if (pos != NOTFOUND) { // Слово уже встречалось
            list[pos].cnt++;
        }
        else {
            Elem tmp;
            tmp.str = s;
            tmp.cnt = 1;
            list.push_back(tmp);
        }
    }
    sort(list.begin(), list.end(), cmp_by_cnt);
 
    std::vector<Elem>::iterator max_it;
    std::vector<Elem>::iterator list_it;
    max_it = std::max_element(list.begin(), list.end(), max_by_cnt);
 
    std::size_t min_len = 0;
    for (list_it = list.begin(); list_it != list.end(); list_it++)
        min_len = min_len != 0 ? min(list_it->str.length(), \
            min_len) : list.begin()->str.length();
 
    std::size_t max_cnt = max_it->cnt;
    for (std::size_t cnt = 1; cnt <= max_cnt; cnt++)
    {
        for (std::size_t col = 0; col <= min_len; col++)
        {
            for (std::size_t row = 0; row < list.size(); row++)
            {
                std::size_t min_n = row;
                for (std::size_t t = row + 1; t < list.size(); t++)
                    min_n = (list[t].str[col] < list[min_n].str[col]) &&
                        (equal_key(list[min_n].str, list[t].str, col)) &&
                            (list[row].cnt == list[t].cnt) && (list[row].cnt == cnt) ? t : min_n;
 
                std::swap(list[row], list[min_n]);
            }
        }
    }
 
    PrintList();
 
    _getch();
    return 0;
}
1
edol1
0 / 0 / 0
Регистрация: 17.03.2016
Сообщений: 36
15.10.2016, 20:23  [ТС] 7
Цитата Сообщение от Invader0x7F Посмотреть сообщение
Попробуйте теперь:
Всё так же
0
Invader0x7F
Helper C/C++
281 / 158 / 122
Регистрация: 22.09.2016
Сообщений: 518
Завершенные тесты: 5
15.10.2016, 20:29 8
Лучший ответ Сообщение было отмечено edol1 как решение

Решение

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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#include <iostream>
#include <conio.h>
#include <windows.h>
#include <string>
#include <vector>
#include <algorithm>
 
using namespace std;
 
const int   NOTFOUND = -1;
 
struct Elem {           // Описание структуры из 2-х компонент:
    string str;     //  строка для хранения слова
    std::size_t cnt;            //  счетчик кол-ва появлений слова
};
 
vector <Elem> list;     // Динамический массив структур 
 
                        // Функция сравнения двух элементов структур 
                        // по убыванию значения поля cnt (для sort())
bool cmp_by_cnt(const Elem& lh, const Elem& rh)
{
    return lh.cnt > rh.cnt;
}
 
bool max_by_cnt(const Elem& lh, const Elem& rh)
{
    return lh.cnt < rh.cnt;
}
 
bool equal_key(string s1, string s2, std::size_t pos)
{
    if (pos == 0) return true;
    for (std::size_t r = pos - 1; r >= 0 && pos > 0; r--)
        if (s1[r] != s2[r]) return false;
 
    return true;
}
 
// Получить очередное слово с клавиатуры и записать в str
// Возвращает true, если это слово не "quit"
// (string& - строка передаётся по ссылке!)
bool GetWord(string& str) {
    cin >> str;
 
    return str != "quit";
}
 
// Поиск слова Str в массиве List
// Возвращает индекс найденного элемента или NOTFOUND
// (const string& - строку нельзя модифицировать)
int Search(const string& str)
{
    for (std::size_t i = 0; i < list.size(); ++i)
        if (str == list[i].str) return i;
 
    return NOTFOUND;
}
 
void PrintList()
{
    for (std::size_t i = 0; i < list.size(); ++i)
        cout << "\nСлово <" << list[i].str << "> встретилось " << list[i].cnt << " раз";
}
 
int main() {
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    system("cls");
    system("color 0E");
 
    string s;       // Буфер для хранения очередного слова
 
    while (GetWord(s)) {
        int pos = Search(s);
 
        if (pos != NOTFOUND) { // Слово уже встречалось
            list[pos].cnt++;
        }
        else {
            Elem tmp;
            tmp.str = s;
            tmp.cnt = 1;
            list.push_back(tmp);
        }
    }
    sort(list.begin(), list.end(), cmp_by_cnt);
 
    std::vector<Elem>::iterator max_it;
    std::vector<Elem>::iterator list_it;
    max_it = std::max_element(list.begin(), list.end(), max_by_cnt);
 
    std::size_t min_len = 0;
    for (list_it = list.begin(); list_it != list.end(); list_it++)
        min_len = min_len != 0 ? min(list_it->str.length(), \
            min_len) : list.begin()->str.length();
 
    std::size_t max_cnt = max_it->cnt;
    for (std::size_t cnt = 1; cnt <= max_cnt; cnt++)
    {
        for (std::size_t col = 0; col <= min_len; col++)
        {
            for (std::size_t row = 0; row < list.size(); row++)
            {
                std::size_t min_n = row;
                for (std::size_t t = row + 1; t < list.size(); t++)
                    min_n = (list[t].str[col] < list[min_n].str[col]) &&
                        (equal_key(list[min_n].str, list[t].str, col)) &&
                            (list[row].cnt == list[t].cnt) && (list[row].cnt == cnt) ? t : min_n;
 
                std::swap(list[row], list[min_n]);
            }
        }
    }
 
    PrintList();
 
    _getch();
    return 0;
}
1
Миниатюры
Комплексная сортировка по частоте и алфавиту  
edol1
0 / 0 / 0
Регистрация: 17.03.2016
Сообщений: 36
15.10.2016, 20:46  [ТС] 9
Всё, работает! Большое спасибо!
0
Invader0x7F
Helper C/C++
281 / 158 / 122
Регистрация: 22.09.2016
Сообщений: 518
Завершенные тесты: 5
15.10.2016, 20:48 10
Пожалуйста. Если что обращайтесь ещё.
0
15.10.2016, 20:48
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.10.2016, 20:48

Сортировка по алфавиту
Вот программа , там сортировка по нумерации поездов, а нужна по ПУНКТАМ...

Сортировка по алфавиту
Доброго времени суток, появилась проблема: есть структура, читаю из файла,...

Сортировка по алфавиту
С клавиатуры ввести автора и название книги и посторить список по алфавиту.


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

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