Добавил:
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
2
Добавлен:
31.01.2021
Размер:
16.43 Кб
Скачать

Інформатика — Теорія — Масиви як параметри функцій    Автори

|

Контакти

|

Підсистема допомоги

|

Методичні вказівки

|

Анотація

|

Назад

   ІнформатикаФункції : Масиви як параметри функційЗміст курсу

Вступ

Теорія

Визначення й виклик функцій

Передача параметрів

Функції, що не повертають значення

Функції із змінним числом параметрів

Рекурсивні функції

Перевантаження функцій

Передача параметрів за замовчуванням

Масиви як параметри функцій

Шаблони функцій

Практика

Практичне заняття

Лабораторна робота

Поточна перевірка знань

Функції

Висновки

Версія для друку

  Масиви як параметри функцій      При використанні масиву як параметру функції передається покажчик на його перший елемент, іншими словами, масив завжди передається за адресою. При цьому інформація про кількість елементів масиву губиться, і варто передавати його розмірність через окремий параметр.

Приклад 15.Функція, що підсумує елементи одномірного масиву.

double sum(double *mas,int n)

{

     double s=0;

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

          s+=mas[i];

     return s;

}

void main()

{

     double mas1[5]={3.2, 5.3, 5.6, 1.2, 6.3};

     double a=sum(mas1,5);

}

     Якщо функції передається двовимірний масив, то опис відповідного аргументу функції повинен містити кількість стовпців; кількість рядків - несуттєво, оскільки фактично передається покажчик.

Приклад 16.Функція, що перемножує матриці А и В; результат - С. Розмір матриць - не більше 10.

const nmax = 10;

void product (int a[ ][nmax], int b[ ][nmax], int c[ ][nmax],int m, int n, int k)

{

/* m - число рядків у матриці a; n - число рядків у матриці b (повинне бути рівним числу стовпців у матриці a); k - число стовпців у матриці b. */      for (int i=0; i< m; i++)

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

     {

          c[i][j]=0;

          f or (int l=0; l< n; l++)

               c[i][j] + = a[i][l]*b[l][j];

     }

}

     Якщо задані, наприклад, квадратні матриці, то одержати їхній добуток можна так:

product (a, b, c, 5, 5, 5);

     У наведеному прикладі є недолік - тут заздалегідь фіксується максимальна розмірність матриць. Обійти це можна різними способами, один із яких - використання допоміжних масивів покажчиків на масиви.

Приклад 17. Функція, що транспонує квадратну матрицю довільної розмірності n.

void trans ( int n, double *p[ ] )

{

     double x;

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

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

     {

          x=p[i][j];

          p[i][j]=p[j][i];

          p[j][i]=x;

     }

}

void main()

{

     double A[4][4]={ 10, 12, 14, 17,

               15, 13, 11, 0,

               -3, 5.1, 6, 6,

               2, 8, 3, 1};

     double ptr[ ]={(double*)&A[0], (double*)&A[1], (double*)&A[2], (double*)&A[3]};

     int n=4;

     trans (n, ptr);

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

     {

          count<< "\n рядок"<< (i+1)<< ":";

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

               cout<< "\t"<< A[i][j];

          cout<< \n";

     }

}

     У функції main() матриця представлена двовимірним масивом double A[4][4]. Такий масив не можна безпосередньо використовувати як фактичний параметр, що відповідає формальному double *p[]. Тому вводитися додатковий допоміжний масив покажчиків double *ptr[]. Як початкові значення елементам цього масиву привласнюються адреси рядків матриці, перетворені до типу double*.

     Багатомірний масив зі змінними розмірами може бути динамічно сформований усередині функції. У викликувану функцію його можна передати як покажчик на одномірний масив покажчиків на одномірні масиви з елементами відомої розмірності й заданого типу.

Приклад 18. Функція, що формує одиничну матрицю порядку n.

int** singl (int n)

{

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

/* Тип int* [n] - масив покажчиків на цілі. Операція new повертає покажчик на виділену пам'ять під цей масив і тип змінної p є int**. Таким чином, р є масив покажчиків на рядки цілих майбутньої матриці. */

     if (p = = NULL)

     {

          cout<< "Динамічний масив не створений!\n";

          exit(1);

     }

// цикл створення одномірних масивів - рядків матриці:

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

     {

          p[i]=new int[n];

          if( !p[i] )

          {

               cout<<"Не створена динамічний рядок!\n";

               exit(1);

          }

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

               p[i][j]=(i = =j )? 1: 0;

     }

     return p;

}

void main()

{

     int n; cout<< "\n Задайте порядок матриці: ";

     cin>>n;

     int** matr; //Покажчик для формованої матриці

     matr = singl(n);

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

     {

          cout<< "\n рядок";

          cout.width(2);

          cout<< i+1<< ": ";

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

          {

               cout.width(4);

               cout<< matr[i][j];

          }

     }

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

          delete matr[i];

     delete matr;

}

У цій програмі звертання до функції cout.width(k) установлює ширину поля наступного висновку в k позицій, що дозволяє вирівняти вигляд отриманої матриці.

 © 2008 ХНУРЭ, Інформатики, Сінельнікова Т.Ф., informatika@kture.Kharkov.uaРозроблено за допомогою LERSUS

Соседние файлы в папке content