Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OOP.docx
Скачиваний:
6
Добавлен:
12.11.2019
Размер:
347.23 Кб
Скачать

Лабораторна робота № 3 Створення|створіння| і обробка масивів

Мета|ціль|. Отриматитримати практичні навички|навички| створення|створіння| і обробки масивів даних за допомогою мови С++.

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

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

За способом розподілу пам'яті під дані масиви розділяють на статичні і динамічні.

При оголошенні статичного масиву відбувається|походить| пошук зв'язної області вільної оперативної пам'яті, розмір якої рівний числу елементів масиву, помноженому на розмір одного елементу. Кількість байт, займану|позичати,посідати| одним елементом, визначається його типом.

Мова|язик| С++ допускає масиви будь-якого типу, включаючи масиви масивів (багатовимірні|багатомірні|).

Наприклад. Заданий двовимірний масив дійсних чисел. Визначити математичне очікування|чекання| і дисперсію.

#include <iostream. h>

#include <conio. h>

#define Row 5

#define Col 4

void main ()

{float masRowCol,//оголошення масиву mas, який містить Row*Col //елементів типу float

float m_o = 0, m_o_2=0; int i, j;

for (i = 0; i < Row, i ++)

for (j = 0; j < Col, j ++)

{cin >> masij; //внесення значень елементів

m_o + = masij; //накопичення суми елементів масиву

m_o_2+=masij*masi j;//накопичення суми квадратів елементів масиву

}

m_o = m_o / (Col*Row); //обчислення мат. сподівання/

сout << “\n Математичне сподівання = ” << m_o;

m_o_2 = m_o_2 / (Col*Row); //обчислення моменту другого порядку

cout << “\ n Дисперсія = “ << m_о_2 - m_о*m_0;

getch();

}

Динамічні масиви використовуються для гнучкішого розподілу оперативної пам'яті під елементи масиву і управління нею. При цьому в С++ використовуються оператори new і delete у вигляді|виді|:

ім’я_массиву = new тип_ елементу [кількість_элементів] ;

delete [] ім’я_массиву;

при цьому ідентифікатор ім’я_масиву повинен бути оголошений покажчиком на тип елементів масиву:

тип_елементу * ім’я_массива;

Якщо компілятору не вдається виділити з|із| купи(вільної пам'яті) необхідний об'єм|обсяг| пам'яті, що запрошується оператором new, то ідентифікатору ім’я_масиву привласнюється значення системного покажчика порожнечі|пустоти| NULL.

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

Наприклад. Створити динамічний двовимірний масив чисел, визначити позицію першого нуля в кожному рядку.

#include < iostream. h >

void main()

{ int row, col, i, j, pos;

cout <<  \n введіть кількість рядків та стовпчиків;

cin >> row>>col;

int ** mas;

mas = new int * row; // розподіл пам’яті під адреси рядків

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

{ mas i = new int col; /* розподіл пам’яті під елементи i - ого

рядка масиву */

for (j = 0; j < col; j ++)

cin >> mas i j ; // внесення значень елементів масиву

}

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

{ pos = -1;

for (j = 0; j < col; j ++)

if (mas ij = = 0) break;

pos = j; /* якщо поточний елемент стовпчика дорівнює

нулю, занести його позицію в змінну pos*/

if (pos <col) cout <<  \ n в  <<i<< - ому рядку нуль знаходиться в 

<<pos<<  стовпчику;

else cout <<  \n  <<i<<  рядок не мітить нуля;

}

for(i=0;i<col;i++) delete masi; /*звільнення пам’яті, що була зайнята під елементи i-того рядка */

delete mas; //звільнення пам’яті, що була зайнята під покажчики на рядки

}

Завдання до лабораторної роботи № 3

  1. Вивчити можливості створення та обробки однотипових даних на прикладі програм, що розглянуті в п.п. «Короткі теоретичні відомості» та «Приклад виконання лабораторної роботи №3». Перевірити роботу наведених програм.

  2. Модифікувати програму, яку наведено в п. «Приклад виконання лабораторної роботи №3» таким чином, щоб розподіл памя’ті відбувався динамічно, а не статично. Пояснити принципові відмінності застосованих методів.

  3. |задачі|Написати програму, що дозволяє вирішити поставлену в індивідуальному завданні задачу з використанням масивів. Спосіб зберігання елементів масиву вибрати самостійно. Пояснити вибір.

Приклад виконання лабораторної роботи №3

Приклад використання масивів для збереження та обробки однотипових даних.

Нехай задано деяку квадратну матрицю розмірності n n, яка містить дійсні числа.. Розіб’ємо дану матрицю на чотири сектори однакового розміру, як показано на рис.1. Будемо вважати, що квадратна матриця є збалансованою,

1 . .

. . n

1

.

1

3

.

n

2

4

Рис.1 Сектори

матриці

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

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

float mas[10][10]; ,//оголошення масиву mas, який містить 100 елементів типу

float Sum[]={0,0,0,0};//оголошення масиву Sum з чотирма елементами, які //дорівнюють нулю

int i,j,n;

cin>>n; //ввід кількості елементів масиву

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

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

cin>>mas[i][j]; // внесення значень елементів масиву

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

int rozmir=n/2;

В даному випадку використане ціле ділення. Тобто, якщо n є числом, яке не кратне 2, змінна rozmir буде цілим числом. Це дозволяє відкинути середній стовпчик та рядок при визначенні розміру сектора, якщо n є числом, яке не кратне 2.

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

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

for(j=0;j<centr;j++)

{ Sum[0]+=mas[i][j]; //підрахунок суми в першому секторі

Sum[1]+=mas[n-1-i][j]; //підрахунок суми в другому секторі

Sum[2]+=mas[i][n-1-j]; //підрахунок суми в третьому секторі

Sum[3]+=mas[n-1-i][n-1-j]; //підрахунок суми в четвертому секторі

}

Підрахунок суми елементів першого та третього секторів ведеться, починаючи з елементів рядка з нульовим індексом в прямому напрямку, другого і четвертого секторів – починаючи з останнього елемента рядка у зворотному напрямку. Аналогічно, накопичення суми елементів першого та другого секторів ведеться, починаючи з нульового елемента стовпчика в прямому напрямку, для третього та четвертого секторів – починаючи з останнього елементу стовпчика в зворотному напрямку.

Таким чином, в цілому програма визначення збалансованості заданої матриці матиме вигляд:

#include <iostream.h>

#include <conio.h>

void main()

{ float mas[10][10];

float Sum[]={0,0,0,0};

int i,j,n;

cin>>n;

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

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

cin>>mas[i][j];

int rozmir=n/2;

cout<<"\nc="<<centr+n%2;

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

for(j=0;j<rozmir;j++)

{Sum[0]+=mas[i][j];

Sum[1]+=mas[n-1-i][j];

Sum[2]+=mas[i][n-1-j];

Sum[3]+=mas[n-1-i][n-1-j];

}

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

cout<<"\nSum["<<i<<"]="<<Sum[i];

if ((Sum[0]==Sum[3])&&(Sum[1]==Sum[2])) cout<<"\n збалансована";

else cout<<"\n не збалансована";

getch();}

Зміст|вміст,утримання| звіту до лабораторної роботи №3

  1. Титульний лист|аркуш|: назва дисципліни; номер і найменування роботи; прізвище, ім'я, по батькові студента; дата виконання.

  2. Постановка завдання|задачі|. Слід дати конкретну постановку, тобто вказати, який масив даних потрібно створити, які під задачі повинні вирішуватись

  3. Математична схема вирішення поставленої задачі

  4. Визначення основних змінних та функцій з|із| коментарями.

  5. Реалізація функцій.

  6. Лістинг основної програми, в якому повинно бути вказано, в якому місці і яка функція викликається|спричиняються|.

Варіанти завдань до лабораторної роботи №3

  1. Є|наявний| n міст, зв'язаних мережею|сіттю| шосейних доріг. Відома відстань між містами, якщо вони зв'язані дорогою. Необхідно знайти найкоротший шлях|колію,дорогу| і його довжину від вказаного міста відправлення в будь-яке інше відоме місто (метод Форда визначення найкоротшого шляху|колії,дороги| на графі в інтерпретації Дейкстри). Теоретичний матеріал див. в методичних вказівках до виконання семестрової роботи з дисципліні “Дискретна математика”.

  2. Є|наявний| n міст, зв'язаних мережею|сіттю| шосейних доріг. Відома відстань між містами, якщо вони зв'язані дорогою. Необхідно знайти довжини найкоротших шляхів|колій,доріг| між будь-якими двома відомими містами (метод Шимбела визначення найкоротшого шляху|колії,дороги| на графі ). Теоретичний матеріал див. в методичних вказівках до виконання семестрової роботи з дисципліні “Дискретна математика”.

  3. “Життя” – це багатоклітинна істота, що населяє прямокутну пустелю. Пустеля розбита на осередки|чарунок,вічка,комірки|, подібні клітинам шахівниці. Осередок|чарунка,вічко,комірка| може бути порожнім|пустим| або вміщати одну клітку|клітину| життя. У цьому світі “життя” розвивається по кроках. За один крок в одних осередках|чарунках,вічках,комірках| клітки|клітини| гинуть, а в інших зароджуються. Зміна поколінь “життя” відбувається|походить| за такими правилами:

  • сусідами клітки|клітини| називаються клітки|клітини|, що знаходяться|перебувають| в 8 осередках|чарунках,вічках,комірках|, дотичних з|із| осередком|чарункою,вічком,коміркою|, що містить|утримує| клітку|клітину|;

  • якщо клітка|клітина| має двох або трьох сусідів, то вона зберігає себе на наступному|такому| такті “життя”;

  • якщо клітка|клітина| має більше трьох або менше двох сусідів – вона гине. У першому випадку – від перенаселеності, в другому – від “самоти|самітності,самотності|”;

  • якщо в клітці|клітині| немає “життя”, але|та| у|в,біля| неї рівно три сусідні клітки|клітини|, то в ній зароджується “життя”.

Необхідно написати програму, що дозволяє визначати стан “життя” через вказану кількість кроків. Питання про розміри пустелі і її заповнення вирішити|розв'язати| самостійно.

  1. Існує n груп 2-го і 3-го курсів|, які необхідно розподілити в n комп'ютерні класи для проведення лабораторних занять. На основі наявних статистичних досліджень визначена продуктивність кожної групи в кожному комп'ютерному класі. Необхідно так розподілити групи по класах, щоб сумарна продуктивність на заняттях по програмуванню була максимальною (угорський метод рішення задачі вибору: виконати крок приведення масиву і вибір незалежних нулів). Теоретичний матеріал див. в методичних вказівках до виконання семестрової роботи з дисципліні “Методи оптимізації”.

  2. Умова завдання|задачі| №4 : реалізувати крок пошуку мінімального покриття матриці і її подальшого|наступного| приведення.

  3. Задана “s/t - мережа|сіть|”, яка складається з n міст і m дуг. Необхідно визначити величину максимального потоку в “s/t - мережі|сіті| (теорема Форда - Фалкерсона). Теоретичний матеріал див. в методичних вказівках до виконання семестрової роботи з дисципліні “Дискретна математика”.

  4. Транспортна задача|задача|: вибір початкового опорного рішення|розв'язання,вирішення,розв'язування| методом північно-західного кута|рогу,кутка|. Теоретичний матеріал див. в методичних вказівках до виконання семестрової роботи з дисципліні “Методи оптимізації”.

  5. Транспортна задача|задача|: вибір початкового опорного рішення|розв'язання,вирішення,розв'язування| методом мінімального елементу. Теоретичний матеріал див. в методичних вказівках до виконання семестрової роботи з дисципліні “Методи оптимізації” >

  6. Транспортна задача|задача|: вибір початкового опорного рішення|розв'язання,вирішення,розв'язування| методом Фогеля. Теоретичний матеріал див. в методичних вказівках до виконання семестрової роботи з дисципліні “Методи оптимізації”.

  7. Транспортне задача|задача|: поліпшення|покращання| опорного плану методом потенціалів. Теоретичний матеріал див. в методичних вказівках до виконання семестрової роботи з дисципліні “Методи оптимізації”.

  8. Симплексний метод рішення|розв'язання,вирішення,розв'язування| ЗЛП|: побудова|шикування| симплексної таблиці, вибір розв’язуючого елементу. Теоретичний матеріал див. в методичних вказівках до виконання семестрової роботи з дисципліні “Методи оптимізації”.

  9. Симплексний метод рішення|розв'язання,вирішення,розв'язування| ЗЛП|: перерахунок симплексної таблиці, визначення оптимальності одержаного|отриманого| рішення|розв'язання,вирішення,розв'язування|. Теоретичний матеріал див. в методичних вказівках до виконання семестрової роботи з дисципліні “Методи оптимізації”.

  10. Задані три послідовності: U(розмірності n), X(розмірності m), Y(розмірності r). Враховуючи, що послідовність U – універсальна множина|безліч|, послідовності X і Y – підмножини універсальної множини|безлічі|, необхідно знайти:

  • об'єднання множин|безлічі| X і Y;

  • перетин множин|безлічі| X і Y;

  • різниця множин|безлічі| X і Y, Y і X;

  • доповнення множин|безлічі| X і Y;

  • прямий добуток|добуток| множин|безлічі| X і Y.

Передбачити можливість|спроможність| некоректного завдання|задавання| множин U, X, Y. Теоретичний матеріал див. в методичних вказівках до виконання семестрової роботи з дисципліні “Дискретна математика”.

  1. Задані дві матриці А={aij} розмірності nn і B={bij} розмірності mg. Для кожної з них поміняти місцями другий і третій стовпці і елементи рядка, який містить|утримує| найбільший елемент матриці, замінити нулями. Підрахувати|підсумувати| значення найбільшого мінору для матриць А і В.

  2. Скласти функцію для обчислення|підрахунку| елементів матриці С={cij}, розмірності m g, що є|з'являється,являється| добутком матриць А={aij} розмірності m n|добутком| і B={bij} розмірності n g. У масиві В поміняти місцями рядки, які вибирає користувач.

  3. Скласти функцію для обчислення|підрахунку| елементів матриці С={cij}, яка є сумою матриць А={aij}, |з'являється,являється| і B={bij} розмірності n  n. Причому матриця А може бути задана довільно, а елементи матриці B визначаються наступним|слідуючим| чином: Потім в матриці А замінити всі від’ємні|заперечні| елементи найменшим в кожному рядку відповідно, а позитивні - замінити залишком|остачею| від ділення|поділки,розподілу,поділу| елементу на 2.

  4. Скласти функцію для обчислення|підрахунку| вектора Z={zi}, i=1.m, рівного добутку|добутку| матриці А={aij} розмірності m  n на вектор Х={хj}, елементи якого обчислюються за формулою Перевірити, чи є|з'являються,являються| елементи вектора Z впорядкованими за зменшенням. Якщо ні, то показати перший елемент, що порушив порядок|лад| зменшування, а також номер цього елементу, виправити|справити| порушення, тобто розташувати елементи у порядку|ладі| зменшування.

  5. Скласти функцію, яка у заданій|запровадженій| матриці А розмірності mn знаходить|находить| число R - найменше з|із| позитивних відношень, де s – номер стовпця, в якому елемент ais є негативним|заперечний|. У масиві А замінити елементи стовпця з|із| найменшим значенням нулями.

  6. Написати програму, яка будує матрицю А розмірності nn з|із| компонентами, визначуваними за формулою: aij= sin(i+j)x, i,j=1.n, x – довільна дійсна величина. Потім в кожному рядку А замінити найбільший елемент абсолютною величиною діагонального елементу, а від’ємні|заперечні| елементи замінити їх кубами. Далі розташувати елементи кожного рядка у порядку|ладі| зростання.

  7. У масиві А={aij} розмірності n n знайти різницю між сумою і добутком|добутком| елементів| масиву. Потім в кожному рядку знайти найбільший елемент і упорядкувати всі елементи в правильному порядку|ладі| по відношенню до найбільшого, тобто якщо існує рядок {1.2; 0.5; 7.0; 2.6; 5.0}, то після|потім| впорядкування повинен вийти рядок {0.5; 1.2; 7.0; 5.0; 2.6}.

  8. Скласти функцію для обчислення|підрахунку| матриці B={bij}, яка є добутком|добутку| числа g на матрицю А={aij} розмірності n n. Число g – найбільший елемент заданого вектора Z. Потім в матриці В замінити діагональні елементи найбільшими елементами кожного стовпця відповідно.

  9. Скласти функцію для обчислення|підрахунку| вектора B={bi}, рівного тому рядку матриці А={aij} розмірності n n, в якій розташований|схильний| найбільший елемент матриці, і вектора С={ci}, який є таким стовпцем матриці А, в якому знаходиться|перебуває| найменший елемент матриці. Потім упорядкувати елементи знайдених векторів| у порядку|ладі| зростання елементів.

  10. Задані дві матриці А={aij} розмірності nn і B={bij} розмірності mg. Для кожної з них визначити добуток|добуток| від’ємних|заперечних| елементів і їх кількість. Упорядкувати елементи рядків в матриці А і стовпців матриці В у порядку|ладі| зростання лінійним швидким сортуванням.

  11. Задано|запроваджена| матрицю А={aij} розмірності mn. Скласти функцію для побудови|шикування| логічного вектора B={bi} за наступним|слідуючим| правилом: якщо в рядку з|із| номером k кількість позитивних елементів більше ніж кількість від’ємних |заперечних|, то bk=1(true), інакше bk=0(false). Потім необхідно розташувати елементи кожного стовпця масиву А по убуванню лінійним сортуванням.

  12. Задано|запроваджена| матрицю А={aij} розмірності nn. Скласти функцію для побудови|шикування| вектора B={bi} за наступним|слідуючим| правилом: якщо aii0, то bi прийняти рівним сумі елементів і - ого рядка, інакше – суму абсолютних величин і - го стовпця. Потім в матриці А розташувати елементи кожного рядка у порядку|ладі| зростання.

  13. Введена|запроваджена| матриця А={aij} розмірності mn. Скласти функцію для побудови|шикування| логічного вектора B={bi} за наступним|слідуючим| правилом: якщо і - ий рядок матриці А утворює незбутню послідовність, то bk=1(true), інакше bk=0(false). Потім в матриці А для кожного рядка визначити номери найменших елементів і добуток|добуток| |слідуючих| елементів, що йдуть за ними.

  14. Введені|запроваджені| логічний вектор А={ai} і дійсний Х={хi} і=1,., n. Скласти функцію для перетворення вектора Х за правилом: якщо ai=1(true), то хi помножити на 10, інакше – розділити на -10. Потім у векторі Х замінити позитивні елементи найбільшим серед позитивних, а від’ємні|заперечні| – найменшим серед від’ємних |заперечних|.

  15. Написати аналог гри “Хрестики - нулі”.

  16. Заданий куб 222, грані якого розбиті на 4 однакових сектори 11. Кожний з секторів розфарбований довільним чином. Визначити, чи розфарбована кожна з граней куба одним кольором|цвітом|. Спосіб зберігання даних визначити самостійно.

  17. Заданий масив 33, заповнений довільно числами від 1 до 8, одна комірка|чарунка,вічко,комірка| масиву “умовно порожня|пустий|”. Використовуючи принцип гри “п’ятнашки”, упорядкувати елементи масиву.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]