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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 2, средняя оценка - 3.00
Ternsip
660 / 188 / 6
Регистрация: 10.05.2012
Сообщений: 595
#1

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

15.12.2012, 14:54. Просмотров 908. Ответов 4

Задача готова, надо найти мелкий баг.
Есть прямоугольная таблица, содержащая слова. Каждые ее столбец имеет свое имя. Задан набор критериев сортировки вида "ИМЯ_ПОЛЯ ПОРЯДОК_СОРТИРОВКИ", где ПОРЯДОК_СОРТИРОВКИ это либо 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 минут
И даже эксперты помочь не в силах :\ А задача одна из самых лёгких...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.12.2012, 14:54     Отсортируйте строки таблицы в первую очередь по первому критерию, при равенстве по первому критерию, отсортируйте по второму
Посмотрите здесь:

C++ Выберите из строки все буквы от Q (q) до Z (z) и отсортируйте их в алфавитном порядке
Строчные буквы строки преобразуйте в прописные и отсортируйте в алфавитном порядке C++
Строчные буквы строки преобразуйте в прописные и отсортируйте в алфавитном порядке C++
Подсчитать сумму элементов строки в массиве и присвоить значение первому элементу C++
C++ Отсортируйте элементы массива по возрастанию их модуля
C++ Отсортировать файл по первому символу строки
C++ Отсортируйте структуру
Отсортируйте массив по убыванию и выведите на экран C++
C++ Можно ли адресной арифметикой перебрать массив массивов по первому индексу во вложенном цикле, а во внешнем по второму?
C++ Переставить числа в последовательности , что бы сначала шли числа равные первому члену, затем равные второму и тд
C++ При вводе определенных переменных программа должна возвращать пользователя обратно к первому шагу
Дано двумерный массив размерности nxm. Определить, есть ли в массиве строки, равные первому C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ternsip
660 / 188 / 6
Регистрация: 10.05.2012
Сообщений: 595
17.12.2012, 10:33  [ТС]     Отсортируйте строки таблицы в первую очередь по первому критерию, при равенстве по первому критерию, отсортируйте по второму #2
Может быть пустые строки ?
Preveter
9 / 9 / 1
Регистрация: 11.08.2011
Сообщений: 66
17.12.2012, 21:27     Отсортируйте строки таблицы в первую очередь по первому критерию, при равенстве по первому критерию, отсортируйте по второму #3
А критерии сортировки всегда есть? Как я понимаю, их может не быть. В таком случае надо просто оставить все как есть. Скорее всего тут и возникает ошибка.
Ternsip
660 / 188 / 6
Регистрация: 10.05.2012
Сообщений: 595
10.04.2013, 12:46  [ТС]     Отсортируйте строки таблицы в первую очередь по первому критерию, при равенстве по первому критерию, отсортируйте по второму #4
Хочу добить задачу. Но никто не помогает.
Ternsip
660 / 188 / 6
Регистрация: 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;
 }
Yandex
Объявления
28.08.2013, 10:28     Отсортируйте строки таблицы в первую очередь по первому критерию, при равенстве по первому критерию, отсортируйте по второму
Ответ Создать тему
Опции темы

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