Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Metodichka_Vinogradova.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
628.22 Кб
Скачать

8.2 Динамические матрицы.

Объем памяти, выделяемой под динамическую матрицу, определяется на этапе выполнения программы.

Размеры матрицы представляются переменной или(в общем случае)целым выражением(или приводимым к нему).

Пример универсального и безопасного выделения памяти под матрицу.

int n,m;

cout<<”Введите размеры матрицы\n”;

cin>>n>>m;

float **A = new float* [n];

for(int i=0;i<n;i++)

A[i]=new float[m];

В этом случае создается переменная A- указатель на float*, в динамической памяти отводится непрерывная область, достаточная для размещения n указателей вещественного типа, и адрес ее начала записывается в указатель A. Затем в цикле поочередно выделяются по m ячеек под очередую строку и указатель на эту строку заносится в A[i].

Динамические массивы нельзя при создании инициализировать.

Для доступа к элементу динамической матрицы указываются все ее индексы, например, A[i][j] или более экзотическим способом: *(A [i]+j) или *(*(A+i)+j). Это возможно, поскольку A[i] является адресом начала i-й строки массива.

8.2.1 Практическая работа с динамическими матрицами.

Размеры матрицы и матрица вводятся с клавиатуры.

Пример 1. В заданной матрице поменять местами строки с максимальной и минимальной суммой элементов

#include<iostream.h>

#include<iomanip.h>

#include<limits.h>

#include<conio.h>

int** input(int& n,int &m)

{int i,j;

cout<<" введите размеры матрицы \n";

cin>>n>>m;

int** w=new int*[n];

cout<<"введите "<<n<<" строк по "<<m<<" элем\n";

for( i=0;i<p;i++){

w[i]=new int[m];

for( j=0;j<m;j++)

cin>>w[i][j];

}

return w;

}

//----------------------------------------

void output(int** w,int n,int m, char title[])

{ cout<<title;

for(int i=0;i<n;i++)

{

for(int j=0;j<m;j++)

cout<<setw(4)<<w[i][j]<<' ';

cout<<endl;

}

}

//-----------------------------------------------

void change(int** w,int n,int m)

{

int i,j,maxSum=INT_MIN,minSum=INT_MAX,Imin,Imax,Sum,z;

for(int i=0;i<n;i++)

{ Sum=0;

for(int j=0;j<m;j++)

Sum+=w[i][j];

if(Sum>maxSum){maxSum=Sum;Imax=i;}

if(Sum<minSum) {minSum=Sum;Imin=i;}

}

for(int j=0;j<m;j++)

{z=w[Imin][j]; w[Imin][j]= w[Imax][j]; w[Imax][j]=z;}

}

//-------------------------------------------------

void main()

{ int n,m;

clrscr();

int**a= input(n,m);

output(a,n,m,"\n исходная матрица\n");

change(a,n,m);

output(a,n,m,"\n измененная матрица\n");

getch();

}

Пример 2. Отсортировать в порядке возрастания те строки матрицы, которые начинаются с отрицательного элемента. Использовать функцию сортировки одномерного массива.

#include<iostream.h>

#include<conio.h>

#include<iomanip.h>

//-----------------------------

void sort(int *w,int m)

{ int k,j,Nmin,z;

for (j=0;j<m-1;j++)

{ Nmin=j;

for (k=j+1;k<m;k++)

if (w[k]<w[Nmin]) Nmin=k;

z=w[j];

w[j]=w[Nmin];

w[Nmin]=z ;

}}

//-----------------------------------------------

int** input(int& n,int &m)

{

cout<<" введите размеры матрицы \n";

cin>>n>>m;

int** w=new int*[n];

cout<<"введите "<<n<<" строк по "<<m<<" элем\n";

for( int i=0;i<p;i++){

w[i]=new int[m];

for(int j=0;j<m;j++)

cin>>w[i][j];

}

return w;

}

//----------------------------------------

void output(int** w,int n,int m, char title[])

{ cout<<title;

for(int i=0;i<n;i++)

{

for(int j=0;j<m;j++)

cout<<setw(4)<<w[i][j]<<' ';

cout<<endl;

}

}

void main()

{ clrscr();

int i,n,m;

int**a=input(n,m);

for( i=0;i<n;i++)

if(a[i][0]<0) sort(a[i],m);

output(a,n,m,"\n измененная матрица \n");

getch();

}

Пример 3.

Вычислить p=a*b+с*d, где a,b,c,d-матрицы размером n*n.

В функция MULT выполняет умножение двух матриц z=x*y,

при этом :

zij =

#include<iostream.h>

#include<conio.h>

#include<iomanip.h>

int** make(int n) //выделение памяти под матрицу

{ int** w =new int*[n];

for( int i=0;i<n;i++)

w[i]=new int[n];

return w;

}

//--------------------------------------

int** input(int n) //заполнение матрицы

{ int**w=make(n);

for( int i=0;i<n;i++){

for(int j=0;j<n;j++)

cin>>w[i][j];

}

return w; }

//----------------------------------------

void output(int** w,int n, char title[]) //вывод матрицы

{ cout<<title;

for(int i=0;i<n;i++)

{

for(int j=0;j<n;j++)

cout<<setw(4)<<w[i][j]<<' ';

cout<<endl;

}

}

//------------------------------------------

void MULT(int** x, int** y, int** z, int n) //умножение матриц z=x*y

{ int sum;

for(int i=0;i<n;i++)

for(int j=0;j<n;j++)

{sum=0;

for(k=0;k<n;k++)

sum+=x[i][k]*y[k][j];

z[i][j]=sum;

}

}

int main()

{ clrscr();

int i,j,n;

cout<<”введите n”;

cin>>n;

int**a=input(n),**b=input(n),**c=input(n),**d=input(n);

int**p=make(n),**t=make(n);

MULT(a,b,p,n);

MULT(c,d,t,n);

for( i=0;i<n;i++)

for(j=0;j<n;j++)

p[i][j]+=t[i][j];

output(p,n,"\n РЕЗУЛЬТАТ: \n");

getch();

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]