Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.76/21: Рейтинг темы: голосов - 21, средняя оценка - 4.76
 Аватар для Samrisbe
1365 / 732 / 67
Регистрация: 28.01.2011
Сообщений: 2,069

Сортировка по цифре с литерой в стринг грид

21.02.2020, 00:29. Показов 4174. Ответов 24

Студворк — интернет-сервис помощи студентам
Добро всем!
У меня есть пример сортировки по числам. После появления цифры с литерой пример 11Б сортировка выдает ошибку так как не может 11Б загнать в переменную int
Как сделать сортировку в StringGrid1 с чтоб учитывала кириллический символы:
310
233
124Б
45
42А
85
31Г
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 int Col_sort = 0;//колонка для сортировки
 String value;
 for (int i = 1; i < StringGrid1->RowCount; i++)
  for (int j = i; j < StringGrid1->RowCount; j++)
    {
    if (StringGrid1->Cells[Col_sort][i].ToInt()>StringGrid1->Cells[Col_sort][j].ToInt())
      {
      for(int k=0;k<StringGrid1->ColCount;k++)  // количество сортируемых столбцов
        {
        value=StringGrid1->Cells[k][i];
        StringGrid1->Cells[k][i]= StringGrid1->Cells[k][j];
        StringGrid1->Cells[k][j]=value;
        }
      }
    }
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.02.2020, 00:29
Ответы с готовыми решениями:

Сортировка по цвету в стринг грид
Добро всем :senor: Я в гриде перекрашиваю строки на которые надо обратить внимание. Подскажите пожалуйста как сортировать строки в гриде...

Сортировка массива и вывод его в стринг грид
Здравствуйте! Подскажите, пожалуйста. Есть задание: выдать список студентов по убыванию среднего балла за период обучения. Средний балл...

Объясните: проверьте, можно ли из букв, входящих в стринг А, составить стринг В
//Даны два &quot;стринга&quot; А и В. //Проверьте, можно ли из букв, входящих в стринг А, составить стринг В. //Буквы можно переставлять, и...

24
 Аватар для TrollHammer
1216 / 709 / 336
Регистрация: 22.02.2018
Сообщений: 2,095
Записей в блоге: 2
21.02.2020, 00:34
Вот так я сортировал массив структур
C++
1
2
3
4
5
6
7
8
for (int i = 0; i <= iSelNum; i++)
            for (int j = iSelNum - 1; j > i; j--)
                if (strcmp(ss[j].aWorkType.c_str(), ss[j - 1].aWorkType.c_str()) < 0)
                {
                    h = ss[j];
                    ss[j] = ss[j - 1];
                    ss[j - 1] = h;
                }
Думаю, переделать под Вашу задачу не составит труда
1
Модератор
 Аватар для D1973
9921 / 6457 / 2457
Регистрация: 21.01.2014
Сообщений: 27,399
Записей в блоге: 3
23.02.2020, 14:00
Samrisbe, если я правильно понимаю, Вам надо отсортировать таблицу по определенному столбцу и сортировка должна идти по правилам сортировки именно чисел, а не строк? А сколько "литер" может присутствовать после числа? Если только одна - то все просто...
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
#include <memory>
#include <Math.hpp>
//---------------------------------------------------------------------------
int __fastcall Sorter(TStringList *X, int i1, int i2)
{
   return CompareValue(StrToInt(X->Names[i1]), StrToInt(X->Names[i2]));
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   int tmp;
   String s;
   std::auto_ptr<TStringList> L (new TStringList);
   for(int i = SG->FixedRows; i < SG->RowCount; i++)
     {
        s = SG->Cells[0][i];
        s = TryStrToInt(s, tmp) ? s : s.SubString(1, s.Length() - 1);
        L->Add(String().sprintf(L"%s=%s", s, SG->Rows[i]->CommaText));
     }
   L->CustomSort(Sorter);
   for(int i = 0; i < L->Count; i++)
     SG->Rows[i + SG->FixedRows]->CommaText = L->ValueFromIndex[i];
}
//---------------------------------------------------------------------------
До сортировки:



После сортировки:
Миниатюры
Сортировка по цифре с литерой в стринг грид  
2
 Аватар для Samrisbe
1365 / 732 / 67
Регистрация: 28.01.2011
Сообщений: 2,069
24.02.2020, 04:02  [ТС]
Цитата Сообщение от D1973 Посмотреть сообщение
сортировки именно чисел, а не строк? А сколько "литер" может присутствовать после числа?
Да сортировка по числам, и литера только одна.
Я попробовал на других цифрах с литерой и появилось отклонение я попытался разобраться в вашем примере но не смог...
Миниатюры
Сортировка по цифре с литерой в стринг грид   Сортировка по цифре с литерой в стринг грид  
0
 Аватар для TrollHammer
1216 / 709 / 336
Регистрация: 22.02.2018
Сообщений: 2,095
Записей в блоге: 2
24.02.2020, 04:40
Цитата Сообщение от Samrisbe Посмотреть сообщение
и появилось отклонение
А вариант с использованием БД для хранения данных не рассматривается? Там можно сортировать в запросе или, на худой конец, методом Sort.
1
 Аватар для Samrisbe
1365 / 732 / 67
Регистрация: 28.01.2011
Сообщений: 2,069
25.02.2020, 19:15  [ТС]
Цитата Сообщение от TrollHammer Посмотреть сообщение
А вариант с использованием БД
оно так и есть бд но в запросе сортирует криво
C++
1
FROM Гаражи ORDER BY НомерГаража.....
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
25.02.2020, 23:44
Samrisbe, ну и от меня "костыль"...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    /* #include <stdio.h>  */
    TStringList *SL = new TStringList;
    for(int dg=0,ch='z',i=1;i<StringGrid1->RowCount;i++) {
     sscanf(StringGrid1->Cells[0][i].c_str(),"%d%c",&dg,&ch);
     String G1=String().sprintf("%.7d%c,",dg,ch);
     SL->Add(G1+StringGrid1->Rows[i]->CommaText);
    }
    SL->Sort(); 
    for(int p,i=1;i<StringGrid1->RowCount;i++) {
     if((p=SL->Strings[i-1].Pos(","))>0)
      StringGrid1->Rows[i]->CommaText=
        SL->Strings[i-1].SubString(p+1,SL->Strings[i-1].Length());
    }
    delete SL;
(Я иногда использую метод дополнительной начальной колонки при сортировке, которая затем игнорируется. Такая сортировка ближе всего к "рукотворной". Хотя код, конечно, тяжеловесный и его много.)
1
 Аватар для Samrisbe
1365 / 732 / 67
Регистрация: 28.01.2011
Сообщений: 2,069
26.02.2020, 00:01  [ТС]
Цитата Сообщение от nick42 Посмотреть сообщение
Я иногда использую метод дополнительной начальной колонки
это на крайний случай
0
Модератор
 Аватар для D1973
9921 / 6457 / 2457
Регистрация: 21.01.2014
Сообщений: 27,399
Записей в блоге: 3
26.02.2020, 16:26
Цитата Сообщение от nick42 Посмотреть сообщение
метод дополнительной начальной колонки
А, судя по всему, без нее не обойтись... Времени сейчас катастрофически нет, но попробовать хочу обязательно...
1
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
26.02.2020, 17:05
Тогда пробовать лучше с исправленным кодом (и иметь ввиду применимость к конкретике ТС...- после числа не более 1-й буквы и она из русского алфавита).
C++
1
2
3
4
5
6
7
8
9
    TStringList *SL = new TStringList;
    for(int dg=0,ch='z',i=1;i<StringGrid1->RowCount;++i,dg=0,ch='z') {
      sscanf(StringGrid1->Cells[0][i].c_str(),"%d%c",&dg,&ch);
      SL->Add(String().sprintf("%.7d%c,%s",dg,ch,StringGrid1->Rows[i]->CommaText));
    }
    SL->Sort();
    for(int i=1;i<StringGrid1->RowCount;i++) StringGrid1->Rows[i]->CommaText=
      SL->Strings[i-1].SubString(10,SL->Strings[i-1].Length()-9);
    delete SL;
1
 Аватар для Samrisbe
1365 / 732 / 67
Регистрация: 28.01.2011
Сообщений: 2,069
26.02.2020, 19:28  [ТС]
на эти строки в 10 билдере конфликт
C++
1
2
sscanf(StringGrid1->Cells[0][i].c_str(),"%d%c",&dg,&ch);
      SL->Add(String().sprintf("%.7d%c,%s",dg,ch,StringGrid1->Rows[i]->CommaText));
error^
[BCC32 Error] Unit1.cpp(1026): E2034 Cannot convert 'wchar_t *' to 'const char *'
Unit1.cpp(1006): parsing: void _fastcall TForm1::Button3Click(TObject *)
[BCC32 Error] Unit1.cpp(1026): E2342 Type mismatch in parameter '__buffer' (wanted 'const char *', got 'wchar_t *')
Unit1.cpp(1006): parsing: void _fastcall TForm1::Button3Click(TObject *)
[BCC32 Error] Unit1.cpp(1027): E2034 Cannot convert 'char const[10]' to 'const wchar_t *'
Unit1.cpp(1006): parsing: void _fastcall TForm1::Button3Click(TObject *)
[BCC32 Error] Unit1.cpp(1027): E2342 Type mismatch in parameter 'format' (wanted 'const wchar_t *', got 'const char *')
Unit1.cpp(1006): parsing: void _fastcall TForm1::Button3Click(TObject *)
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
26.02.2020, 23:16
Рад бы помочь, но увы...! Я не специалист по вольтижировке с юникодами, а это типичные ошибки такого типа.
1
Модератор
 Аватар для D1973
9921 / 6457 / 2457
Регистрация: 21.01.2014
Сообщений: 27,399
Записей в блоге: 3
27.02.2020, 17:37
Цитата Сообщение от Samrisbe Посмотреть сообщение
на эти строки в 10 билдере конфликт
А так?
C++
1
2
3
4
for(int dg = 0, ch = 'z', i = 1; i < StringGrid1->RowCount; ++i, dg = 0, ch = 'z') {
      sscanf(StringGrid1->Cells[0][i].c_str(), L"%d%c", &dg, &ch);
      SL->Add(String().sprintf(L"%.7d%c,%s", dg, ch, StringGrid1->Rows[i]->CommaText)); 
     }
1
 Аватар для Samrisbe
1365 / 732 / 67
Регистрация: 28.01.2011
Сообщений: 2,069
27.02.2020, 23:45  [ТС]
Цитата Сообщение от D1973 Посмотреть сообщение
А так?
Спасибо, не две сократились ошибки
C++
1
sscanf(StringGrid1->Cells[0][i].c_str(), L"%d%c", &dg, &ch);
после клика на любую из ошибок курсор становится перед закрывающей скобкой

[BCC32 Error] Unit1.cpp(1026): E2034 Cannot convert 'wchar_t *' to 'const char *'
Full parser context
Unit1.cpp(1006): parsing: void _fastcall TForm1::Button3Click(TObject *)
[BCC32 Error] Unit1.cpp(1026): E2342 Type mismatch in parameter '__buffer' (wanted 'const char *', got 'wchar_t *')
Full parser context
Unit1.cpp(1006): parsing: void _fastcall TForm1::Button3Click(TObject *)
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
28.02.2020, 15:14
Лучший ответ Сообщение было отмечено Samrisbe как решение

Решение

Samrisbe, а в такой подаче Ваш Билдер переварит__?
C++
1
2
3
4
5
6
7
8
9
10
11
    TStringList *SL = new TStringList;
    for(int dg=0,ch='z',i=1;i<StringGrid1->RowCount;++i,dg=0,ch='z') {
      const char *buf = ((AnsiString)StringGrid1->Cells[0][i]).c_str(),
                     *msk = "%d%c";
      sscanf(buf,msk,&dg,&ch);
      SL->Add(String().sprintf(L"%.7d%c,%s",dg,ch,StringGrid1->Rows[i]->CommaText));
    }
    SL->Sort();
    for(int i=1;i<StringGrid1->RowCount;i++) StringGrid1->Rows[i]->CommaText=
      SL->Strings[i-1].SubString(10,SL->Strings[i-1].Length()-9);
    delete SL;
У меня ХЕ-овые студии претензий не предъявляли.
1
 Аватар для Samrisbe
1365 / 732 / 67
Регистрация: 28.01.2011
Сообщений: 2,069
29.02.2020, 00:28  [ТС]
Цитата Сообщение от nick42 Посмотреть сообщение
Ваш Билдер переварит__?
Билдер переварил без возражений, просил искренне поблагодарить всех не равнодушных участников форума!

Добавлено через 10 минут
Сейчас результат вполне устраивает сперва с литерой потом без литеры:
100
111А
111Б
111
145
146
200А
200
300

сложно сортировать чтоб сперва шла цифра без литеры а потом с литерой ?
100
111
111А
111Б
145
200
200А
300
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
29.02.2020, 00:38
Лучший ответ Сообщение было отмечено Samrisbe как решение

Решение

Цитата Сообщение от Samrisbe Посмотреть сообщение
сложно сортировать чтоб сперва шла цифра без литеры а потом с литерой ?
Ставлю банку пива, что у 200А А - "нерусское". Если Вы заметили, - при отсутствии буквы после номера до сортировки туда подставляется буква z. Таким образом, любая кириллическая литера отсортируется следом за ней, и только латинская литера будет ей предшествовать.

Добавлено через 1 минуту
Замените z на @, - и числа без литер всегда будут впереди.
1
 Аватар для Samrisbe
1365 / 732 / 67
Регистрация: 28.01.2011
Сообщений: 2,069
29.02.2020, 08:21  [ТС]
Цитата Сообщение от nick42 Посмотреть сообщение
Ставлю банку пива, что у 200А А - "нерусское"
с Вас банка пива проверил А настоящая казачка

Цитата Сообщение от nick42 Посмотреть сообщение
Замените z на @, - и числа без литер всегда будут впереди
Спасибо большое!
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
29.02.2020, 10:15
...
Тогда сохраните в файл SL и обнародуйте содержимое. Просто так быть не может! (это я о сортировке). Интересно же!
0
 Аватар для Samrisbe
1365 / 732 / 67
Регистрация: 28.01.2011
Сообщений: 2,069
29.02.2020, 21:27  [ТС]
Цитата Сообщение от nick42 Посмотреть сообщение
Тогда сохраните в файл SL
во вложении
Вложения
Тип файла: txt sort.txt (831 байт, 3 просмотров)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.02.2020, 21:27
Помогаю со студенческими работами здесь

Сортировка StringGrid-а и вывод результата в другой грид
Значит так. У меня есть StringGrid1, который заполняется рандомно. Мне нужно его отсортировать и вывести результат в StringGrid2. Но что-то...

Сортировка по последней цифре
Напишите программу, которая сортирует элементы массива по возрастанию последней цифры десятичной записи чисел. Входные данные Первая...

Сортировка массива по последней цифре
Пожалуйста, помогите написать такую программу Заполнить массив из 10 элементов случайными числами в интервале и отсортировать его по...

Сортировка массива по последней цифре
Здравствуйте, уважаемые форумчане! Наконец решил отойти от обычных &quot;ручных&quot; методов решения некоторых задач, а именно использовать...

Из массива стринг в двумерный массив стринг
У меня есть массив строк, в каждой строки записаны слова через пробел. Мне нужно из этого массива получить двухмерный массив stringarray;...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
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