Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 23.05.2017
Сообщений: 65

Сортировка строк

30.07.2018, 14:16. Показов 2346. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Народ, тут проблемка небольшая. Судя по всему просто незнание теории...
Пытаюсь сортировку сделать:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void __fastcall TForm1::FormVP()
{
    int ptr;
    for (int i = 2; i < StringGrid1->RowCount; i++)
    {
        char *ff = AnsiString(StringGrid1->Cells[0][i]).c_str();
        char *ss = AnsiString(StringGrid4->Cells[0][i]).c_str();
        ptr = strcmp(ss, ff);
        if (ptr > 0)
        {
            StringGrid3->Cells[0][i] = StringGrid1->Cells[0][i];
        }
        else
        {
            StringGrid3->Cells[0][i] = StringGrid4->Cells[0][i];
        }
    }
}
Так вот вопрос, можно ли подобным образом объявлять:
C++
1
2
        char *ff = AnsiString(StringGrid1->Cells[0][i]).c_str();
        char *ss = AnsiString(StringGrid4->Cells[0][i]).c_str();
ибо, в дебаге показывает следующее:
1. ff = "Строка 1"
2. ss = "Строка 2"
3. ff = ss - непонятно почему...

Добавлено через 12 минут
И вообще, как можно максимально просто отсортировать два StringGrid-а в один?
Есть два StringGrid-а:
C1 Строка 1 Число
C2 Строка t Число
C3 Строка a Число
C4 Строка b Число
C5 Строка 3 Число
C6 Строка t Число
C1 Строка 5 Число
С3 Строка t Число
C7 Строка a Число
C14 Строка b Число
C15 Строка 3 Число
C26 Строка t Число
И нужно получить третий StringGrid
C1 Строка 1 Число
C1 Строка 5 Число
C2 Строка t Число
С3 Строка t Число
C4 Строка b Число
C5 Строка 3 Число
C6 Строка t Число
C7 Строка a Число
C14 Строка b Число
C15 Строка 3 Число
C26 Строка t Число
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.07.2018, 14:16
Ответы с готовыми решениями:

Сортировка строк
Как отсортировать строки, если, например, дано: &quot;11:00:01_1_1_ 12:30:00_0_1_ 09:40:05_1_0_&quot; После сортировки должно...

сортировка строк
помогите пожалуйста решить задачу в билдере. в Edite вводим цифры не упорядоченные, их нужно упорядочить по убыванию и вывести в Edit! ...

Сортировка строк в Мемо
Добро всем! :senor: Как текст находящийся в Мемо отсортировать адреса по алфавиту? Вот текст в Мемо: Дата: 26.11.2014 ...

11
106 / 93 / 44
Регистрация: 26.07.2015
Сообщений: 197
30.07.2018, 14:37
Лучший ответ Сообщение было отмечено Letzins как решение

Решение

Самый простой способ - записать данные в TStringList и воспользоваться стандартной сортировкой.
http://docs.embarcadero.com/pr... _Sort.html
1
Модератор
 Аватар для D1973
9929 / 6467 / 2457
Регистрация: 21.01.2014
Сообщений: 27,423
Записей в блоге: 3
30.07.2018, 15:05
Этот метод хорош, если необходимо сортировать текстовые данные. И хотя в стринггриде все данные представлены в текстовом виде, но сортировка чисел или дат по правилам сортировки строк приведет к не очень симпатичным результатам. В этом случае правильнее будет воспользоваться методом CustomSort
2
0 / 0 / 0
Регистрация: 23.05.2017
Сообщений: 65
30.07.2018, 16:19  [ТС]
D1973, да, сортировка по Sort немного не то. 1, потом 10, и затем 11...
А что должно поступать в CustomSort?
я внес столбцы в TStringList и хочу их отсортировать

PS А можно как то сделать, чтобы он сортировал по 1 столбцу, но тащил за собой и остальные столбцы?

Добавлено через 46 минут
Вроде, похоже на правду, но не хочет работать...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int _fastcall Sort(TStringList *List1,char i1,char i2)// Ф-ция  сравнения
{
    char *l1= List1->Strings[i1].c_str;
    char *l2= List1->Strings[i2].c_str;
 
    if(l1>l2) return 1;
    else if(l1==l2) return 0;
         else return -1;
}
 
void __fastcall TForm1::FormVP()
{
    int Index;
    std::auto_ptr<TStringList> List1(new TStringList());
    List1->AddStrings(StringGrid1->Cols[0]);
    List1->AddStrings(StringGrid4->Cols[0]);
    StringGrid3->RowCount = List1->Count;
    List1->CustomSort(Sort());
    StringGrid3->Cols[0]->CommaText = List1->CommaText;
}
Добавлено через 10 минут
Точнее
C++
1
2
3
4
5
6
7
8
int __fastcall Sort(TStringList* List, int i1, int i2)
{
    AnsiString s1=List->Strings[i1];
    AnsiString s2=List->Strings[i2];
    if(s1 > s2) return 1;
    else if(s1 == s2) return 0;
         else return -1;
}
0
106 / 93 / 44
Регистрация: 26.07.2015
Сообщений: 197
30.07.2018, 16:26
тут
C++
1
int _fastcall Sort(TStringList *List1,char i1,char i2)// Ф-ция  сравнения
не char a int
C++
1
 int __fastcall Sort(TStringList *List1,int i1,int i2)
и тут
C++
1
List1->CustomSort(Sort());
надо так
C++
1
List1->CustomSort(&Sort);
P.S. я как с работы приду, смогу нормально на билдере попробовать
0
0 / 0 / 0
Регистрация: 23.05.2017
Сообщений: 65
30.07.2018, 16:40  [ТС]
Si14, спасибо, если вдруг успею разобраться сам, напишу сюда)
int и Sort кстати поправил
C++
1
2
3
4
5
6
7
8
int __fastcall Sort(TStringList* List, int i1, int i2)
{
    AnsiString s1=List->Strings[i1];
    AnsiString s2=List->Strings[i2];
    if(s1 > s2) return 1;
    else if(s1 == s2) return 0;
         else return -1;
}
Сейчас он сортирует, но по принципу того же метода Sort, т.е. С1, С1, С10, С10, С100, С101 и т.д. А надо С1, С1, С2, С2 и т.д.
0
106 / 93 / 44
Регистрация: 26.07.2015
Сообщений: 197
30.07.2018, 16:54
А гарантировано, что сначала будут идти буквы, и только в конце числа?
Т.е. всегда c1,c2,c3... и никогда не будет с1с или 1с.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33405 / 21515 / 8236
Регистрация: 22.10.2011
Сообщений: 36,916
Записей в блоге: 12
30.07.2018, 16:55
Написал так:
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
#include <StrUtils.hpp>
#include <Math.hpp>
#include <memory>
 
// ...
 
int __fastcall sorter(TStringList* List, int i1, int i2)
{
    TStringDynArray arr_1 = SplitString(List->Strings[i1], ",");
    TStringDynArray arr_2 = SplitString(List->Strings[i2], ",");
    int Result = CompareValue(RightStr(arr_1[0], arr_1[0].Length() - 1).ToInt(),
                              RightStr(arr_2[0], arr_2[0].Length() - 1).ToInt());
    return Result ? Result : CompareStr(arr_1[1], arr_2[1]);
}
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    std::auto_ptr<TStringList> L(new TStringList);
    for(int i = 0; i < StringGrid1->RowCount; i++)
        L->Add(StringGrid1->Rows[i]->CommaText);
    for(int i = 0; i < StringGrid2->RowCount; i++)
        L->Add(StringGrid2->Rows[i]->CommaText);
    L->CustomSort(sorter);
    for(int i = 0; i < L->Count; i++)
        StringGrid3->Rows[i]->CommaText = L->Strings[i];
}
Получил результат (XE4, если что, и да, тут считается, что буква перед числами - одна) :
Миниатюры
Сортировка строк  
1
0 / 0 / 0
Регистрация: 23.05.2017
Сообщений: 65
30.07.2018, 17:02  [ТС]
Si14, Да. Элементы везде C1 - C200, DA1 - DA200, R1 - R200 и т.д.
Т.е. Буква (-ы) и затем порядковый номер, но буквы разные и может быть по две буквы подряд

Добавлено через 5 минут
volvo, Вау! то что нужно, но есть небольшая загвоздка.
В первом СГ у меня нужно пропустить две строки. Сделал так:
C++
1
2
3
4
5
6
7
8
std::auto_ptr<TStringList> L(new TStringList);
    for(int i = 2; i < StringGrid1->RowCount; i++)
        L->Add(StringGrid1->Rows[i]->CommaText);
    for(int i = 0; i < StringGrid4->RowCount; i++)
        L->Add(StringGrid4->Rows[i]->CommaText);
    L->CustomSort(sorter);
    for(int i = 0; i < L->Count; i++)
        StringGrid3->Rows[i]->CommaText = L->Strings[i];
Но выдает следующее:
'Q1' is not a valid integer value
Хотя элемента Q1 и нет, там ZQ1, т.е. он почему то съел первый символ
0
106 / 93 / 44
Регистрация: 26.07.2015
Сообщений: 197
30.07.2018, 17:25
Вот здесь
C++
1
int Result = CompareValue(RightStr(arr_1[0], arr_1[0].Length() - 1).ToInt(),
надо отнимать не единичку, а позицию первого символа, являющегося числом.
std::isdigit в помощь

Добавлено через 2 минуты

Не по теме:

Резисторы, конденсаторы, микрухи и кварцевые резонаторы. Это что, программа для рисования электрических схем?

0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33405 / 21515 / 8236
Регистрация: 22.10.2011
Сообщений: 36,916
Записей в блоге: 12
30.07.2018, 17:29
Лучший ответ Сообщение было отмечено Letzins как решение

Решение

Letzins, а вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int __fastcall sorter(TStringList* List, int i1, int i2)
{
    TStringDynArray arr_1 = SplitString(List->Strings[i1], ",");
    TStringDynArray arr_2 = SplitString(List->Strings[i2], ",");
    int v1 = arr_1[0].Length(); while(isdigit(arr_1[0][v1])) v1--;
    int v2 = arr_2[0].Length(); while(isdigit(arr_2[0][v2])) v2--;
 
    int Result = CompareStr(LeftStr(arr_1[0], v1),
                        LeftStr(arr_2[0], v2));
    if(!Result)
        Result = CompareValue(RightStr(arr_1[0], arr_1[0].Length() - v1).ToInt(),
                              RightStr(arr_2[0], arr_2[0].Length() - v2).ToInt());
    if(!Result)
        Result = CompareStr(arr_1[1], arr_2[1]);
    return Result;
}
Миниатюры
Сортировка строк  
2
0 / 0 / 0
Регистрация: 23.05.2017
Сообщений: 65
31.07.2018, 08:14  [ТС]
volvo, Все работает! Спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
31.07.2018, 08:14
Помогаю со студенческими работами здесь

Сортировка строк матрицы
Привет всем, я не как не могу придумать ка сортировать строки матрицы, другими словами 1. Я нашел суму парных отрицательные элементов...

Сортировка строк в Мемо
Понимаю что похожие темы были ну я так чуток и не допонял.... Суть проблемы вот вчем: Прога считает количество символов в тексте(в...

Сортировка строк по столбцам Stringgrid
Помогите пожалуйста, нужно сортировать строки StringGrid по выбранным столбцам из combobox

Сортировка строк в memo по датам
возникла проблемка, необходимо отсортировать строки в memo такого типа 23.12.2014;ручка;паркер, 12.6.1995;карандаш;паркер....только по...

Сортировка строк в порядке алфавита
Дана строка, состоящая из слов на английском языке, разделенных пробелами. Вывести на экран эти слова в порядке алфавита. - C++ builder ...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru