insert(new(pstatictext,init(r,sr))); {выводим матрицу}
end;
end;
r.assign(2,i+2,70,4+i); insert(new(pstatictext,init(r,'_____________________________________________')));
end;
end;
{_______________________________________________}
procedure tmatrix.initmenubar; {Инициализация панели меню}
var
r:trect;
begin
getextent(r);
r.b.y:=succ(r.a.y);
menubar:=new(pmenubar,init(r,newmenu(
newsubmenu('Ввод',hcnocontext,
newmenu(
newitem('Ручной','F3', kbf3,cmvvod,hcnocontext,
newitem('Автоматический','F4',kbf4,cmvval,hcnocontext,
newitem('Из файла','F7',kbf7,cmisfl,hcnocontext,
newline(
newitem('Выход','Alt+X',kbaltx,cmquit,hcnocontext,nil)))))),
newsubmenu('Результат',hcnocontext,
newmenu(
newitem('Все подматрицы','F5', kbf5,cmvvse,hcnocontext,
newitem('По условию','F6',kbf6,cmvusl,hcnocontext,
newline(
newitem('Записать все','F7', kbf7,cmfilv,hcnocontext,
newitem('Записать по условию','F8',kbf8,cmfilu,hcnocontext,
nil)))))),
newitem('О программе','F1', kbf1,cmvhel,hcnocontext,nil))) )))
end;
{_______________________________________________}
procedure tmatrix.initstatusline; {Инициализация строки состояния}
var
r:trect;
begin
getextent(r);
r.a.y:=pred(r.b.y);
statusline:=new(pstatusline,init(r,newstatusdef(0,$ffff,newstatuskey('Alt+X-Выход',kbAltX, cmQuit,nil),nil)));
disablecommands(wincoml);
enablecommands(wincom2)
end;
{_______________________________________________}
procedure tmatrix.GetRandomMatrix; {Автоматический ввод матрицы}
var
i,j:integer;{счётчики}
a,pred,s_i,s_j,s_pred:integer;
r:trect; col,row,max: PInputLine;
inputwindow,inputw:pinputwindow;
begin
r.assign(15,5,65,16);
inputwindow:=new(pinputwindow, Init(r, 'Автоматический ввод'));
withinputwindow^ do
begin{выводим модальное окно, в котором вводим количество строк, столбцов и мак. значение}
r.Assign(37,2,45,3);
col:=New(PInputLine, Init(r,4));
Insert(col); r.Assign(2,2 , 35,3);
Insert(New(PLabel, Init(r, 'Количество строк матрицы', col)));
r.Assign(37,4,45,5);
row:=New(PInputLine, Init(r,4));
Insert(row); r.Assign(2,4,35,5);
Insert(New(PLabel, Init(r, 'Количество столбцов матрицы', row)));
r.Assign(37,6,45,7);
max:=New(PInputLine, Init(r,4)) ;
Insert(max); r.Assign(2,6,35,7);
Insert(New(PLabel, Init(r, 'Максимальное значение элемента', max)));
r.Assign(19,8,32,10);
Insert(New(PButton, Init(r, 'OK', cmOk, bfdefault)));
end;
if desktop^.execview(inputwindow)=cmok then
begin{вводим элементы в матрицу}
inputwindow^.getdata(data);
val(data.col,n,s_i);
val( data.row,m,s_j) ;
val(data.max,pred,s_pred) ;
for i:=1 to N do
for j:=1 to M do
begin
a:=random(pred)+1;
Mxx[i,j]:=a;
end;
mf:=true; {флаг ввода исходной матрицы}
dispose(inputwindow,done);
enablecommands(wincoml);
tmatrix.printmatrix; {выводим рабочую матрицу}
end;
end;
{_______________________________________________}
procedure tmatrix.InputMatrix; {Ручной ввод матрицы}
var
i,j,s_i,s_j:integer; {счётчики}
a:integer;
r:trect;
col,row,c: PInputLine;
inputwindow,inputw:pinputwindow;
s,t:string;
begin
r.assign(15,5,65,16);
inputwindow:=new(pinputwindow, Init(r, 'Ручной ввод'));
with inputwindow^ do
begin{выводим модальное окно, в котором вводим количество строк, столбцов}
r.Assign(37,2,45,3);
col:=New(PInputLine, Init(r,4));
Insert(col);
r.Assign(2,2 , 35,3);
Insert(New(PLabel, Init(r, 'Количество строк матрицы', col)));
r.Assign(37,4,45,5);
row:=New(PInputLine, Init(r,4));
Insert(row);
r.Assign(2,4,35,5);
Insert(New(PLabel, Init(r, 'Количество столбцов матрицы', row)));
r.Assign(19,8,32,10);
Insert(New(PButton, Init(r, 'OK', cmOk, bfdefault)));
end;
if desktop^.execview(inputwindow)=cmok then
begin{водим элементы матрицы в окне}
inputwindow^.getdata(data);
val(data.col,n,s_i);
val( data.row,m,s_j);
dispose(inputwindow,done);
for i:=1 to N do
for j:=1 to M do
begin
str(i,t);
str(j,s);
r.assign(15,5,65,16);
inputwindow:=new(pinputwindow, Init(r, 'Ввод элемента матрицы'));
with inputwindow^ do
begin
r.Assign(2,4,35,5);
Insert(New(PLabel, Init(r, 'Элемент матрицы'+'['+t+','+s+']', c)));
r.Assign(37,4,45,5);
Insert(New(PInputLine, Init(r,4)));
r.Assign(19,8,32,10);
Insert(New(PButton, Init(r, 'OK', cmOk, bfdefault)));
end;
if desktop^.execview(inputwindow)=cmok then
begin{заносим в матрицу Mxx значения}
inputwindow^.getdata(data);
val(data.col,a,s_i);
Mxx[i,j]:=a;
dispose(inputwindow,done);
end;
end;
mf:=true; {флаг ввода исходной матрицы}
enablecommands(wincoml);
tmatrix.printmatrix; {выводим рабочую матрицу}
end;
end;
{_______________________________________________}
procedure tmatrix.fileinput; {ввод данных из файла}
var
pf:pfiledialog;
s:pathstr;
x:char;
i,j:integer;{счётчики}
begin
new(pf,init('*.txt','Выберите нужный файл:','Имя файла',fdopenbutton,0));
if desktop^.execview(pf)=stddlg.cmfileopen then
begin{считывание матрицы из файла}
pf^.getfilename(s);
assign(filework,s);
reset(filework); {открываем файл для чтения}
enablecommands(wincoml);
dispose(pf,done);
i:=1;
j:=1;
while not eof(filework ) do
begin
while not eoln(filework) do
begin
read(filework,mxx[i,j]); {заносим в матрицу значения}
read(filework,x);
j:=j+1;
n:=i;
m:=j-1;
end;
j:=1;
i:=i+1;
readln(filework);
end;
close(filework);{закрываем файл}
tmatrix.printmatrix; {выводим рабочую матрицу}
end;
end;
{_______________________________________________}
procedureSort; {сортируем элементы периметра по возрастанию}
var
i,j:integer; {счётчики}
p:integer; {вспомогательная переменная для обмена значениями}
begin
for i:=2 to l do
for j:=l downto i do
if per[j-1]>per[j] then
begin{меняем местами элементы}
p:=per[j-1];
per[j-1]:=per[j];
per[j]:=p;
end;
end;
{_______________________________________________}
procedure GetPerimetr(n_1,m_1,n_2,m_2:integer); {определение элементов по периметру}
var
i:integer;{счётчик}
k:integer;
begin{обнуляем массив}
for i:=1 to 2*N+2*M do
per[i]:=0;
k:=1;
fori:=m_1 tom_2 do {выбираем элементы столбца периметра}
begin
per[k]:=Mxx[n_1,i];
per[k+1]:=Mxx[n_2,i];
inc(k,2)
end;
fori:=(n_1+1) to (n_2-1) do {выбираем элементы строк периметра}
begin
per[k]:=Mxx[i,m_1];
per[k+1]:=Mxx[i,m_2];
inc(k,2)
end;
dec(k,2);
l:=k;
inc(l);
end;
{_______________________________________________}
procedure PrintSubMatrix(n_1,m_1,n_2,m_2:integer); {выводим в окно результирующую матрицу}
var
i,j,k,l:integer;
r:trect;
s,sr:string;
begin
with wind^ do
begin
r.assign(2,n+4,70,n+20);
insert(new(pstatictext,init(r,' ')));
end;
for i:=n_1 to n_2 do
begin
for j:=m_1 to m_2 do
begin
str(mxx[i,j],sr);
with wind^ do
begin
r.assign(1+j*4,1+i+n+6,4+j*4,n+3+i+7);
insert(new(pstatictext,init(r,sr)));
end;
end;
end;
readkey;
end;
{_______________________________________________}
procedure PrintSubMatrixfile(n_1,m_1,n_2,m_2:integer); {выводим в файл результ-щую матрицу}
var
i,j,k,l:integer;
begin
for i:=n_1 to n_2 do
begin
for j:=m_1 to m_2 do
write(fileresu,mxx[i,j]:3,' ');
writeln(fileresu);
end;
writeln(fileresu);
writeln(fileresu);
end;
{_______________________________________________}
functionGeomProg:boolean; {функция вычисления геометрической прогрессии}
var
i:integer;
dv:real;
begin
Sort; {сортируем по возрастанию}
GeomProg:=true; {образует геометрическую прогрессию}
dv:=per[2]/per[1];
for i:= 2 to l-1 do
if per[i+1]/per[i]<>dv then
begin
GeomProg:=false; {не образует геометрическую прогрессию}
break;
end;
end;
{_______________________________________________}
procedure tmatrix.Main(f:boolean); {вывод результата}
var
Sn,Sm,Snn,Smm:integer; {угловые счётчики периметра}
begin
Sn:=2;
Sm:=2;
Snn:=1;
Smm:=1;
while (Sn<>N) or (Sm<>M) do {перебираем подматрицы}
begin
GetPerimetr(Snn,Smm,(Snn+Sn)-1,(Smm+Sm)-1); {определение эл-ов по периметру подматриц}
if f then {по условию}
begin
ifGeomProgthen{геометрическая прогрессия}
if fil then {в файл}
PrintSubMatrixfile(Snn,Smm,(Snn+Sn)-1,(Smm+Sm)-1)
else {в окно}
PrintSubMatrix(Snn,Smm,(Snn+Sn)-1,(Smm+Sm)-1);
end
else {все подматрицы}
if fil then {в файл}
PrintSubMatrixfile(Snn,Smm,(Snn+Sn)-1,(Smm+Sm)-1)
else{в окно}
PrintSubMatrix(Snn,Smm,(Snn+Sn)-1,(Smm+Sm)-1);
if (Smm+Sm)<=M then
inc(Smm)
else
begin
if (Snn+Sn)<=N then
begin
inc(Snn);
Smm:=1;
end
else
begin
if Sm = M then
begin
Sm:=2;
inc(Sn);
snn:=1;
smm:=1;
end
else
begin
snn:=1;
smm:=1;
inc(sm)
end;
end;
end;
end;
GetPerimetr(1,1,N,M); {определение элементов по периметру матрицы}
if f then {по условию}
begin
ifGeomProgthen{геометрическая прогрессия}
if fil then {в файл}
PrintSubMatrixfile(1,1,n,m)
else {в окно}
PrintSubMatrix(1,1,N,M);
end
else {все подматрицы}
if fil then {в файл}
PrintSubMatrixfile(1,1,n,m)
Else{в окно}
begin
PrintSubMatrix(1,1,N,M);
readkey;
end;
end;
{_______________________________________________}
procedure tmatrix.fileoutputv(f:boolean); {окно записи в файл результатов}
var
pf:pfiledialog;
s:pathstr;
x:char;
i,j:integer;
begin
new(pf,init('*.txt','Выберите нужный файл:','Имя файла',fdopenbutton,0));
if desktop^.execview(pf)=stddlg.cmfileopen then
begin
pf^.getfilename(s);
assign(fileresu,s);
rewrite(fileresu); {открываем файл для записи}
fil:=true;
if f then {по условию}
tmatrix.main(true)
else{все подматрицы}
tmatrix.main(false);
dispose(pf,done);
close (fileresu);{закрываем файл}
end;
fil:=false;
end;
{_______________________________________________}
procedure tmatrix.handleevent(var event:tevent);
var
r:trect;
i:integer;
begin
if event.what=evcommand then
case event.command of
cmisfl:tmatrix.fileinput;
cmfilu:tmatrix.fileoutputv(true);
cmfilv: tmatrix.fileoutputv(false);
cmvvod:tmatrix.inputmatrix;
cmvval:tmatrix.getrandommatrix;
cmvhel:messagebox(#3'Вывод подматриц,'#13+#3'периметр которых -'#13+#3'геометрическая прогрессия'#13+ #3'Алексей 2010',nil,mfinformation or mfokbutton);
cmvvse:
begin
with wind^ do
begin
r.assign(2,n+3,70,n+5);
insert(new(pstatictext,init(r,'Все подматрицы:')));
end;
tmatrix.main(false);
end;
cmvusl:
begin
with wind^ do
begin
r.assign(2,n+3,70,n+5 );
insert(new(pstatictext,init(r,'Подматрицы, у которых периметр - геометрическая прогрессия: ')));
end;
tmatrix.main(true);
end;
cmQuit: if messagebox(#3'Завершить работу?',nil,mfconfirmation or mfokcancel)=cmcancel then clearevent(event);
else
exit
end;
inherited handleevent(event);
end;
{_______________________________________________}
end.
6 Тестирование программы
Объектом испытаний является разработанная программа. Целью испытаний является проверка соответствия программного продукта поставленным требованиям.
Для проведения испытаний данные вводились с клавиатуры. Размерность тестируемой матрицы 3 – строки, 4 – столбца. Исходная матрица (рисунок 6):
Рисунок 6 – Исходная рабочая матрица
На рисунке 7 представлен результат работы программы по условию (рисунок 2).
Рисунок 7 – Результат работы программы в текстовом виде
Также, проводилось тестирование с различными примерами, которые здесь не приведены, но которые также показали верный результат.