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

Отсортировать строку по возрастанию

15.09.2013, 13:54. Показов 1620. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Не получается выполнить задание. Дана целочисленная матрица размера MхN. Расставить по возрастанию элементы заданной строки.

Написал вот такой код:
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
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
#include <iostream.h>
#include <stdlib.h>
#include <conio.h>
#include <math.h>
#include "Ulab2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
StringGrid1->ColCount=(StrToInt(Edit1->Text))+1;
StringGrid1->RowCount=(StrToInt(Edit2->Text))+1;
randomize();
for (int i= 1; i< StringGrid1->RowCount; i++)
for (int j= 1; j< StringGrid1->ColCount; j++)
   {
     StringGrid1->Cells[i][j]=random(199);
   }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
for (int i=1; i< StringGrid1->RowCount; i++)
for (int j=1; j< StringGrid1->ColCount; j++)
    {
if(StringGrid1->Cells[i][j]>StringGrid1->Cells[i+1][j])
StringGrid1->Cells[i+1][j]=StringGrid1->Cells[i][j];
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
Form1->Close();
}
//---------------------------------------------------------------------------
Форма должна выглядеть так:
Миниатюры
Отсортировать строку по возрастанию  
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.09.2013, 13:54
Ответы с готовыми решениями:

Отсортировать строки в матрице по возрастанию
У меня 2-мерный массив 5x5, который я получаю из StringGrid, и ума не приложу как отсортировать строчки в нем по возрастанию Пробую...

Отсортировать строку по возрастанию
Помогите написать, в формате .com и отладить в debug'е (dosbox).

Отсортировать строку по по возрастанию
Помогите написать, в формате .com для отладки в debug'е (dosbox).

15
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
15.09.2013, 14:47
Стоит попробовать один из алгоритмов сортировки, а не эту ерунду.
Алгоритмы сортировок
0
1 / 1 / 2
Регистрация: 25.03.2013
Сообщений: 49
15.09.2013, 15:11  [ТС]
BRcr, если бы это был одномерный массив, я бы еще смог отсортировать, а тут двумерный и я не очень понимаю как это сделать.

Вот написал по аналогии методом обмена:
C++
1
2
3
4
5
6
7
8
9
10
11
void __fastcall TForm1::Button2Click(TObject *Sender)
{ int i, j;
for (i=1; i< StringGrid1->RowCount; i++)
for (j=1; j< StringGrid1->ColCount; j++)
AnsiString swap;
if(StringGrid1->Cells[i][j]>StringGrid1->Cells[i+1][j])
{swap=StringGrid1->Cells[i+1][j];
StringGrid1->Cells[i+1][j]=StringGrid1->Cells[i][j];
StringGrid1->Cells[i][j]=swap;
}
}
но все равно не идет
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33403 / 21513 / 8236
Регистрация: 22.10.2011
Сообщений: 36,914
Записей в блоге: 12
15.09.2013, 15:35
Dmitry0150,

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int __fastcall MySort(TStringList *L, int i1, int i2)
{
    return (i1 == 0) ? (-1) : (StrToIntDef(L->Strings[i1], 0) - StrToIntDef(L->Strings[i2], 0));
}
 
void __fastcall TForm1::Button5Click(TObject *Sender)
{
    int row = StrToInt(Edit1->Text); // тут индекс упорядочиваемой строки. Отсчет - от 0...
 
    std::auto_ptr<TStringList> L(new TStringList);
    L->AddStrings(StringGrid1->Rows[row]);
    L->CustomSort(MySort);
    StringGrid1->Rows[row]->Assign(L.get());
}
прекрасно упорядочивает нужную строку...

Сказали же, не надо велосипедов, есть готовые методы сортировки списков...
1
1 / 1 / 2
Регистрация: 25.03.2013
Сообщений: 49
15.09.2013, 17:11  [ТС]
Спасибо!

А можете помочь сделать, чтобы номер строки, которую я хочу отсортировать, я указывал сам (а то он сортирует всегда последнюю строку) вот здесь:
Миниатюры
Отсортировать строку по возрастанию  
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33403 / 21513 / 8236
Регистрация: 22.10.2011
Сообщений: 36,914
Записей в блоге: 12
15.09.2013, 17:18
Цитата Сообщение от Dmitry0150 Посмотреть сообщение
а то он сортирует всегда последнюю строку
Это неправда. Он сортирует строку, индекс которой введен в Edit1. У тебя это поле просто называется по-другому, скорее всего. Подставь свое название - будет работать как нужно...
1
1 / 1 / 2
Регистрация: 25.03.2013
Сообщений: 49
15.09.2013, 18:10  [ТС]
UI, и правда, спасибо большое!

Добавлено через 45 минут
UI, а как можно изменить этот код чтобы удалить столбец?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int __fastcall MySort(TStringList *L, int i1, int i2)
{
    return (i1 == 0) ? (-1) : (StrToIntDef(L->Strings[i1], 0) - StrToIntDef(L->Strings[i2], 0));
}
 
void __fastcall TForm1::Button5Click(TObject *Sender)
{
    int row = StrToInt(Edit1->Text); // тут индекс упорядочиваемой строки. Отсчет - от 0...
 
    std::auto_ptr<TStringList> L(new TStringList);
    L->AddStrings(StringGrid1->Rows[row]);
    L->CustomSort(MySort);
    StringGrid1->Rows[row]->Assign(L.get());
}
0
1 / 1 / 2
Регистрация: 25.03.2013
Сообщений: 49
15.09.2013, 18:57  [ТС]
Я изменил ваш код вот так:
C++
1
2
3
4
5
6
void __fastcall TForm1::Button2Click(TObject *Sender)
{
    int col = StrToInt(Edit3->Text);
    std::auto_ptr<TStringList> L(new TStringList);
    delete[]StringGrid1->Cols[col];
}
мне показывает что будет программа робатать, но он мне выдает ошибку после того как я сгенерирую матрицу и нажму на кнопку Button2:
Миниатюры
Отсортировать строку по возрастанию  
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
15.09.2013, 19:26
Лучший ответ Сообщение было отмечено как решение

Решение

Это тихий ужас... Очень советую почитать про оператор delete.

Ближе к теме. На самом деле нет простого и совсем адекватного способа удалять строки и столбцы в стринггриде, эту возможность разработчики почему-то исключили.
Есть легкий способ на основе interceptor-классов, но я уже побаиваюсь наткнуться на ответ "я не понимаю и не пойму"...

Все же вот этот способ. У класса TStringGrid есть защищенные методы DeleteRow() и DeleteColumn(). Чтобы их использовать можно унаследоваться от класса и открыть их, а затем обманывать родителя с помощью каста указателя:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class t_del_grid
               : public TStringGrid {
public:
    using TStringGrid::DeleteRow;
    using TStringGrid::DeleteColumn;
};
 
void __fastcall TForm1::Button2Click(TObject *Sender)
{
    int col = StrToInt(Edit3->Text);
 
    ( ( t_del_grid * )StringGrid1 )->DeleteColumn( col );
}
3
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
16.09.2013, 09:39
Цитата Сообщение от BRcr Посмотреть сообщение
C++
1
2
using TStringGrid::DeleteRow;
using TStringGrid::DeleteColumn;
А как они, интересно, реализованы? Может они точно так же очищают ячейки, сдвигают все последующие уменьшают на один общее количество?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33403 / 21513 / 8236
Регистрация: 22.10.2011
Сообщений: 36,914
Записей в блоге: 12
16.09.2013, 10:26
Цитата Сообщение от SatanaXIII Посмотреть сообщение
А как они, интересно, реализованы?
Какая разница? Зато они реализованы и протестированы (потому что используются для внутренних нужд VCL) разработчиками из Embarcadero, а не написаны на коленке. Так что предпочтительно - не переписывать очередной велосипед, а использовать готовое средство...

P.S.
Вот реализация:

Delphi
1
2
3
4
5
6
7
8
9
10
11
procedure TCustomGrid.DeleteColumn(ACol: Longint);
begin
  MoveColumn(ACol, ColCount-1);
  ColCount := ColCount - 1;
end;
 
procedure TCustomGrid.DeleteRow(ARow: Longint);
begin
  MoveRow(ARow, RowCount - 1);
  RowCount := RowCount - 1;
end;
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
16.09.2013, 10:35
Цитата Сообщение от UI Посмотреть сообщение
Какая разница?
Да интересно. Может они там какую-нибудь магию делают. )
Цитата Сообщение от UI Посмотреть сообщение
Зато они реализованы и протестированы (потому что используются для внутренних нужд VCL) разработчиками из Embarcadero, а не написаны на коленке. Так что предпочтительно - не переписывать очередной велосипед, а использовать готовое средство
Соглашусь. Только почему они тогда не public?
Цитата Сообщение от UI Посмотреть сообщение
Вот реализация
Ну практически так я и думал. Только бы еще на MoveColumn и MoveRow посмотреть бы.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33403 / 21513 / 8236
Регистрация: 22.10.2011
Сообщений: 36,914
Записей в блоге: 12
16.09.2013, 10:48
Delphi
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
procedure TCustomGrid.MoveColumn(FromIndex, ToIndex: Longint);
var
  Rect: TGridRect;
begin
  if FromIndex = ToIndex then Exit;
{$IF DEFINED(CLR)}
  if Length(FColWidths) > 0 then
{$ELSE}
  if Assigned(FColWidths) then
{$IFEND}
  begin
    MoveExtent(FColWidths, FromIndex + 1, ToIndex + 1);
    MoveExtent(FTabStops, FromIndex + 1, ToIndex + 1);
  end;
  MoveAdjust(FCurrent.X, FromIndex, ToIndex);
  MoveAdjust(FAnchor.X, FromIndex, ToIndex);
  MoveAdjust(FInplaceCol, FromIndex, ToIndex);
  Rect.Top := 0;
  Rect.Bottom := VisibleRowCount;
  if FromIndex < ToIndex then
  begin
    Rect.Left := FromIndex;
    Rect.Right := ToIndex;
  end
  else
  begin
    Rect.Left := ToIndex;
    Rect.Right := FromIndex;
  end;
  InvalidateRect(Rect);
  ColumnMoved(FromIndex, ToIndex);
{$IF DEFINED(CLR)}
  if Length(FColWidths) <> 0 then
{$ELSE}
  if Assigned(FColWidths) then
{$IFEND}
    ColWidthsChanged;
  UpdateEdit;
end;
MoveRow - по тому же принципу... Теперь тебе захочется посмотреть на MoveExtent/ColumnMoved?
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Только почему они тогда не public?
Здесь уже была версия ответа на этот вопрос: Почему скрываются вполне рабочие методы, события
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
16.09.2013, 11:05
Цитата Сообщение от UI Посмотреть сообщение
Теперь тебе захочется посмотреть на MoveExtent/ColumnMoved?

Но хотя уже впринципе понятно. И смею громко заявить, что обычный велосипед со смещением в один проход всех строк и декремента общего значения будет работать точно так же, может еще и даже лучше. Я не вижу здесь магии: где суперзащиты от всего подряд? Безусловно, скорее всего я ошибаюсь, но пока не вижу этого явно.

Цитата Сообщение от UI Посмотреть сообщение
Здесь уже была версия ответа на этот вопро
И случай со стриггридом как раз туда не вписался.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33403 / 21513 / 8236
Регистрация: 22.10.2011
Сообщений: 36,914
Записей в блоге: 12
16.09.2013, 11:21
Цитата Сообщение от SatanaXIII Посмотреть сообщение
обычный велосипед со смещением в один проход всех строк и декремента общего значения будет работать точно так же, может еще и даже лучше.
Очень громкое заявление. Этот твой велосипед не будет рассматривать ничего, кроме как тупо пойти и удалить все ячейки столбца. Ну, навскидку: что, если у меня на ячейку, которую ты удалишь, был назначен свой InplaceEditor? "Фиг с ней, с утечкой, зато мой велосипед проще", правда? В том-то и преимущество НЕвелосипедного программирования: тебе не надо заботиться о том, о чем уже позаботились разработчики VCL.

Цитата Сообщение от SatanaXIII Посмотреть сообщение
И случай со стриггридом как раз туда не вписался.
Да блин... Что ж вы такие все зашоренные-то? Ну protected - это не "скрытый", вот если бы Embarcadero объявило методы в private-секции, то я бы посмотрел, как бы ты тогда заплясал. Тебе бы каждый раз пришлось переписывать тонны кода. А так - наследование, изменение видимости, и используй все, что явно не запретили использовать. Это же принцип работы с VCL (и с FMX, кстати тоже): расширение возможностей именно за счет наследования.

В общем, ясно... "Пишу как хочу, это мой выбор", но когда программа начинает глючить или код раздувается до невозможности - "это виноваты разработчики"... Очень удобная позиция. Продолжай в том же духе...
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
16.09.2013, 11:52
Цитата Сообщение от UI Посмотреть сообщение
преимущество НЕвелосипедного программирования: тебе не надо заботиться о том, о чем уже позаботились разработчики VCL.
И я как раз об этом. Реализацию DeleteRow я и хотел посмотреть, чтобы сравнить, что она еще делает, помимо перечисленного мной.
Цитата Сообщение от UI Посмотреть сообщение
А так - наследование, изменение видимости
Ну давайте у кнопок OnClick наследовать. Аналогия ясна?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.09.2013, 11:52
Помогаю со студенческими работами здесь

Отсортировать 1 строку матрицы и 2 столбик по возрастанию
Приветствую господа! Хочу понять как написать программу для сортировки 1 строки и 2 столбца матрицы по возрастанию, но не могу понять как...

Отсортировать указанную строку матрицы по возрастанию
Помогите, пожалуйста, с написанием программы на языке Си. Текст задачи: &quot;Дана матрица целых чисел MxN. Пользователь...

Отсортировать каждую строку матрицы по возрастанию
Помогите. Нужно отсортировать каждую строку матрицы по возрастанию.

Отсортировать в матрице по возрастанию серединную строку
В двумерном массиве целых случайных чисел размерностью 7*7,отсортировать по возрастанию серединную строку.Использовать метод вставки

Отсортировать каждую строку матрицы по возрастанию
нужно отсортировать каждую строку двумерной матрицы по возростанию. если можно с объяснением. Добавлено через 54 минуты примерно...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Функция установки текстового статуса в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru