Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
504 / 223 / 42
Регистрация: 14.11.2009
Сообщений: 371
1

Написать класс матрицы NxM

16.02.2011, 19:49. Показов 1851. Ответов 3
Метки нет (Все метки)

Здравствуйте, уважаемые программисты всея форума! Доброго вам времени суток =)
Появился у меня вопросик...
Моя задача звучит так:

" Класс - числовая матрица размером NxM. Получить из нее новую матрицу путем удаления из нее отмеченную мышкой строку (двойным или обычным нажатием). По клавише Alt (E) - показать исходную матрицу."

Собственно говоря, мне непонятно, как описать эти события: нажатие на мышку и нажатие на клавишу. И еще непонятно, нужно ли мне создавать потомка TStringGrid или надо сделать как-то иначе...

Буду рад любой помощи =) Заранее вам большое спасибо =)
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.02.2011, 19:49
Ответы с готовыми решениями:

Для матрицы А размером NxM вывести на экран все ее седловые точки. Элемент матрицы называется седловой точкой,
Для матрицы А размером NxM вывести на экран все ее седловые точки. Элемент матрицы называется...

Сортировка матрицы NxM
Отсортировать по возрастанию только те рядки которые нечетные, помогите, запутался, что-то с i,j...

Составить программу обработки матрицы размерности NxM
Составить программу обработки матрицы размерности NxM. Выполнить программу для N=3, M=4....

Составить программу обработки матрицы размерности NxM
Составить программу обработки матрицы размерности NxM. Выполнить программу для N=3, M=4. В...

3
504 / 223 / 42
Регистрация: 14.11.2009
Сообщений: 371
18.02.2011, 19:04  [ТС] 2
Ндя, наверно я не очень хорошо объяснил свою проблему =)
Я не понимаю, как в разделе interface описать события нажатия на клавишу и на клавишу мышки =)
0
425 / 53 / 15
Регистрация: 31.12.2010
Сообщений: 191
18.02.2011, 19:28 3
И еще непонятно, нужно ли мне создавать потомка TStringGrid
для OnClick и OnMouseMove луше
Ндя, наверно я не очень хорошо объяснил свою проблему =)
вы лучше код попробуите написать, а что непонятно подскажем
1
504 / 223 / 42
Регистрация: 14.11.2009
Сообщений: 371
27.02.2011, 02:41  [ТС] 4
Лучший ответ Сообщение было отмечено как решение

Решение

В итоге решил проблему так: описал класс без событий, а уже в приложении, иллюстрирующем работу класса в событиях компонента TStringGrid описал все, что мне нужно =)

Вот код класса:

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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
unit TMatrix;
 
interface
 
uses sysutils,Grids; // èñïîëüçóåìûé ìîäóëü - òàáëèöû.
 
{-------------------------------- Çàäàíèå ----------------------------
 
Êëàññ - ÷èñëîâàÿ ìàòðèöà ðàçìåðîì MxN. Ïîëó÷èòü èç íåå íîâóþ ìàòðèöó
ïóòåì óäàëåíèÿ èç íåå îòìå÷åííîé ìûøêîé ñòðîêè (äâîéíûì èëè îáû÷íûì íàæàòèåì
). Ïî êëàâèøå Alt/E - ïîêàçàòü èñõîäíóþ ìàòðèöó.}
 
// ñîçäàåì òèï ìàòðèöû.
type
Matr = record
RowsN: integer; // ïîëå - êîëè÷åñòâî ñòðîê ìàòðèöû.
ColsM: integer; // ïîëå - êîëè÷åñòâî ñòîëáöîâ ìàòðèöû.
mas: array of array of integer; // äâóìåðíûé ìàññèâ, îïèñûâàþùèé ìàòðèöó.
end;
 
type
 
TMy_Matrix = class    // êëàññ --- ïðÿìîóãîëüíîé --- ìàòðèöû.
private
 
{----------------  Ïîëÿ îïèñûâàþùèå ìàòðèöó  ----------------}
 
FMatr1: Matr; // èñõîäíàÿ ìàòðèöà.
FMatr2: Matr; // ðàáî÷àÿ ìàòðèöà.
 
public
 
{----------------  Âíåøíèå ìåòîäû  ----------------}
 
constructor Create;  // Êîíñòðóêòîð îáúåêòà êëàññà.
destructor  Destroy; override;  // Óíè÷òîæåíèå îáúåêòà êëàññà.
procedure GenerMatr; // ãåíåðèðîâàíèå ñëó÷àéíûõ ýëåìåíòîâ ìàòðèöû.
procedure ShowMatr(var Grid: TStringGrid); // âûâîä ìàòðèöû â êîìïîíåíò StringGrid.
procedure DelRow(NumRow: integer); // óäàëåíèå óêàçàííîé ñòðî÷êè.
procedure ReturnMatr; // ïðîöåäóðà âîçâðàùåíèÿ èñõîäíîé ìàòðèöû.
 
end; // êîíåö îïèñàíèÿ êëàññà.
 
 
implementation
 
{----------------  Îïèñàíèå ìåòîäîâ êëàññà TMatrix  ----------------}
 
// Êîíñòðóêòîð îáúåêòà êëàññà.
constructor TMy_Matrix.Create;
begin
 
inherited Create;
// Çàäàåì ðàçìåðû ïåðâîé ìàòðèöû.
FMatr1.RowsN:= 1;
FMatr1.ColsM:= 1;
SetLength(FMatr1.mas, FMatr1.RowsN, FMatr1.ColsM);
// Çàäàåì ðàçìåðû è âòîðîé ìàòðèöû.
FMatr2.RowsN:= 1;
FMatr2.ColsM:= 1;
SetLength(FMatr2.mas, FMatr2.RowsN, FMatr2.ColsM);
 
end;
 
// Äåñòðóêòîð îáúåêòà êëàññà.
destructor TMy_Matrix.Destroy;
begin
  Finalize(FMatr1.mas);  // îñâîáîæäàåì èç ïàìÿòè íàøó ìàòðèöó.
  Finalize(FMatr2.mas); // îñâîáîæäàåì èç ïàìÿòè è âòîðóþ ìàòðèöó.
  inherited Destroy; // îòñûëêà ê ïåðâîíà÷àëüíîìó ìåòîäó ðàçðóøåíèÿ îáúåêòà.
end;
 
// Ñãåíåðèðîâàòü ñëó÷àéíûå çíà÷åíèÿ â ìàòðèöå.
procedure TMy_Matrix.GenerMatr;
var
i, j,            // ñ÷åò÷èêè öèêëîâ.
a, m: integer;   // ÷èñëî è çíàê.
begin
Randomize; // Èíèöèàëèçàöèÿ ãåíåðàòîðà ñëó÷àéíûõ ÷èñåë.
// çàäàåì ñëó÷àéíûå ðàçìåðû èñõîäíîé ìàòðèöû.
FMatr1.RowsN:= random(20) + 1;
FMatr1.ColsM:= random(20) + 1;
setlength(Fmatr1.mas, Fmatr1.RowsN, Fmatr1.ColsM);
// Òåïåðü äåëàåì âòîðóþ òàêóþ æå ìàòðèöó.
FMatr2.RowsN:= FMatr1.RowsN;
FMatr2.ColsM:= FMatr1.ColsM;
SetLength(FMatr2.mas, FMatr2.RowsN, FMatr2.ColsM);
// Çàïîëíåíèå ìàòðèö.
for i:= 0 to High(FMatr1.mas) do       // îò ïåðâîé äî ïîñëåäíåé ñòðîêè ìàòðèöû.
  for j:= 0 to High(FMatr1.mas[i]) do  // îò ïåðâîãî äî ïîñëåäíåãî ñòîëáöà ìàòðèöû.
begin
a:= Random(101); // ãåíåðèðóåì ñëó÷àéíîå ÷èñëî.
m:= Random(2); // ãåíåðèðóåì çíàê ÷èñëà.
  if m = 1 then // åñëè çíàê = 1 òîãäà
