ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 16.09.2024

Просмотров: 9

Скачиваний: 0

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Лекція 11. Одновимірні масиви

План:

  1. Визначення одновимірного масиву

  2. Операції на одновимірними масивами

  3. Одновимірні динамічні масиви

  4. Оголошення одновимірних динамічних масивів

  5. Виділення і звільнення пам'яті

  6. Звернення до елементів одновимірного динамічного масиву

Основні визначення

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

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

В С++ ознакою одновимірного масиву є наявність парних дужок [ ], в яких указується кількість елементів масиву (його довжина, розмір), зафіксована у визначенні масиву і в процесі роботи програми не змінна. Розмір може бути заданий тільки цілою додатньою константою або константним виразом.

Визначення одновимірного масиву:

Тип_Ім'я [розмір масиву];

В деяких випадках допустимий опис масиву без вказівки кількості його елементів:

Extern int array[ ];

До окремого елемента масиву можна звернутися за допомогою змінної з індексом: імені масиву (єдиного для всіх елементів) і одного або декількох індексів, в залежності ось розмірності масиву. Індекс може мінятися ось 0 до n-1, де n – кількість елементів масиву, його розмір. Максимальний індекс елемента завжди на 1 менше розміру масиву.

Наприклад:

char buffer[81]; //масив складається з елементів buffer[0]. buffer[80] типу char;

int key[4]; //масив складається з елементів key[0]. key[3] типу int;

float а[10]; //масив складається з елементів a[0]. a[9] типу float;

Доступ до елемента масиву:

buffer[80] key[3] а[1] а[9]

Автоматичний контроль виходу індексу за межі масиву не проводиться, тому програміст повинен стежити за цим самостійно. Типовою помилкою при використовуванні масивів є звернення до неіснуючого елемента, тобто вихід індексу за допустиме значення.


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

Якщо елементів в масиві більше, ніж ініціалізацій елементи, для яких значення не вказані, обнуляються:

int b[5]={3, 2, 1}; //масив цілих значиться, займає 5*4=20 байтів //b[0]=3; b[1]=2; b[2]=1; b[3]=0; b[4]=0;

float f[10]; //масив займає 10*4=40 байтів

double x [ ] = {1.5, 2.8, 3.4, 0.5, 7.3}  ; //масив дійсних змінних займає 5*8=40 байтів

char str [ ] = {‘a’, ‘b’, ‘+’}; //масив символів, займає 3 байти

Якщо елементів в масиві менше ніж ініціалізацій, то визначення масиву буде помилковим:

double B[]; //помилка у визначенні – немає розміру

double B[3]={1, 2, 3, 4, 5}; //помилка ініціалізації

Для статичних або зовнішніх масивів компілятор виконує ініціалізацію за умовчанням (всім елементам привласнюються нульові значення).

Найбільш часто масив використовується для зберігання даних. Наприклад, структура з трьох що значиться типу float, проіндексованих заданим діапазоном цілих чисел від 0 до 2 оголошується записом: float V [3];

В пам'яті елементи V[0], V[1], V[2] розташовуються послідовно:

V[0]

V[1]

V[2]

Адрес масиву в пам'яті співпадає з адресою його першого елемента (елемента із значенням індексу рівним лівій межі діапазону індексів).

Будь-яким полином можна описати масивом його коефіцієнтів a0, a1 ., ak-1, ak, в якому роль індексу грає ступінь змінної х: а, а, .a[k-1], а[k].

Характеристики масиву

У якості характеристик масиву виступають:

  • Тип – загальний тип елементів масиву.

  • Розмірність – кількість індексів масиву (а[10] – одновимірний масив; b[3][5] – двомірний масив; з[2][3][5] – тривимірний і т.д.)

  • Розмір (кількість елементів) по кожній з размірностей.

Тип компонентів. Тип індексів

Елементами масиву можуть бути дані будь-якого типу, включаючи похідні (масиви, терміни, структури, файли). Як індекси можуть використовуватися цілі позитивні константи або константні вирази. Рекомендується задавати розміри масиву у вигляді іменованих або препроцесорних констант. При необхідності такі константи легко змінити, адаптуючи їх до різних наборів початкових даних, хоча і з повторною трансляцією програми. Крім того, завдання значення такої константи достатньо великим, дозволить працювати з масивами даного типу будь-якого меншого розміру і як би імітує змінну довжину статичного масиву.


Приклад використовування при визначенні масиву заздалегідь певних констант:

#define до 50 const int n=10; const int m=20;

double а [n]; char b [m];

double ar[k];


Операції над масивами

Операції над масивами – це операції над їх окремими елементами: ініціалізація, введення і вивід значень, перестановка значень, копіювання. Для роботи з масивами, як правило, використовуються цикли.

Найбільш часто при роботі з масивами розв'язуються наступні типи задач:

  1. аналіз масиву (всього або частини) для знаходження деякої його характеристики;

  2. пошук в масиві, тобто визначення елемента (першого, останнього, всіх) з деякою умовою і знаходження його індексу;

  3. побудова масиву за деяким правилом, використовуючи індекси, числа або масиви;

  4. перетворення масиву (зміна значення, перестановка елементів, додавання або видалення елементів і т.п.);

  5. сортування масиву по деякому критерію;

  6. виведення масиву в спеціальному вигляді.

Розглянемо більш детально роботу з масивами.

Ініціалізація масиву – привласнення кожному елемента масиву значення, відповідного базовому типу. Можлива явна ініціалізація масиву тільки при його визначенні:

int intarray[5]= { 31, 54, 77, 52, 93 };

або:

int ar [5] = {0, 0, 0, 0, 0};

Розмір масиву указувати необов'язково (компілятор обчислить його по кількості значень, що ініціалізуються):

int V[ ]= {12, 1 -5, 22 -4};

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

За допомогою операції sizeof (ім’я_масиву) можна визначити розмір масиву в байтах (тобто розмір ділянки пам'яті, виділеної для масиву).

Оскільки всі елементи масиву мають однаковий розмір, то кількість елементів в масиві дозволяє визначити вираз:

Sizeof (ім’я_масиву) / sizeof (ім’я_масиву [0]).

Введення масиву реалізується введенням в циклі що значиться його елементів. При цьому розмір масиву задається константою, наприклад:

const int n=5;

int А[n];

for (int i=0; і <n; i++)

{

printf ("input А[%d]\n", і); //в стилі С

scanf ("%d",&A[i])

}

або

int age[4];

for(int j=0; j<4; j++)

{

cout << "Enter an age: ";

cin >> age[j]; //в стилі С++

}

Якщо точна кількість елементів в масиві невідома, то пам'ять можна виділити по максимуму (наприклад, const int n = 100;), а потім заповнювати тільки частину її. Не дивлячись на те, що значення константи n визначається із запасом, надійна програма повинна обов'язково містити перевірку на кількість елементів, що вводяться.


#include "iomanip"

void Vvod (int mas[], int kol_a); //прототипи функцій введення-виведення

void Vyvod (int mas[], int kol_a);

const int n = 1000;

int main ()

{

int а[n];

int kol_а;

cout << "kol_a=??? ";

cin >> kol_а;

if (kol_а > n) { //перевірка

cout << "size > n " << endl;

_getch();

return 1;

}

Vvod (а,kol_а);

Vyvod (а,kol_а);

_getch();

return 0;

}

void Vvod (int mas[], int kol_а) //функція введення елементів

{for(int j=0; j<kol_а; j++)

{cout << "Enter an а: ";

cin >> mas[j];

}

}

void Vyvod (int mas[], int kol_а) //функція виведення елементів

{int j;

for(j=0; j<kol_а; j++)

cout << setw(4) << mas[j];

if ( !((j+1)% 5) ) cout << endl;

}

Виведення елементів масиву можна організувати по-різному.

Виведення елементів одновимірного масиву поодинці в рядку:

#include "stdafx.h"

int main()

{

int intarray[5]= { 31, 54, 77, 52, 93 };

for(int j=0; j<5; j++)

cout << intarray[j] << endl;

_getch();

return 0;

}

Виведення елементів одновимірного масиву в строку без урахування їх розміщення:

int main()

{

int intarray[5]= { 31, 54, 77, 52, 93 };

for (int i=0; i<5; i++)

cout << intarray[i] << " ";

cout << endl;

_getch();

return 0;

}

Виведення елементів одновимірного цілочисельного масиву по K в рядку

#include <iomanip>

const int n=10;

int K =5;

int А[n]; //в стилі С++

for (int j=0; j<n; j++)

А[j]= j * 10; //заповнення масиву

for (int i=0; i<n; i++)

{cout << setw(7) << А[i]; //на елемент відводиться 7 позицій

if (!((i+1)% K)) cout << endl; //переклад терміни відбувається після виведення K=5 елементів

}

Наприклад, в припущенні, що на значення відводиться 8 позицій – разом із знаком і відступом від попереднього значення, маємо: #include <iomanip>

#include <stdlib.h>

const int n=10;

int main ()

{

int Random_array[n];

int a=5, b=10;

for (int index =0; index < n; index++)

Random_array [index] = а + rand() % b; //заповнення масиву

for (int i=0; i<n; i++)

{cout << setw(8);

cout << Random_array[i];

if (!((i+1) %5)) cout << endl; //виведення елементів масиву по 5 в рядку

}

cout << endl;

_getch();

return 0;

}

В цьому випадку елементи масиву будуть розташовані чіткими стовпцями.

Контрольні питання

  1. Яким чином визначається масив?

  2. Що є ознакою одновимірного масиву в мові програмування С++?

  3. Чи відбувається автоматичний контроль виходу індексу за межі масиву?

  4. Що виступає в якості характеристик масиву