Файл: Разработка объектной программы для задачи учета компьютерной техники в организации.doc
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 04.12.2023
Просмотров: 75
Скачиваний: 3
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
///
Балансовая стоимость.
public void SetInventoryCost(uint inventoryCost)
{
throw new NotImplementedException();
}
}
}
Класс: CustomLinkedListNode
namespace TestProgramm.Models
{
///
/// Класс - элемент однонаправленного списка элементов.
/// Реализован как Generic для переиспользования.
///
///
public class CustomLinkedListNode
{
///
/// Ссылка на следующий элемент списка.
///
private CustomLinkedListNode
///
/// Данные элемента списка.
///
private T Data { get; set; }
///
/// Конструктор.
///
///
Данные.
/// Ссылка на следующий элемент списка.
public CustomLinkedListNode(T data, CustomLinkedListNode
{
Data = data;
Next = next;
}
///
/// Получить данные элемента списка.
///
///
public Computer GetItem()
{
throw new NotImplementedException();
}
///
/// Получить ссылку на следующий элемент списка.
///
///
public CustomLinkedListNode
{
throw new NotImplementedException();
}
}
}
Класс: Organization
namespace TestProgramm
{
///
/// Класс Организация.
///
public class Organization
{
///
/// Очередь помещений.
///
private Room[] Rooms { get; set; }
///
/// Максимальное количество комнат в организации. (размер очереди)
///
private int MaxRoomsCount { get; set; }
///
/// Текущее количество комнат в организации. (текущая глубина очереди)
///
private int CurrentRoomsCount { get; set; }
///
/// Конструктор.
///
///
Максимальное количество комнат.
public Organization(int maxRoomsCount)
{
MaxRoomsCount = maxRoomsCount;
Rooms = new Room[MaxRoomsCount];
CurrentRoomsCount = 0;
}
///
/// Добавляем помещение. (Push элемента в очередь)
///
///
Помещение.
public void AddRoom(Room room)
{
throw new NotImplementedException();
}
///
/// Удалить помещение. (Pop элемента из очередь)
///
public void RemoveRoom()
{
throw new NotImplementedException();
}
///
/// Подсчет стоимости помещений.
///
///
public uint CalcOrganizationTotalInventoryCost()
{
throw new NotImplementedException();
}
///
/// Перечисляет все помещения.
///
///
public IEnumerable
{
throw new NotImplementedException();
}
///
/// Чтение структуры организации из файла.
///
///
Путь к файлу.
///
public static Organization Load(string fileName)
{
throw new NotImplementedException();
}
///
/// Запись структуры организации в файл.
///
///
Организация.
///
Путь к файлу.
public static void Save(Organization organization, string fileName)
{
throw new NotImplementedException();
}
}
}
Класс: Room
namespace TestProgramm.Models
{
///
/// Этот класс реализует Помещение.
///
public class Room
{
///
/// Номер комнаты.
///
private uint RoomN { get; set; }
///
/// Список компьютеров. Указатель на текущий элемент в списке.
///
private CustomLinkedListNode
///
/// Конструктор помещения.
///
///
Номер комнаты.
public Room(uint roomN)
{
RoomN = roomN;
Computers = null;
}
///
/// Метод добавляет компьютер.
///
///
Инвентарный номер.
public void AddComputer(int inventoryN)
{
throw new NotImplementedException();
}
///
/// Удалить компьютер.
///
///
Инвентарный номер.
public void DeleteComputer(int inventoryN)
{
throw new NotImplementedException();
}
///
/// Найти компьютер.
///
///
Инвентарный номер.
///
public Computer FindComputer(int inventoryN)
{
throw new NotImplementedException();
}
///
/// Получить номер комнаты.
///
///
public uint GetRoomN()
{
throw new NotImplementedException();
}
///
/// Этот метод подсчитывает балансовую стоимость всех компьютеров в комнате.
///
///
public uint CalcRoomTotalInventoryCost()
{
throw new NotImplementedException();
}
///
/// Перечисляет компьютеры.
///
///
public IEnumerable
{
throw new NotImplementedException();
}
}
}
Программная реализация методов объявленных классов приведена в листинге программного кода.
3.Описание демонстрационного модуля с характеристикой компонентов
Для решения задачи, была использована Visual Studio – интегрированная среда разработки ПО для Microsoft Windows на языке C#. Разработанный демонстрационный модуль имеет вид:
Рисунок 1 . Окно программного приложения
Интерфейс приложения разработан просто. В верхней части окна расположен список помещений организации, в нижней части – соответствующий каждому (текущему выбранному) помещению список компьютеров, зарегистрированных в данном помещении.
Внешний вид программного приложения имеет классический вид, и не отличается от традиционных приложений для операционной системы Windows. Поля ввода данных служат для передачи информации от пользователя программе.
При загрузке главного окна приложения выполняются обработчики событий:
public MainForm()
{
InitializeComponent();
toolStripStatusLabel1.Text = "";
toolStripStatusLabel2.Text = "";
// Установка обработчиков событий контролов
roomsTableControl1.AddRoom += OnAddRoom;
roomsTableControl1.DeleteRoom += OnDeleteRoom;
roomsTableControl1.RoomSelected += OnRoomSelected;
computersTableControl1.AddComputerAfter += OnAddComputerAfter;
computersTableControl1.AddComputerBefore += OnAddComputerBefore;
computersTableControl1.DeleteComputer += OnDeleteComputer;
// Создание пустой организации при страте приложения
NewOrganization();
}
При старте приложения создаётся контейнер Organization:
private void NewOrganization()
{
// Создаем организацию
this.organization = new Organization();
// Обновляем компоненты
FillComponents();
roomsTableControl1.SelectRoom(null);
}
Данное «главное» окно приложения состоит из двух вложенных окон:
roomsTableControl1 и computersTableControl1, которые являются визуальными хранилищами списков помещений и компьютеров.
Для добавления помещения предназначено специальное окно
Рисунок 2. Диалоговое окно ввода нового помещения
private void button1_Click(object sender, EventArgs e)
{
// Если есть обработчик события "Добавить помещение"
if (AddRoom != null)
{
// вызываем событие "Добавить помещение"
AddRoom(this, (uint)numericUpDown1.Value);
}
}
Для получения значения «Номер помещения» использован стандартный компонент среды программирования numericUpDown, который позволяет без дополнительной проверки вводить корректное числовое значение номера помещения.
После закрытия окна вода помещения выполняется обработчик главной формы:
private bool OnAddRoom(uint roomN)
{
// Определяем помещение
Room room = organization.FindRoom(roomN);
// Если помещение найдено
if (room != null)
{
// выводим предупреждение
MessageBox.Show($"Помещение с номером: {roomN} уже существует.");
При определенных «неправильных» действиях пользователь получит предупреждающие сообщения, при этом в работе программы фатальных ошибок не возникнет. Например, предупреждение, если помещение такого номера уже введено:
Рисунок 3. Предупреждающие сообщения о неверном вводе
return false;
}
// создаем новое помещение
Room newRoom = new Room(roomN);
// добавляем помещение
try
{
organization.AddRoom(newRoom);
}
catch (Exception e)
{
MessageBox.Show(e.Message);
}
// Обновляем компоненты
FillComponents();
roomsTableControl1.SelectRoom(newRoom);
return true;
}
Аналогичный обработчик выполняется при попытке удаления помещения:
Рисунок 4. Диалог подтверждения помещения
private bool OnDeleteRoom(uint roomN)
{
// Определяем помещение
Room room = organization.FindRoom(roomN);
// Если помещение не найдено
if (room == null)
{
// выводим предупреждение
MessageBox.Show($"Помещения с номером: {roomN} не существует.");
return false;
} // удаляем помещение
organization.DeleteRoom();
// Обновляем компоненты
FillComponents();
roomsTableControl1.SelectRoom(null);
return true;
}
Для добавления компьютера также предназначено специальное окно
Рисунок 5. Добавление компьютера в помещение «после» №777
В данном случае для корректного ввода номера компьютера (инвентарного номера) и балансовой стоимости также использования стандартные компоненты среды программирования numericUpDown, которые позволяют без дополнительной проверки вводить корректные числовые значения.
После закрытия окна вода помещения выполняется обработчик главной формы:
Рисунок 6. Компьютер добавлен
private bool OnAddComputerBefore(uint roomN, uint inventoryN, uint? beforeInventoryN, uint inventoryCost)
{
// Определяем помещение
Room room = organization.FindRoom(roomN);
// Если в помещении уже есть компьютер с инвентарным номером
if (room.FindComputer(inventoryN) != null)
{
// выводим предупреждение
MessageBox.Show($"Компьютер с инвентарным номером: {inventoryN} уже существует.");
return false;
}
// если в помещении нет компьютеров
if (room.GetCount() == 0)
{
// добавляем в начало списка
room.AddComputerBefore(inventoryN, null);
}
else
{
// добавляем в конец списка
room.AddComputerBefore(inventoryN, beforeInventoryN);
}
// задаем балансовую стоимость
Computer comp = room.FindComputer(inventoryN);
comp.SetInventoryCost(inventoryCost);
// обновляем компоненты
FillComponents();
roomsTableControl1.SelectRoom(room);
computersTableControl1.SelectInvenoryN(comp);
return true;
}
Рисунок 7. Удаление компьютера из помещения
В составе программного приложения применен стандартный компонент среды программирования MenuStrip, позволяющий использовать привычный для пользователя интерфейс меню Windows-приложений.
В данном меню предусмотрены элементы меню ToolStripMenuItem, к которым привязаны обработчики событий, позволяющие сохранять и загружать данные с дискового накопителя.
Для этого использованы компоненты стандартных диалоговых окон Windows:
OpenFileDialog – диалог загрузки файла;
SaveFileDialog - диалог сохранения файла.
Также для отображения различной полезной информации в главной форме приложения использован компонент StatusStrip, в который заносится текстовая информация при помощи обработчика:
toolStripStatusLabel1.Text = $"Количество помещений в организации: {this.organization.GetCurrentRoomsCount()}";
toolStripStatusLabel2.Text = $"Балансовая стоимость организации: {this.organization.CalcOrganizationTotalInventoryCost()}";
4.Описание структуры проекта
Созданный проект в среде Visual Studio имеет, ряд файлов, связанных с ним.
Рисунок. Структура проекта VisualStudio
Это файлы:
Главный файл проекта, называется MainForm.cs – содержит ресурсы главной экранной формы. (изначально Project1.dpr).
Файлы RoomsTableControl.cs и ComputersTableControl.cs содержат ресурсы, описывающие табличное представление данных помещений и компьютеров организации.
Файлы AddRoomForm.cs и AddComputerForm.cs содержат ресурсы, описывающие обработчики диалоговых окон ввода данных помещений и компьютеров организации.
5.Листинг программного кода с комментариями
Файл проекта
using System;
using System.Windows.Forms;
namespace CursProgram
{
static class Program
{
///
/// Главная точка входа для приложения.
///
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Forms.MainForm());
}
}
}
Главная форма
namespace CursProgram.Forms
{
///
/// Класс - главная форма приложения
///
public partial class MainForm : Form
{
///
/// Организация
///
private Organization organization;
///
/// Флаг - признак обновления информации в контролах
///
private bool updateMode = false;
///
/// Конструктор
///
public MainForm()
{
InitializeComponent();
toolStripStatusLabel1.Text = "";
toolStripStatusLabel2.Text = "";
// Установка обработчиков событий контролов
roomsTableControl1.AddRoom += OnAddRoom;
roomsTableControl1.DeleteRoom += OnDeleteRoom;
roomsTableControl1.RoomSelected += OnRoomSelected;
computersTableControl1.AddComputerAfter += OnAddComputerAfter;
computersTableControl1.AddComputerBefore += OnAddComputerBefore;
computersTableControl1.DeleteComputer += OnDeleteComputer;
// Создание пустой организации при страте приложения
NewOrganization();
}
///
/// Метод создания новой, пустой организации
///
private void NewOrganization()
{
// Создаем организацию
this.organization = new Organization();
// Обновляем компоненты
FillComponents();
roomsTableControl1.SelectRoom(null);
}
///
/// Обработчик события "Выбрано помещение" контрола "дерево объектов"
///
///
Номер помещения
///
private bool OnRoomSelected(uint roomN)
{
if (updateMode)
{
return true;
}
// Определяем комнату
Room room = this.organization.FindRoom(roomN);
if (room != null)
{
// Обновляем контролы
computersTableControl1.LoadRoomComputers(room);
}
return true;
}
///
/// Обработчик события "Добавить помещение"
///
///
Номер помещения
///
private bool OnAddRoom(uint roomN)
{
// Определяем помещение
Room room = organization.FindRoom(roomN);
// Если помещение найдено
if (room != null)
{
// выводим предупреждение
MessageBox.Show($"Помещение с номером: {roomN} уже существует.");
return false;
}
// создаем новое помещение
Room newRoom = new Room(roomN);
// добавляем помещение
try
{
organization.AddRoom(newRoom);
}
catch (Exception e)
{
MessageBox.Show(e.Message);
}
// Обновляем компоненты
FillComponents();
roomsTableControl1.SelectRoom(newRoom);
return true;
}
///
/// Обработчик события "Удалить помещение"
///
///
Номер помещения
///
private bool OnDeleteRoom(uint roomN)
{
// Определяем помещение
Room room = organization.FindRoom(roomN);
// Если помещение не найдено
if (room == null)
{
// выводим предупреждение
MessageBox.Show($"Помещения с номером: {roomN} не существует.");
return false;
}
// удаляем помещение
organization.DeleteRoom();
// Обновляем компоненты
FillComponents();
roomsTableControl1.SelectRoom(null);
return true;
}
///
/// Метод загрузки информации в контролы
///
private void FillComponents()
{
updateMode = true;
if (this.organization != null)
{
// загружаем информацию в контролы
roomsTableControl1.LoadOrganization(this.organization);
if (this.organization.GetCurrentRoomsCount() == 0)
{
computersTableControl1.Enabled = false;
computersTableControl1.Clear();
}
else
{
computersTableControl1.Enabled = true;
}
CalcOrganizationStat();
}
updateMode = false;
}
///
/// Метод вывода информации об организации
///
private void CalcOrganizationStat()
{
toolStripStatusLabel1.Text = $"Количество помещений в организации: {this.organization.GetCurrentRoomsCount()}";
toolStripStatusLabel2.Text = $"Балансовая стоимость организации: {this.organization.CalcOrganizationTotalInventoryCost()}";
}
///
/// Обработчик события "Добавить компютер"
///
///
Номер помещения
///
Инвентарный номер
///
Инвентарный номер после которого необходимо добавить
///
Балансовая стоимость
///
private bool OnAddComputerAfter(uint roomN, uint inventoryN, uint? afterInventoryN, uint inventoryCost)
{
// Определяем помещение
Room room = organization.FindRoom(roomN);
// Если в помещении уже есть компьютер с инвентарным номером
if (room.FindComputer(inventoryN) != null)
{
// выводим предупреждение
MessageBox.Show($"Компьютер с инвентарным номером: {inventoryN} уже существует.");
return false;
}
// если в помещении нет компьютеров
if (room.GetCount() == 0)
{
// добавляем в начало списка
room.AddComputerAfter(inventoryN, null);
}
else
{
// добавляем в конец списка
room.AddComputerAfter(inventoryN, afterInventoryN);
}
// задаем балансовую стоимость
Computer comp = room.FindComputer(inventoryN);
comp.SetInventoryCost(inventoryCost);
// обновляем компоненты
FillComponents();
roomsTableControl1.SelectRoom(room);
computersTableControl1.SelectInvenoryN(comp);
return true;
}
///
/// Обработчик события "Добавить компютер"
///
///
Номер помещения
///
Инвентарный номер
///
Инвентарный номер перед которым необходимо добавить
///
Балансовая стоимость
///
private bool OnAddComputerBefore(uint roomN, uint inventoryN, uint? beforeInventoryN, uint inventoryCost)
{
// Определяем помещение
Room room = organization.FindRoom(roomN);
// Если в помещении уже есть компьютер с инвентарным номером
if (room.FindComputer(inventoryN) != null)
{
// выводим предупреждение
MessageBox.Show($"Компьютер с инвентарным номером: {inventoryN} уже существует.");
return false;
}
// если в помещении нет компьютеров
if (room.GetCount() == 0)
{
// добавляем в начало списка
room.AddComputerBefore(inventoryN, null);
}
else
{
// добавляем в конец списка
room.AddComputerBefore(inventoryN, beforeInventoryN);
}
// задаем балансовую стоимость
Computer comp = room.FindComputer(inventoryN);
comp.SetInventoryCost(inventoryCost);
// обновляем компоненты
FillComponents();
roomsTableControl1.SelectRoom(room);
computersTableControl1.SelectInvenoryN(comp);
return true;
}
///
/// Обработчик события "Удалить компьютер"
///
///
Номер помещения
///
Инвентарный номер
///
private bool OnDeleteComputer(uint roomN, uint inventoryN)
{
// Определяем помещение
Room room = organization.FindRoom(roomN);
// Если в помещении компьютера нет
if (room.FindComputer(inventoryN) == null)
{
// выводим предупреждение
MessageBox.Show($"Компьютер с инвентарным номером: {inventoryN} не существует.");
return false;
}
// Удаляем компьютер
room.DeleteComputer(inventoryN);
// обновляем компоненты
FillComponents();
roomsTableControl1.SelectRoom(room);
computersTableControl1.SelectInvenoryN(null);
return true;
}
///
/// Обработчик нажатия на пункт меню "Файл"->"Создать"
///
///
Отправитель события
///
Аргументы события
private void создатьToolStripMenuItem_Click(object sender, EventArgs e)
{
// Создаем пустую организацию
NewOrganization();
}
///
/// Обработчик нажатия на пункт меню "Файл"->"Загрузить"
///
///
Отправитель события
///
Аргументы события
private void загрузитьToolStripMenuItem_Click(object sender, EventArgs e)
{
using (OpenFileDialog openFileDialog = new OpenFileDialog())
{
// настройка диалогового окна
openFileDialog.InitialDirectory = "c:\\";
openFileDialog.FilterIndex = 2;
openFileDialog.RestoreDirectory = true;
// если пользователь нажал на "Загрузить"
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
// определяем путь к файлу
string filePath = openFileDialog.FileName;
// загружаем структуру
Organization org = new Organization();
org.Load(filePath);
this.organization = org;
// обновляем компоненты
FillComponents();
roomsTableControl1.SelectRoom(null);
}
}
}
///
/// Обработчик нажатия на пункт меню "Файл"->"Сохранить"
///
///
Отправитель события
///
Аргументы события
private void сохранитьToolStripMenuItem_Click(object sender, EventArgs e)
{
using (SaveFileDialog saveFileDialog = new SaveFileDialog())
{
// настройка диалогового окна
saveFileDialog.InitialDirectory = "c:\\";
saveFileDialog.FilterIndex = 2;
saveFileDialog.RestoreDirectory = true;
// если пользователь нажал на "Сохранить"
if (saveFileDialog.ShowDialog() == DialogResult.OK)
{
// определяем путь к файлу
string filePath = saveFileDialog.FileName;
// сохраняем структуру
this.organization.Save(filePath);
// обновляем компоненты
FillComponents();
}
}
}
///
/// Обработчик нажатия на пункт меню "Файл"->"Выход"
///
///
Отправитель события
///
Аргументы события
private void выходToolStripMenuItem_Click(object sender, EventArgs e)
{
// Закрываем форму
Close();
}
}
}
Добавление помещения
namespace CursProgram.Forms
{
///
/// Делегат обработчика события "Добавить помещение"
///
///
Отправитель события
///
Номер помещения
public delegate void AddRoomHandler(AddRoomForm sender, uint roomN);
///
/// Класс форма - добавления помещения
///
public partial class AddRoomForm : Form
{
///
/// Событие "Добавить помещение"
///
public event AddRoomHandler AddRoom;
///
/// Конструктор
///
public AddRoomForm()
{
InitializeComponent();
}
///
/// Обработчик нажатия на кнопку "Отмена"
///
///
Отправитель события
///
Аргументы события
private void button3_Click(object sender, EventArgs e)
{
// закрываем форму
Close();
}
///
/// Обработчик нажатия на кнопку "Добавить"
///
///
Отправитель события
///
Аргументы события
private void button1_Click(object sender, EventArgs e)
{
// Если есть обработчик события "Добавить помещение"
if (AddRoom != null)
{
// вызываем событие "Добавить помещение"
AddRoom(this, (uint)numericUpDown1.Value);
}
}
private void AddRoomForm_Shown(object sender, EventArgs e)
{
numericUpDown1.Focus();
}
}
}
Добавление компьютера
namespace CursProgram.Forms
{
///
/// Делегат обработчика события "Добавить комнату"
///
///
Отправитель события
///
Номер помещения
///
Инвентарный номер нового компьютера
///
Балансовая стоимость нового компьютера
public delegate void AddComputerHandler(AddComputerForm sender, uint roomN, uint inventoryN, uint inventoryCost);
///
/// Класс - форма добавления компьютера в помещение
///
public partial class AddComputerForm : Form
{
///
/// Событие "Добавить компьютер"
///
public event AddComputerHandler AddComputer;
///
/// Номер помещения
///
private uint roomN;
///
/// Конструктор
///
public AddComputerForm()
{
InitializeComponent();
}
///
/// Конструктор
///
///
Номер помещения
public AddComputerForm(uint roomN)
{
InitializeComponent();
this.roomN = roomN;
// задаем загаловок
this.Text = $"Добавить компьютер в помещение №{this.roomN}?";
}
///
/// Обработчик нажатия на кнопку "Добавить"
///
///
Отправитель события
///
Аргументы события
private void button1_Click(object sender, EventArgs e)
{
// Если есть обработчик события "Добавить компьютер"
if (AddComputer != null)
{
// вызываем событие "Добавить компьютер"
AddComputer(this, this.roomN, (uint)numericUpDown1.Value, (uint)numericUpDown2.Value);
}
}
///
/// Обработчик нажатия на кнопку "Отмена"
///
///
Отправитель события
///
Аргументы события
private void button3_Click(object sender, EventArgs e)
{
// закрываем форму
Close();
}
}
}
Список использованной литературы
-
Visual Studio 2012. Алгоритмы и программы: О. В. Чеснокова - СПб.:, НТ Пресс, 2012 г.- 368 с. -
Бобровский С.И. Visual Studio. Учебный курс - М., 2014 -
Иванова Г. С., Ничушкина Т. Н., Пугачев Е. К. Технология программирования: Объектно-ориентированное программирование. М.: МГТУ им. Н. Э. Баумана, 3-е издание, 2012. - 320 с. -
Лингер Р., Миллс Х., Уитт Б. Теория и практика структурного программирования. - М., 2010. -
Осваиваем Visual Studio 2015: С. А. Любавин - СПб: НТ Пресс, 2014 г.- 576 с. -
Основы программирования в Visual Studio 2012 XE (+ CD-ROM): Н. Б. Культин - МЖ, БХВ-Петербург, 2016 г.- 416 с. -
Основы программирования в интегрированной среде VISUAL STUDIO 2012: А. Желонкин – М:, Бином. Лаборатория знаний, 2014 г.- 240 с. -
Программирование в Visual Studio 2010 для Windows: А. Я. Архангельский - СПб:, Бином-Пресс, 2016 г.- 1248 с.