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

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

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

Author24 — интернет-сервис помощи студентам
Не получается выполнить задание. Дана целочисленная матрица размера 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)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.09.2013, 13:54
Ответы с готовыми решениями:

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

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

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

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

15
4043 / 2332 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
15.09.2013, 14:47 2
Стоит попробовать один из алгоритмов сортировки, а не эту ерунду.
Алгоритмы сортировок
0
1 / 1 / 2
Регистрация: 25.03.2013
Сообщений: 49
15.09.2013, 15:11  [ТС] 3
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
32833 / 21170 / 8148
Регистрация: 22.10.2011
Сообщений: 36,431
Записей в блоге: 8
15.09.2013, 15:35 4
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  [ТС] 5
Спасибо!

А можете помочь сделать, чтобы номер строки, которую я хочу отсортировать, я указывал сам (а то он сортирует всегда последнюю строку) вот здесь:
Миниатюры
Отсортировать строку по возрастанию  
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32833 / 21170 / 8148
Регистрация: 22.10.2011
Сообщений: 36,431
Записей в блоге: 8
15.09.2013, 17:18 6
Цитата Сообщение от Dmitry0150 Посмотреть сообщение
а то он сортирует всегда последнюю строку
Это неправда. Он сортирует строку, индекс которой введен в Edit1. У тебя это поле просто называется по-другому, скорее всего. Подставь свое название - будет работать как нужно...
1
1 / 1 / 2
Регистрация: 25.03.2013
Сообщений: 49
15.09.2013, 18:10  [ТС] 7
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  [ТС] 8
Я изменил ваш код вот так:
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
4043 / 2332 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
15.09.2013, 19:26 9
Лучший ответ Сообщение было отмечено как решение

Решение

Это тихий ужас... Очень советую почитать про оператор 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
Почетный модератор
Эксперт С++
5850 / 2861 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
16.09.2013, 09:39 10
Цитата Сообщение от BRcr Посмотреть сообщение
C++
1
2
using TStringGrid::DeleteRow;
using TStringGrid::DeleteColumn;
А как они, интересно, реализованы? Может они точно так же очищают ячейки, сдвигают все последующие уменьшают на один общее количество?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32833 / 21170 / 8148
Регистрация: 22.10.2011
Сообщений: 36,431
Записей в блоге: 8
16.09.2013, 10:26 11
Цитата Сообщение от 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
Почетный модератор
Эксперт С++
5850 / 2861 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
16.09.2013, 10:35 12
Цитата Сообщение от UI Посмотреть сообщение
Какая разница?
Да интересно. Может они там какую-нибудь магию делают. )
Цитата Сообщение от UI Посмотреть сообщение
Зато они реализованы и протестированы (потому что используются для внутренних нужд VCL) разработчиками из Embarcadero, а не написаны на коленке. Так что предпочтительно - не переписывать очередной велосипед, а использовать готовое средство
Соглашусь. Только почему они тогда не public?
Цитата Сообщение от UI Посмотреть сообщение
Вот реализация
Ну практически так я и думал. Только бы еще на MoveColumn и MoveRow посмотреть бы.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32833 / 21170 / 8148
Регистрация: 22.10.2011
Сообщений: 36,431
Записей в блоге: 8
16.09.2013, 10:48 13
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
Почетный модератор
Эксперт С++
5850 / 2861 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
16.09.2013, 11:05 14
Цитата Сообщение от UI Посмотреть сообщение
Теперь тебе захочется посмотреть на MoveExtent/ColumnMoved?

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

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

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

В общем, ясно... "Пишу как хочу, это мой выбор", но когда программа начинает глючить или код раздувается до невозможности - "это виноваты разработчики"... Очень удобная позиция. Продолжай в том же духе...
0
Почетный модератор
Эксперт С++
5850 / 2861 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
16.09.2013, 11:52 16
Цитата Сообщение от UI Посмотреть сообщение
преимущество НЕвелосипедного программирования: тебе не надо заботиться о том, о чем уже позаботились разработчики VCL.
И я как раз об этом. Реализацию DeleteRow я и хотел посмотреть, чтобы сравнить, что она еще делает, помимо перечисленного мной.
Цитата Сообщение от UI Посмотреть сообщение
А так - наследование, изменение видимости
Ну давайте у кнопок OnClick наследовать. Аналогия ясна?
0
16.09.2013, 11:52
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.09.2013, 11:52
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru