страница 1 |
|||||||||||||||||||||||||||||||||||||||||||
Похожие работы
|
Лабораторная работа №7 двухмерные массивы (матрицы) - страница №1/1
![]() ДВУХМЕРНЫЕ МАССИВЫ (МАТРИЦЫ) Кроме приведенного ранее описания многомерный массив можно описать как одномерный, элементами которого являются массивы. Так, например, матрица d из лабораторной работы № 6 может быть описана в виде type matr=array[1.3] of array[1..2] of real; var d,h:matr; В этом случае ссылка на элемент матрицы, лежащий на пересечении i-ой строки и j-го столбца, выглядит следующим образом d[i] [j] . При такой записи описания допускается оператор присваивания h[2]:=d[1]; в соответствии с которым вся первая строка матрицы d засылается во вторую строку матрицы h. Независимо от вида описания, если два массива (вектор или матрица) имеют один и тот же тип, то возможна передача значений всего массива оператором h:=d; Вывод двухмерного массива в компонент StringGrid: for i:=1 to n do for j:=1 to m do StringGrid2.cells[j-1,i-1]:=IntToStr(a[i,j]);
Требуется переслать элементы матрицы a размером n * m в вектор b длиной n * m с сохранением порядка следования элементов. Очевидно, что порядковый номер k элемента в векторе, соответствующий индексам i и j элемента в матрице, вычисляется по формуле k = m ( i-1 ) + j . Программа записывается следующим образом: const n=3; m=4; type matr=array[1..n,1..m] of real; vec=array[1..n*m] of real; const a:matr=(( 0, -2, 1, 3), ( 4, 5, 7, -1), ( 0, 6, 2, 0 )); var i, j, k : integer; b:vec; begin for i:=1 to n do for j:=1 to m do begin k:=m*(i-1)+j; b[k]:=a[i, j] end; for k:=1 to n*m do Memo1.Lines.Add(FormatFloat(‘0.0’,b[k])) end;
const n=3; m=4; type matr=array[1..n,1..m] of real; vec=array[1..n*m] of real; const b:vec=( 0, -2, 1, 3, 4, 5, 7, -1, 0, 6, 2, 0 ); var i, j, k:integer; a:matr; begin for i:=1 to n do for j:=1 to m do begin k:=m*(i-1)+j; a[i,j]:=b[k] end; //вывод матрицы End; 7.2. Транспонирование матрицы Необходимо переставить строки матрицы на место столбцов, а столбцы на место строк, т. е. вычислить b i, j = a j, i . program prtrans; const n=3; m=4; type matr1=array[1..n,1..m] of real; matr2=array[1..m,1..n] of real; const a:matr1=(( 0, -2, 1, 3 ), ( 4, 5, 7, -1 ), ( 0, 6, 2, 0 )); var i, j : integer; b:matr2; begin for i:=1 to m do for j:=1 to n do b[i,j]:=a[j,i]; //вывод матрицы End;
При суммировании необходимо учитывать, что у элементов, расположенных на главной диагонали индексы одинаковые, а у элементов побочной диагонали сумма индексов на единицу больше порядка матрицы. const n:=3; a:array[1..n,1..n] of real=(( 2, 9, 4 ), ( 7, 5, 3 ), ( 6, 1, 8 )); var i, j : integer; sgd, spd: real; begin sgd:=0; spd:=0; for i:=1 to n do begin sgd:=sgd+a[i,i]; spd:=spd+a[i,n-i+1] end; Memo1.Lines.Add(‘sgd=‘+FloatToStr(sgd)+’ ‘+ ‘spd=‘+FloatToStr(spd)) End;
7.4. Суммирование элементов строк Необходимо вычислить сумму элементов каждой строки матрицы a размером n * m. Результат получим в виде вектора ss. Поскольку на поиск в массиве элемента с заданным индексом затрачивается время, для повышения эффективности при вычислении суммы каждой строки используется простая переменная s, что исключает многократное обращение к элементам вектора ss. const n=3; m=4; a:array[1..n,1..m] of real=(( 0, -2, 1, 3 ), ( 4, 5, 7, -1 ), ( 0, 6, 2, 0 )); var i, j :integer; s:real; ss: array[1..n] of real; begin for i:=1 to n do begin s:=0; for j:=1 to m do s:=s+a[i, j]; ss[i]:=s; Memo1.Lines.Add(‘ss(’+IntToStr(i)+’)=’+FormatFloat(‘0.0’,ss[i]) end end;
Перестановка i-ой и j-ой строк выполняется с использованием вспомогательной переменной u. В примере номера переставляемых строк вводятся с клавиатуры. const n=3; m=4; a:array[1..n,1..m] of real=(( 0, -2, 1, 3 ), ( 4, 5, 7, -1 ), ( 0, 6, 2, 0 )); var i, j, k:integer; u:real; begin i:=StrToInt(Edit1.Text); j:=StrToInt(Edit2.Text); for k:=1 to m do begin u:=a[i,k]; a[i,k]:=a[j,k]; a[j,k]:=u end;
//вывод матрицы End;
Номера переставляемых столбцов n1 и n2.
procedure TForm1.FormCreate(Sender: TObject); var i,j:integer; begin
Randomize; with StringGrid1 do begin RowCount:=n; ColCount:=m; for i:=0 to RowCount-1 do for j:=0 to ColCount-1 do cells[j,i]:=IntToStr(-5+random(10)); end;
with StringGrid2 do begin
ColCount:=m; RowCount:=n end; end;
var a:array[1..n,1..m]of integer; n1,n2,y:integer;i,j:integer; begin n1:=StrToInt(Edit1.Text); n2:=StrToInt(Edit2.Text); if (n1<1) or (n1>m) or (n2<1) or (n2>m) then begin ShowMessage('Ошибка! Проверьте номера столбцов!'+ #13#10+'Диапазон номеров от 1 до '+IntToStr(m)+'!'); exit
end; for i:=1 to n do for j:=1 to m do a[i,j]:=StrToInt(StringGrid1.cells[j-1,i-1]); //перестановка for i:=1 to n do begin y:=a[i,n1]; a[i,n1]:=a[i,n2]; a[i,n2]:=y end; //вывод
for i:=1 to n do for j:=1 to m do StringGrid2.cells[j-1,i-1]:=IntToStr(a[i,j]);end;
Требуется удалить строку с заданным номером k. Все строки, начиная с (k+1)-ой перемещаются вверх. Номер удаляемой строки в примере вводится с клавиатуры. const nn=3; m=4; a:array[1..nn,1..m] of real=(( 0, -2, 1, 3 ), ( 4, 5, 7, -1 ), ( 0, 6, 2, 0 )); var i, j, k, n:integer; begin read( k ); n:=nn-1; for i:=k to n do for j:=1 to m do a[i,j]:=a[i+1,j]; //вывод матрицы
Требуется переставить строки в порядке убывания сумм строк. Программа состоит из двух частей. В первой вычисляется вектор сумм строк, а во второй - этот вектор используется как ключ для упорядочения матрицы. Сортировка по методу пузырька. const n=3; m=4; a:array[1..n,1..m] of real=(( 0, -2, 1, 3 ), ( 4, 5, 7, -1 ), ( 0, 6, 2, 0 )); var i, j, k:integer; s:real; ss: array[1..n] of real; begin for i:=1 to n do begin s:=0; for j:=1 to m do s:=s+a[i, j]; ss[i]:=s
end for i:=1 to n-1 do for j:=1 to n- i do if ss[j] < ss[j+1] then begin s:=ss[j]; ss[j]:=ss[j+1]; ss[j+1]:=s; for k:=1 to m do begin s:=a[j,k]; a[j,k]:=a[j+1,k]; a[j+1,k]:=s end
end; //вывод упорядоченной матрицы end.
Дана квадратная матрица размером n * n. Составить программу и рассчитать суммы и произведения элементов матрицы. Написать отчет, содержащий - задание, - принятые обозначения, - программу, - результаты.
Требуется определить:
|
ещё >> |