В головной программе матрица должна быть описана с фиксированной размерностью с 10 столбцами.


Else

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

Треугольные динамические матрицы

— Выделение памяти под верхний треугольник квадратной матрицы nхn:

int **p;

p = new int *[n];

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

p[i] = new int [n-i];

— Выделение памяти под нижний треугольник такой же матрицы:

int **p;

p = new int *[n];

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

p[i] = new int [i+1];

 

Пример 10.6. Динамическая единичная матрица (вариант1).
include <iostream.h>
void main ()
{int i, j, n;
cout << "Enter n"; cin >> n;

int **matr;
matr= new int *[n];
//массив указателей
if (matr == NULL)

{cout <<"Error"; return;}
for (i=0;i<n;i++)

matr[i]= new int [n];
for (i=0;i<n;i++)
for (j=0;j<n;j++)
if (i != j)
*(*(matr+i)+j) =0;
else
*(*(matr+i)+j) =1;
for (i=0;i<n;i++)
{
cout << endl;
for (int j=0;j<n;j++)
cout<<*(*(matr+i)+j)<<' '; }
for (i=0;i<n;i++)
delete *(matr+i);

delete [] matr;
}

Пример 10.7. Динамическая единичная матрица (вариант2).
int i,j,n;
cout << ”N“;
cin >> n;
float **matr;
matr= (float**)malloc(n*4);
if (matr == NULL)
{cout <<”error”; return;}
for (i=0;i<n;i++)
matr[i] =(float*)malloc(n*sizeof (float));
for (i=0;i<n;i++)
for (j=0;j<n;j++)
if (i != j)
*(*(matr+i)+j) =0;
else
*(*(matr+i)+j) =1;
for (i=0;i<n;i++)
{ cout << endl;
for (int j=0;j<n;j++)
cout << *(*(matr+i)+j) << ' ';
}
for (i=0;i<n;i++)
free(*(matr+i));
free(matr);
cout << endl;

}

Одномерные массивы – параметры
Формальный параметр массив
можно объявить тремя способами:
· массив с фиксированной длиной;
· безразмерный массив;
· указатель, тип которого будет совпадать с типом элементов массива.
При вызове функции, параметром которой является массив, в качестве фактического параметра указывается имя массива без индексов.

Пример 10.8. Нахождение суммы элементов массива.

int sum1(int a[100], int n)
{
for (int i=0, int s=0; i<n-1;
s += a[i++]);
return s;
}

int sum2(int a[], int n)
{
int s=0;
for (int i=-1;i<n-1;s+=a[++i]);
return s;
}

int sum3(int *a, int n)
{
int s=0;
for (int i=-1;i<n-1;s+=a[++i]);
return s;
}

int main()
{int a[30], *b,
c[]={1,22,35,4,5,7,9,6,44,55,100};
int r, n;
srand(time(0));
n=rand()%29+1; //размер<30
b=new int[n];
for (int i=0; i<n; i++)
{a[i] = rand()%100;
b[i] = rand()%10;}
r1= sum1(a,n);
r2= sum2(c,sizeof(c)/sizeof(int));
r3= sum3(b,n);
}

 

Функции, возвращающие указатель на массив

 

Пример 10.9. Слияние двух упорядоченных массивов

#include <iostream>

using namespace std;

int* fun(int n, int* a, int m, int* b)

{ int* x=new int[n+m];

//массив-результат

int ia=0,ib=0,ix=0;

while ((ia<n)&&(ib<m))

//цикл до конца одного из массивов

if (a[ia]>b[ib])

x[ix++]=b[ib++];

else x[ix++]=a[ia++];

if (ia>=n)

while(ib<m)

x[ix++]=b[ib++];

while(ia<n)

x[ix++]=a[ia++];

return x;

}

 

void main()

{setlocale(LC_ALL,".1251");

int p[]={3,7,8,55};

int s[]={1,4,6,9,23,34};

int* h;//указатель на массив-результат

int kp=sizeof(p)/sizeof(p[0]);

int ks=sizeof(s)/sizeof(s[0]);

h=fun(kp,p,ks,s);

cout<<"результат"<<endl;

for(int i=0;i<kp+ks;i++)

cout << " " << h[i];

cout<<endl;

delete[]h;

}

Двумерные массивы – параметры

Двумерный массив как формальный параметр можно объявить следующими способами:
1.Двумерный массив с фиксированной длиной;
2.Двумерный массив с фиксированной размерностью первого измерения, т.е. второй размерностью (количество столбцов);
3.Указатель, которому при вызове будет соответствовать адрес первого элемента двумерного массива;
4. Массив указателей на массивы строк;
5.Динамический двумерный массив.

Прототипы соответствующих функций будут иметь следующий вид:
1)int f1(int ma[20][30]);
2)int f21(int ma[][30], int n);
или
int f22(int ma[][30],int n, int m);
3)int f3(int *ma, int n, int m);
4)int f4(int *ma[],int n,int m);
5)int f5(int **ma, int n,int m);

Варианты I-II.

Пример 10.10. Функция транспонирования квадратной матрицы (варианты 1-2).
void transpon(int Ma[10][10],int n)

//void transpon(int Ma[][10],int n)

{int r;

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

for (int j=i+1; j<n; j++)

{

r=Ma[i][j];

Ma[i][j]=Ma[j][i];

Ma[j][i]=r;

}

}

int main()

{int Matr[10][10];

int k;

cin >> k;

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

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

Matr[i][j]=rand()%10;

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

{for (int j=0; j<k; j++)

cout << Matr[i][j] << " ";

cout << endl;

}

transpon(Matr,k);

cout << ”---------------\n”;

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

{for (int j=0; j<k; j++)

cout << Matr[i][j] << " ";

cout << endl;

}

return 0;

}