Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

15.12.2012, 14:54. Просмотров 951. Ответов 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 минут
И даже эксперты помочь не в силах :\ А задача одна из самых лёгких...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.12.2012, 14:54
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Отсортируйте строки таблицы в первую очередь по первому критерию, при равенстве по первому критерию, отсортируйте по второму (C++):

Можно ли адресной арифметикой перебрать массив массивов по первому индексу во вложенном цикле, а во внешнем по второму? - C++
Можно ли адресной арифметикой перебрать массив массивов по первому индексу во вложенном цикле, а во внешнем по второму?

Выберите из строки все буквы от Q (q) до Z (z) и отсортируйте их в алфавитном порядке - C++
Всем доброго времени суток. Задачка: С клавиатуры вводится строка. Выберите из нее все буквы от Q (q) до Z (z) (строчные преобразуйте...

Строчные буквы строки преобразуйте в прописные и отсортируйте в алфавитном порядке - C++
с клавиатуры вводится строка. выберите из нее все буквы А(а) до I(i) . строчные преобразуйте в прописные и отсортируйте в алфавитном порядке

Строчные буквы строки преобразуйте в прописные и отсортируйте в алфавитном порядке - C++
с клавиатуры вводится строка. выберите из нее все буквы от А(а) до I(i)(строчные преобразуйте прописные) и отсортируйте их в алфавитном...

Переставить числа в последовательности , что бы сначала шли числа равные первому члену, затем равные второму и тд - C++
Помогите пожалуйста! Не могу решить задачу на перемещение элементов массива Даны целые числа a1,....,an. Переставить числа в...

Отсортировать файл по первому символу строки - C++
Помогите пожалуйста с заданием: &quot;Отсортировать файл по первому символу строки&quot; Заранее спасибо!

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

Отсортируйте данные о сдаче сессии по первому полю - Turbo Pascal
Разработайте программу для работы с массивом записей: сведения о сдаче студентами сессии: -фамилия студента -оценка по экзамену ...

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

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

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


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

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

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