Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
30
Добавлен:
15.01.2021
Размер:
78.2 Кб
Скачать

4.3. Масиви структур у c#

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

Person[] persons = new Person[3]; //створення масиву структур

Приклад 6.

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace Lab4_Array

{

struct Person

{

string Name;

string Role;

int Age;

string Address;

public Person(string name, string role, int age, string address)

{

//конструктор з параметрами. Ініціалізація полів

this.Name = name;

this.Role = role;

this.Age = age;

this.Address = address;

}

public void Print_Person()

{

//метод виводить інформацію про студента

Console.WriteLine("Ім'я= {0}, Роль= {1}, Вік = {2}, Адреса = {3}", Name, Role, Age, Address);

}

}

class Program

{

static void Main(string[] args)

{

Person[] persons = new Person[3]; //створення масиву структур

//створення екземплярів структури

persons[0] = new Person("Іванов", "студент", 20, "Киев");

persons[1] = new Person("Петров", "магістр", 22, "Одеса");

persons[2] = new Person("Сидоров", "робітник", 26, "Харків");

foreach (Person pers in persons)

{

pers.Print_Person(); //виведення інформації про персони

}

Console.ReadKey();

}

}

}

Призначення структур

У зв'язку з викладеним вище виникає резонне питання: навіщо в C# включена структура, якщо вона має скромніші можливості, ніж клас? Відповідь на це питання полягає в підвищенні ефективності і продуктивності програм. Структури відносяться до типів значень, і тому ними можна оперувати безпосередньо, а не за посиланням. Отже, для роботи із структурою взагалі не потрібно змінні посилкового типу, а це означає у ряді випадків істотну економію оперативної пам'яті.

Більше того, робота із структурою не призводить до погіршення продуктивності, такого характерного для звернення до об'єкту класу. Адже доступ до структури здійснюється безпосередньо, а до об'єктів - за посиланням, оскільки класи відносяться до даних посилкового типу. Непрямий характер доступу до об'єктів має на увазі додаткові витрати обчислювальних ресурсів на кожен такий доступ, тоді як звернення до структур не спричиняє за собою подібні витрати. І взагалі, якщо треба просто зберегти групу пов'язаних разом даних, що не вимагають спадкування і звернення за посиланням, то з точки зору продуктивності для них краще вибрати структуру.

У С++ також є структури і використовується ключове слово struct. Але ці структури відрізняються від тих, що є в C#. Так, в С++ структура відноситься до типу класу, а значить, структура і клас в цій мові практично рівноцінні і відрізняються один від одного лише доступом за замовчанням до їх членів, які виявляються закритими для класу і відкритими для структури. А в C# структура відноситься до типу значення, тоді як клас - до посилкового типу.

Приклад використання структури замість классу

У файлі Persons.txt зберігається інформація про співробітників.

Ivanov/2000/3000

Petrov/1990/4000

Sidorov/1980/3500

Goncharenko/1995/5600

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.IO;

namespace Lab8_OOP

{

struct Person

{

string name;

int birth_year;

double pay;

public Person(string s) // 2 конструктор з параметром

{

string[] split = s.Split(new Char[] { '/' });

name = split[0].Trim();

birth_year = Convert.ToInt32(split[1].Trim());

pay = Convert.ToDouble(split[2].Trim());

if (birth_year < 0) throw new FormatException();

if (pay < 0) throw new FormatException();

}

public override string ToString() // 3 перевизначений метод

{

return string.Format("Name: {0} birth: {1} pay: {2:F2}", name, birth_year, pay);

}

public int Compare(string name) // порівняння прізвища

{

return (string.Compare(this.name, 0, name, 0, name.Length, StringComparison.OrdinalIgnoreCase));

}

// -------------------- властивості класу --------------------------

public string Name

{

get { return name; }

set { name = value; }

}

public int Birth_year

{

get { return birth_year; }

set

{

if (value > 0) birth_year = value;

else throw new FormatException();

}

}

public double Pay

{

get { return pay; }

set

{

if (value > 0) pay = value;

else throw new FormatException();

}

}

// ------------------ операції класу ---------------------------

public static double operator +(Person pers, double a)

{

pers.pay += a;

return pers.pay;

}

public static double operator +(double a, Person pers)

{

pers.pay += a;

return pers.pay;

}

public static double operator -(Person pers, double a)

{

pers.pay -= a;

if (pers.pay < 0) throw new FormatException();

return pers.pay;

}

}

}

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.IO;

namespace Lab8_OOP

{

class Program

{

static void Main(string[] args)

{

Person[] dbase = new Person[10]; //масив персон

int n = 0;

try

{

StreamReader f = new StreamReader("Persons.txt");

string s;

int i = 0;

while ((s = f.ReadLine()) != null) //Читати до кінця файлу

{

dbase[i] = new Person(s); //конструктор об'єктів класу Person

Console.WriteLine(dbase[i]);

++i;

}

n = i - 1;

f.Close();

}

catch (FileNotFoundException e)

{

Console.WriteLine(e.Message);

Console.WriteLine("Перевірте правильність імені і шляху до файлу!");

return;

}

catch (IndexOutOfRangeException)

{

Console.WriteLine("Дуже великий файл!");

return;

}

catch (FormatException)

{

Console.WriteLine("Недопустима дата народження або оклад");

return;

}

catch (Exception e)

{

Console.WriteLine("Помилка: " + e.Message);

return;

}

Console.ReadKey();

//------------------------

int n_pers = 0;

double mean_pay = 0;

Console.WriteLine("Введіть прізвище співробітника");

string name;

while ((name = Console.ReadLine()) != "")

{

bool not_found = true;

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

{

Person pers = dbase[k];

if (pers.Compare(name) == 0)

{

Console.WriteLine(pers);

++n_pers; mean_pay += pers.Pay;

not_found = false;

}

}

if (not_found) Console.WriteLine("Такого співробітника немає");

Console.WriteLine("Введіть прізвище співробітника або Enter для завершення");

}

if (n_pers > 0)

Console.WriteLine("Середній оклад: {0:F2}", mean_pay / n_pers);

Console.ReadKey();

}

}

}

Контрольні запитання і завдання для самостійного виконання

1. Яке призначення записів на мові Паскалі?

2. Як оголошується запис на на мові Паскаль?

3. Яка структура даних у C# відповідає запису?

4. Яка різниця між структурами і класами у C#?

5. Чи може структура мати конструктор без параметрів?

6. Коли використання структури у програмі краще за клас і чому?

7. До посилкового чи типу-значення відносяться структури?

8. Створити структуру, яка описує адресу з полями: місто, вулиця, номер будину, квартира. Створити метод, який виводить на консоль значення полів.

В методі main створити 2 об’єкти і призначити їм значення двох адрес. Викликати метод виведення значень полів.