Аватар для Samrisbe
1365 / 732 / 67
Регистрация: 28.01.2011
Сообщений: 2,069

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

21.02.2020, 00:29. Показов 4214. Ответов 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
9923 / 6459 / 2457
Регистрация: 21.01.2014
Сообщений: 27,409
Записей в блоге: 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
9923 / 6459 / 2457
Регистрация: 21.01.2014
Сообщений: 27,409
Записей в блоге: 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
9923 / 6459 / 2457
Регистрация: 21.01.2014
Сообщений: 27,409
Записей в блоге: 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
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 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru