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

Отсортировать в алфавитном порядке данные в StringGrid

13.12.2016, 21:23. Показов 8846. Ответов 21

Студворк — интернет-сервис помощи студентам
Добрый день! Помогите пожалуйста отсортировать в алфавитном порядке данные StrinGrid, нашла кое-какой код, но он не работает до конца
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
TStringList *SL = new TStringList;
String S;
 
for (int i=0;i<StringGrid1->RowCount;i++)
    {
    S=" ";
    for (int j=1;j<StringGrid1->ColCount;j++)
    S += StringGrid1->Cells[j][i]+" ";
    SL->Add(S);
    }
 
SL->Sort();
 
for (int i=0;i<StringGrid1->RowCount;i++)
    {
     StringGrid1->Rows[i]->DelimitedText = SL->Strings[i];
    }
delete SL;
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.12.2016, 21:23
Ответы с готовыми решениями:

Отсортировать данные по фамилиям студентов в алфавитном порядке
С текстового файла считать последовательность записей, содержащих данные о результатах сессии студентов группы в следующем формате:...

Отсортировать в алфавитном порядке данные методом вставки
Здравствуйте, подскажите каким образом происходит сортировка в алфавитном порядке? Например дан input.txt 111 Сидоров Олег...

Массивы: отсортировать в алфавитном порядке по всему массиву и в алфавитном порядке по строкам
Ввести с клавиатуры массив произвольного размера состоящий из латинских букв отсортировать:а)в алфавитном порядке по всему массиву;б)в...

21
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,142
Записей в блоге: 3
13.12.2016, 23:43
Придумал сортировку в наминат "я все починил "

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 TStringList *lst  = new TStringList;
 TStringList *lst1 = new TStringList;
 
 int col_sort =0;  //номер колонки для сортиовки
 
 for(int i=0;i<StringGrid1->RowCount;++i)    //загоняем все в лист и через разделительный знак запоминаем номер строки, что бы после все передвинуть
    lst->Add(StringGrid1->Cells[col_sort][i]+"~"+IntToStr(i));
 
 lst->Sort();   //Сортируем
 
 for(int i=0;i<StringGrid1->RowCount;++i)   //Делаем дупликат таблицы,что бы поней после пересобрать основную
   lst1->Add(StringGrid1->Rows[i]->Text);
 
 for(int i=0;i<StringGrid1->RowCount;++i)     //Строим отсортированую таблицу
  StringGrid1->Rows[i]->DelimitedText =  lst1->Strings[lst->Strings[i].SubString(lst->Strings[i].Pos("~") + 1,lst->Strings[i].Length()).ToInt()]  ;
 
 delete lst,lst1;
}
//---------------------------------------------------------------------------
1
 Аватар для lifeforce
266 / 211 / 89
Регистрация: 27.09.2010
Сообщений: 1,234
14.12.2016, 00:20
для сортировки по возрастанию и убыванию использую это решение.

имена для кнопок SpeedButton1 SpeedButton2 ..... и т.д.(адрес, телефон.... и т.д.)

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
        // находим имя нажимаемой кнопки     ButtonName;
        AnsiString  ButtonName = ((TSpeedButton*) Sender)->Name;
        // удаляем из полученного имени "SpeedButton" и остается сам номер кнопки
        ButtonName.Delete(1, 11);// удаляю с 1 по 11 символ в имени "SpeedButton"
            p = ButtonName.ToInt();
        if (p > 0)  StringGrid1 ->Col = p; // установка на колонку № р
          }else
          {
             p = RadioGroup_menusort->ItemIndex +4;// здесь дополнительно выбираем номер кнопки (имя, фамилия ... и т.д.)
          }
        StringGrid1 ->Row = 0; // перемещение курсора в верхнюю строку
        float progres = StringGrid1->RowCount ;
             progres = 100/progres;
        ProgressBar_sortirovka->Visible = true;
   String buff;
   int minimal = 0;
 
  for (int i = 0; i < StringGrid1->RowCount-1; i++)// начинаю с первой строки
   {      minimal = i;// номер строки для перемещения
          buff = StringGrid1->Cells[p][i];
   for (int j = i+1; j < StringGrid1->RowCount; j++)// проверяю строку
    {
     if (buff> StringGrid1->Cells[p][j]
      && !sort_napravlenie //== false
        )//[здесь номер искомой колонки][j]
     {
           minimal = j;// находим минимальный размер строки
           buff = StringGrid1->Cells[p][j];
     }
   else  if (buff < StringGrid1->Cells[p][j]
      && sort_napravlenie //== true
        )//[здесь номер искомой колонки][j]
     {
           minimal = j;// находим максимальный размер строки
           buff = StringGrid1->Cells[p][j];
     }
    }// конец поиска строки
// перемещение минимальной строки на очередной номер
    if (minimal != 0)
    {
   StringGrid1->Rows [StringGrid1->RowCount +1] = StringGrid1->Rows[i];
   StringGrid1->Rows[i] = StringGrid1->Rows[minimal];
   StringGrid1->Rows [minimal] = StringGrid1->Rows [StringGrid1->RowCount +1];
    }
    ProgressBar_sortirovka->Position =  progres*i ;
    Application->ProcessMessages();
    
    }
 
//---------- очистка буффера и удаление "временной" строки ---------------------
             StringGrid1->Rows[ StringGrid1->RowCount + 1]->Clear();// очистка последней строки
 
    ProgressBar_sortirovka->Visible = false;
 
}
//............... конец программы Сортировка ...................................
2
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,142
Записей в блоге: 3
14.12.2016, 08:22
lifeforce,а кто убирать лишнию буфирную строку будет?) а Вы результат сортировки видели ?)
PS я как понял, в Вашем примере проба сделать сортировку по длине слова, но ни как ни обычная сортировка.
0
 Аватар для lifeforce
266 / 211 / 89
Регистрация: 27.09.2010
Сообщений: 1,234
14.12.2016, 08:54
Dinkin,
это кусок кода из моей программы. которая сортирует в алфавитном порядке. там есть переключатель направления сортировки(возрастание или убывание). есть и выбор колонки по которой можно сделать сортировку. просто этот код надо доработать под свои нужды.
но а в вашем примере сортирует только по первой колонке.
я использовал метод вставки (вместо пузырькового) что увеличило скорость сортировки . проверил на базе 10 000 строк и 50 колонок , занимает 6 секунд.
0
 Аватар для lifeforce
266 / 211 / 89
Регистрация: 27.09.2010
Сообщений: 1,234
14.12.2016, 09:01
в другой таблице я использовал сортировку не путем нажатия кнопок, а непосредственно на саму колонку .
Миниатюры
Отсортировать в алфавитном порядке данные в StringGrid  
0
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,142
Записей в блоге: 3
14.12.2016, 09:01
lifeforce, Возьмите таблицу,небольшую, 5 строк, и 3 колонки и примените свой метод. (Приложил скрин вашей сортировки ниже...как видно буферная строка лишняя появляется+ то что после "А" идет "Д")

Цитата Сообщение от Dinkin Посмотреть сообщение
int col_sort =0; *//номер колонки для сортиовки
У меня сортирует по любой колонке.
Миниатюры
Отсортировать в алфавитном порядке данные в StringGrid  
0
 Аватар для lifeforce
266 / 211 / 89
Регистрация: 27.09.2010
Сообщений: 1,234
14.12.2016, 09:04
Dinkin, сори ,я не внимательно посмотрел.
ну тогда наши два примера работают - осталось ждать решения от casmr, - что выберет.
0
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,142
Записей в блоге: 3
14.12.2016, 09:09
lifeforce, посмотрите пожалуйста на пример скрина вашей сортировки что выше выложил =) и сделайте у себя такой же тест =).
0
 Аватар для lifeforce
266 / 211 / 89
Регистрация: 27.09.2010
Сообщений: 1,234
14.12.2016, 09:16
Цитата Сообщение от lifeforce Посмотреть сообщение
StringGrid1->Rows[ StringGrid1->RowCount + 1]->Clear();// очистка последней строки
может когда я убирал лишние строки и удалил что то.
но у меня работает отлично и нет лишних строк.
0
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,142
Записей в блоге: 3
14.12.2016, 09:17
Цитата Сообщение от lifeforce Посмотреть сообщение
StringGrid1->RowCount + 1
Интересно как можно очистить строку которая находится за пределами длины таблицы.
0
 Аватар для lifeforce
266 / 211 / 89
Регистрация: 27.09.2010
Сообщений: 1,234
14.12.2016, 09:20
Цитата Сообщение от lifeforce Посмотреть сообщение
StringGrid1->Rows [minimal] = StringGrid1->Rows [StringGrid1->RowCount +1];
здесь я ее и создаю для временного хранения. но потом ее надо очистить. если будут добавляться новые записи то может и появиться эта лишняя строка.
0
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,142
Записей в блоге: 3
14.12.2016, 09:38
Лан,если упустить код и посмотреть на тему вопроса и посмотреть зачем тут пузырьки..наверное что бы было =)
0
1 / 1 / 0
Регистрация: 07.04.2016
Сообщений: 11
14.12.2016, 12:52  [ТС]
Большое спасибо за код, но почему то фиксированные ячейки ставит вниз, а когда ставлю цикл с 1, то пишет что вышел за границы массива
Миниатюры
Отсортировать в алфавитном порядке данные в StringGrid  
0
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,142
Записей в блоге: 3
14.12.2016, 13:47
casmr, это вы ща про какой код?
0
1 / 1 / 0
Регистрация: 07.04.2016
Сообщений: 11
14.12.2016, 13:49  [ТС]
Про Ваш
0
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,142
Записей в блоге: 3
14.12.2016, 14:17
Лучший ответ Сообщение было отмечено casmr как решение

Решение

что бы оставить заголовки колонок, то нужно чутка переписать под вот так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 TStringList *lst  = new TStringList;
 TStringList *lst1 = new TStringList;
 
 int col_sort =0;  //номер колонки для сортиовки
 
 for(int i=1;i<StringGrid1->RowCount;++i)    //загоняем все в лист и через разделительный знак запоминаем номер строки, что бы после все передвинуть
    lst->Add(StringGrid1->Cells[col_sort][i]+"~"+IntToStr(i));
 
 lst->Sort();   //Сортируем
 
 for(int i=0;i<StringGrid1->RowCount;++i)   //Делаем дупликат таблицы,что бы по ней после пересобрать основную
   lst1->Add(StringGrid1->Rows[i]->Text);
 
 for(int i=0;i<lst->Count;++i)     //Строим отсортированую таблицу
  StringGrid1->Rows[i+1]->DelimitedText =lst1->Strings[lst->Strings[i].SubString(lst->Strings[i].Pos("~") + 1,lst->Strings[i].Length()).ToInt()]  ;
 
 delete lst,lst1;
2
1 / 1 / 0
Регистрация: 07.04.2016
Сообщений: 11
14.12.2016, 14:22  [ТС]
Большое спасибо!!!
0
 Аватар для lifeforce
266 / 211 / 89
Регистрация: 27.09.2010
Сообщений: 1,234
14.12.2016, 20:28
я не использовал заголовок в этом примере использовал кнопки расположенные сверху над соответствующей колонкой.
Цитата Сообщение от lifeforce Посмотреть сообщение
for (int i = 0; i < StringGrid1->RowCount-1; i++)// начинаю с первой строки
здесь если поменять на int i = 1; тогда заголовок останется не тронутым.
я же предупредил что надо доработать под себя.
0
0 / 0 / 0
Регистрация: 08.05.2021
Сообщений: 3
08.05.2021, 19:10
Dinkin, я попробовал ваш код, но столбец с ФИО у меня разделяется на несколько столбцов, тоесть Фамилия в столбце ФИО, а Имя заносится в следующий столбец и т.д.

Добавлено через 2 минуты
[Dinkin][/Dinkin], я попробовал ваш код, но столбец с ФИО у меня разделяется на несколько столбцов, тоесть Фамилия в столбце ФИО, а Имя заносится в следующий столбец и т.д.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.05.2021, 19:10
Помогаю со студенческими работами здесь

Переписать данные файла input.txt в файл output.txt, отсортировать их в алфавитном порядке по фамилии
Народ меня тут 11 задач мне нужно их подробно прокомментировать какая строчка что делает(пример первая задача) помогите плиз кому не...

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

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

Отсортировать массив в алфавитном порядке
введённый с клавиатуры двумерный массив, произвольного размера состоящий из латинских букв отсортировать: 1. в алфавитном порядке по всему...

Отсортировать строку в алфавитном порядке
Написать программу, которая определяет количество слов заданной строки, длина кождого из которых равна длинне первого слова этой строки....


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение/ Перевод https:/ / **********/ gallery/ thinkpad-x220-tablet-porn-gzoEAjs . . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru