ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 21.12.2021
Просмотров: 986
Скачиваний: 3
7 МАСИВИ
7.1 Загальні поняття
Масив – це впорядкована за індексом сукупність однотипних даних. Являє собою набір послідовних комірок.
У програмі масив – це змінна структурованого типу. Масиву присвоюється ім’я, за допомогою якого можна посилатися як на весь масив, так і на будь-який його елемент. Тут змінні мають індекси, що можуть бути сталими, змінними або виразами порядкового типу.
Переваги використання масивів безперечно полягають у зручності звертання до довільного елемента, у можливості компактного збереження послідовності у локальній області пам’яті та їх економності по відношенню до використання пам’яті.
Масиви є ефективні для використання у нескладних задачах, доки не з’являється потреба ефективного додавання та видалення елементів масиву. Масив може бути одновимірним та багатовимірним.
7.2 Одновимірні масиви
Одновимірний масив можна уявити як таблицю n×1. Індексом масиву є одне число. Тобто, за кожним елементом закріплений лише один його порядковий номер. Нумерація елементів масиву починається з 0 (0, 1, … , n). Цей масив також називається лінійним. Прототип одновимірного масиву має такий вигляд:
Синтаксис одновимірного масиву.
тип даних ім’я змінної [n];
Посилання на кожен елемент складається з назви змінної та індексу (номера елемента). Уявимо послідовність цілих чисел: 3, 2, 6, 9, 8. Маємо такі його елементи: A[0]=3, A[1]=2, A[2]=6, A[3]=9, A[4]=8.
Зобразимо графічно одновимірний массив (нумерація іде від 0 до деякого числа n, кожне значення комірки відповідає номеру елемента) (рис. 7.1)
Рисунок 7.1 – Зображення одновимірного масиву.
Для посилання на будь-який елемент цього масиву вкажемо ім’я послідовності (в нашому випадку це array) та значення індексу. Звернемося до нульового елемента даного масиву: array[0]. Значення цього елемента 0.
Існує декілька можливостей заповнення масиву. Розглянемо їх на прикладі масиву з 10 елементів:
1) Можна присвоїти значення окремим коміркам за допомогою оператора присвоювання.
Приклад 1. Заповнимо усі комірки другим способом. Останні три заповнимо числом 7 окремо.
int array[10]={5,5,5,5,5,5,5,5,5,5};
array[7]=array[8]=array[9]=7;
for (int i=0; i<10; i++){
printf("%i ",array[i]);
}
Результат роботи програми:
2) Ефективним способом заповнення масиву є заповнення його у циклі.
Приклад 2. Заповнимо кожну комірку масиву числом 5 і виведемо результат.
for (int i=0; i<9; i++){
array[i]=5;
printf("%i ",array[i]);
}
Результат роботи програми:
3) Можна присвоїти деякі значення елементам масиву при його оголошенні.
Приклад 3. Присвоєння елементів в масиві.
int array[10]={5,5,5,5,5,5,5,5,5,5};
4) Також можна заповнювати масив числами, введеними з клавіатури. Тоді у текст програми додається рядок зчитуваня зі стандартного пристрою.
Приклад 4. Заповнення масиву з клавіатури.
for (int i=0; i<9; i++){
scanf(“%i”, &array[i]);
printf("%i ",array[i]);
}
5) На екрані ми побачимо аналогічну картину до попередніх. Буде виведений рядок чисел, попередньо нам заданих.
Приклад 5. Знайти максимальний елемент масиву.
Для вирішення цієї задачі створимо змінну max найменшого можливого значення. У циклі будемо почергово порівнювати значення елементів із максимальним. Коли воно виявиться більшим – максимальному значенню присвоїмо дане значення. В кінці виведемо max.
#include <stdlib.h>
#include <iostream.h>
int main()
{
int max= - 999999999;
int array[5]={1,3,5,3,0};
for(int i=0; i<5; i++){
if(array[i]>max){
max=array[i];
}}
printf("Max = %i\n", max);
system("PAUSE");
return 0;
}
Результат роботи програми:
7.3 Багатовимірні масиви
Дво-, тривимірні та інші масиви з більшою кількістю вимірів називаються багатовимірними масивами. Індексом є уже сукупність чисел, кількість яких визначає скільки саме вимірів матиме масив. Оголошуються вони аналогічно до одновимірних. Двовимірний масив можна уявити як таблицю n×m.
Прототип двовимірного масиву має такий вигляд:
<тип даних> <ім’я змінної> [n][m];
Для двовимірних масивів уже вводиться поняття головної та побічної діагоналі. Зобразимо це на рисунку. Червоною стрілкою показаний напрямок головної діагоналі, а блакитною – побічної.
Рисунок 7.2 – Зображення двовимірного масиву
Усі властивості одновимірних масивів зберігаються і для багатовимірних масивів. Тривимірний масив уже можна уявити як об’ємну фігуру – паралелепіпед. Більше трьох вимірів можна вважати математичною абстракцією.
Найчастіші дії, що проводяться над масивами – це:
пошук деякого значення;
сортування елементів в порядку зростання або спадання;
підрахунок кількості елементів у масиві, що задовольняють дану умову.
Приклад 6. Всім елементам, що знаходяться вище головної діагоналі присвоїти значення ‘1’, елементам, що знаходяться нижче головної діагоналі – ‘-1’, а тим що на самій діагоналі – ‘0’.
#include <stdio.h>
#include <stdlib.h>
int main(){
int MAS[4][4];
int n=5;
for (int i=0;i<n;i++){
for (int j=0; j<n; j++){
if (i==j) MAS[i][j]=0;
if (i>j) MAS[i][j]=-1;
if (i<j) MAS[i][j]=1;
printf("%3i ", MAS[i][j]);
}
printf("\n");
}
system("pause");
return 0;
}
Результат роботи програми:
6. ФУНКЦІЇ
6.1 Основні поняття
Функція – це частина програми, що виконується, після її виклику.
Синтаксис виклику функції наступний:
<ім’я функції> (аргумент1, аргумент2,…)
де ім’я функції – індетифікатор, за допомогою якого здійснюється виклик функції;
аргумент1, аргумент2,… – список аргументів функції. Аргументом називають значення яке передається у функцію.
Виклик функції може бути частиною виразу чи аргументом іншої функції.
Стандартна бібліотека С містять широкий набір функцій, які можна використати у програмі підключивши відповідні загаловочні файли, наприклад:
- <math.h> - виконання загальних математичних обчислень;
- <string.h> - обробка рядків та символів;
- <stdio.h> - введення/виведення інформації;
- <stdlib.h> - виділення пам'яті, контроль процесу виконання програми.
Підключення заголовочних файлів до програми здійснюється за допомогою директиви #include.
В таблиці 6.1 наведені деякі функції заголовочного файлу <math.h>.
Таблиця 6.1 – Функції заголовочного файлу <math.h>
Функція |
Призначення |
Приклад |
abs(x) |
повертає модуль числа x |
abs(-14.0) рівне 14 |
acos(x) |
повертає арккосинус x |
acos(0.0) рівне 1.570796 |
asin(x) |
повертає арксинус x |
asin(0.0) рівне 0.0 |
atan(x) |
повертає арктангенс x |
atan(1.0) рівне 0.785398 |
ceil(x) |
повертає x округлений до більшого |
ceil(4.2) рівне 5.0 |
cos(x) |
повертає косинус x |
cos(3.14) рівне -0.999999 |
cosh(x) |
повертає гіперболічний косинус x |
cosh(0.0) рівне 1.0 |
exp(x) |
повертає експоненту x(е в степені х) |
exp(1.0) рівне 2.718282 |
floor(x) |
повертає x округлений до меншого |
floor(4.9) рівне 4.0 |
log(x) |
повертає натуральний логарифм x |
log(2.718282) рівне 1.0 |
log10(x) |
повертає логарифм x за основою 10 |
log10(1000) рівне 3.0 |
pow(x,y) |
повертає x піднесене до степеня y |
pow(2.0,5.0) рівне 32.0 |
round(x) |
повертає число, округлене за звичайним правилом |
round(4.2) рівне 4.0 round(4.9) рівне 5.0 |
sin(x) |
повертає синус x |
sin(0.0) рівне 0.0 |
sinh(x) |
повертає гіперболічний синус x |
sinh(0.0) рівне 0.0 |
sqrt(x) |
повертає квадратний корінь з x |
sqrt(4.0) рівне 2.0 |
tan(x) |
повертає тангенс x |
tan(0.785398) рівне 1.0 |
tanh(x) |
повертає гіперболічний тангенс x |
tanh(10.0) рівне 1.0 |
Окрім функцій стандартної бібліотеки С програміст може визначати власні функції.
Синтаксис визначення функції:
<тип> <ім’я функції> (параметр1, параметр2,…)
{тіло функції}
де тип – тип даних значення, яке повертається функцією у місце виклику;
ім’я функції – ідентифікатор, за допомогою якого здійснюється виклик функції;
параметр1, параметр2,… – список параметрів функції. Кожен параметр складається з типу даних та ідентифікатора, як і будь-яке оголошення змінної (наприклад: int x). Змінні які оголошені в якості параметра є локальними для даної функції. Вони приймають значення аргументів функції при виклику.
тіло функції – це блок операторів у фігурних дужках {}.
Тип кожного аргументу функції повинен відповідати типу відповідного параметра, оголошеного при визначенні функції.
Приклад 6.1. Використання стандартних функцій та функцій визначених у програмі.
#include <stdio.h>
#include <stdlib.h>
int add (int a, int b)/*визначення функції add*/
{
int q;
q=a+b;
return (q);
}
int main ()
{
int t;
t = add (7, 4);/*виклик функції add*/
printf( "Suma = %i \n", t);/*виклик функції printf з бібліотеки stdio.h*/
system("PAUSE");/*виклик функції system з бібліотеки stdlib.h*/
return 0;
}
Результат роботи програми:
На початку програми здійснюється визначення функції add. Далі здійснюється визначення функції main. Функція main починається з оголошення змінної t типу int. Після цього, здійснюється виклик функції add. Подібність виклику та визначення функції зображено на рис. 6.1.
Рисунок 6.1 – Визначення та виклик функції
При виклику функції add у якості аргументів їй передаються два значення: 7 і 4, які відповідають параметрам int а та int b.
Значення обох аргументів при виклику (7 і 4) будуть скопійовані в локальні змінні int а та int b.
У функції add оголошується інша локальна змінна int q, якій присвоюється результат виразу q=а+b.
Наступний рядок коду: return (q); завершує роботу функції add, і повертає значення у функцію main. Програма продовжує роботу з того ж місця, в якому вона була перервана викликом функції add. Значення змінної q в цей момент дорівнює 11, і воно стає значенням функції, що викликається. Потім це значення присвоюється змінній t (рис. 6.2).
Рисунок 6.2 – Повернення значення функції
6.2 Область видимості
Видимість змінних, оголошених у функції обмежується тілом функції, тобто вони є локальними змінними функції і не можуть бути використані поза нею. Наприклад, у попередньому прикладі було б неможливо використовувати змінні a, b або q безпосередньо у функції main, так як вони є локальними змінними функції add. Крім того, було б неможливо використовувати змінну t у функції add, так як вона є локальною змінною функції main.
У випадку необхідності видимості змінної, як у межах функції так і поза нею, потрібно використати глобальну змінну. Для створення глобальної змінної потрібно її оголосити поза межами функції.
Приклад 6.2. Види виклику функцій.
#include <stdio.h>
#include <stdlib.h>
int sub (int a, int b)
{
int q;
q=a-b;
return (q);
}
int main ()
{
int x=2, y=1, t;
t = sub(7, 4);
printf("First %i \n", t);
printf("Second %i \n", sub(7, 4));
printf("Third %i \n", sub (x, y));
t = 4 + sub(x, y);
printf("Fourth %i \n", t);
system("PAUSE");
return 0;
}
Результат роботи програми:
У прикладі 6.2 створена функція sub, яка повертає різницю значень аргументів. В програмі продемонстровано чотири варіанти виклику функції sub.
Перший варіант виклику:
t = sub(7, 4);
printf("First %i \n", t);
Другий варіант виклику:
printf("Second %i \n", sub(7, 4));
У цьому варіанті функція sub викликається в якості аргументу функції printf.
Третій варіант виклику:
printf("Third %i \n", sub(x, y));
У цьому варіанті замість числових літералів (7, 4) в якості аргументів функції sub виступають змінні x та y.
Четвертий варіант виклику:
t = 4 + sub(x, y);
printf("Fourth %i \n", t);
У цьому варіанті показано можливість роботи з функцією, як зі звичайною змінною такого ж типу, який повертає функція.
6.3 Порожній тип void
Визначення функції починається з типу даних значення, яке буде повертатися функцією. Але, якщо не потрібно повертати жодного значення, то використовується порожній тип void.
Наприклад, потрібно створити функцію, яка виводитиме повідомлення на екран. Такій функції не потрібно повертати жодного значення.
Приклад 6.3. Використання порожнього типу void.
#include <stdio.h>
#include <stdlib.h>
void message ()/*функція яка не повертає значення*/
{
printf( "THIS IS SPARTA!!!\n ");
}
int main ()
{
message ();
system("PAUSE");
return 0;
}
Результат роботи програми:
В списку параметрів функції також може використовуватися void, для показу того, що функція не має параметрів при виклику. Наприклад, функція message могла бути визначена як:
void message ( void )
{
printf("THIS IS SPARTA!!!\n");
}
Хоча не обов'язково вказувати void в списку параметрів. У мові C, список параметрів може бути порожнім, якщо не потребує жодних параметрів. Необхідно писати дужки, навіть за відсутності параметрів:
message();
Наявність дужок вказує на те, що це виклик функції, а не ім'я змінної або інший оператор мови C. Наступний виклик був би неправильний:
message;
6.4 Передача аргументів у функцію
Аргументи у функцію можуть бути передані за значенням (by value).
Приклад 6.4. Передача параметрів за значенням.
int x=7, y=4, t;
t = add( x , y );
У функцію add передаються значення змінних х і у, тобто 7 і 4 відповідно (рис. 6.3).
Рисунок 6.3 – Передача параметрів у функцію за значенням.
При виклику функції add, у локальні змінні a і b копіюються значення змінних x і y. Тому будь-яка зміна значень a або b в межах функції add, не вплине на значення змінних х і у.
6.5 Рекурсивні функції
Рекурсивна функція – це функція, яка викликає саму себе. За допомогою рекурсії легко вирішуються такі завдання як сортування або обчислення факторіала числа.
Факторіал цілого невід'ємного числа n, записується як n!, і обчислюється за формулою:
n! = n * (n-1) * (n-2) * (n-3) * ... * 1
Наприклад, 5!, тобто факторіал п'яти, є добутком 5 * 4 * 3 * 2 * 1, який дорівнює 120.
Розглянемо рекурсивну функцію для обчислення факторіалу:
Приклад 6. Обчислення факторіалу.
#include <stdio.h>
#include <stdlib.h>
long fact(long a)
{
if (a>1)
return (a*fact(a-1));
else
return(1);
}
int main ()
{
long n;
printf("BBegiTb 4iCJlO: ");
scanf ("%i",&n);
printf(" %i! = %i ", n, fact(number));
system("PAUSE");
return 0;
}
Результат роботи програми:
Функція fact викликатиме сама себе, постійно зменшуючи аргумент наступного виклику на 1 до тих пір, поки аргумент не стане рівний 1. В цьому випадку функція поверне число 1(рис 6.5).
Рисунок 6.5 – Приклад обчислення 5! за допомогою рекурсивної функції.
6.6 Прототипи функцій
Прототип функції – це оголошення функції, яке не містить тіло функції і повідомляє компілятору:
- тип даних, який повертає функція;
- число, тип та порядок параметрів, які функція приймає.
Прототип дає можливість викликати функцію до моменту її оголошення.