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

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

13.12.2016, 21:23. Показов 8932. Ответов 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,153
Записей в блоге: 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,153
Записей в блоге: 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,153
Записей в блоге: 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,153
Записей в блоге: 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,153
Записей в блоге: 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,153
Записей в блоге: 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,153
Записей в блоге: 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,153
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
BOINC: 22 года — и всё ещё работает
Programma_Boinc 12.03.2026
BOINC: 22 года — и всё ещё работает Дэвид Андерсон написал ретроспективу. Кратко: в 2001 году он ушёл из United Devices, где был CTO, и за несколько месяцев написал ядро BOINC — клиент, сервер,. . .
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 03.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru