Смекни!
smekni.com

Работа с двумерными числовыми массивами (стр. 5 из 5)

Число столбцов нечётно – был произведён сдвиг «вниз»

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.