Попередня сторінка Зміст Наступна сторінка Електронні посібники ВНТУ
ЛАБОРАТОРНА РОБОТА № 3
СКЛАДНІ СТРУКТУРИ ДАНИХ C#
Мета роботи: навчитися створювати та працювати з масивами, структурами, з’ясувати поняття перерахування (перелічення), їх створення і використання.
3.1 Теоретичні відомості
3.1.1 Масиви
Платформа .NET включає різні вбудовані типи даних, такі як int, decimal, string, та boolean. Ці типи можуть бути ідентифіковані як прості типи даних, тому що вони складаються з єдиного, простого значення, такого як число, текстове значення, істина або хиба. Можна стверджувати, що String – це не простий тип даних і в деякій мірі це правда. C/C++ та інші подібні мови вважають, що String – це символьний масив. Основна відмінність C# – те, що ми можемо використовувати значення типу String в якості простої структури даних, не хвилюючись про доступ до нього як до символьного масиву.
Складні типи даних підходять для випадків, коли вам потрібно зберегти кілька елементів як єдине ціле. Розглянемо дні тижня, місяці року, колоду карт. Кожен з цих прикладів вимагає декількох значень, щоб відобразити поняття. Ми сприймаємо тиждень, як єдине ціле, що складається з семи днів. Коли ми говоримо приблизно тиждень, ми враховуємо те, з чого складається тиждень.
Масив являє собою набір об'єктів, які згруповані разом і управляються як єдине ціле. Ви можете думати про масив як про послідовність елементів однакового типу. Ви можете створювати прості масиви, які мають один вимір (список), два виміри (таблиці), три виміри (куб) і так далі. Масиви в C# мають такі особливості:
- Кожен елемент в масиві містить значення.
- Масиви індексуються з нуля, тобто перший елемент в масиві – елемент на позиції 0.
- Розмір масиву – загальна кількість елементів, які він містить.
- Масиви можуть бути одновимірні, багатовимірними, або зубчасті.
- Розряд масиву – число розмірностей в масиві.
Масиви певного типу можуть містити елементи тільки цього типу. Якщо вам необхідно здійснювати маніпуляції набором на відміну від роботи з об'єктом або типом значення, рекомендується використовувати один з типів колекцій, які визначені в просторі імен System.Collections.
3.1.2 Створення і використання одновимірних масивів
Коли ви оголошуєте масив, ви вказуєте тип даних, який він містить та ім'я масиву. Оголошення масиву насправді не виділяє для нього пам'ять. CLR фізично створює масив, коли ви використовуєте ключове слово new і також саме тоді ви повинні й задати розмір масиву.
Щоб оголосити одновимірний масив, ви вказуєте тип елементів в масиві і використовуєте дужки [], щоб вказати, що змінна – масив. Пізніше, ви визначаєте розмір масиву, коли виділяєте пам'ять для масиву за допомогою ключового слова new. Розмір масиву – ціле число.
Наступний приклад коду показує, як створити одновимірний масив цілих чисел, починаюючи з нульового елементу і завершуючи дев'ятим.
int[] arrayName = new int[10];
В наступному прикладі, ми оголошуємо масив і присвоюємо йому значення.
Компілятор знає наскільки великим робити масив, щоб він містив значення, що задаються у фігурних дужках.
int[] arrayName = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
3.1.3 Доступ до даних в масиві
Ви можете отримати доступ до даних в масиві декількома способами, наприклад, шляхом визначення індексу конкретного елемента, або ітерацією через весь масив, повертаючи кожен елемент послідовно.
У наступному прикладі коду використовується індекс для доступу до елементу з індексом два.
//Доступ до елементів масиву за індексом
int[] oldNumbers = { 1, 2, 3, 4, 5 };
//number буде містити значення 3
int number = oldNumbers[2];
Примітка: Масиви починаються з нульового індекса, тому перший елемент в масиві будь-якої розмірності з індексом нуль. Останній елемент має індекс N-1, де N є розмірність. При спробі доступу до елементу поза цим діапазоном CLRгенерує виняток(помилку) IndexOutOfRangeException.
Ви можете перебрати масив, використовуючи для цього цикл. Ви можете використовувати властивість Length масиву, щоб визначити, коли зупинити цикл.
У наступному прикладі коду показано, як використовувати цикл для перебору масиву.
//Перебір всіх елементів масиву
int[] oldNumbers = { 1, 2, 3, 4, 5 };
for (int i = 0; i < oldNumbers.Length; i++)
{
int number = oldNumbers[i];
}
3.1.4 Багатовимірні масиви
Масиви можуть мати розмірність більше, ніж 1. Число розмірностей відповідає числу індексів, які використовуються, щоб ідентифікувати окремий елемент в масиві. Ви можете визначити до 32 розмірностей, але вам рідко будуть потрібні більше, ніж 3. Ви оголошуєте багатовимірну змінну типу масив, так як ви оголошуєте одновимірний масив, але ви розділаєте розмірності комами.
Наступний приклад коду показує, як створити масив цілих чисел з двома размірностями.
// Створюємо масив, що довжиною 10 елементів (рядок) і ширина - 10 елементів (стовпчик)
int[ , ] arrayName = new int[10,10];
Для того, щоб отримати доступ до елементів в багатовимірному масиві, ви повинні вказувати усі індекси, як в прикладі коду нижче.
// Досуп до першого елемента першого рядка першого стовпчика
int value = arrayName[0,0]
// Досуп до першого елемента першого рядка другого стовпчика
int value2 = arrayName[0, 1];
// Досуп до першого елемента дрягого рядка першого стовпчика
int value2 = arrayName[1, 0];
3.1.5 Зубчасті масиви
Зубчастий масив – це масив масивів, і розмір кожного масиву може бути різний. Зубчасті масиви можуть бути використані для моделювання розріджених структур даних, де, можливо, не завжди потрібно виділяти пам'ять для кожного елемента, якщо вона не буде використовуватися. Наступний приклад коду показує, як оголосити і задати зубчастий масив. Зверніть увагу на те, що Ви повинні визначити розмір першого масиву, але Ви не повинні визначати розмір масивів, які містяться в цьому масиві. Ви виділяєте пам'ять кожному масиву в зубчастому масиві окремо, за допомогою ключового слова new.
int[][] jaggedArray = new int[10][];
jaggedArray[0] = new Type[5]; // можна задавати будь-який розмір.
jaggedArray[1] = new Type[7];
...
jaggedArray[9] = new Type[21];
3.1.6 Перерахування(перелічення)
Перерахування – є структурою, яка дозволяє створити змінну з фіксованим набором можливих значень. Найбільш поширеним прикладом є використання перерахування для визначення дня тижня. Є тільки сім можливих значень для днів тижня, і ви можете бути впевнені, що ці значення не зміняться.
Найкращою практикою є задання перерахування безпосередньо поблизу простору імен так, щоб всі класи в цьому просторі імен мали б доступ до нього, якщо це необхідно. Можна також помістити ваші змінні з перерахування всередині класів або структур.
За замовчуванням значення перерахувань починаються з 0 і кожний наступний член збільшує значення індекса на 1.
3.1.7 Створення і використання перерахувань
Щоб створити перерахування, ви оголошуєте його в коді за допомогою наступного синтаксису, який демонструє створення перерахування під назвою Day, який містить дні тижня:
enum Day { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday };
За замовчуванням значення перерахувань починаються з 0 і кожний наступний член збільшується на в 1. В результаті, попереднє перерахування 'День' буде містити значення:
Sunday = 0
Monday = 1
Tuesday = 2
Ви можете змінити значення за замовчуванням, вказавши початкове значення для вашого перерахування, як показано в наступному прикладі
enum Day { Sunday = 1, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday };
У цьому прикладі, неділі присвоюється значення 1 замість 0.
Зараз Monday = 2, Tuesday = 3, і т.д.
Ключове слово enum використовується для вказівки "типу" якого буде змінна Day. Перерахування підтримують вбудовані типи даних і можна використовувати один з наступних: byte, sbyte, short, ushort, int, uint, long, ulong.
Для того, щоб змінити тип даних за замовчуванням для вашого перерахування, ви можете вказати тип даних зі списку вище, так як:
enum Day : short { Sunday = 1, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday };
Базовий тип визначає, скільки пам'яті буде виділено для кожного лічильника в перерахуванні. Під час компіляції, ваше перерахування буде конвертоване в числовий літерал в коді. Якщо ви використовуєте Visual Studio, функція Intellisense цілком здатна розпізнати ваше перерахування і буде автоматично відображати строкові значення в IDE, коли ви вводите ім'я enum.
Важливо відзначити, що вам необхідно буде використовувати явне приведення, якщо ви хочете перетворити з значення типу enum до іншого типу. Розглянемо наступний приклад, в якому оператор присвоює значення перелічення Sun до типу ште, щоб перетворити перерахування в ціле значення.
int x = (int)Day.Sun;
Використання перерахувань
Day favoriteDay = Day.Friday;
Використання перерахувань має ряд переваг в порівнянні з використанням тексту або числових типів:
- Покращена керованість. Обмежуючи змінну фіксованим набором допустимих значень, ви менше схильні використовувати неприпустимі аргументи і робити помилки.
- У Visual Studio, функція IntelliSense підказує вам можливі значення при використанні enum.
- Краще читається код. Синтаксис перерахування робить ваш код зрозумілішим.
Кожен член перерахування має ім'я і значення. Ім'я є рядком, що визначається в фігурних дужках, наприклад, неділя або понеділок. За замовчуванням, значення є цілим числом. Якщо ви не вкажете значення для кожного члена, їм призначаються значення у порядку зростання починаючи з 0. Наприклад, Day.Sunday дорівнює 0 і Day.Monday дорівнює 1.
У наступному прикладі показано, як можна використовувати імена і значення для присвоєння:
// Задання змінної перелічення за іменем.
Day favoriteDay = Day.Friday;
// Задання змінної перелічення за значенням.
Day favoriteDay = (Day)4;
3.2 Завдання до лабораторної роботи (Додаток В)
3.3. Контрольні питання:
- Приклад оголошення змінної, що є структурою.
- Що таке масив
- Які бувають масиви?
- Опис синтаксису масивів.
- Охарактеризуйте масиви як об'єкти.
- Охарактеризуйте одномірні масиви.
- Охарактеризуйте багатовимірні масиви.
- Охарактеризуйте масиви масивів.
- Використання оператора foreach з масивами.
- Передача масивів в якості аргументів.
- Передача масивів за допомогою параметрів ref і out.
- Неявно типізовані масиви.
- Приклад оголошення змінної що є перечисленням (зчисленням).