Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Задания по ООП.pdf
Скачиваний:
16
Добавлен:
25.03.2016
Размер:
1.65 Mб
Скачать

1.4 Универсальные типы библиотеки .Net Framework

Задание1: создать класс и обеспечить указанные действия с ним с использованием заданного универсального типа.

Описание параметров задания

поля класса «Город»:

1.название (не пустое), уникальное;

2.координата X, int, 0÷100, по умолчанию 0;

3.координата Y, int, 0÷100, по умолчанию 0;

комбинации координат (X, Y) должны быть уникальными;

отображение: «<название> (X=<X>, Y=<Y>)»;

работа с универсальным типом: создание маршрута посещения городов. Для выполнения задания необходимо обеспечить:

1.реализацию хранения маршрута в объекте универсального типа List<T> без хранения в визуальном компоненте;

2.добавление в маршрут города, выбранного в списке городов (город может быть в маршруте несколько раз);

3.удаление из маршрута всех ссылок на город, выбранный в списке городов;

4.очистка маршрута;

5.отображение количества точек маршрута;

6.расчет длины маршрута.

Примечание: при отображении информации о классе вместо данных в угловых скобках подставляются значения полей.

Для решения поставленной задачи потребуются компоненты:

Spisok_L класса Label для подписи компонента Spisok_LB;

Spisok_LB класса ListBox для хранения списка городов;

AddCity_GB класса GroupBox для визуального выделения компонентов добавления города;

Name_L класса Label для подписи компонента Name_TB;

Name_TB класса TextBox для ввода названия города;

X_L класса Label для подписи компонента X_NUD;

X_NUD класса NumericUpDown для ввода координаты X города;

Y_L класса Label для подписи компонента Y_NUD;

Y_NUD класса NumericUpDown для ввода координаты Y города;

AddCity_B класса Button для активизации добавления города;

1 Полные требования к выполнению задания приведены в общей части разде-

ла 2.4

29

DelCity_B класса Button для активизации удаления выбранного

города;

Points_GB класса GroupBox для визуального выделения компонентов работы с маршрутом;

Count_L класса Label для подписи компонента Count_TB;

Count_TB класса TextBox для вывода количества точек маршру-

та;

AddPoint_B класса Button для активизации добавления выбранного города в маршрут;

DelPoint_B класса Button для активизации удаления всех ссылок на выбранный город из маршрута;

ClearPoints_B класса Button для активизации очистки маршру-

та;

Calc_B класса Button для активизации расчета длины маршрута;

Length_L класса Label для подписи компонента Length_TB;

Length_TB класса TextBox для вывода длины маршрута. Установим следующие значения свойств компонентов (таблица 5).

Таблица 5 – Значения свойств компонентов для примера выполнения задания по использованию универсальных типов библиотеки .Net Framework

Компонент.Свойство

Значение

Spisok_L.Text

Список &городов

AddCity_GB.Text

Добавление города

Name_L.Text

Назва&ние

X_L.Text

Координата &X

Y_L.Text

Координата &Y

AddCity_B.Text

До&бавить город

DelCity_B.Text

Удал&ить город

Points_GB.Text

Работа с маршрутом

Count_L.Text

Количество &пунктов

Count_TB.ReadOnly

True

 

 

AddPoint_B.Text

Д&обавить пункт маршрута

DelPoint_B.Text

Удали&ть из маршрута все ссылки на выбранный

город

 

ClearPoints_B.Text

О&чистить маршрут

Calc_B.Text

Ра&ссчитать длину маршрута

Length_L.Text

Д&лина маршрута

Length_TB.ReadOnly

True

 

 

30

Для реализации класса (назовём его City) потребуется отдельный модуль. Добавим его в программу через меню «Проект → Добавить класс». Реализация членов класса приведена ниже.

class City

{

// Требуемые поля private int _X, _Y; private string _Name;

public int X // Свойство для доступа к полю _X

{

get { return _X; }

set { if (value >= 0) _X = X; }

}

public int Y // Свойство для доступа к полю _Y

{

get { return _Y; }

set { if (value >= 0) _Y = Y; }

}

public string Name // Свойство для доступа к полю _Name

{

get { return _Name; }

set { if (value != null && value.Trim() != "") _Name = value; }

}

//Конструктор без параметров, использующий конструктор с

//параметрами и устанавливающий значения полей по умолчанию

public City(): this("", 0, 0) { }

//Конструктор с параметрами, присваивающий полям переданные

//значения, если они допустимые, или значения по умолчанию public City(string Name, int X, int Y)

{

_Name = Name.Trim() != "" ? Name.Trim() : "Без названия"; _X = X >= 0 ? X : 0;

_Y = Y >= 0 ? Y : 0;

}

//Метод, возвращающий требуемое строковое представление

//города

public override string ToString()

{

return string.Format("{0} (X={1}, Y={2})", _Name, _X, _Y);

}

}

В классе основной формы опишем список универсального типа List<T>, в котором будем хранить точки маршрута:

private List<City> Path = new List<City>();

31

При выполнении операций с точками маршрута (а также при удалении города) возможно изменение количества точек маршрута и его длины. Для упрощения обновления информации на форме команды вывода количества точек маршрута и очистки длины реализуем в виде отдельного метода:

private void ViewState()

{

Count_TB.Text = Path.Count.ToString(); Length_TB.Text = "";

}

Опишем событие Click кнопки AddCity_B:

private void AddCity_B_Click(object sender, EventArgs e)

{

try

{

//Получение заданных пользователем значений string Name = Name_TB.Text.Trim();

int X = Convert.ToInt32(X_NUD.Value); int Y = Convert.ToInt32(Y_NUD.Value);

//Проверка, что название города не пустое

if (Name == "")

{

//Если название города не введено, то передача фокуса

//управления на компонент ввода названия и генерация

//исключительной ситуации

Name_TB.Focus();

throw new Exception("Не введено название города");

}

//Проверка на наличие города с указанным названием

//и с указанными координатами

for (int i = 0; i < Spisok_LB.Items.Count; i++)

{

City Item = Spisok_LB.Items[i] as City; if (Item.Name == Name)

{

Name_TB.Focus(); throw new Exception(

"Город с таким наименованием уже имеется");

}

if (Item.X == X && Item.Y == Y)

{

X_NUD.Focus();

throw new Exception(

"Город с таким расположением уже имеется");

}

}

// Создание объекта-города

32

City Temp = new City(Name, X, Y);

// Добавление нового города в список городов

Spisok_LB.Items.Add(Temp);

}

// Обработка всех исключительных ситуаций catch (Exception E)

{

MessageBox.Show(E.Message, "Ошибка"); return;

}

}

Опишем событие Click кнопки DelCity_B:

private void DelCity_B_Click(object sender, EventArgs e)

{

// Удаление возможно только тогда, когда выбран город if (Spisok_LB.SelectedIndex >= 0)

{

//Получение города, подлежащего удалению

City Item = Spisok_LB.SelectedItem as City;

//Чтобы удалить все вхождения города в маршрут,

//используем метод RemoveAll(), в качестве параметра

//которого указано лямбда-выражение, сравнивающее каждый

//из городов с заданным

Path.RemoveAll(Value => Value == Item);

//Обновление информации о маршруте

ViewState();

//Удаление города из списка городов

Spisok_LB.Items.RemoveAt(Spisok_LB.SelectedIndex);

}

else

MessageBox.Show("Не выбран город для удаления", "Информация");

}

Опишем событие Click кнопки AddPoint_B:

private void AddPoint_B_Click(object sender, EventArgs e)

{

//Добавление пункта маршрута возможно только тогда,

//когда выбран город

if (Spisok_LB.SelectedIndex >= 0)

{

// Получение выбранного города

City Item = Spisok_LB.SelectedItem as City;

//Добавление новой точки в маршрут

Path.Add(Item);

//Обновление информации о маршруте

ViewState();

}

33

else MessageBox.Show(

"Не выбран город для добавления в маршрут", "Информация");

}

Опишем событие Click кнопки DelPoint_B:

private void DelPoint_B_Click(object sender, EventArgs e)

{

//Удаление всех вхождений города из маршрута похоже на

//удаление самого города. Отличие заключается в том, что

//сам город не удаляется

if (Spisok_LB.SelectedIndex >= 0)

{

City Item = Spisok_LB.SelectedItem as City; Path.RemoveAll(Value => Value == Item); ViewState();

}

else MessageBox.Show(

"Не выбран город для удаления из маршрута", "Информация");

}

Опишем событие Click кнопки Clear_B:

private void ClearPoins_B_Click(object sender, EventArgs e)

{

Path.Clear();

ViewState();

}

Опишем событие Click кнопки Calc_B:

private void Calc_B_Click(object sender, EventArgs e)

{

// Расчет возможен, если задано не менее двух точек маршрута if (Path.Count > 1)

{

double Sum = 0;

//Количество суммируемых растояний между городами на 1

//меньше, чем количество городов. Поэтому начинаем цикл

//с 1

for (int i = 1; i < Path.Count; i++)

Sum += Math.Sqrt(Math.Pow(Path[i-1].X - Path[i].X, 2) + Math.Pow(Path[i-1].Y - Path[i].Y, 2));

Length_TB.Text = String.Format("{0:F2}", Sum);

}

else MessageBox.Show(

34

"В маршруте менее двух пунктов", "Информация");

}

Внешний вид и пример работы программы показаны на рисунке .

маршрут: Кемерово – Междуреченск – Новокузнецк – Кемерово

Рисунок 4 – Внешний вид и пример работы программы, использующей универсальные типы библиотеки .Net Framework

35