• Главная
  • Карта сайта
Не найдено

C #. Розробка програми демонстрації роботи списків і асоціативних масивів

  1. зміст

У даній темі наведено приклад розробки програми типу Windows Forms Application, яке демонструє використання списків (клас List) і асоціативних масивів (клас Dictionary).

Додаток реалізує лабораторну роботу одного з навчальних закладів.

Використовуючи даний приклад Ви отримаєте досвід роботи з класами Dictionary <TKey, TValue> і List <T>, які відносяться до узагальнених колекцій.

При розробці програми реалізовані наступні завдання:

  • читання даних з файлу і відображення їх в елементі управління типу ListBox;
  • демонстрація використання класу StreamReader з модуля System.IO для читання даних з файлу;
  • демонстрація роботи класу Dictionary <TKey, TValue> для організації колекції. Клас зберігає пари «ключ-значення»;
  • демонстрація роботи класу List <T> для організації динамічного масиву або списку.

зміст

Реалізувати програму типу Windows Forms Application з використанням списків і асоціативних масивів.

Дано два текстові файли: « Flight.txt »І« Tickets.txt «.

Файли містять необмежену кількість рядків. Кожен рядок файлу містить дані, які розділені символом ',' (кома).

Один рядок файлу « Flight.txt »Має наступну структуру:

  • номер рейсу (ціле число);
  • пункт відправлення (рядок символів);
  • час вильоту, години (ціле число);
  • загальна кількість місць (ціле число).

Один рядок файлу « Tickets.txt »Має наступну структуру:

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

У програмі потрібно вирішити наступні завдання:

1. Прочитати дані з файлу «Flight.txt» і виконати над ними такі операції:

  • відобразити їх на Windows -форме в елементі управління типу ListBox;
  • організувати дані в колекцію (клас Dictionary <TKey, TValue>).

2. Прочитати дані з файлу «Tickets.txt» і виконати над ними такі операції:

  • відобразити їх на Windows -форме в елементі управління типу ListBox;
  • організувати дані в динамічний масив (клас List <T>).

3. Вивести на форму рейси з максимальною тривалістю польоту. Обчислення виконати з використанням класів Dictionary <TKey, TValue> і List <T>.

4. Вивести на форму число пасажирів, які чекають відправлення в введений момент часу. Обчислення виконати з використанням класів Dictionary <TKey, TValue> і List <T>.

Приклад вмісту файлу Flight.txt:

1, Kiev, 18,120 2, Kiev, 19,100 3, Kiev, 20,90 4, Kiev, 22,150

Приклад файлу «Tickets.txt«:

1,1,1,05.10.2016, California, 06.10.2016,21,500,14: 10 2,1,1,05.10.2016, California, 06.10.2016,21,500,14: 30 3,2,1,05.10. 2016, Croatia, 06.10.2016,22,245,14: 45 4,2,2,05.10.2016, Croatia, 06.10.2016,22,245,14: 50 5,2,3,05.10.2016, Croatia, 06.10.2016, 22,245,14: 51 6,3,1,05.10.2016, Amsterdam, 06.10.2016,23,400,14: 55 7,3,3,05.10.2016, Amsterdam, 06.10.2016,23,400,15: 10 8,3 , 7,05.10.2016, Amsterdam, 06.10.2016,23,400,15: 25 9,4,1,05.10.2016, Moscow, 06.10.2016,24,350,15: 27 10,4,10,05.10.2016, Moscow , 06.10.2016,24,350,16: 08

1. Запустити MS Visual Studio.

створити проект за шаблоном C # як Windows Forms Application. Приклад створення такого проекту докладно описується тут .

2. Створення форми додатка.

Розмістити на формі наступні елементи управління (рисунок 1):

  • елемент керування типу ListBox для відображення даних з файлу «Flights.txt«. Автоматично створюється об'єкт з ім'ям listBox1;
  • елемент керування типу ListBox для відображення даних з файлу «Tickets.txt«. Автоматично створюється об'єкт з ім'ям listBox2;
  • елементи управління типу Label для відображення інформаційних повідомлень. Створюються об'єкти з іменами label1, label2, label3, label4, label5;
  • елемент керування типу TextBox який представляє рядок введення даних (час відправлення). Створюється об'єкт з ім'ям textBox1;
  • елемент керування типу Button (кнопка «Обчислити«). Створюється об'єкт з ім'ям button1;
  • елемент керування типу ListBox (список рейсів з максимальною тривалістю польотів). Створюється об'єкт з ім'ям listBox3.

Скорегувати розміри і позиції елементів управління так як показано на малюнку 1.

Мал. 1. Форма додатка після розміщення елементів управління

3. Налаштування властивостей елементів управління.

Налаштування властивостей елементів управління здійснюється за допомогою вікна «Properties» системи Microsoft Visual Studio 2010 року.

Налаштувати такі властивості елементів управління:

  • в елементі управління label1 властивість Text = "Файл Flight.txt»;
  • в елементі управління label2 властивість Text = "Файл Tickets.txt»;
  • в елементі управління label3 властивість Text = "Час відправлення»;
  • в елементі управління textBox1 властивість Text = "";
  • в елементі управління label4 властивість Text = "Число пасажирів, які чекають відправлення:«;
  • в елементі управління button1 властивість Text = "Обчислити»;
  • в елементі управління label5 властивість Text = "Рейси максимальною тривалістю польоту:».

Після настройки властивостей і коригування позицій і розмірів елементів управління форма додатка буде мати вигляд як показано на малюнку 2.

Мал. 2. Форма додатка після настройки елементів управління

4. Організація даних у вигляді структур.

Дані, які розміщуються в одному рядку того чи іншого файлу доцільно представити у вигляді структури. Це здійснюється з метою підвищення ефективності роботи програми. Так як, на відміну від класу, який є посиланням, структури в C # реалізовані як типи-значення . У порівнянні зі структурами, при доступі до об'єктів класу за посиланням, збільшується кількість виділених ресурсів і оперативної пам'яті.

Уявімо дані одного рядка файлу «Flight.txt» у вигляді структури Flight:

// Структура "Авіарейси" public struct Flight {public int num_r; // номер рейсу public string punkt_vd; // пункт відправлення public int time_v; // час вильоту public int n_places; // загальна кількість місць}

За тим же принципом представляються дані одного рядка файлу «Tickets.txt» в структурі Tickets:

// Структура "Квитки" public struct Tickets {public int num_t; // номер квитка public int num_r; // номер рейсу public int place; // місце public string date_v; // дата вильоту public string punkt_pr; // пункт призначення public string data_pr; // дата прибуття public int time_pr; // час прибуття public double price; // ціна public string time_prod; // час продажу квитка}

Фрагмент лістингу файлу «Form1.cs» після введення структур має наступний вигляд:

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace Kontrolna_UZHNU_1 {public partial class Form1: Form {// Структура "Авіарейси" public struct Flight {public int num_r; // номер рейсу public string punkt_vd; // пункт відправлення public int time_v; // час вильоту public int n_places; // загальна кількість місць} public struct Tickets {public int num_t; // номер квитка public int num_r; // номер рейсу public int place; // місце public string date_v; // дата вильоту public string punkt_pr; // пункт призначення public string data_pr; // дата прибуття public int time_pr; // час прибуття public double price; // ціна public string time_prod; // час продажу квитка} public Form1 () {InitializeComponent (); }}}

5. Класи Dictionary <Key, Value> і List <T>. Опис основних структур даних.

У відповідності до розділу завдання, дані, які розміщені в файлах «Flight.txt» і «Tickets.txt«, формуються в колекції.

Колекція типу «словник» (Dictionary) представляється у вигляді: «ключ-значення». Причому значення ключа є унікальним (не може повторюватися).

Для структури Flight доцільно сформувати дані у вигляді словника або асоційованого масиву. Це пов'язано з тим, що номер рейсу в списку рейсів є унікальним (не може повторюватися).

У C # для представлення колекції типу «словник» (асоційований масив) реалізовано два базових класи:

  • клас HashTable - належить до неузагальнених колекціям;
  • клас Dictionary - належить до узагальнених колекцій.

У відповідності до розділу завдання, потрібно використовувати клас Dictionary.

Для уявлення асоційованого масиву в текст класу форми потрібно ввести об'єкт з ім'ям avia, що є типу Dictionary <int, Flight>:

// Асоційований масив структур "Авіарейси" Dictionary <int, Flight> avia = new Dictionary <int, Flight> ();

У цьому описі тип int є номером рейсу, а тип Flight є структурою, яка відповідає цьому рейсу.

Для різних рейсів номер квитка може повторюватися. Тому, зручно реалізувати квитки у вигляді узагальненого динамічного масиву типу List <T>. Замість типу <T> підставляється структура Tickets - в результаті виходить List <Tickets>.

Ввести об'єкт з ім'ям tickets:

// Динамічний масив (список) структур "Квитки" List <Tickets> tickets = new List <Tickets> ();

6. Підключення простору імен System.IO. Клас StreamReader.

У відповідності до розділу завдання, в програмі здійснюється читання з файлу. Бібліотека класів .NET Framework представляє безліч засобів для організації взаємодії програми з файлами (відкриття файлу, читання файлу і т.д.).

У даній роботі використані можливості класу StreamReader. Цей клас описується в просторі імен System.IO. Отже, на початку файлу «Form1.cs» потрібно ввести рядок:

using System.IO;

Клас StreamReader призначений для введення символів з байтового потоку. Для виведення символів в байтовий потік використовується клас StreamWriter.

У класі StreamReader є метод ReadLine (), який читає текстовий рядок з файлу. Метод ReadLine () повертає рядок типу string. Цей метод буде використаний при читанні файлу в даній задачі.

7. Програмування методів читання даних з файлів «Flight.txt» і «Tickets.txt«.

Прочитані з файлів «Flight.txt» і «Tickets.txt» дані відображаються в елементах управління listBox1 і listBox2. Для відображення даних потрібно створити два методи.

Перший метод Read_Avia () виконує наступні операції:

  • читає список авіарейсів з файлу «Flight.txt«;
  • формує асоційований масив avia типу Dictionary <int, Flight>;
  • формує список авіарейсів в listBox1 для його відображення на формі.

Другий метод Read_Tickets () виконує наступні операції:

  • читає перелік куплених квитків з файлу «Tickets.txt«;
  • формує динамічний масив tickets типу List <Tickets>;
  • виводить вміст файлу «Tickets.txt» в listBox2.

Лістинг методів Read_Avia () і Read_Tickets () наступний:

public void Read_Avia () {StreamReader sr = new StreamReader ( "Flight.txt", Encoding .Default); string s = ""; string [] fields; Flight sa; // додаткова змінна - структура типу Flight // Основний цикл. // У циклі: // 1. Читаються дані з файлу "Flight.txt" // 2. Формується словник avia типу Dictionary <int, Flight> while (s! = Null) {s = sr.ReadLine (); // прочитати рядок з файлу if (s! = Null) {fields = s.Split ( ','); // формування структури sa типу struct Flight sa.num_r = Convert .ToInt32 (fields [0]); sa.punkt_vd = fields [1]; sa.time_v = Convert .ToInt32 (fields [2]); sa.n_places = Convert .ToInt32 (fields [3]); // додаємо пару <num_r, sa> в словник avia // ключем до структури є номер рейсу num_r avia.Add (sa.num_r, sa); // додати рядок s в listBox1 listBox1.Items.Add (s); }}} Public void Read_Tickets () {StreamReader sr = new StreamReader ( "Tickets.txt", Encoding.Default); string s; string [] fields; // масив рядків-полів структури Tickets Tickets tk; // допоміжна змінна-структура s = sr.ReadLine (); // Основний цикл. // У циклі: // 1. Читаються дані з файлу "Tickets.txt" // 2. Формується список tickets типу List <Tickets> // використовуємо цикл do ... while () do {// розбити рядок s на частини за ознакою символу ',' fields = s.Split ( ','); // заповнити структуру tk tk.num_t = Convert .ToInt32 (fields [0]); tk.num_r = Convert .ToInt32 (fields [1]); tk.place = Convert .ToInt32 (fields [2]); tk.date_v = fields [3]; tk.punkt_pr = fields [4]; tk.data_pr = fields [5]; tk.time_pr = Convert .ToInt32 (fields [6]); tk.price = Convert .ToDouble (fields [7]); tk.time_prod = fields [8]; // додати заповнену структуру в список tickets tickets.Add (tk); listBox2.Items.Add (s); s = sr.ReadLine (); } While (s! = Null); }

Пояснимо деякі фрагменти коду в методах Read_Avia () і Read_Tickets ().

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

StreamReader sr = new StreamReader ( "Flight.txt", Encoding .Default); StreamReader sr = new StreamReader ( "Tickets.txt", Encoding .Default);

Читання рядки з файлу здійснюється методом ReadLine () класу StreamReader. Якщо досягнуто кінця файлу, то метод повертає null.

За допомогою рядка

fields = s.Split ( ',');

відбувається поділ рядка на складові частини. Роздільник між складовими частинами - це символ ','.

рядок

avia.Add (sa.num_r, sa);

додає в колекцію avia типу Dictionary <int, Flight> номер рейсу і заповнену структуру sa.

рядок

tickets.Add (tk);

додає в колекцію tk типу List <Tickets> структуру tk.

8. Зміна коду конструктора форми Form1 ().

Методи Read_Avia () і Read_Tickets () розміщуються в конструкторі форми Form1 ().

Лістинг конструктора форми Form1 () наступний:

public Form1 () {InitializeComponent (); Read_Avia (); Read_Tickets (); }

9. Програмування події кліка на кнопці «Обчислити«.

Лістинг обробника події кліка на кнопці «Обчислити» має вигляд:

private void button1_Click (object sender, EventArgs e) {// Розрахунок // 1. Рейси з максимальною тривалістю польоту int i, j; int max, tmp; bool f_first = true; max = 0; foreach (var a in avia) {foreach (var t in tickets) if (a.Value.num_r == t.num_r) {if (f_first) {max = t.time_pr - a.Value.time_v; f_first = false; } Else {tmp = t.time_pr - a.Value.time_v; if (max <tmp) max = tmp; }}} // на виході отримуємо максимальну тривалість польоту в змінної max // формування списку рейсів з максимальною тривалістю польоту listBox3.Items.Clear (); foreach (var a in avia) {foreach (var t in tickets) if (a.Value.num_r == t.num_r) {tmp = t.time_pr - a.Value.time_v; if (tmp == max) {string s; s = a.Value.num_r.ToString () + "," + a.Value.punkt_vd + "," + a.Value.time_v.ToString () + "," + a.Value.n_places.ToString () + "-" + t.num_t.ToString () + "," + t.punkt_pr + "," + t.time_pr.ToString () + "," + t.place.ToString (); listBox3.Items.Add (s); }}} Label4.Text = "Рейси з максимальною тривалістю польоту:" + max.ToString (); // 2. Число пасажирів, які чекають відправлення в введений момент часу int tm, k; tm = Int32 .Parse (textBox1.Text); // отримати час k = 0; // число пасажирів foreach (var a in avia) {foreach (var t in tickets) if ((a.Value.num_r == t.num_r) && (tm == a.Value.time_v)) k ++; } Label5.Text = "Число пасажирів, які чекають відправлення:" + k.ToString (); }

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

Список рейсів з максимальною тривалістю польоту виводиться в елемент управління listBox3.

10. Запуск програми на виконання.

Результат роботи програми зображений на малюнку 3.

Мал. 3. Результат роботи програми

Провайдеры:
  • 08.09.2015

    Batyevka.NET предоставляет услуги доступа к сети Интернет на территории Соломенского района г. Киева.Наша миссия —... 
    Читать полностью

  • 08.09.2015
    IPNET

    Компания IPNET — это крупнейший оператор и технологический лидер на рынке телекоммуникаций Киева. Мы предоставляем... 
    Читать полностью

  • 08.09.2015
    Boryspil.Net

    Интернет-провайдер «Boryspil.net» начал свою работу в 2008 году и на данный момент является одним из крупнейших поставщиков... 
    Читать полностью

  • 08.09.2015
    4OKNET

    Наша компания работает в сфере телекоммуникационных услуг, а именно — предоставлении доступа в сеть интернет.Уже... 
    Читать полностью

  • 08.09.2015
    Телегруп

    ДП «Телегруп-Украина» – IT-компания с 15-летним опытом работы на рынке телекоммуникационных услуг, а также официальный... 
    Читать полностью

  • 08.09.2015
    Софтлинк

    Высокая скоростьМы являемся участником Украинского центра обмена трафиком (UA — IX) с включением 10 Гбит / сек... 
    Читать полностью