a:= -a; // ÷èñëî à - îòðèöàòåëüíîå ÷èñëî.
FMatr1.mas[i,j]:= a; // çàïèñûâàåì ÷èñëî â ìàòðèöó.
FMatr2.mas[i,j]:= a; // çàïèñûâàåì ýòî æå ÷èñëî âî âòîðóþ ìàòðèöó.
end;
end;
 
// Âûâåñòè ìàòðèöó â êîìïîíåíò StringGrid.
procedure TMy_Matrix.ShowMatr(var Grid: TStringGrid);
var
i, j: integer; // ñ÷åò÷èêè öèêëà.
begin
// Âî ïåðâûõ - ïîäãîíèì ðàçìåðû òàáëèöû ïîä ìàòðèöó - òàê ÷òîáû åå ìîæíî áûëî óâèäåòü.
Grid.RowCount:= FMatr1.RowsN; // äîáàâèëè êîëè÷åñòâî ñòðîê.
Grid.ColCount:= FMatr1.ColsM; // äîáàâèëè êîëè÷åñòâî ñòîëáöîâ.
// Öèêë çàïîëíåíèÿ òàáëèöû.
for i:= 0 to High(FMatr1.mas) do // îò ïåðâîé äî ïîñëåäíåé ñòðî÷êè ìàòðèöû.
  for j:= 0 to High(FMatr1.mas[i]) do // îò ïåðâîãî äî ïîñëåäíåãî ñòîëáöà ìàòðèöû.
Grid.Cells[j, i]:= IntToStr(FMatr1.mas[i,j]); // äîáàâèëè ÷èñëî â ÿ÷åéêó.
end;
 
// Óäàëèòü ñòðî÷êó ìàòðèöû.
procedure TMy_Matrix.DelRow(NumRow: integer);
var
i, j: integer;  // ñ÷åò÷èêè öèêëîâ.
begin
// ïðîâåðêà óñëîâèÿ ñòðî÷êè.
if (NumRow <= (FMatr1.RowsN - 1)) then
begin
for i:= (NumRow + 1) to High(FMatr1.mas) do   // îò ïåðâîé äî ïîñëåäíåé ñòðîêè ìàòðèöû.
  for j:= 0 to High(FMatr1.mas[i]) do  // îò ïåðâîãî äî ïîñëåäíåãî ñòîëáöà ìàòðèöû.
    FMatr1.mas[i-1,j]:= FMatr1.mas[i,j]; // ïåðåìåùàåì ýëåìåíòû "ââåðõ" ñòðîêàìè.
// èçìåíÿåì ðàçìåðû ìàòðèöû.
FMatr1.RowsN:= FMatr1.RowsN - 1;
SetLength(FMatr1.mas,FMatr1.RowsN, FMatr1.ColsM);
 
end;
end;
 
// Ïðîöåäóðà âîçâðàùåíèÿ èñõîäíîé ìàòðèöû.
procedure TMy_Matrix.ReturnMatr;
var
i,j: integer; // ñ÷åò÷èêè öèêëîâ.
begin
 
// Âîçâðàùàåì èñõîäíîé ìàòðèöå åå ïåðâîíà÷àëüíûå ðàçìåðû.
FMatr1.RowsN:= FMatr2.RowsN;
FMatr1.ColsM:= FMatr2.ColsM;
SetLength(FMatr1.mas, FMatr1.RowsN, FMatr1.ColsM);
 
// Êîïèðóåì ýëåìåíòû èñõîäíîé ìàòðèöû.
for i:= 0 to High(FMatr2.mas) do
  for j:= 0 to High(FMatr2.mas[i]) do
FMatr1.mas[i,j]:= FMatr2.mas[i,j];
 
end;
 
 
end.

А вот код приложения:

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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids, TMatrix, Buttons;
 
type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    GroupBox1: TGroupBox;
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;
    BitBtn3: TBitBtn;
    BitBtn4: TBitBtn;
    procedure BitBtn1Click(Sender: TObject);
    procedure BitBtn2Click(Sender: TObject);
    procedure BitBtn3Click(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
      var CanSelect: Boolean);
    procedure StringGrid1KeyPress(Sender: TObject; var Key: Char);
    procedure BitBtn4Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
 
 
 
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
  MyMatrix: TMy_Matrix;  // ïåðåìåííàÿ êëàññà My_Matrix.
 
implementation
 
{$R *.dfm}
 
// Ïðè íàæàòèè íà íàäïèñü - "Ñîçäàòü ìàòðèöó".
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
 
// ñîçäàäèì ìàòðèöó, åñëè åå åùå íå ñóùåñòâóåò!
if assigned(MyMatrix) = false then
begin
 
// Ñîçäàåì îáúåêò êëàññà.
MyMatrix:= TMy_Matrix.Create;
 
// Âûâåäåì ñîîáùåíèå îá ýòîì.
MessageDlg('Ìàòðèöà óñïåøíî ñîçäàíà!', mtInformation, [mbOK], 0);
 
end
else
MessageDlg('Ìàòðèöà óæå ñîçäàíà!', mtError, [mbOK], 0); // èíà÷å ñîîáùåíèå îá îøèáêå.
 
end;
 
 
// Ïðè íàæàòèè íà êíîïêó "Çàïîëíèòü ìàòðèöó ñëó÷àéíûìè ÷èñëàìè".
procedure TForm1.BitBtn2Click(Sender: TObject);
var
buttonselect: integer; // ïåðåìåííàÿ äëÿ äèàëîãà.
begin
 
if assigned(MyMatrix) = true then // åñëè îáúåêò ñóùåñòâóåò, òî.
begin
// Çàïîëíèì ìàòðèöó ñëó÷àéíûìè ÷èñëàìè.
MyMatrix.GenerMatr;
 
// Âûâåäåì ñîîáùåíèå îá ýòîì.
buttonselect:= MessageDlg('Ìàòðèöà óñïåøíî çàïîëíåíà! Âûâåñòè ïîëó÷åííóþ ìàòðèöó â êîìïîíåíò StringGrid?', mtInformation, [mbYes, mbNo], 0);
 
// Åñëè áûëà íàæàòà êíîïêà "yes":
if buttonselect = mrYes then
MyMatrix.ShowMatr(StringGrid1);   // âûâîäèì ìàòðèöó.
end
else
MessageDlg('Ìàòðèöà åùå íå ñîçäàíà!', mtError, [mbOk], 0);
 
end;
 
// Ïðè íàæàòèè íà êíîïêó "Âûâåñòè ìàòðèöó â êîìïîíåíò StringGrid".
procedure TForm1.BitBtn3Click(Sender: TObject);
begin
 
if assigned(MyMatrix) = true then // åñëè îáúåêò ñóùåñòâóåò, òî.
  MyMatrix.ShowMatr(StringGrid1) // âûâåëè.
else
  MessageDlg('Ìàòðèöà åùå íå ñîçäàíà!', mtError, [mbOk], 0);
 
end;
 
 
 
// Ïðè ïîêàçå ôîðìû - íàâîäèì êðàñîòèùùó =))
procedure TForm1.FormShow(Sender: TObject);
begin
 
// öåíòðèðóåì åå.
Left:= (Screen.Width - Width) div 2;
Top:= (Screen.Height - Height) div 2;
 
// àíèìèðóåì =)
AnimateWindow(Handle, 500, Aw_center or aw_slide);
 
end;
 
// ñîáûòèå ïðè íàæàòèè íà ÿ÷åéêó òàáëèöû.
procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,
  ARow: Integer; var CanSelect: Boolean);
var
buttonselect: integer; // äëÿ âûáîðà èç äèàëîãà.
begin
 
if assigned(MyMatrix) = true then // åñëè îáúåêò ñóùåñòâóåò, òî.
begin
MyMatrix.DelRow(ARow); // óäàëÿåì ñòðîêó.
 
// Âûâåäåì ñîîáùåíèå îá ýòîì.
buttonselect:= MessageDlg('Ñòðîêà èç ìàòðèöû óñïåøíî óäàëåíà! Âûâåñòè ïîëó÷åííóþ ìàòðèöó â êîìïîíåíò StringGrid?', mtInformation, [mbYes, mbNo], 0);
 
// Åñëè áûëà íàæàòà êíîïêà "yes":
if buttonselect = mrYes then
MyMatrix.ShowMatr(StringGrid1);   // âûâîäèì ìàòðèöó.
 
end
else
MessageDlg('Ìàòðèöà åùå íå ñîçäàíà!', mtError, [mbOk], 0);
 
end;
 
// Ïðè íàæàòèè íà êíîïêó E èëè left_Alt.
procedure TForm1.StringGrid1KeyPress(Sender: TObject; var Key: Char);
var
buttonselect: integer; // ïåðåìåííàÿ äèàëîãà.
begin
 
if assigned(MyMatrix) = true then // åñëè îáúåêò ñóùåñòâóåò, òî.
  if (Key = #64) or (Key = 'e') then // left alt or e.
begin
 
MyMatrix.ReturnMatr; // âîçâðàùàåì èñõîäíóþ ìàòðèöó.
 
// Âûâåäåì ñîîáùåíèå îá ýòîì.
buttonselect:= MessageDlg('Ìàòðèöà óñïåøíî âîçâðàùåíà! Âûâåñòè ïîëó÷åííóþ ìàòðèöó â êîìïîíåíò StringGrid?', mtInformation, [mbYes, mbNo], 0);
 
// Åñëè áûëà íàæàòà êíîïêà "yes":
if buttonselect = mrYes then
MyMatrix.ShowMatr(StringGrid1);   // âûâîäèì ìàòðèöó.
 
end
else
MessageDlg('Ìàòðèöà åùå íå ñîçäàíà!', mtError, [mbOk], 0);
 
end;
 
// Ïðè íàæàòèè íà êíîïêó "Óíè÷òîæèòü ìàòðèöó"
procedure TForm1.BitBtn4Click(Sender: TObject);
begin
 
// óíè÷òîæèì ìàòðèöó, åñëè îíà óæå ñóùåñòâóåò!
if assigned(MyMatrix) = true then
begin
 
// Óíè÷òîæàåì îáúåêò êëàññà.
MyMatrix.Destroy;
 
// Âûâåäåì ñîîáùåíèå îá ýòîì.
MessageDlg('Ìàòðèöà óñïåøíî óíè÷òîæåíà!', mtInformation, [mbOK], 0);
 
// Âñåì íàçëî åùå è èç ïðîãðàììû âûéäåì.
Form1.Close;
Application.Terminate;
 
end
else
MessageDlg('Ìàòðèöà åùå íå ñîçäàíà!', mtError, [mbOK], 0); // èíà÷å ñîîáùåíèå îá îøèáêå.
 
end;
 
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 
// àíèìèðóåì óõîä =)
AnimateWindow(Handle, 500, Aw_center or aw_hide);
 
end;
 
end.

Плюс на всякий случай выложу и сам проект =) Удачи всем, кто столкнется с похожей проблемой =)
Вложения
Тип файла: zip Лабораторная № 3.zip (292.1 Кб, 72 просмотров)
3
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.02.2011, 02:41

Написать программу, которая на основе матрицы А nxm
Написать программу, которая на основе матрицы А nxm (заполненная псевдослучайными числами) строит...

Определить количество 'особых' элементов матрицы A(nxm), B(nxm) принадлежащих главной диагонали
Определить количество 'особых' элементов матрицы A(nxm), B(nxm) принадлежащих главной диагонали....

Написать программу заполнения матрицы NxM числами по порядку
Условие: Написать программу заполнения матрицы NxM числами по порядку.(автоматическое заполнение)....

Написать подпрограмму поиска в каждой строке матрицы NxM элемента с минимальным значением
Совершенно забыл паскаль. Выводит верный результат только по первой строчке. Явно что-то забыл....


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru