Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
670 / 198 / 29
Регистрация: 10.05.2012
Сообщений: 595
1

Отсортируйте строки таблицы в первую очередь по первому критерию, при равенстве по первому критерию, отсортируйте по второму

15.12.2012, 14:54. Показов 1668. Ответов 4

Author24 — интернет-сервис помощи студентам
Задача готова, надо найти мелкий баг.
Есть прямоугольная таблица, содержащая слова. Каждые ее столбец имеет свое имя. Задан набор критериев сортировки вида "ИМЯ_ПОЛЯ ПОРЯДОК_СОРТИРОВКИ", где ПОРЯДОК_СОРТИРОВКИ это либо ASC (неубывающий порядок) либо DESC (невозрастающий порядок). В наборе критерии записаны через запятую c пробелом. Отсортируйте строки таблицы в первую очередь по первому критерию, при равенстве по первому критерию, отсортируйте по второму. И так далее. Если две строки равны с точки зрения набора критериев, то сохраните их относительный порядок друг относительно друга. Считайте, что каждый элемент таблицы имеет тип строка, пользуйтесь лексикографическим сравнением.

Входные данные
В первой строке записаны имена столбцов. Во второй строке записан набор критериев. Далее входные данные содержат таблицу. Все слова разделяются единичными пробелами.

Выходные данные
Выведите таблицу после сортировки.

Пример

Ввод
NAME GROUP AGE
GROUP ASC, AGE DESC
Alex 412 19
Peter 422 19
Sergey 412 18
Andrey 311 18

Вывод
Andrey 311 18
Alex 412 19
Sergey 412 18
Peter 422 19

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
#include <iostream>
#include <cmath>
#include <vector>
#include <algorithm>
#include <map>
#include <string>
 
using namespace std;
 
struct space{
    vector <string> mline;
};
 
map <string, int> names;
vector <int> criteries;
vector <bool> msign;
 
bool loweq(int criteria, const space& a, const space& b){
    if (criteria < criteries.size())
        if (a.mline[criteries[criteria]] == b.mline[criteries[criteria]]){
            return loweq(criteria + 1, a, b);   
        }else{
            return ((a.mline[criteries[criteria]] < b.mline[criteries[criteria]]) == msign[criteria]);
        }
    return 0;
}
 
bool pred(const space& a, const space& b){
    return loweq(0, a, b);  
}
 
int main(){
    freopen("input.txt", "rt", stdin);
    freopen("output.txt", "wt", stdout);
    string str;
    int num = 0;
    bool flag = 0;
    while (cin >> str){
        if (!flag && names.count(str) == 0){
            names[str] = num++;
        }else{
            flag = 1;
        }
        if (flag){
            if (names.count(str) != 0){
                criteries.push_back(names[str]);
            }else{
                return 0;
            }
            string rule;
            cin >> rule;
            if (rule == "ASC,"){
                msign.push_back(1);
            }
            if (rule == "ASC"){
                msign.push_back(1);
                break;
            }
            if (rule == "DESC,"){
                msign.push_back(0);
            }
            if (rule == "DESC"){
                msign.push_back(0);
                break;
            }
        }
    }
    vector <space> ans;
    int n = names.size();
    while (cin >> str){
        space ns;
        ns.mline.push_back(str);
        for (int i = 1; i < n; i++){
            cin >> str;
            ns.mline.push_back(str);
        }
        ans.push_back(ns);
    }
 
    stable_sort(ans.begin(), ans.end(), pred);
 
    for (int i = 0; i < ans.size(); i++){
        for (int j = 0; j < n-1; j++){
            cout << ans[i].mline[j] << " ";
        }
        cout << ans[i].mline[n-1] << endl;
    }
    return 0;
}
Не проходит 2 теста из 10. Выдаёт PE(Presentation Error Скорее всего пустой файл), при этом если убрать
C++
1
2
3
4
5
if (names.count(str) != 0){
    criteries.push_back(names[str]);
}else{
    return 0;
}
и оставить
C++
1
criteries.push_back(names[str]);
то один из тестов станет RE (Runtime error)

Добавлено через 15 часов 25 минут
Тема актуальна! Срочно нужна помощь. Полагаю дело в считывании

Добавлено через 2 часа 34 минуты
Тема актуальна! Срочно нужна помощь.

Добавлено через 4 часа 32 минуты
-----------

Добавлено через 13 часов 29 минут
-----------

Добавлено через 1 час 30 минут
Почти 150 просмотров и никто не может помочь. :\ Очень жаль

Добавлено через 23 часа 35 минут
аааа! выручайте

Добавлено через 1 час 16 минут
И даже эксперты помочь не в силах :\ А задача одна из самых лёгких...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.12.2012, 14:54
Ответы с готовыми решениями:

Отсортируйте данные о сдаче сессии по первому полю
Разработайте программу для работы с массивом записей: сведения о сдаче студентами сессии:...

Формирование новых таблиц для каждой строки из одной таблицы по критерию
Здравствуйте! Задача в следующем: в Excel имеется одна таблица, в которой есть столбцы двух уровней...

Расчет цепи по первому и второму закону Кирхгофа
1) Составить систему уравнений, необходимых для определения токов по первому и второму законам...

Сортировка данных в файле по первому и второму столбцу
Приветствую! Подскажите пожалуйста! Есть текстовый файл, структуры: Необходимо его...

4
670 / 198 / 29
Регистрация: 10.05.2012
Сообщений: 595
17.12.2012, 10:33  [ТС] 2
Может быть пустые строки ?
0
9 / 9 / 2
Регистрация: 11.08.2011
Сообщений: 66
17.12.2012, 21:27 3
А критерии сортировки всегда есть? Как я понимаю, их может не быть. В таком случае надо просто оставить все как есть. Скорее всего тут и возникает ошибка.
1
670 / 198 / 29
Регистрация: 10.05.2012
Сообщений: 595
10.04.2013, 12:46  [ТС] 4
Хочу добить задачу. Но никто не помогает.
0
670 / 198 / 29
Регистрация: 10.05.2012
Сообщений: 595
28.08.2013, 10:28  [ТС] 5
Решил вот так :
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
#include <iostream>
#include <vector>
#include <string>
#include <iterator>
#include <algorithm>
#include <sstream>
 
using namespace std;
 
vector <string> criteria, names;
vector< vector<string> > table;
vector <bool> ASC;
 
bool comp(const vector<string> & a, const vector<string> & b) {
    for (int i = 0; i < criteria.size(); ++i)
        for (int j = 0; j < names.size(); ++j)
            if (criteria[i] == names[j] && a[j] != b[j])
                return (ASC[i] ^ (a[j] > b[j]));
    return false;
}
 
int main() {
    string str;
    getline(cin, str);
    names = vector <string> ((istream_iterator<string>(istringstream(str))), istream_iterator<string>());
    getline(cin, str);
    vector <string> criterias((istream_iterator<string>(istringstream(str))), istream_iterator<string>());
    for (int i = 0; i < criterias.size(); i += 2) {
        criteria.push_back(criterias[i]);
        ASC.push_back((criterias[i+1] == "ASC," || criterias[i+1] == "ASC"));
    }
    while (getline(cin, str))
        table.push_back(vector <string> ((istream_iterator<string>(istringstream(str))), istream_iterator<string>()));
    stable_sort(table.begin(), table.end(), comp);
    for (int i = 0; i < table.size(); ++i, puts(""))
        for (int j = 0; j < table[i].size(); ++j)
            cout << table[i][j] << " ";
    return 0;
 }
0
28.08.2013, 10:28
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.08.2013, 10:28
Помогаю со студенческими работами здесь

Расчет цепи первому и второму законам Кирхгофа
1)составить систему уравнений, необходимых для определения токов по первому и второму законам...

Отсортируйте первую половину массива по возрастанию, а вторую по убыванию
Создайте целочисленный массив А, содержащий 10 различных чисел. Отсортируйте первую половину...

Отсортируйте первую половину массива по возрастанию, а вторую по убыванию
Дан массив с четным количеством элементов. Отсортируйте первую половину массива по возрастанию, а...

Отсортируйте первую половину массива по возрастанию, а вторую – по убыванию
Помогите решить задачу пожалуйста. Долго сижу и не могу сделать. Буду благодарен от всего сердца ;(...

Отсортируйте первую половину массива по возрастанию, а вторую по убыванию
Решите задачи данной группы, оформив решение в виде процедур генерации, вывода и обработки...

Отсортируйте первую половину массива по убыванию, а вторую по возрастанию
Дан массив А состоящий из 15 целых чисел. Отсортируйте первую половину массива по убыванию, а...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru