КАРТКА-ЗАВДАННЯ НА ЛАБОРАТОРНЕ ЗАНЯТТЯ Тема 2. ОСНОВИ АЛГOРИТМІЗАЦІЇ ТА ПРОГРАМУВАННЯ Заняття 5. Використання масивів в якості параметрів функції Теоретичні відомості Прототип функції Прототип функції — декларація функції в деяких мовах програмування, при якій вказується тільки її назва, тип та кількість і типи її аргументів. Таке оголошення необхідне і достатнє для компілятора при створенні правильного об'єктного коду. Необхідність у оголошенні прототипу функції перед визначенням її реального коду виникає при складних вкладених викликах однієї функції в іншій. Декларація прототипу дозволяє програмісту уникнути прослідковування послідовності написання функцій в програмі. Крім того, реальний код функції може знаходитися в окремій, уже відкомпільованій бібліотеці, що підключається до програми компонувальником. Оголошення прототипів функцій стандартних бібліотек С та С++ поміщені в спеціальні заголовні файли, які приєднуються до програми препроцесором на першому етапі компілювання. Приклад: В якості прикладу розглянемо наступний прототип функції: int foo(int n); Цей прототип оголошує функцію «foo», яка приймає один аргумент «n» цілого типу і повертає ціле число. Опис функції може розміщуватись де завгодно в програмі. Масиви як параметри функцій Розрізняють 3 основні підходи передачі масивів в якості параметрів функції: 1) Передача масиву з фіксованим розміром; 2) Передача масиву змінної довжини; 3) Передача вказівника на перший елемент масиву. Аргументами (параметрами) функцій можуть бути не тільки змінні, але й масиви. У цьому випадку можна використовувати як масиви фіксованого розміру, так і невизначеного (масиви змінної довжини). Передача масиву з фіксованим розміром. При застосуванні масивів фіксованої довжини в заголовку функції в списку формальних аргументів указується тип масиву і його розмір, наприклад: void sort (int mas[30]); #include <stdio.h> void display(int num[10]); int main () { int t [10], i; for (i=0; i<10; ++i) t[i]=i; display(t); return 0; } void display(int num[10]) { int i; for (i=0; i<10; i++) cout<<num[i]; } Передача масиву не вказуючи його розмірність тип функції назва функції (тип елементів масиву назва масиву[]) int SumArrayInts(int A[]); #include <stdio.h> int SumArrayInts(int A[]); int main() { int M[5] = { 23, -2, -1, -8, 4 }; int summa; summa = SumArrayInts(M); // summa = 16 cout<<summa<<endl; } int SumArrayInts(int A[]) { int i; int sum = 0; // сума for (i=0; i<5; i++) sum = sum + A[i]; return sum; } Передача масиву змінної довжини Якщо описується функція з масивом змінної довжини, то в заголовку вказується тип масиву невизначеного розміру і обов’язково ще один параметр, за допомогою якого задається розмірність масиву, наприклад: void sort (int mas[ ],int n); #include <stdio.h> int SumArrayInts(int n, int A[]) int main() { int M[5] = { 23, -2, -1, -8, 4 }; int n = 5; int summa; summa = SumArrayInts(n, M); // summa = 16 cout<<summa<<endl; } int SumArrayInts(int n, int A[]) { int i; int sum = 0; // сума for (i=0; i<n; i++) sum = sum + A[i]; return sum; } Приклад: Передача вказівника на перший елемент масиву Всі масиви у функції передаються за адресою (як покажчики), тому у випадку зміни масивів у функції ці зміни зберігаються при поверненні у викликаючу функцію. тип функції назва функції тип_елементів * ім’я_вказівника int SumArrayInts(int n, int *A) #include <stdio.h> int SumArrayInts(int n, int A[]) int main() { int M[5] = { 23, -2, -1, -8, 4 }; int n = 5; int summa; summa = SumArrayInts(n, &M); cout<<summa<<endl; } int SumArrayInts(int n, int *A) // масив передаєтсья як *A { int i; int sum = 0; // сума for (i=0; i<n; i++) sum = sum + A[i]; return sum; } Багатовимірні масиви в якості параметру функції void fun1(intmat[7][10]); Якщо застосовується багатовимірний масив невизначеної довжини, то невизначеним може бути тільки один вимір розмірності, наприклад: void fun2 (int mat[][10], int rows); Приклад: #define NCOLS 4 void array2d_fill( int m[ ][ NCOLS ] ) void array2d_print( int ( * m )[ NCOLS ] ) int array2d_max( int * m ) int main() { int a[ NROWS ][ NCOLS ]; array2d_fill( a ); array2d_print( a ); cout << array2d_max( a[ 0 ] ) << endl; } По суті, двовимірний масив є вказівкою int(*m)[3]. Це означає, що при арифметичних операціях з вказівкою, вона збільшується або зменшується на кількість байтів трьох елементів типу даних int до першого розмикання. Після першого розмикання адреса збільшується на кількість байтів одного елементу int, як у разі звичайної вказівки. У даному прикладі вказівці int(*m)[3] привласнюється значення вказівки двовимірного масиву mas. Потім, у функцію vivod передається вказівка m збільшена на одиницю. При передачі у функцію записи int (*mas)[3] та int mas[][3] еквівалентні. Другий параметр у дужках вказувати обов’язково, саме він говорить на скільки елементів масиву треба зміщуватись при виконанні арифметичних операцій. Існує принаймні одна ситуація, коли двомірний масив проявляє себе саме як масив масивів. Це буває у функціях, параметри яких є двомірними масивами. Коли в заголовку або прототипі функції фігурує параметр, який є багатовимірним масивом, то розмір першого його вимірювання не вказується; розміри інших вимірювань повинні бути обов'язково вказані. Оскільки розмір першого розміру не наводиться, зазвичай виникає необхідність в додатковому параметрі типу int, який передає інформацію про це розмірі. Нижче наведено приклад прототипу функції з двовимірним масивом р в якості параметра. void display_page (const char p [] [100], int size_dimension_l) Це правило знаходить чіткий сенс, якщо згадати, що параметр є масивом масивів. Оскільки параметр const char p [] [100] - це двомірний масив, який представляє собою масив масивів, то лише перше його вимір є індексом масиву і трактується так само, як і індекс одновимірного масиву. Друга ж розмірність є частиною опису базового типу, який представляє собою масив з 100 символів. Приклад void-функції введення двовимірного масиву А, кількість рядків n, кількість стовпців m. Можна передати двовимірний масив у функцію як подвійну вказівку ("**"). void vvod2(int n,int m, int a[][10]) { for(int i=0;i<n;i++) for(int j=0;j<m;j++) cin>>a[i][j]; } Приклад: Створити програму, що забезпечує роботу таких пунктів меню. 1. Введення масиву цілих чисел з 20 елементів. 2. Генерація 20 .елементов масиву від -100 до 100. 3. Заміна в масиві негативних елементів нулем. 4. Висновок елементів масиву. 5. Кінець роботи. Результат виконання програми: Питання 1. Розробка алгоритмів обробки масивів даних з використанням підпрограм Час на відпрацювання - 40 хв. Розробити алгоритми виконання двох задач відповідно до варіанту (у вигляді блок-схем). Різних за темами задач є 25. Більшість задач мають по 25 індивідуальних завдань. Номер завдання, яке має розв’язати курсант, у конкретній задачі визначається числом і номером варіанта. Номер варіанта - це номер курсанта в журналі. Якщо в умові задачі немає конкретних даних, то їх треба задати на свій розсуд, керуючись її змістом. Скрізь вимагається скласти програму для розв’язування задачі. У кінці кожної програми зазначити своє прізвище. Завдання Задача 1. Одновимірний масив, як параметр Розробити програму, яка працюватиме наступним чином: Головна функція програми повинна викликати інші функції в ній має бути реалізовано меню керування роботою програми: - функція введення масиву даних на вибір або в діалозі з користувачем, або через генератор псевдовипадкових чисел для двох різних масивів (різного розміру); - функція виведення створених масивів; - функція виконання визначеної відповідно до варіанту дії; В головній програмі має бути реалізовано аналіз пошуку даних у всіх масивах. Варіант 1 2 3 Постановка задачі Знайти в якому з двох введених масивів кількість від’ємних чисел є більшою. Знайти в якому з двох введених масивів середнє арифметичне додатних елементів є менше. Знайти в якому з двох введених масивів максимальний елемент є більший. 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 Знайти в якому з двох введених масивів кількість парних елементів є менше. Знайти в якому з двох введених масивів кількість чисел, які діляться без остачі на 10 є більшою. Знайти в якому з двох введених масивів сума додатних елементів є більшою. Знайти різницю між середнім арифметичним елементів першого і другого масивів. Замінити всі від’ємні елементи масивів нулями. Визначити в якому з двох масивів була більша кількість перестановок. Знайти в якому з двох введених масивів кількість елементів, які є менші за 5 є більшою. Знайти середнє арифметичне між мінімальними елементами масивів. Знайти в якому з двох введених масивів максимальний елемент розміщений в масиві раніше. Визначити чи всі елементи масивів є додатними. Якщо ні, то вивести в якому масиві є від’ємні елементи. Знайти якому з введених масивів елементи розміщені в дзеркальному відображені. Якщо ж ні в одному, то вивести про це повідомлення. Знайти значення елементів масиву, які розміщені в масивах після максимального. Знайти в якому з двох введених масивів мінімальний елемент по модулю є більшим. Знайти в якому з двох введених масивів максимальний елемент ділиться на 3 без остачі. Знайти в якому з двох введених масивів сума елементів, які розміщені на не парних позиціях є більшою. Знайти добуток максимальних елементів двох введених масивів. Знайти в якому з введених масивів кількість двозначних елементів є більшою. Знайти в якому з двох введених масивів мінімальний елемент розміщений раніше. Знайти в якому з двох введених масивів сума додатних елементів більших за 15 є більшою. Знайти різницю між добутками додатних парних елементів двох введених масивів. Знайти в якому з введених масивів кількість елементів, які розміщені в послідовності після першого додатного є більшою. Знайти в якому з введених масивів число не нульових елементів є більшою. Задача 2. Двовимірний масив, як параметр. Розробити програму, яка працюватиме наступним чином: Головна функція програми повинна викликати інші функції в ній має бути реалізовано меню керування роботою програми: функція введення масиву даних на вибір або в діалозі з користувачем, або через генератор псевдовипадкових чисел для одного двовимірного масиву; функція виведення створених масивів; функція виконання визначеної відповідно до варіанту дії; Варіант 1 2 3 Постановка задачі Дано двовимірну матрицю цілих чисел. Знайти норму матриці. Нормою матриці вважати максимум з абсолютних величин її елементів. Дано двовимірну матрицю цілих чисел. Знайти суму елементів матриці, що лежать вище головної діагоналі. Дано двовимірну матрицю цілих чисел. Визначити кількість рядків, які не містять жодного нульового елемента. 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 Дано двовимірну матрицю цілих чисел. Визначити кількість стовпців, що не містять жодного нульового елемента. Дано двовимірну матрицю цілих чисел. Визначити суму елементів в тих рядках, які містять хоча б один негативний елемент. Дано двовимірну матрицю цілих чисел. Визначити суму елементів в тих стовпцях, які не містять негативних елементів. Дано двовимірну матрицю цілих чисел. Знайти суму модулів елементів, розташованих нижче головної діагоналі. Дано двовимірну матрицю цілих чисел. Знайти кількість рядків, середнє арифметичне елементів яких менше заданої величини. Дано двовимірну матрицю цілих чисел. Знайти номер першого з рядків, що містять хоча б один позитивний елемент. Дано двовимірну матрицю цілих чисел. Знайти суму модулів елементів, розташованих нижче побічної діагоналі. Дано двовимірну матрицю цілих чисел. Знайти номер першого з стовпців, що містять хоча б один позитивний елемент. Дано двовимірну матрицю цілих чисел. Знайти номер першого з стовпців, що не містять жодного негативного елементу. Дано двовимірну матрицю цілих чисел. Знайти в кожному з рядків матриці мінімальний елемент. Дано двовимірну матрицю цілих чисел. Обчислити суму рядків матриці з нульовими елементами на побічній діагоналі Дано двовимірну матрицю цілих чисел. Збільшити значення кожного елемента стовпця матриці на значення першого елемента відповідного стовпця Дано двовимірну матрицю цілих чисел. Обчислити суму парних елементів в кожному стовпці матриці. Дано двовимірну матрицю цілих чисел. Замінити мінімальний елемент головної діагоналі матриці сумою елементів першого рядка Дано двовимірну матрицю цілих чисел. Знайти кількість додатних елементів в кожному стовпці матриці. Дано двовимірну матрицю цілих чисел. Визначити, скільки рядків заданої матриці містять хоча б один елемент із діапазону [A, B]. Дано двовимірну матрицю цілих чисел. Обчислити суму стовпців матриці з позитивними елементами на головній діагоналі. Дано двовимірну матрицю цілих чисел. Помножити значення кожного елемента рядка матриці на значення першого елемента відповідного рядка. Дано двовимірну матрицю цілих чисел. Модифікувати матрицю шляхом віднімання кожного від кожного її елемента мінімального елемента. Дано двовимірну матрицю цілих чисел. Знайти і надрукувати значення і індекси мінімального елемента в кожному рядку матриці Дано двовимірну матрицю цілих чисел. Модифікувати матрицю шляхом віднімання від максимального її значення кожного її елемента. Питання 2. Реалізація алгоритму обробки масивів даних з використанням підпрограм Час на відпрацювання - 85 хвилин. На основі розроблено в першому питанні алгоритму виконати програмну реалізацію трьох задач відповідно до варіанту. Текст програм занести в звіт з лабораторної роботи. Програми повинні бути універсальними, тому вхідні дані вводяться з клавіатури. Питання 3. Відлагодження алгоритму обробки масивів даних з використанням підпрограмЧас на відпрацювання - 20 хвилин. Здійснити перевірку написаних програм на наявність синтаксичних та логічних помилок. Провести аналіз отриманих результатів. Результати занести до звіту з лабораторної роботи.