Число столбцов нечётно – был произведён сдвиг «вниз»
0 0 1111111111
0 123 0
456 0 0
1234567890 0 789
0 15 0
0 0 -13
915 -376 19
Результат выполнения четвёртого задания:
Матрица, «развёрнутая» против часовой стрелки: 0; 456; 1234567890; 0; 0; 915; 0; 0; 1111111111; 19; -13; 0; 789; 0; 0; 123; 0; 0; 15; 0; -376
Результат выполнения пятого задания:
Строки отсортированы в невозрастающем порядке сумм:
1234567890 0 789
0 0 1111111111
915 -376 19
456 0 0
0 123 0
0 15 0
0 0 -13
Приложение 2. Полный листинг формы (файл form.pas)
14 {
15 Модуль, содержащий форму, переменную для хранения исходной матрицы,
16 процедуры синхронизации содержания матрицы и элементов формы, а так же
17 процедуру задания размеров матрицы
18 }
19 unit form;
20
21 interface
22
23 uses
24 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
25 Dialogs, Menus, StdCtrls, ExtCtrls, ComCtrls, Grids,
26 //модули программы
27 fileIO, MatrixOperations;
28
29 type
30 TMainForm = class(TForm)
31 Pages: TPageControl;
32 Task1: TTabSheet;
33 Task2: TTabSheet;
34 Task3: TTabSheet;
35 Task4: TTabSheet;
36 Task5: TTabSheet;
37 Menu: TMainMenu;
38 A1: TMenuItem;
39 load: TMenuItem;
40 save: TMenuItem;
41 N1: TMenuItem;
42 quit: TMenuItem;
43 N4: TMenuItem;
44 M_Task1: TMenuItem;
45 M_Task2: TMenuItem;
46 M_Task3: TMenuItem;
47 M_Task4: TMenuItem;
48 M_Task5: TMenuItem;
49 GroupBox1: TGroupBox;
50 G_Matrix: TStringGrid;
51 E_RowsN: TEdit;
52 Label1: TLabel;
53 Label2: TLabel;
54 E_ColsN: TEdit;
55 B_SetDimms: TButton;
56 SaveDialog: TSaveDialog;
57 OpenDialog: TOpenDialog;
58 Label3: TLabel;
59 Label4: TLabel;
60 G_Task1B: TStringGrid;
61 Label5: TLabel;
62 Label6: TLabel;
63 G_Task1C: TStringGrid;
64 B_Task1Run: TButton;
65 Label7: TLabel;
66 Label8: TLabel;
67 Label9: TLabel;
68 E_Task2S1: TEdit;
69 B_Task2Run: TButton;
70 E_Task2S2: TEdit;
71 L_Task2MatrxChanged: TLabel;
72 Label10: TLabel;
73 B_Task3Run: TButton;
74 L_Task3Result: TLabel;
75 Label11: TLabel;
76 B_Task4Run: TButton;
77 Label12: TLabel;
78 B_Task5Run: TButton;
79 about: TMenuItem;
80 MEM_Task4: TMemo;
81 procedure saveClick(Sender: TObject);
82 procedure loadClick(Sender: TObject);
83 procedure B_SetDimmsClick(Sender: TObject);
84 procedure FormCreate(Sender: TObject);
85 procedure quitClick(Sender: TObject);
86 procedure M_Task1Click(Sender: TObject);
87 procedure M_Task2Click(Sender: TObject);
88 procedure M_Task3Click(Sender: TObject);
89 procedure M_Task4Click(Sender: TObject);
90 procedure M_Task5Click(Sender: TObject);
91 procedure B_Task1RunClick(Sender: TObject);
92 procedure FormDestroy(Sender: TObject);
93 procedure B_Task2RunClick(Sender: TObject);
94 procedure B_Task3RunClick(Sender: TObject);
95 procedure B_Task4RunClick(Sender: TObject);
96 procedure B_Task5RunClick(Sender: TObject);
97 procedure aboutClick(Sender: TObject);
98 private
99 procedure readMatrix;
100 procedure writeMatrix;
101 public
102 published
103 { Public declarations }
104 end;
105
106 var
107 MainForm: TMainForm;
108 workMatrix: TMatrix;
109
110 implementation
111
112 uses Math;
113
114 {$R *.dfm}
115
116 {заполнить матрицу в соответствии с содержанием таблицы на форме}
117 procedure TMainForm.ReadMatrix;
118 var rowN, colN: integer;
119 begin
120 SetLength(workMatrix, G_Matrix.RowCount-1, G_Matrix.ColCount-1);
121 for rowN:= 0 to G_Matrix.RowCount-2 do
122 for colN:= 0 to G_Matrix.ColCount-2 do
123 workMatrix[rowN, colN]:= StrToIntDef(G_Matrix.Cells[colN+1, rowN+1], 0);
124 end;
125
126 {заполнить таблицу на форме в соответствии с содержанием матрицы}
127 procedure TMainForm.writeMatrix;
128 var rowN, colN: integer;
129 begin
130 G_Matrix.Cells[1, 1]:= '';//если матрица пуста
131 //обновим размеры матрицы
132 E_RowsN.Text:= IntToStr(high(workMatrix) + 1);
133 if(E_RowsN.Text <> '0') then
134 E_ColsN.Text:= IntToStr(high(workMatrix[low(workMatrix)]) + 1)
135 else E_ColsN.Text:= '0';
136 B_SetDimmsClick(self);
137 //заполним таблицу
138 for rowN:= low(workMatrix) to high(workMatrix) do
139 for colN:= low(workMatrix[rowN]) to high(workMatrix[rowN]) do
140 G_Matrix.Cells[colN+1, rowN+1]:= IntToStr(workMatrix[rowN, colN]);
141 end;
142
143 {обработчик Файл->Сохранить}
144 procedure TMainForm.saveClick(Sender: TObject);
145 var
146 outFile: TextFile;
147 begin
148 //отобразим диалог выбора файла для сохранения, если отмена - выходим
149 if SaveDialog.Execute = false then exit;
150 AssignFile(outFile, SaveDialog.Files[0]);
151 ReWrite(outFile);//создадим файл
152
153 readMatrix;//прочтём матрицу из таблицы
154 Write2DArray(workMatrix, outFile);//запишем матрицу в файл
155
156 CloseFile(outFile);//закроем файл
157
158 end;
159
160 {обработчик Файл->Загрузить}
161 procedure TMainForm.loadClick(Sender: TObject);
162 var
163 inFile: TextFile;
164 begin
165 //отобразим диалог выбора фала для загрузки, если отмена - выходим
166 if OpenDialog.Execute = false then exit;
167 AssignFile(inFile, OpenDialog.Files[0]);
168 Reset(inFile);//подготовим файл к чтению
169
170 Read2DArray(workMatrix, inFile);//прочтём матрицу из файла
171 writeMatrix;//отобразим матрицу
172
173 CloseFile(inFile);//закроем файл
174 end;
175
176 {обраюотчик уствновки размеров матрицы}
177 procedure TMainForm.B_SetDimmsClick(Sender: TObject);
178 var
179 i: integer;
180 RowsN, ColsN: integer;
181 begin
182 //значения размеров не должны быть меньше 1
183 RowsN:= StrToIntDef(E_RowsN.Text, 0);
184 if RowsN < 1 then begin RowsN:= 1; E_RowsN.Text:= '1' end;
185 ColsN:= StrToIntDef(E_ColsN.Text, 0);
186 if ColsN < 1 then begin ColsN:= 1; E_ColsN.Text:= '1' end;
187 //число строк и столбцов в таблице, учитывая колонку и строку с номерами
188 G_Matrix.RowCount:= RowsN + 1;
189 G_Matrix.ColCount:= ColsN + 1;
190 //в этих таблицах отображаются одномерные массивы из первого задания
191 G_Task1B.RowCount:= RowsN;
192 G_Task1C.RowCount:= RowsN;
193 //одномерный массив из четвёртого задания имеет длину, равную числу элементов исходной матрицы
194 //G_Task4.ColCount:= RowsN * ColsN;
195 //расставим номера строк и столбцов
196 for i:= 0 to RowsN do
197 begin
198 G_Matrix.Cells[0, i+1]:= IntToStr(i+1);
199 G_Task1B.Cells[0, i]:= IntToStr(i+1);
200 G_Task1C.Cells[0, i]:= IntToStr(i+1);
201 end;
202 for i:= 0 to ColsN do
203 G_Matrix.Cells[i+1, 0]:= IntToStr(i+1);
204
205 //for i:= 0 to RowsN * ColsN do
206 // G_Task4.Cells[i, 0]:= IntToStr(i+1);
207 G_Matrix.Refresh;
208 end;
209
210 {при создании формы задаём размер матрицы по умолчанию}
211 procedure TMainForm.FormCreate(Sender: TObject);
212 begin
213 B_SetDimmsClick(Sender);
214 end;
215
216 {при уничтожении формы освобождаем память, выделенную для хранения матрицы}
217 procedure TMainForm.FormDestroy(Sender: TObject);
218 begin
219 workMatrix:= nil;
220 end;
221
222 {обработчик Файл->Выход}
223 procedure TMainForm.quitClick(Sender: TObject);
224 begin
225 if mrYes = MessageDlg('Вы уверены, что хотите выйти?', mtConfirmation, [mbYes, mbNo], 0)
226 then Close;
227 end;
228
229 {обработчик Задачи->задача 1}
230 procedure TMainForm.M_Task1Click(Sender: TObject);
231 begin
232 Pages.ActivePageIndex:= 0;
233 end;
234 {обработчик Задачи->задача 2}
235 procedure TMainForm.M_Task2Click(Sender: TObject);
236 begin
237 Pages.ActivePageIndex:= 1;
238 end;
239 {обработчик Задачи->задача 3}
240 procedure TMainForm.M_Task3Click(Sender: TObject);
241 begin
242 Pages.ActivePageIndex:= 2;
243 end;
244 {обработчик Задачи->задача 4}
245 procedure TMainForm.M_Task4Click(Sender: TObject);
246 begin
247 Pages.ActivePageIndex:= 3;
248 end;
249 {обработчик Задачи->задача 5}
250 procedure TMainForm.M_Task5Click(Sender: TObject);
251 begin
252 Pages.ActivePageIndex:= 4;
253 end;
254
255 {выполнение первого задания}
256 procedure TMainForm.B_Task1RunClick(Sender: TObject);
257 var
258 maxVal: TVector; //массив максимальных элементов из каждой строки
259 maxValCol: TVector; //массив номеров столбцов с максимальными элементами
260 RowN: integer;
261 begin
262 readMatrix;//прочитаем матрицу из таблицы
263 GetMaxVals(maxVal, maxValCol, workMatrix);//сформируем массивы по заданию
264 for RowN:= low(maxVal) to high(maxVal) do
265 begin//выведем сформированные массивы в элементы формы
266 G_Task1B.Cells[1, RowN]:= IntToStr(maxVal[RowN]);
267 G_Task1C.Cells[1, RowN]:= IntToStr(maxValCol[RowN]+1);
268 end;
269 //освободим память
270 maxVal:= nil;
271 maxValCol:= nil;
272 end;
273
274 {выполнение второго задания}
275 procedure TMainForm.B_Task2RunClick(Sender: TObject);
276 var S1, S2: Int64;//суммы выше и ниже пересечения диагоналей
277 begin
278 readMatrix;//проситаем матрицу из таблицы
279 //высчитаем суммы
280 S1:= GetSumAbove(workMatrix);
281 S2:= GetSumBelow(workMatrix);
282 //выведем суммы в элементы формы
283 E_Task2S1.Text:= IntToStr(S1);
284 E_Task2S2.Text:= IntToStr(S2);
285 if S1 >= S2 then L_Task2MatrxChanged.Caption:= 'Матрица не была изменена'
286 else
287 begin//если S1 < S2, то
288 SwapAboveBelow(workMatrix);//меняем местами элементы выше и ниже пересечения диагоналей
289 writeMatrix;//выводим изменённую матрицу на форму
290 L_Task2MatrxChanged.Caption:= 'Матрица была изменена'
291 end;
292 end;
293
294 {выполнение третьего задания}
295 procedure TMainForm.B_Task3RunClick(Sender: TObject);
296 begin
297 readMatrix;//прочтём матрицу из таблицы
298 if (high(workMatrix)+1) mod 2 = 0 then
299 begin//если число строк - чётное
300 CircuarShift(workMatrix, true);//осуществим циклический сдвиг вверх
301 L_Task3Result.Caption:= 'был произведён сдвиг "вверх"';
302 end
303 else
304 begin//иначе, если число строк - нечётное
305 CircuarShift(workMatrix, false);//осуществим циклический сдвиг вниз
306 L_Task3Result.Caption:= 'был произведён сдвиг "вниз"';
307 end;
308 writeMatrix;//выведем изменённую матрицу в таблицу
309 end;
310
311 {выполнение четвёртого задания}
312 procedure TMainForm.B_Task4RunClick(Sender: TObject);
313 var arrayB: TVector;//массив, содержащий "развёрнутую" матрицу
314 var i: integer;
315 begin
316 readMatrix;//прочтём матрицу из таблицы
317 UnwindMatrix(workMatrix, arrayB);//наполним массив, обходя матрицу по спирали
318 MEM_Task4.Lines[0]:= '';
319 for i:= 0 to high(arrayB) do
320 begin//выведем все элементы из массива на форму
321 //G_Task4.Cells[i, 1]:= IntToStr(arrayB[i]);
322 MEM_Task4.Lines[0]:= MEM_Task4.Lines[0] + IntToStr(arrayB[i]) + '; '
323 end;
324 arrayB:= nil;//освободим память
325 end;
326
327 {выполнение пятого задания}
328 procedure TMainForm.B_Task5RunClick(Sender: TObject);
329 begin
330 readMatrix;//прочтём матрицу из таблицы
331 SortRows(workMatrix);//отсортируем строки матрицы по убыванию сумм
332 writeMatrix;//выведем матрицу в таблицу
333 end;
334 {обработчик About}
335 procedure TMainForm.aboutClick(Sender: TObject);
336 var info: string;
337 begin
338 info:= 'Курсовая работа по дисциплине "Программирование на ЯВУ"'#10#10 +
339 'Тема: "Работа с двумерными числовыми массивами"'#10 +
340 'Выполнил: студент группы ВСМ-06-08 Филон Д. В.'#10#10#10 +
341 #9#9#9#9#9#9'Москва 2010 год';
342 MessageDlg(info, mtInformation, [mbIgnore], 0);
343 end;
344 end.