Студопедия

Главная страница Случайная страница

КАТЕГОРИИ:

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Завдання. Тема: Обробка одновимірного масиву






Лабораторна робота №6

Тема: Обробка одновимірного масиву

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

 

Масиви

 

6.1.1 Основні поняття

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

Як показує практика роботи на Сі, покажчики рідко використовуються зі скалярними змінними, а частіше – з масивами. Покажчики дають можливість застосовувати адреси приблизно так, як це робить ЕОМ на машинному рівні. Це дозволяє ефективно організувати роботу з масивами. Будь-яку серйозну програму, що використовує масиви, можна написати за допомогою покажчиків.

Для роботи з масивом необхідно:

1. Визначити ім'я масиву, його розмірність (кількість вимірів) і
розмір – кількість елементів масиву;

2. Виділити ОП для його розміщення.

У мові Сі можна використовувати масиви даних будь-якого типу:

- статичні: з виділенням ОП до початку виконання функції; ОП виділяється в стеку або в ОП для статичних даних;

- динамічні: ОП виділяється з купи в процесі виконання програми, за допомогою функцій malloc() і calloc().

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

Розмір масиву визначається:

1. Для статичних масивів при його оголошенні; ОП виділяється до початку виконання програми; ім'я масиву – покажчик-константа; кількість елементів масиву визначається:

a. явно; наприклад: int а[5];

b. неявно, при ініціалізації елементів масиву; наприклад:

 

int а[] = { 1, 2, 3 };

 

2. Для динамічних масивів у процесі виконання програми; ОП для них запитується і виділяється динамічно, з купи; ім'я покажчика на масив – це змінна; масиви ці можуть бути:

a. одновимірні і багатовимірні; при цьому визначається кількість елементів усього масиву й ОП запитується для всього масиву;

b. вільні (спеціальні двовимірні); при цьому визначається кількість рядків і кількість елементів кожного рядка, і ОП запитується і виділяється для елементів кожного рядка масиву в процесі виконання програми; при використанні вільних масивів використовують масиви покажчиків;

Розмір масиву можна не вказувати. В цьому разі необхідно вказати порожні квадратні дужки:

1. Якщо при оголошенні ініціалізується значення його елементів; наприклад:

 

static int а[] = {1, 2, 3};

char b[] = " Відповідь: ";

 

2. Для масивів – формальних параметрів функцій; наприклад:

 

int fun1(int a[], int n);

int fun2(int b[k][m][n]);

 

3. При посиланні на раніше оголошений зовнішній масив; наприклад:

 

int а[5]; /* оголошення зовнішнього масиву */

main ()

{

extern int а[]; /*посилання на зовнішній масив */

}

 

В усіх оголошеннях масиву ім'я масиву – це покажчик-константа! Для формування динамічного масиву може використовуватися тільки ім'я покажчика на масив – це покажчик-змінна. Наприклад:

 

int *m1 = (int *) malloc (100 * sizeof (int));

float *m2 = (float *) malloc (200 * sizeof (float));

 

де m1 – змінна-покажчик на масив 100 значень типу int;

m2 – змінна-покажчик на масив 200 значень типу float.

Звільнення виділеної ОП відбувається за допомогою функції:

 

free (покажчик-змінна);

Наприклад:

free(ml);

free(m2);

 

Звертання до елементів масивів m1 і m2 може виглядати так:

 

m1[i], m2[j].

 

Пересилання масивів у Сі немає. Але можна переслати масиви поелементно або сумістити масиви в ОП, давши їм практично те саме ім'я.

Наприклад:

 

int *m1 = (int *) malloc(100 * sizeof(int));

int *m2 = (int *) malloc(100 * sizeof(int));

 

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

 

for (i = 0; i < 100; i++) m2[i] = ml [i];

 

Замість m2[i] = m1 [i]; можна використовувати:

 

*m2++ = *ml++;

 

або:

 

*(m2 + i) = *(ml + i);

 

За допомогою покажчиків можна сполучити обидва масиви й у такий спосіб:

 

free(m2); m2 = ml;

 

Після цього обидва масиви займатимуть одну й ту саму область ОП, виділену для масиву m1. Однак це не завжди припустимо. Наприклад, коли масиви розташовані в різних типах ОП: один – у стеку, інший – у купі. Наприклад, у функції main() оголошені:

 

int *m1 = (int *) malloc(100* sizeof(int));

int m2[100];

 

У вищенаведеному прикладі m1 – пакажчик-змінна, і масив m1 розташований у купі, m2 – покажчик-константа, і масив m2 розташований у стеку. У цьому випадку помилковий оператор: m2 = m1; тому що m2 – це покажчик-константа. Але після free(m1) припустимим є оператор:

 

m1 = m2; /* оскільки m1 – покажчик-змінна */

 

Для доступу до частин масивів і до елементів масивів використовується індексування (індекс). Індекс – це вираз, що визначає адресу значення або групи значень масиву, наприклад адреса значень чергового рядка двовимірного масиву. Індексування можна застосовувати до покажчиків-змінних на одновимірний масив – так само, як і до покажчиків-констант.

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

Розглянемо способи оголошення і формування адрес частини масиву й елементів одновимірних і багатомірних масивів за допомогою покажчиків.3

 

6.1.2 Оголошення та звертання в одновимірних масивах

Форма оголошення одновимірного масиву з явною вказівкою кількості елементів масиву:

 

тип ім'я_масива [кількість-елементів-масива];

 

Звертання до елементів одновимірного масиву в загальному випадку можна представити індексуванням, тобто у вигляді:

 

ім'я-масиву [вираз];

 

де ім'я-масиву – покажчик-константа;

вираз – індекс, число цілого типу; він визначає зсув – збільшення адреси заданого елемента масиву щодо адреси нульового елемента масиву.

Елементи одновимірного масиву розташовуються в ОП підряд: нульовий, перший і т д. Приклад оголошення масиву:

 

int а[10];

іnt *p = а; /* – р одержує значення а */

 

При цьому компілятор виділяє масив в стеку ОП розміром
(sizeof(Type) * розмір-масиву) байтів.

У вищенаведеному прикладі це 2 * 10 = 20 байтів. Причому а – покажчик-константа, адреса початку масиву, тобто його нульового елемента,
р – змінна; змінній р можна присвоїти значення одним із способів:

 

р = а;

р = & а[0];

р = & a[i];

 

де & а[i] == (а + i) – адреса і-елемента масиву.

Відповідно до правил перетворення типів значення адреси i-елемента масиву на машинному рівні формується таким чином:

 

& а[i]= а + i * sizeof(int);

 

Справедливі також наступні співвідношення:

 

& a == a+0 == & a[0] – адреса а[0] – нульового елемента масиву;

а+2 == & а[2] – адреса а[2] – другого елементи масиву;

а+i == & a[i] – адреса a[i] – i-гo елемента масиву;

*а==*(а+0)==*(& а[0])==a[0] – значення 0-ого елемента масиву;

*(а + 2) == а[2] – значення а[2] – другого елементи масиву;

*(а + i) == а[i] – значення a[i] – i-гo елемента масиву;

*а + 2 == а[0] + 2 – сума значень а[0] і 2.

 

Якщо р – покажчик на елементи такого ж типу, які і елементи масиву a та p=а, то а та р взаємозамінні; при цьому:

 

p == & a[0] == a + 0;

p+2 == & a[2] == a + 2;

*(p + 2) == (& a[2]) == a[2] == p[2];

*(p + i) == (& a[i]) == a[i] == p[i];

 

Для a та p еквівалентні всі звертання до елементів a у вигляді:

a[i], *(a+i), *(i+a), i[a], та

p[i], *(p+i), *(i+p), i[p]

Завдання

 

Розробити блок-схему та розв’язати завдання з використанням мови програмування С++. Дано масив чисел ... та число .

 


Поделиться с друзьями:

mylektsii.su - Мои Лекции - 2015-2024 год. (0.012 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал