Файл: Лабораторная работа 8 Разработка приложений с использованием коллекций.doc

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 09.11.2023

Просмотров: 92

Скачиваний: 2

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.


4. Пример выполнения работы

Задание: Дан список, содержащий точки с координатами (х, у). Создать новый список, в который попадут точки, лежащие левее оси ординат. Соответственно, в старом списке останутся точки, которые расположены справа от оси ординат. Предусмотреть возможность сортировки нового списка по возрастанию координаты х.
4.1. Визуальное проектирование диалогового окна

Внешний вид работающего приложения с описанием использованных компонентов приведен на рисунке 4.2.


Рис. 4.2. Пример работающего приложения
Для счетчиков XnumericUpDown и YnumericUpDown устанавливаются следующие дополнительные свойства:


Свойство

Значение

Описание

Minimum

-100

Минимальное значение компонента

Maximum

100

Максимальное значение компонента

Increment

0,1

Шаг увеличения или уменьшения

DecimalPlaces

1

Количество знаков после запятой при отображении


Для таблиц данных dataGridView1 и dataGridView2 устанавливаются следующие дополнительные свойства:


Свойство

Значение

Описание

ColumnHeadersHeight-SizeMode

AutoSize

Регулирует высоту заголовков столбцов

EditMode

EditProgrammatically

Режим редактирования данных (здесь – только программно)

Columns

редактируется

Столбцы таблицы



Для добавления столбцов в таблицу следует нажать кнопку свойства Columns. Откроется диалоговое окно, где нужно добавлять и устанавливать свойства столбцов таблицы (рис. 4.3).


Рис. 4.3. Окно редактирования столбцов таблицы
В нашем случае добавляются 2 столбца с именами х и y (свойства Name и HeaderText) и для них отменяется режим автоматической сортировки строк (свойство SortMode устанавливается равным NotSortable).
4.2. Проектирование программного кода

4.2.1. Разработка класса точки

Проектирование кода начинается с разработки класса, представляющего собой структуру точки. Чтобы добавить класс, нужно выбрать пункт меню Project->Add Class…, в появившемся диалоговом окне снова выбрать «Class» и указать имя создаваемого файла (и класса). В нашем случае класс называется «Point».

Так как в задании необходимо реализовать сортировку списка точек по одной из координат, программе (а именно методу Sort) необходимо явно указать, по какому именно признаку (по какой координате) следует производить сравнение точек при сортировке. Для этого нужно, чтобы класс реализовывал интерфейс IComparable.

Созданный класс будет содержать следующие компоненты:

  • два закрытых поля типа float, задающих координаты точки;

  • конструктор с двумя параметрами, инициализирующий эти поля;

  • два открытых свойства для доступа к полям (чтения и установки им значений);

  • реализацию открытого метода CompareTo, описанного в интерфейсе IComparable и задающего способ сравнения объектов класса. Этот метод возвращает целочисленное значение: положительное, если вызывающий объект больше объекта параметра, отрицательное, если меньше, и ноль, если объекты равны. Именно в этом методе мы указываем, что сравнение точек должно производиться по координате х.

Ниже приведен листинг описания класса Point:
//класс реализует интерфейс IComparable

class Point : IComparable

{

float X; //координаты точки

float Y;

//конструктор класса

public Point(float X, float Y)

{

this.X = X;

this.Y = Y;

}

//свойство для доступа к координате х

public float x

{

get { return X; } //получить х

set { X = value; } //установить х

}



//свойство для доступа к координате y

public float y

{

get { return Y; } //получить y

set { Y = value; } //установить y

}

//установить способ сравнения объектов-точек

public int CompareTo(object obj)

{

//преобразуем параметр obj к типу точки

Point p = (Point)obj;

if (x > p.x) //сравниваем координаты х

return 1; //и возвращаем либо положительное,

if (x == p.x)

return 0; //либо нулевое,

return -1; //либо отрицательное значение

}

}
4.2.2. Обработчики событий

Прежде всего для работы с коллекциями в начале файла главной формы нужно подключить пространство имен System.Collections:
using System.Collections;
Далее необходимо в классе формы объявить два динамических массива: исходный массив точек points и массив-результат res. Обоим массивам следует выделить память либо в конструкторе класса, либо в обработчике события Load:
ArrayList points, res; //объявление динамических массивов

private void MainForm_Load(object sender, EventArgs e)

{

points = new ArrayList(); //выделение памяти

res = new ArrayList();

}
При нажатии кнопки «Добавить» необходимо взять текущие значения компонентов-счетчиков, создать объект класса точки с этими значениями в качестве координат, добавить этот объект в коллекцию и отобразить координаты новой точки в таблице на экране:
private void AddButton_Click(object sender, EventArgs e)

{

//берем значения из компонентов-счетчиков

float x = (float)XnumericUpDown.Value;

float y = (float)YnumericUpDown.Value;

//создаем новую точку

Point p = new Point(x,y);

//добавляем ее в коллекцию

points.Add(p);

//добавляем в таблицу на форме

dataGridView1.Rows.Add(p.x,p.y);

}
При удалении точки из списка следует сначала проверить, выбрана ли строка таблицы для удаления. Реализуется это стандартными средствами обработки исключений (операторы trycatch). Если точка выбрана, то надо получить номер соответствующей строки из таблицы, удалить точку с этим номером из коллекции и из таблицы на форме:
private void DelButton_Click(object sender, EventArgs e)

{

try

{

//получаем номер выбранной строки

int num = dataGridView1.SelectedRows[0].Index;

//удаляем точку с данным номером из коллекции

points.RemoveAt(num);

//удаляем выбранную строку из таблицы

dataGridView1.Rows.Remove(dataGridView1.SelectedRows[0]);


}

catch

{

MessageBox.Show("Выберите строку!!!");

}

}
При нажатии на кнопку «Решить задачу» должны выполняться следующие действия. Прежде всего, необходимо очистить массив-коллекцию результатов res, а также обе таблицы на форме, т.к. данные в них будут обновляться. Далее, путем использования методов Add и Remove классов коллекций добавляем и удаляем элементы массивов в соответствии с условиями задачи и отображаем эти массивы в таблицах на форме:
private void SolveButton_Click(object sender, EventArgs e)

{

//очистить коллекцию res

res.Clear();

//очистить содержимое таблиц на форме

dataGridView1.Rows.Clear();

dataGridView2.Rows.Clear();

//просматриваем исходный массив

foreach (Point p in points)

if (p.x < 0) //при выполнении условия

res.Add(p); //добавляем точку в массив-результат

foreach (Point p in res)

{

//удаляем найденные точки из исходного массива

points.Remove(p);

//отображаем 2-й массив в таблице на форме

dataGridView2.Rows.Add(p.x, p.y);

}

foreach (Point p in points)

//отображаем 1-й массив в таблице на форме

dataGridView1.Rows.Add(p.x, p.y);

}
Метод-обработчик кнопки «Отсортировать» достаточно простой. Реализация классом Point интерфейса IComparable позволяет применять к коллекции из объектов этого класса метод Sort(), после чего нужно только обновить содержимое отсортированного массива в таблице на форме:
private void Sortbutton_Click(object sender, EventArgs e)

{

//сортируем

res.Sort();

//очищаем содержимое таблицы на форме

dataGridView2.Rows.Clear();

foreach (Point p in res)

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

dataGridView2.Rows.Add(p.x, p.y);

}
5. Варианты заданий для самостоятельной работы

  1. Дан стек, содержащий фамилии студентов и средний балл сессии каждого студента. Создать новый список, в который войдут студенты, средний балл у которых не меньше "4", а в стеке останутся все остальные. Отсортировать новый список по убыванию среднего балла.

  2. Дана очередь данных о клиентах пункта проката автомобилей: ФИО, адрес (улица, дом, квартира) и марка машины. Во второй массив записать отсортированные по алфавиту данные только тех людей, кто ездит на "Audi".

  3. Дан список английских глаголов: тип (правильный/неправильный), первая форма, вторая форма, третья форма. Вывести только те глаголы, у которых все три формы совпадают. Вывести только правильные (неправильные) глаголы в алфавитном порядке.

  4. Рациональное число можно представить записью с двумя полями: числитель и знаменатель. Дан стек из N рациональных чисел. Создать новый список из дробей, обратных исходным (числитель и знаменатель меняются местами), отсортировать его по убыванию дробей. Удалить из этого списка максимальное и минимальное значения.

  5. Дан массив данных о работниках фирмы: ФИО и дата поступления на работу (месяц, год). Во второй массив записать только данные тех из них, кто на сегодняшний день проработал уже не менее 5 лет. Отсортировать данные по алфавиту.

  6. Дан список данных о работниках фирмы: фамилия, имя, отчество, адрес (улица, дом, квартира) и дата поступления на работу (месяц, год). Отсортировать этот список по году поступления на работу. Определить, есть ли в списке Петровы (Петров, Петрова), если есть, то вывести их адрес (адреса) и записать их в стек.

  7. Дан список иногородних студентов из n человек: ФИО, адрес (город, улица, дом-квартира), приблизительное расстояние до Краснодара. Для них в общежитии выделено k мест. Вывести очередь студентов, которых необходимо селить в общежитие в первую очередь. Критерий отбора: расстояние до города.

  8. Дан массив данных о студентах некоторой группы: фамилия, имя, отчество и дата рождения (день, месяц, год). Вывести на экран фамилию и имя тех студентов, у кого сегодня день рождения (сегодняшнюю дату вводить с клавиатуры). Удалить сведения об этих студентах из исходного списка.

  9. Дан массив, содержащий сведения о студентах некоторой группы: ФИО, оценки по пяти экзаменационным дисциплинам. Вывести сначала студентов, получающих повышенную стипендию, затем обычную, и, наконец, без стипендии. Организовать поиск студента по фамилии с выводом информации о нем.

  10. Дан стек книг: название, автор, количество страниц. Вывести все книги А.С. Пушкина в алфавитном порядке.

  11. Дан массив, в котором хранятся данные о расписании поездов на сегодняшний день: номер поезда, название (т.е. откуда – куда, например, Новороссийск-Москва), время прибытия на станцию и время отправления (часы, минуты). По данному времени определить, какие из поездов стоят сейчас на станции.

  12. Для каждого из N студентов группы известны ФИО и оценки (в баллах) по пяти дисциплинам. Сформировать очередь из фамилий и имен тех из них, у которых количество положительных оценок больше, чем отрицательных.

  13. Рациональное число можно представить записью с двумя полями: числитель и знаменатель. Дан список рациональных чисел. Записать в другой список все неправильные дроби, предварительно удалив их из исходного списка и преобразовав в правильные. Неправильной называется дробь, у которой числитель больше знаменателя. Определить количество элементов каждого списка. Отсортировать оба списка по убыванию числителя.

  14. Дана хеш-таблица, содержащий сведения о книгах: название, жанр, автор (где название – это ключ хеш-таблицы, остальные поля - значение). Вывести названия книг только классического жанра, отсортировав их по фамилии автора. Найти количество таких книг, насколько их больше (меньше), чем остальных.

  15. Рациональное число можно представить записью с двумя полями: числитель и знаменатель. Разработать функцию сократить(m) приведения рационального числа m к несократимому виду. Дан стек рациональных чисел. Сократить эти числа и записать их в список, отсортировав по убыванию.

  16. Дана очередь данных о работниках фирмы: ФИО и адрес (улица, дом, квартира). Во второй массив записать только тех из них, которые живут на улице Красной. Вывести их на экран в алфавитном порядке.

  17. Дан список, содержащий числовые данные. Отсортировать его по возрастанию и сформировать два новых списка таким образом, чтобы половина элементов исходного списка попала в первый новый список (1, 3, 5, …), а вторая половина – во второй новый (2, 4, 6, …).

  18. Дана очередь, содержащая перечень товаров различных фирм. Из элементов этого списка создать новый список, который будет содержать товары, изготовленные фирмой SONY. Отсортировать их по алфавиту, определить количество таких товаров и их долю от общего количества товаров.

  19. Дан список, содержащий информацию о клиентах пункта проката автомобилей: ФИО и марка машины. Отсортировать его марке машины. Записать в стек данные только тех людей, кто ездит на "Audi", предварительно удалив их из исходного списка. Организовать запрос на наличие в исходном списке требуемого человека.

  20. Даны два списка, содержащие перечни товаров, производимых концернами SHARP и LG. Создать список товаров, выпускаемых как одной, так и другой фирмой. Отсортировать его по алфавиту. Организовать поиск в этом списке заданного товара.

  21. Дан список четырехзначных номеров лотерейных билетов. Отсортировать его по возрастанию сумм цифр числа. Сформировать очередь из чисел, которые состоят из одинаковых цифр (1111, 2222, 3333…).

  22. В магазине формируется список лиц, записавшихся на покупку товара повышенного спроса. Каждая запись этого списка содержит: порядковый номер, ФИО, домашний адрес покупателя и дату постановки на учет. Удалить из списка все повторные записи, проверяя ФИО и домашний адрес. Данные организовать в виде хеш-таблицы, где порядковый номер – это ключ, а все остальные данные – значение.

  23. Информация о сотрудниках двух отделов предприятия записана в стеке и содержит: ФИО, название отдела, должность, дату начала работы. Вывести списки сотрудников по отделам в порядке убывания стажа.

  24. Для книг, хранящихся в библиотеке, задаются: регистрационный номер книги, автор, название, год издания, издательство, количество страниц. Данные организованы в виде хеш-таблицы, где регистрационный номер – это ключ, а все остальные данные – значение. Создать список типа ArrayList книг с фамилиями авторов в алфавитном порядке, изданных после заданного года.

  25. Различные цехи завода выпускают продукцию нескольких наименований. Сведения о выпущенной продукции включают: наименование, количество, номер цеха. Для заданного цеха необходимо вывести количество выпущенных изделий по каждому наименованию в порядке убывания количества. Исходные данные задаются в виде очереди, результат – в виде динамического массива ArrayList.

  26. Стек данных о группе студентов содержит следующую информацию: ФИО, рост и вес. Сформировать и вывести список ФИО студентов, рост и вес которых являются в списке уникальными. Отсортировать список по алфавиту.

  27. Информация об участниках спортивных соревнований двух команд содержит: наименование страны, название команды, ФИО игрока, игровой номер, возраст. Вывести и отсортировать по игровому номеру информацию о самой молодой команде.

  28. Дана очередь данных о служащих предприятия: фамилия, отдел, зарплата. Сформировать список данных по алфавиту о работниках бухгалтерии и определить их суммарную зарплату.

  29. Ведомость абитуриентов, сдавших вступительные экзамены в институт, содержит: ФИО, адрес, оценки. Определить количество абитуриентов, проживающих в Краснодаре, и сдавших экзамены со средним баллом не ниже 4,5, записать их в отдельный список, отсортировать по фамилии и удалить из исходного списка.

  30. На междугородней АТС информация о разговорах содержит дату разговора, код и название города, время разговора, тариф, номер телефона в этом городе и номер телефона абонента. Сформировать и вывести хеш-таблицу, где ключом будет код и название города, а значением – общее время разговоров с ним и сумма.