- •Общие требования
- •1 Примеры реализации заданий
- •1.1 Основные элементы класса
- •1.2 Перегрузка операторов
- •1.3 Использование делегатов
- •1.4 Универсальные типы библиотеки .Net Framework
- •2 Варианты заданий
- •2.1 Основные элементы класса
- •2.2 Перегрузка операторов
- •2.3 Использование делегатов
- •2.4 Универсальные типы библиотеки .Net Framework
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