Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Теоретичні відомості




Масив – упорядкований набір даних, для зберігання даних одного типу (double, float, int і т.д.), ідентифікованих за допомогою одного або декількох індексів. В найпростішому випадку масив має постійну довжину и зберігає одиниці даних одного і того ж типу.

Кількість індексів масиву може бути різноманітною. Масиви з одним індексом називають одновимірними, з двома – двовимірними і т. д. Одновимірний масив відповідає вектору в математиці, двовимірний – матриці.

Наприклад, оператор

іnt A[10];

об’являє масив з іменем А, що складається з 10 цілих чисел. Доступ до елементів цього масиву здійснюється виразом А[i], де і – індекс, який для даного прикладу є цілим числом в діапазоні 0-9.

З оголошення масиву компілятор повинен отримати інформацію про тип елементів масиву і їх кількість. Оголошення масиву має два формати:

специфікатор-типу описувач [константний - вираз];

специфікатор-типу описувач [ ];

Описувач - це ідентифікатор масиву.

Специфікатор-типу задає тип елементів оголошуваного масиву. Елементами масиву не можуть бути функції і елементи типу void.

Константний-вираз в квадратних дужках задає кількість елементів масиву. Константний-вираз при оголошенні масиву може бути опущено в наступних випадках:

- при оголошенні масив ініціалізувався

- масив оголошений як формальний параметр функції

- масив оголошений як посилання на масив, явно визначений в іншому файлі.

Кожний константний-вираз в квадратних дужках визначає число елементів по даному вимірюванню масиву, так що оголошення двомірного масиву містить два константних-вирази, тривимірного, - три і т.д. Відзначимо, що в мові СІ перший елемент масиву має індекс рівний 0.

Приклад

int a[2][3]; /* представлено у вигляді матриці

a[0][0] a[0][1] a[0][2]

a[1][0] a[1][1] a[1][2] */

double b[10]; /* вектор з 10 елементів типу double */

int w[3][3] = { { 2, 3, 4 },

{ 3, 4, 8 },

{ 1, 0, 9 } };

Використання покажчиків

Масиви і покажчики в С++ тісно пов’язані і можуть бути використані майже еквівалентно. Ім’я масиву можна розуміти як константний покажчик на перший елемент масиву. Його відмінність від звичайного покажчика лише в тому, що його неможна модифікувати.

Покажчик - це адреса пам'яті, що розподіляється для розміщення ідентифікатора (як ідентифікатор може виступати ім'я змінної, масиву, структури).

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

специфікатор-типу [ модифікатор ] * описувач.

специфікатор-типу задає тип об'єкту і може бути будь-якого основного типу.

Приклад

unsigned int * a;

/* змінна а є покажчиком на тип unsigned int (цілі числа без знаку) */

double * x;

/* змінна х указує на тип даних з плаваючою точкою подвоєної точності */

char * fuffer;

/* оголошується покажчик з ім'ям fuffer який указує на змінну типу char */

double nomer;

void *addres;

addres = & nomer;

(double *)addres ++;

/* Змінна addres оголошена як покажчик на об'єкт будь-якого типу. Тому їй можна привласнити адресу будь-якого об'єкту (& - операція обчислення адреси) */.

Заповнення масивів випадковим чином

Заповнення масивів можна здійснювати через введення даних з клавіатури, читання файлів (текстових і числових), випадковим чином. Останній спосіб потребує використання функції randomize() – вмикання генератора псевдовипадкових чисел і функції random(int num), яка повертає цілі числа в діапазоні [0 (num-1)]. Функції потребують підключення бібліотеки stdlib.h.

Об’явлення та виклик функцій

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

Функція описується наступним чином:

тип_значення_яке_повертається ім’я функції(список параметрів)

{

оператори тіла функції

}

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

Якщо тип значення, яке повертається не вказаний, то він за замовчуванням вважається рівним int.

Як правило, окрім опису функції в текст програми включається також прототип функції – її попереднє об’явлення. Прототип представляє собою той же заголовок функції, але з крапкою і комою «;» вкінці. Крім того, в прототипі можна не вказувати імена параметрів. Якщо ви все ж вказуєте імена, то областю їх дії є лише даний прототип функції. Введення в програму прототипів дозволяє використовувати в даному модулі функцію, яка описана в будь-якому іншому модулі.

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

Всі об’явлення в тілі функції є локальними. Об’явленні змінні доступні лише всередині даної функції. Якщо їх ідентифікатори співпадають з ідентифікаторами якихось глобальних змінних модуля, то ці зовнішні змінні стають невидимими і недоступними. В таких випадках отримати доступ до глобальної змінної можна, поставивши перед її ім’ям дві крапки «:», тобто застосувавши унарну операцію дозволу області дії.

Вихід з функції може здійснюватись наступним чином. Якщо функція не повинна повертати ніякого значення, то вихід здійснюється при досягненні фігурної дужки, або при виконанні оператора return. Якщо ж функція повинна повертати певне значення, то нормальний вихід з неї здійснюється оператором:

return вираз

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

Значення функції, що повертається може мати в своєму складі виклик інших функцій. Також функція може викликати сама себе, тобто має місце рекурсія.

 

Приклад

Рекурсивна функція обчислення факторіала

unsigned long factorial (unsigned long n)

{

if (n<=1)

return 1;

else

return n* factorial(n-1);

}

Якщо значення параметра n дорівнює 0 або 1, то функція повертає значення 1. В іншому випадку функція помножає поточне значення n на результат, що повертається при виклику функції factorial, але зі значенням параметра n, зменшеного на одиницю. Оскільки під час кожного виклику значення параметра зменшується, то в певний момент воно досягне 1. Після цього послідовність рекурсивних викликів в остаточному результаті поверне значення факторіала.

Передача параметрів функції за значенням та за посиланням

Список параметрів, що передається до функції складається з імен параметрів та вказування на їх тип. Наприклад, у заголовку

double FSum(double X1, double X2, int A)

вказано три параметра Х1, Х2, А та визначено їх типи. Виклик такої процедури може мати вигляд:

Pr (Y, X2, 5);

Даний спосіб передачі параметрів у процедуру називається передачею за значенням. В момент виклику функції в пам’яті створюються тимчасові змінні з іменами Х1, Х2, А, і в них копіюються значення аргументів Y, X2 і константи 5. Можна змінювати всередині процедури значення Х1, Х2, А, але це ніяк не позначиться на значенні аргументів. До недоліків такої передачі параметрів за значенням відносяться витрати часу на копіювання значень і витрати пам’яті для зберігання копії.

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

Виклик за посиланням можна здійснити двома способами: за допомогою параметрів посилання та за допомогою покажчиків. В першому способі адреса змінної передається в функцію операцією адресації (&), а в другому – операцією непрямої адресації (*).

Приклад

void square(int *); //прототип функції обчислення квадрата

void square(int *a) //заголовок функції

{

*a *=*a; //заміна значень параметра

}

Виклик подібної функції може здійснюватись, наприклад, наступним чином:

int x1=2;

square(&x1);

Поделиться:





Читайте также:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...