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

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

15.12.2012, 14:54. Показов 1919. Ответов 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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.12.2012, 14:54
Ответы с готовыми решениями:

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

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

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

4
 Аватар для Ternsip
670 / 198 / 29
Регистрация: 10.05.2012
Сообщений: 595
17.12.2012, 10:33  [ТС]
Может быть пустые строки ?
0
 Аватар для Preveter
9 / 9 / 2
Регистрация: 11.08.2011
Сообщений: 66
17.12.2012, 21:27
А критерии сортировки всегда есть? Как я понимаю, их может не быть. В таком случае надо просто оставить все как есть. Скорее всего тут и возникает ошибка.
1
 Аватар для Ternsip
670 / 198 / 29
Регистрация: 10.05.2012
Сообщений: 595
10.04.2013, 12:46  [ТС]
Хочу добить задачу. Но никто не помогает.
0
 Аватар для Ternsip
670 / 198 / 29
Регистрация: 10.05.2012
Сообщений: 595
28.08.2013, 10:28  [ТС]
Решил вот так :
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.08.2013, 10:28
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru