Методичка_Ci / LEK9
.DOCЛ е к ц и я №9
Передача масивів у функції
Мета роботи: отримати навички роботи з масивами у функціях.
9.1. Теоретичні відомості
Одномірні масиви
Масиви можуть бути параметрами функцій, і функції як результат можуть повертати вказівник на масив. Розглянемо ці можливості.
При використанні масивів як параметрів функції виникає необхідність визначення в тілі функції кількості елементів масиву, що є аргументом при звертанні до функції.
При роботі з рядками - масивами типу char[], проблема розв'язується просто, оскільки останній елемент рядка має значення '\0'. Тому при обробці масиву-аргументу кожен його елемент аналізується на наявність символу кінця рядка.
Приклад 1. Рядок як параметр функції.
Потрібно скласти програму, що містить функцію, яка підраховує кількість елементів у рядку. Можливий варіант програми має вид:
//Масиви у функціях
#include <iostream.h>;
int dl(char[]);//прототип функції dl
void main()
{
char p[]="кафедра";
cout << "\n Довжина рядка дорівнює:" << dl(p);
}
int dl(char c[])
{
int i;
for(i=0;;i++)
if (c[i]=='\0') break;
return i;
}
У результаті виконання програми на екран буде видане повідомлення:
Довжина рядка дорівнює: 7.
Якщо масив-параметр функції не є символьним рядком, то необхідно або використовувати масиви з заздалегідь відомим числом елементів, або передавати розмір масиву за допомогою додаткового параметра. Наступні два приклади ілюструють ці можливості.
Приклад 2. Одномірний масив як параметр функції.
Нехай потрібно скласти програму, у якій функція обчислює суму елементів масиву, що складає з 5 елементів. Можливий варіант програми має вид:
// Одномірний масив як параметр
#include <iostream.h>
int sum(float x[5])
{
float s=0;
for(int i=0;i<5;i++) s=s+x[i];
return s;
}
void main()
{
float z[5], y;
for(int i=0;i<5;i++)
{
cout<<"\n Введіть черговий елемент масиву:";
cin >> z[i];
}
y=sum(z);
cout<<"\n Сума елементів масиву:”<< y;
}
У результаті виконання програми на екран буде виведене значення суми елементів масиву z.
У приведеному прикладі заздалегідь відоме число елементів — 5, тому у функції всього один параметр — масив x. Оскільки у функції існує значення, що повертається, то виклик функції може бути тільки виразом чи частиною виразу. У програмі оператор присвоювання y=sum(z); містить такий вираз у правій частині. Тут аргументом функції є масив z.
Приклад 3. Одномірний масив з довільною кількістю елементів як параметр функції.
Нехай потрібно скласти програму зі звертанням до функції, яка повертає максимальний елемент одномірного масиву з довільною кількістю елементів.
// Пошук максимального елемента
#include <iostream.h>
float max(int n,float a[])
{
float m=a[0];
for(int i=1;i<n;i++)
if (m<a[i]) m=a[i];
return m;
}
void main()
{
float z[6];
for(int i=0;i<6;i++)
{
cout<<"\n Введіть черговий елемент масиву:";
cin >> z[i];
}
cout <<"\n Максимальний елемент масиву:"<< max(6,z);
}
У результаті виконання програми на екран монітора буде видане повідомлення зі значенням максимального елемента масиву z, який у даному прикладі складається із шести елементів.
Ім'я масиву являє собою константний вказівник на адресу нульового елемента масиву. Тому у будь-якого масиві, використовуваного як параметр функції, можна здійснювати зміну його елементів при виконанні тіла функції.
Приклад 4. Масиви з довільною кількістю елементів як параметри функції.
Нехай потрібно скласти програму з функцією, що формує як результат масив, кожен елемент якого є максимальним з відповідних значень елементів двох інших масивів-параметрів. Можливий варіант програми має вид:
//Вказівники на масив як параметри
#include <iostream.h>;
void maxl(int,int*,int*,int*); // прототип функції
void main()
{
int a[] = {0,1,2,3,4};
int b[]={5,6,0,7,1};
int d[5];
maxl(5,a,b,d) ;
cout << "\n";
for (int i=0;i<5;i++)
cout << "\t" << d[i];
}
void maxl(int n,int *x,int *y,int *z)
{
for (int i=0;i<n;i++)
z[i]=x[i]>y[i] ? x[i]:y[i];
}
У результаті виконання програми на екран монітора будуть видані елементи результуючого масиву d: 5 6 2 7 4.
Багатовимірні масиви
Особливістю мови С++ є несамовизначеність масивів, тому за іменем масиву неможливо довідатися його розмірність і розміри за кожним виміром. Крім того, у С++ багатовимірні масиви не визначені. Наприклад, якщо оголошений масив float d[3][4][5], те це не тривимірний, а одномірний масив d, що включає три елементи, кожний з який має тип float [4][5]. У свою чергу, кожний з чотирьох елементів типу float [5]. І, відповідно, кожний з цих елементів є масивом з п'яти елементів типу float. Ці особливості ускладнюють використання масивів як параметрів функцій.
При передачі масивів як параметрів через заголовок функції варто враховувати, що передавати масиви можна тільки з однією невизначеною границею мірності (ця мірність повинна бути самою лівою).
9.2. Приклад 1
Двовимірний масив як параметр функції.
Нехай потрібно скласти програму з функцією, що підраховує суму елементів матриці.
#include <iostream.h>
float summa(int n,float a[][3])
{
float s=0;
for(int i=0;i<n;i++)
for(int j=0;j<3;j++)
s=s+a[i][j];
return s;
}
void main()
{
float z[4][3]={0,1,2,3,4,5,6,7,7,6,5,4 };
cout<< "\n Сума елементів матриці дорівнює" << summa(4,z);
}
У результаті виконання програми на екран буде виведене повідомлення: “Сума елементів матриці дорівнює 50”.
Приклад 2
Допоміжний масив вказівників на масив як параметр функції.
Потрібно скласти програму з функцією, що повертає як результат мінімальний елемент матриці d розміром mxn.
#include <iostream.h>
float min(int m,int n,float *p[]);
void main()
{
float d[3][4]={1,2,-2,4,
5,0,-3,18,
-9,6,7,9};
float *r[]=
{
(float *) &d[0], (float *) &d[1],(float *) &d[2]
};
int m=3;
int n=4;
cout <<"\n Мінімальний елемент матриці дорівнює "<< min(m,n,r);
}
float min(int m,int n,float *p[])
{
float x=p[0][0];
for (int i=0;i<m;i++)
for (int j=0;j<n;j++)
if (x>p[i][j]) x=p[i][j];
return x;
}
У результаті виконання програми на екран буде виведене повідомлення: “Мінімальний елемент матриці дорівнює –9”.
9.3. Порядок виконання роботи
9.3.1. Проаналізувати умову задачі.
9.3.2. Розробити алгоритм та створити програму розв’язання задачі згідно з номером варіанту.
9.3.3. Результати роботи оформити протоколом.
9.4. Варіанти завдань
-
Скласти функцію, що підраховує кількість повторень заданого символу в довільному рядку.
-
Скласти програму, у якій функція знаходить мінімальний елемент у довільному одномірному масиві.
-
Скласти функцію обчислення скалярного добутку двох векторів.
-
Скласти функцію обчислення суми двох матриць.
-
Скласти функцію обчислення добутку двох матриць.
-
Скласти функцію обчислення добутку вектора на число.
9.5. Контрольні запитання
-
Яким чином можна визначити кількість елементів у рядку символів?
-
У чому відмінність оформлення списку параметрів, коли відомо і не відомо кількість елементів у вхідному для функції масиві?
-
Що являє собою ім'я масиву і як воно зв'язане з нульовим елементом масиву?
-
Яким чином можна одержати як результат виконання функції масив?
-
Як визначаються в С++ багатомірні масиви?
-
Поясніть зв'язок між масивами і вказівниками.
-
Як можна оформити використання динамічних масивів у функціях?