Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
???????4-???_??????? ?_?????_16_11_14.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.11 Mб
Скачать

Передача в функции динамических массивов

При передаче из подпрограмм в качестве параметров динамических массивов, являющихся результатами, приходится использовать указатели на указатели (две звездочки) при работе с одномерными массивами или даже указатель на указатель на указатель (три звездочки) при работе с двумерными массивами. Это связано с тем, что при передаче параметров по указателю (адресу) необходимо передавать именно адрес передаваемого объекта. Поскольку динамический одномерный массив определяется с помощью указателя, то при передаче в функцию необходимо передавать адрес этого указателя. Соответственно динамическая матрица определяется как указатель на указатель, то передача параметра представляет собой передачу указателя на указатель массива, который хранит указатели на строки матрицы.

Пример программы 10. В первом примере рассматривается функция ввода исходных данных (количества элементов и сакмих элементов динамического массива), фвункция вывода элементов массива, а также функция преобразования элементов массива путем умножения каждого элемента на отношение максимального элемента к минимальному элементу.

Выделение динамической памяти для массива производится в функции ввода исходных данных.

#include "stdafx.h"

#include "stdio.h"

#include "conio.h"

#include "D:\\temp\\RusString.h"

void input(float **a,int *n);

void output(float *a,int n);

void preob(float *a,int n);

int _tmain(int argc, _TCHAR* argv[])

{

float *a;

int n;

OutPuts("Ввод исходных данных");

input(&a,&n);

OutPuts("Вывод исходного массива");

output(a,n);

//преобразования массива

preob(a,n);

OutPuts("\nВывод преобразованного массива");

output(a,n);

getch();

delete a;

return 0;

}

void input(float **a,int *n)

{//Введите количества элементов

//и сакмих элементов динамического массива

OutPuts("Введите количество элементов массива");

scanf("%d",n);

*a=new float[*n];

OutPuts("Введите элементы массива");

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

scanf("%f",&(*a)[i]);

}

void output(float *a,int n)

{//функция вывода одномерного массива

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

printf("%5.1f ",a[i]);

}

void preob(float *a,int n)

{//функция преобразования одномерного массива

float max,min;

max=a[0]; min=a[0];

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

if (a[i]>max)

max=a[i];

else

if(a[i]<min)

min=a[i];

float y=max/min;

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

a[i]*=y;

}

/* Протокол ввода - вывода

Ввод исходных данных

Введите количество элементов массива

4

Введите элементы массива

3 1 5 4

Вывод исходного массива

3.0 1.0 5.0 4.0

Вывод преобразованного массива

15.0 5.025.020.0

*/

Пример программы 11. Второй пример иллюстрирует раболту с динамическими матрицами, имеющими треугольный вид. Здесь так же организованы функции ввода исходных данных, вывода матрицы и обработки матриц. Обработка матриц заключается в вычитании двух матриц и формировании результата, представляющего собой третью треугольную матрицу.

#include "stdafx.h"

#include "stdio.h"

#include "conio.h"

#include "D:\\temp\\RusString.h"

void input(float ***a,int *n);

void output(float **a,int n);

void preob(float **a,float **b,float ***c,int n);

int _tmain(int argc, _TCHAR* argv[])

{

float **a,**b,**c;

int n,m;

OutPuts("Ввод матрицы a");

input(&a,&n);

OutPuts("Ввод матрицы b");

input(&b,&m);

OutPuts("Вывод матрицы a");

output(a,n);

OutPuts("Вывод матрицы b");

output(b,m);

if (n==m)

{

preob(a,b,&c,n);

OutPuts("Вывод матрицы c");

output(c,n);

}

getch();

return 0;

}

void input(float ***a,int *n)

{//функция ввода исходных данных

OutPuts("Введите количество строк матрицы");

scanf("%d",n);

*a=new float *[*n];

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

(*a)[i]=new float [i+1];

OutPuts("Введите элементы матрицы");

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

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

scanf("%f",&(*a)[i][j]);

}

void output(float **a,int n)

{//функция вывода матрицы

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

{

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

printf("%5.1f ",a[i][j]);

printf("\n");

}

}

void preob(float **a,float **b,float ***c,int n)

{//функция нахождения разности двух матриц

*c=new float *[n];

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

(*c)[i]=new float [i+1];

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

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

(*c)[i][j]=a[i][j]-b[i][j];

}

/* Протокол ввода - вывода

3

Введите элементы матрицы

1

1 1

1 1 1

Ввод матрицы b

Введите количество строк матрицы

3

Введите элементы матрицы

2

2 2

2 2 2

Вывод матрицы a

1.0

1.0 1.0

1.0 1.0 1.0

Вывод матрицы b

2.0

2.0 2.0

2.0 2.0 2.0

Вывод матрицы c

-1.0

-1.0-1.0

-1.0-1.0-1.0

*/

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