В головной программе матрица должна быть описана с фиксированной размерностью с 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;
}