Лабораторна робота № 18. Показники та функції

Мета:

Здобути навики використання середовища розробки мови C++, познайомитися з показниками та з функціями, здобути навички написання програм.

Короткі теоретичні відомості до роботи.

У лабораторних роботах розглядалися два варіанти передачі аргументів у функцію:

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

Ø по посиланню з аргументами-посиланнями, коли при виконанні функції дія виконується з власною змінною-аргументом, котрій після виходу із функції зберігає змінено значення (див., наприклад, swap).

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

Передачу аргументу у функцію можна здійснити також за допомогою аргументу-показника. Порівняємо обидві варіанти функції swap (табл. 1.4)

Таблиця 1.4. Обмін значеннями

Варіант 1 Варіант 2
void swap(int &, int &) void swap(int &x, int &y) { int t; t=x; x=y; y=t; } //виклик функції swap(x, y); void swap(int *, int *) void swap(int *x, int *y) { int t; t=x; x=y; y=t; } //виклик функції swap(&x, &y);

У варіанті 1 розглядається вже знайомі функції, а у варіанті 2 – з використанням показників. Результат використання обох варіантів однаковий. Показник і посилання – споріднені елементи мови С++.

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

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

void fun(double [ ]);

void fun(double array[ ]) {…..}

У прототипі функції з ім’ям fun вказується, що аргумент є масив типу double (ідентифікатор масиву опущений). Виклик функції має вигляд:

fun (array);

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

Розглянемо функцію, що зводить масив в цілу позитивну ступінь (мається на увазі зведення в ступінь кожного елемента масиву) у наступній програмі.

//файл PART3\3_04.ccp – передача масива у функцію

#include “c:\cpp\subprog\\roll.h”

#include “c:\cpp\subprog\\roll_txt.h”

#include <iomanip.h>

#define N 5

void deg(double [], unsigned, unsigned);

//прототип функції зведення в ступінь у цілу позитивну ступінь

main() { clrscr();

const unsigned size = N; //розмір масиву

unsigned mn = 3; //задана ступінь

double array[N]; //масив

cout <<”\nвхідний масив”;

for (i=0; i<N; i++) { array[i]=chr(8.0, -6.1);

cout <<”\n”<<setw(3)<<i<<setprecision(5)<< setw(12)<<*(array + 1);};

deg(array, size, mn);

cout <<”\nзведення в ступінь “<<mn;

cout<<”\nперетворений масив”;

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

cout <<”\n”<<setw(3)<<i<<setprecision(5)<< setw(12)<<*(array + 1);

pause(0); return 0; }

void deg(double array[], unsigned size, unsigned mn);

{for (i=0; i< size; i++)

array[i]=power(array[i], mn);

/*використовується власна бібліотечна функція power */


РЕЗУЛЬТАТ ВИКОНАНННЯ ПРОГРАМИ

Розглянемо наступну програму передачі масиву функції, що містить корисний та компактний алгоритм обробки даних.

Маємо масив цілих чисел int ms[size], що заданий розміром (size=М). Можна припустити, що це результат опитування size респондентів, які вибирають одна з N відповідей на питання. Треба визначити частоту кожного із N чисел у масиві ms.

//файл PART3\3_05.ccp – передача масиву у функцію

#include “c:\cpp\subprog\\roll.h”

#include “c:\cpp\subprog\\roll_txt.h”

#include <iomanip.h>

#define M 125

#define N 10

void fr(int [], unsigned, int []);

//прототип функції: визначення частоти повторення однакових значень

main() { clrscr();

const unsigned size = M; int ms[size];

const unsigned size = N+1; int ms1[size1];

cout<<”\n вхідний масив;

for(i=0; i<size; i++) {if ((10+i)%10 ==0) cout<<”\n”;

ms[i]=chr(size1, 1); cout<<setw(3)<<*(ms+1); };

for(i=0; i<size; i++) ms[i]=0;

fr (ms, size, ms1); //виклик функції

cout<<”\n значення частоти в %”;

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

сout<<”\n”<<setw(8)<<i<< setw(8)<<*(ms1+1)

<< setw(9)<<(double)ms1[i]/(double)size*100;

pause(0); return 0; }

void fr(int ms[], unsigned size, int ms1[]);

{ for (int i=0; i<size; i++)

++ms1[ms[i]]; }


РЕЗУЛЬТАТ ВИКОНАНННЯ ПРОГРАМИ

Вхідний масив ініціалізується випадковими цілими числами від 1 до N, додатковий масив ms1[N+1] – нулями. Для завдання розмірів масивів використовується спеціфікатор const для того, щоб гарантувати їх незмінність (у великих програмах така передбаченість може бути не зайвою). У С++ масиви, на відміну від одиночних змінних (операція return), із функцій не повертаються, тому доводиться передавати у функцію не тільки масив даних ms для обробки, але і «порожній» масив ms1 потрібний для розміщення результатів. Зверніть увагу на те, що для представлення результату у відсотках без округлення виконане явне перетворення цілих чисел у тип double.

Передача аргументів у функцію за посиланням економить ресурси комп’ю-тера, так як при цьому не створюються тимчасові копії, що суттєво при великих об’ємах інформації, що передається.

У функцію в якості аргументу може бути передана за посиланням інша функція. Ім’я функції є початкова адреса її коду, тобто показник (аналогічний імені масива).

Оглядові запитання

1. Як виконується передача аргументу по значенню?

2. Як виконується передача аргументу за посиланням?

3. Як виконується передача аргументу за допомогою аргумента-показника?

4. Як виконується операція swap за допомогою показника?

5. Як здійснюється передача масиву у функцію за допомогою показника?

6. Який спеціфікатор застосовується для завдання розмірів масиву?

7. Для чого потрібно у функцію передавати не тільки масив для обробки, але ще і «порожній»?

8. Чому передача аргументів у функцію за посиланням економить ресурси комп’ютера?

9. Чи може бути передана в якості аргументу за посиланням інша функція?



Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: