Тема: Программа "Общежитие"

  • Вид работы: Курсовая работа (т)
  • Предмет: Информационное обеспечение, программирование

ОГЛАВЛЕНИЕ


ВВЕДЕНИЕ

. ВНЕШНЕЕ ОПИСАНИЕ

. ПРОЕКТИРОВАНИЕ

. ОПИСАНИЕ ПРОГРАММЫ

. АТТЕСТАЦИЯ ПРОГРАММНОГО СРЕДСТВА

ЗАКЛЮЧЕНИЕ

СПИСОК ЛИТЕРАТУРЫ

ПРИЛОЖЕНИЕ

Введение


В пояснительной записке рассматривается описание программы «Общежитие».

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

Пользователь может создавать, изменять и удалять записи в базе данных. Со стороны пользователя программа проста в использовании и имеет простой и интуитивно - понятный интерфейс.

В качестве основного инструмента разработки применяется MicrosoftVisualStudio 2010 и платформа .NET. Язык программирования C#.


ВНЕШНЕЕ ОПИСАНИЕ


.1 Определение требований к программному средству


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

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


.2 Спецификация качества программного обеспечения


Функциональность: программа должна являться полностью завершенным программным продуктом, не требующим каких-либо дополнительных специальных компонентов.

Надёжность: программа должна быть автономной.

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


1.3 Функциональная спецификация


Минимальные технические характеристики компьютера, на котором гарантируется стабильная работа программы:

компьютер/процессор: компьютер с процессором класса Pentium 4;

память: 512МБОЗУ;

монитор: монитор с разрешением 640x480 точек или более;

операционная система: операционная система WindowsXP, необходимо наличие Microsoft .NET FrameworkRuntime v4.0;

наличие свободного дискового пространства на жёстком диске, которое определяется объёмомбазы данных.

Внешние функции:

добавление студентов в базу данных;

изменение данных о студенте;

удаление студентов;

перемещение студентов по комнатам;

очистка комнаты;

поиск в базе данных по различным критериям;

добавление комнат;

редактирование комнат;

просмотр студентов по комнатам;

программа должна выполнять все функции за конечное количество времени;

Критические случаи:

отсутствие свободного места на жёстком диске при сохранении базы данных журнала. Любая операция с файловой системой должна быть отменена;

завершение работы Windows. В этом случае программа должна завершить свою работу.


ПРОЕКТИРОВАНИЕ


2.1 Проектирование архитектуры приложения


Данное программное средство можно разбить на подсистемы, взаимодействующие друг с другом.


Рисунок 1 - Структура программы


Подсистема интерфейса реализует пользовательский интерфейс программы. Отображение базы данных реализовано в табличном виде с колонками №, Мест, Свободно и жильцы с возможностью сортировки данных и поиска по заданному критерию.

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

создание, удаление, изменение записей базы данных;

предоставление данных для других подсистем

Подсистема поиска реализует поиск непосредственно в базе данных по заданному значению.

Подсистема экспорта реализует методы сохранения данных из базы в распространенные форматы визуального представления данных.

2.2 Проектирование структуры данных


Структура базы данных общежития

База данных представляет собой две таблицы, в которых хранятся записи по студентам и комнатам.Такая структура базы данных была как наиболее полно описывающая предметную область и ввиду её оптимальности и удобства с точки зрения реализации программного продукта.


Описание полей.

Таблица 1- Информация о студенте

ПолеТип поляОписание поляNameстрокаимяSurnameстрокафамилияPatrnameстрокаотчествоAgeнеотрицательное целое числовозрастPhoneстроканомер телефонаCourceнеотрицательное целое числокурсGroupстрокагруппаRoomнеотрицательное целое числоиндекс комнаты

Таблица 2 - Информация о комнатах

ПолеТип поляОписание поляMaxнеотрицательное целое числочисло местStudentsList<int>список проживающих студентов

Таблицы связаны отношением один ко многим по полям Students из таблицы 2 и Room из таблицы 1 соответственно.

База данных для общежития хранится в едином файле .xaml в каталоге программы. Файл имеет структуру стандарта XAML.

Схема файла базы данных с информацией о студентах:

<Studentsxmlns="clr-namespace:Dormitory;assembly=Dormitory"><StudentName="Имя" Surname="Фамилия" Patrname="Отчество" Age="Возраст" Phone="Телефон" Course="Курс" Group="Группа" Room="Номер комнаты" /></Students>

Пример записей файла базы данныхс информацией о студентах:

<Students xmlns="clr-namespace:Dormitory;assembly=Dormitory"><Student Name="Василий" Surname="Пупкин" Patrname="Васильевич" Age="18" Phone="2324543" Course="1" Group="2" Room="0" /><Student Name="Пётр" Surname="Петров" Patrname="Петрович" Age="18" Phone="2132457" Course="1" Group="2" Room="0" /><Student Name="Кирилла" Surname="Троекуров" Patrname="Петрович" Age="18" Phone="2366231" Course="1" Group="3" Room="1" /><Student Name="Владимир" Surname="Малинов" Patrname="Фёдорович" Age="18" Phone="2341222" Course="1" Group="3" Room="1" /><Student Name="Фёдор" Surname="Фёдоров" Patrname="Фёдорович" Age="20" Phone="2143144" Course="2" Group="4" Room="2" /></Students>

Схема файла базы данных с информацией о комнатах:

<RsTSxmlns="clr-namespace:Dormitory;assembly=Dormitory"><RTSMax="Числомест" Students="Проживающие студенты" /></RsTS>

Пример записей файла базы данныхс информацией о комнатах:

<RsTSxmlns="clr-namespace:Dormitory;assembly=Dormitory"><RTS Max="8" Students="0;1;" /><RTS Max="4" Students="2;3;" /><RTS Max="4" Students="4;" /><RTS Max="4" Students="" /><RTS Max="4" Students="" /><RTS Max="4" Students="" /><RTS Max="4" Students="" /><RTS Max="4" Students="" /><RTS Max="4" Students="" /><RTS Max="4" Students="" /></RsTS>

Загрузка и сохранение файла производятся стандартными средствами библиотеки .NET


.3 Проектирование пользовательского интерфейса


Главное окно содержит основные элементы интерфейса и даёт доступ ко всем внешним функциям программы.


Рисунок 2- Главное окно программы


Главное окно содержит следующие элементы управления:

главное меню программы;

панель поиска;

таблицу общежития с данными;

Окно добавления студента содержит поля для ввода данных о нём и даёт возможность добавления студентов в базу данных.


Рисунок 3- Окно добавления записи


Окно просмотра комнат даёт возможность просмотреть и изменить комнату и студентов, проживающих в ней.


Рисунок 3- Окно просмотра комнаты

ОПИСАНИЕ ПРОГРАММЫ


.1 Спецификация классов и типы данных


Таблица 3 - Спецификация классов и типы данных

Тип данныхНазначениекласс Studentпредставляет собой набор сведений остудентекласс Studentsпредставляет собой набор данных для хранения информации о студентахкласс Roomпредставляет собой набор сведений о комнатекласс Roomsпредставляет собой набор данных для хранения информации о комнатахкласс MainWindowпроизводный класс от класса Window .NET, определяет главное окно приложениякласс StudentWindowпроизводный класс от класса Window .NET, определяет окно добавления или редактирования студентакласс RoomWindowпроизводный класс от класса Window .NET, определяет окно просмотра или редактирования комнаты

3.2 Введенные основные переменные и их назначение


Таблица 4 - Основные переменные и их назначения

ПеременнаяТипНазначениеroomsRoomsтаблица данных по комнатамstudentsStudentsтаблица данных по студентам

.3 Основные функции и их блок схемы


Функции класса MainWindow.

MainWindow() - создание экземпляра класса MainWindow;

wndMain_Loaded(object sender, RoutedEventArgs e) - загрузканастроекпрограммыибазданных;

wndMain_Closing(object sender, System.ComponentModel.CancelEventArgs e) - сохранениенастроекпрограммыибазданных;

RefreshDataGrid(stringfilter) - обновлениезаписей, выводимых на экран с возможностью применения фильтра;

ViewRoom_Click (objectsender, RoutedEventArgse) -вызов окна просмотра комнаты и сохранение изменений, если нужно;

AddStudent_Click (objectsender, RoutedEventArgse) - добавлениестудентавбазуданных;


Рисунок 4 - АлгоритмViewRoom_Click


3.4 Алгоритм взаимодействия


После старта программы создается экземпляр класса MainWindow основного окна. Классы окон редактирования и добавления записей создаются и вызываются из основного окна.

Также в экземпляре класса основного окна создаются экземпляры классов,иRoomsдляобеспеченияработы программы.


. АТТЕСТАЦИЯ ПРОГРАММНОГО СРЕДСТВА


4.1 Руководство по инсталляции программного средства


Специальной установки не требуется, установка производится копированием в отдельный каталог программы.


4.2 Руководство использования программного средства


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

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

Для добавления студента в главном меню выберете пункт «Общежитие», в появившемся меню выберете «Добавить студента», или нажажмите кнопку «Добавить» в окне просмотра комнаты.

Для просмотра или изменения комнаты установите курсор на требуемую запись и сделайте двойной щелчок или в меню «Общежитие» выберете пункт «Просмотр и изменение комнаты

Поля «Имя», «Фамилия», «Отчество» и «Комната» обязательны к заполнению.

Для очистки комнаты установите курсор на требуемую запись и нажмите Del или в меню «Общежитие» выберете пункт «Очистить комнату».

База данных сохраняется автоматически при выходе из программы.


4.3 Методика испытаний


Для тестирования программы производились различные манипуляции с данными, искусственно создавались всевозможные критические ситуации.

Программа не предполагает каких - либо вычислений, обработки данных, а также по причине небольшого размера программы разработка программы автоматического тестирования не требует.

Для выявления дефектов в программе/подтверждения ее корректной работоспособности необходимо провести следующие тесты:

добавление новой записи в базу и проверка ее правильного добавления в таблице интерфейса пользователя;

изменение записи в базе и проверка ее правильного изменения в таблице интерфейса пользователя;

удаление записи в базе и проверка ее правильного удаления в таблице интерфейса пользователя;

изменение записи в базе и проверка ее правильного изменения в таблице интерфейса пользователя;

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

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


4.4 Результаты тестирования


Ниже представлены результаты выполнения некоторых тестов программы.

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

файл базы данных повреждён


Рисунок 5 - Файл БД повреждён


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


Рисунок 6 - Первоначальная загрузка базы при старте программы


Рисунок 7 - Новая запись добавлена


. Проверка удаления записи в базе и проверка ее правильного удаления в таблице интерфейса пользователя:


Рисунок 8 - Запись удалена


Запись удалена, тест пройден.

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


ЗАКЛЮЧЕНИЕ

программный учет данные пользовательский

В рамках курсовой работы была разработана программа Общежитие. В процессе проектирования использовались методологии модульного и объектно-ориентированного программирования.

Для разработки данной программы, необходимо правильно спроектировать внутреннюю архитектуру программы и реализацию необходимых классов с использованием современных методик объектно-ориентированного подхода к проектированию. При разработке данного программного средства применялся язык программирования С# и библиотека .NET, как один из наиболее современных инструментов.


ПРИЛОЖЕНИЕА

System;.Collections.Generic;.Linq;.Text;.Windows;.Windows.Controls;.Windows.Data;.Windows.Documents;.Windows.Input;.Windows.Media;.Windows.Media.Imaging;.Windows.Navigation;.Windows.Shapes;System.IO;Dormitory

{

/// <summary>

/// Interaction logic for MainWindow.xaml

/// </summary>partial class MainWindow : Window

{Rooms rooms = new Rooms();Students students = new Students();Settings settings = new Settings();()

{();

}void RefreshDataGrid(string filter)

{= dataGrid.ItemsSource as DGRItems;.Clear();(int i = 0; i <rooms.Count; i++)

{stud = "";(int j = 0; j < rooms[i].Students.Count; j++)

{+= students[rooms[i].Students[j]].Surname+" "+students[rooms[i].Students[j]].Name+" "+students[rooms[i].Students[j]].Patrname;(j < rooms[i].Students.Count-1) stud+= ", ";stud += " ";

}(stud == "") stud = "<НЕТ>";(filter == "") itemsource.Add(new DGRoom((i + 1).ToString(), rooms[i].Max.ToString(), (rooms[i].Max - rooms[i].Students.Count).ToString(), stud, i));

{full = (i + 1).ToString() + " " + rooms[i].Max.ToString() + " " + (rooms[i].Max - rooms[i].Students.Count).ToString() + " " + stud;(full.ToUpper().IndexOf(filter.ToUpper()) > -1) itemsource.Add(new DGRoom((i + 1).ToString(), rooms[i].Max.ToString(), (rooms[i].Max - rooms[i].Students.Count).ToString(), stud, i));

}

}

}string ExtractFileDir(string FileName)

{res = "";index = -1;(int i = FileName.Length - 1; i >= 0; i--)

{(FileName[i] == '\\')

{= i;;

}

}(index == -1) return res;(int i = 0; i <= index; i++)

{+= FileName[i].ToString();

}res;

}void AddRoom_Click(object sender, RoutedEventArgs e)

{

//Добавитькомнаты= new AddRoomsWindow(this);.ShowDialog();(wAddRooms.DialogResult == true)

{(int i = 0; i <wAddRooms.Number; i++) rooms.Add(new Room(wAddRooms.Max));

}(textFind.Text);

}void textFind_TextChanged(object sender, TextChangedEventArgs e)

{(textFind.Text);

}void AddStudent_Click(object sender, RoutedEventArgs e)

{= new StudentWindow(this, rooms, -1);.ShowDialog();(wAddStud.DialogResult == true)

{.Add(new Student(wAddStud.student.Name, wAddStud.student.Surname, wAddStud.student.Patrname, wAddStud.student.Age, wAddStud.student.Phone, wAddStud.student.Course, wAddStud.student.Group, wAddStud.student.Room));[wAddStud.student.Room].Students.Add(students.Count - 1);

}(textFind.Text);

}void ViewRoom_Click(object sender, RoutedEventArgs e)

{(dataGrid.SelectedIndex< 0) return;= new RoomWindow(this, rooms, students, (dataGrid.SelectedItem as DGRoom).ID);.ShowDialog();(wViewRoom.DialogResult == true)

{.Clear();.Clear();(Student s in wViewRoom.students) students.Add(s);(Room r in wViewRoom.rooms) rooms.Add(r);(textFind.Text);

}

}void Window_Loaded(object sender, RoutedEventArgs e)

{;path = ExtractFileDir(Application.ResourceAssembly.Location) + "Data\\";(!Directory.Exists(path)) Directory.CreateDirectory(path);= false;(File.Exists(path + "Settings.xaml"))

{

{= new FileStream(path + "Settings.xaml", FileMode.Open, FileAccess.Read);= System.Windows.Markup.XamlReader.Load(fs) as Settings;.Top = settings.t;.Left = settings.l;.Height = settings.h;.Width = settings.w;.Columns[0].Width = settings.w0;.Columns[1].Width = settings.w1;.Columns[2].Width = settings.w2;.Columns[3].Width = settings.w3;

fs.Close();

}

{.Show("Не удалось загрузить настройки приложения." + Environment.NewLine + "Будут применены настройки по умолчанию", "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);

}

}(File.Exists(path + "Rooms.xaml"))

{

{= new RsTS();= new FileStream(path + "Rooms.xaml", FileMode.Open, FileAccess.Read);= System.Windows.Markup.XamlReader.Load(fs) as RsTS;.Close();(RTS r in rs)

{.Add(new Room(r.Max));temp = "";(int i = 0; i <r.Students.Length; i++)

{(r.Students[i] == ';')

{[rooms.Count - 1].Students.Add(Convert.ToInt32(temp));= "";

}temp += r.Students[i].ToString();

}

}

}

{.Show("Неудалосьзагрузитьбазуданныхкомнат.", "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);= true;

}

}= true;(File.Exists(path + "Students.xaml"))

{

{= new FileStream(path + "Students.xaml", FileMode.Open, FileAccess.Read);= System.Windows.Markup.XamlReader.Load(fs) as Students;.Close();

}

{.Show("Неудалосьзагрузитьбазуданныхстудентов.", "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);= true;

}

}= true;(nodata)

{.Clear();.Clear();

}(textFind.Text);

}

void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)

{;= new RsTS();.t = this.Top;.l = this.Left;.h = this.Height;.w = this.Width;.w0 = dataGrid.Columns[0].Width;.w1 = dataGrid.Columns[1].Width;.w2 = dataGrid.Columns[2].Width;.w3 = dataGrid.Columns[3].Width;path = ExtractFileDir(Application.ResourceAssembly.Location) + "Data\\";(!Directory.Exists(path)) Directory.CreateDirectory(path);

(System.IO.File.Exists(path + "Settings.xaml")) System.IO.File.Delete(path + "Settings.xaml");= new FileStream(path + "Settings.xaml", FileMode.CreateNew, FileAccess.Write);.Windows.Markup.XamlWriter.Save(settings, fs);.Close();.Clear();(Room r in rooms)

{= "";(int i in r.Students) st += i.ToString() + ";";.Add(new RTS(r.Max, st));

}(System.IO.File.Exists(path + "Rooms.xaml")) System.IO.File.Delete(path + "Rooms.xaml");= new FileStream(path + "Rooms.xaml", FileMode.CreateNew, FileAccess.Write);.Windows.Markup.XamlWriter.Save(rs, fs);.Close();(System.IO.File.Exists(path + "Students.xaml")) System.IO.File.Delete(path + "Students.xaml");= new FileStream(path + "Students.xaml", FileMode.CreateNew, FileAccess.Write);.Windows.Markup.XamlWriter.Save(students, fs);.Close();

}void dataGrid_MouseDoubleClick(object sender, MouseButtonEventArgs e)

{_Click(null, null);

}void ClearRoom_Click(object sender, RoutedEventArgs e)

{(dataGrid.SelectedIndex< 0) return;(MessageBox.Show("Выдействительнохотитеудалитьвсехстудентовизкомнаты №" + (dataGrid.SelectedItem as DGRoom).Number + "?", "", MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes)

{= (dataGrid.SelectedItem as DGRoom).ID;(int j = 0; j < rooms[selind].Students.Count; j++)

{.RemoveAt(rooms[selind].Students[j]);(int i = rooms[selind].Students[j]; i <students.Count; i++)

{[students[i].Room].Students.Remove(i + 1);[students[i].Room].Students.Add(i);

}

}[selind].Students.Clear();(textFind.Text);

}

}void dataGrid_PreviewKeyUp(object sender, KeyEventArgs e)

{(e.Key == Key.Delete) ClearRoom_Click(null, null);

}void Exit_Click(object sender, RoutedEventArgs e)

{.Close();

}void About_Click(object sender, RoutedEventArgs e)

{= new AboutWindow(this);.ShowDialog();

}

}class Student

{Student(string name, string surname, string patrname, int age, string phone, intcource, string group, int room)

{= name;= surname;= patrname;= age;= phone;= cource;= group;= room;

}Student()

{

}string Name { get; set; }string Surname { get; set; }string Patrname { get; set; }Age { get; set; }string Phone { get; set; }Course { get; set; }string Group { get; set; }Room { get; set; }

}class Students : System.Collections.ObjectModel.ObservableCollection<Student>

{

}class Room

{Room(int max)

{= max;= new List<int>();

}Room()

{

}Max { get; set; }List<int> Students { get; set; }

}class Rooms : System.Collections.ObjectModel.ObservableCollection<Room>

{

}class RTS

{RTS()

{

}RTS(int max, string sts)

{= max;= sts;

}Max { get; set; }string Students { get; set; }

}class RsTS : System.Collections.ObjectModel.ObservableCollection<RTS>

{

}class DGRoom

{(string N, string M, string F, string S, int id)

{= N;= M;= F;= S;= id;

}()

{

}string Number { get; set; }string Max { get; set; }string Free { get; set; }string Students { get; set; }ID { get; set; }

}class DGRItems : System.Collections.ObjectModel.ObservableCollection<DGRoom>

{

}class DGStudent

{()

{

}(string Full_name, string Student_information, int id)

{= Full_name;= Student_information;= id;

}string FullName { get; set; }string StudentInfo { get; set; }ID { get; set; }

}class DGSItems : System.Collections.ObjectModel.ObservableCollection<DGStudent>

{

}class Settings

{Settings()

{

}double t { get; set; }double l { get; set; }double h { get; set; }double w { get; set; }w0 { get; set; }w1 { get; set; }w2 { get; set; }w3 { get; set; }

}

}System;.Collections.Generic;.Linq;.Text;.Windows;.Windows.Controls;.Windows.Data;.Windows.Documents;.Windows.Input;.Windows.Media;.Windows.Media.Imaging;.Windows.Shapes;Dormitory

{

/// <summary>

/// Interaction logic for StudentWindow.xaml

/// </summary>partial class StudentWindow : Window

{rs = new Rooms();= false;(Window owner, Student Stud, Rooms rooms)

{

//Режимредактирования();.Owner = owner;.Icon = owner.Icon;= new Student(Stud.Name, Stud.Surname, Stud.Patrname, Stud.Age, Stud.Phone, Stud.Course, Stud.Group, Stud.Room);.Title = "Редактирование записи";

buttonOK.Content = "Сохранить";

foreach (Room r in rooms) rs.Add(r);.Text = student.Name;.Text = student.Surname;.Text = student.Patrname;(student.Course == -1) textCourse.Text = "";.Text = student.Course.ToString();.Text = student.Group;(student.Age == -1) textAge.Text = "";.Text = student.Age.ToString();.Text = student.Phone;.Text = (student.Room + 1).ToString();

}(Window owner, Rooms rooms, intdefroom)

{

//Режимдобавленияновойзаписи();.Owner = owner;.Icon = owner.Icon;= new Student();.Title = "Добавитьстудента в базуданных";

buttonOK.Content = "Добавить";(defroom != -1) textRoom.Text = (defroom + 1).ToString();(Room r in rooms) rs.Add(r);

}Student student { get; set; }void buttonOK_Click(object sender, RoutedEventArgs e)

{(textName.Text == "")

{.Show("Введитеимястудента.", "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);;

}.Name = textName.Text;(textSurname.Text == "")

{.Show("Введитефамилиюстудента.", "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);;

}.Surname = textSurname.Text;(textPatrname.Text == "")

{.Show("Введитеотчествостудента.", "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);;

}.Patrname = textPatrname.Text;(textCourse.Text != "")

{{ student.Course = int.Parse(textCourse.Text); }

{.Show("Значение в поле \"Курс\" должнобытьцелымположительнымчислом.", "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);;

}(student.Course< 1)

{.Show("Значение в поле \"Курс\" должнобытьбольшеилиравноединице.", "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);;

}

}

{.Course = -1;

}.Group = textGroup.Text;(textAge.Text != "")

{{ student.Age = int.Parse(textAge.Text); }

{.Show("Значение в поле \"Возраст\" должнобытьцелымнеотрицательнымчислом.", "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);;

}(student.Age< 0)

{.Show("Значение в поле \"Возраст\" должнобытьбольшеилиравнонулю.", "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);;

}

}

{.Age = -1;

}.Phone = textPhone.Text;(textRoom.Text == "")

{.Show("Введитеномеркомнаты, в которуюзаселяетсястудент.", "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);;

}{ student.Room = int.Parse(textRoom.Text); }

{.Show("Номеркомнатыдолженбытьцелымположительнымчислом.", "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);;

}(student.Room< 1)

{.Show("Значение в поле \"Возраст\" должнобытьбольшеилиравноединице.", "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);;

}.Room -= 1;(rs[student.Room].Max == rs[student.Room].Students.Count)

{.Show("В комнате №" + (student.Room + 1).ToString() + " нетмест, выберетедругую.", "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);;

}= true;.Close();

}void buttonCancel_Click(object sender, RoutedEventArgs e)

{= false;.Close();

}void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)

{.DialogResult = dialogresut;

}

}

}System;.Collections.Generic;.Linq;.Text;.Windows;.Windows.Controls;.Windows.Data;.Windows.Documents;.Windows.Input;.Windows.Media;.Windows.Media.Imaging;.Windows.Shapes;Dormitory

{

/// <summary>

/// Interaction logic for RoomWindow.xaml

/// </summary>partial class RoomWindow : Window

{Students students { get; set; }Rooms rooms { get; set; }= -1;= false;void RefreshDataGrid()

{= dataGrid.ItemsSource as DGSItems;.Clear();(int i = 0; i < rooms[roomindex].Students.Count; i++)

{info = "";(students[rooms[roomindex].Students[i]].Course != -1) info += " Курс " + students[rooms[roomindex].Students[i]].Course.ToString() + ".";(students[rooms[roomindex].Students[i]].Group != "") info += " Группа " + students[rooms[roomindex].Students[i]].Group + ".";(students[rooms[roomindex].Students[i]].Age != -1) info += " Возраст " + students[rooms[roomindex].Students[i]].Age.ToString() + ".";(students[rooms[roomindex].Students[i]].Phone != "") info += " Телефон " + students[rooms[roomindex].Students[i]].Phone + ".";(info == "") info = "<НЕТ>";.Add(new DGStudent(students[rooms[roomindex].Students[i]].Surname + " " + students[rooms[roomindex].Students[i]].Name + " " + students[rooms[roomindex].Students[i]].Patrname, info, i));.Content = ", изнихсвободно: " + (rooms[roomindex].Max - dataGrid.Items.Count).ToString();

}

}(Window owner, Rooms rs, Students ss, introom_index)

{();.Owner = owner;.Icon = owner.Icon;= new Students();= new Rooms();(Student s in ss) students.Add(s);(Room r in rs) rooms.Add(r);= room_index;.Content = "Комната №" + (roomindex + 1).ToString();.Text = rooms[roomindex].Max.ToString();.Content = ", изнихсвободно: " + (rooms[roomindex].Max - rooms[roomindex].Students.Count).ToString();();

}void buttonAddStudent_Click(object sender, RoutedEventArgs e)

{(rooms[roomindex].Max == dataGrid.Items.Count)

{(MessageBox.Show("В этойкомнатебольшенетмест, добавить?", "", MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes)

{.Text = (rooms[roomindex].Max + 1).ToString();_Click(null, null);

}

}= new StudentWindow(this, rooms, roomindex);.ShowDialog();(wAddStud.DialogResult == true)

{.Add(new Student(wAddStud.student.Name, wAddStud.student.Surname, wAddStud.student.Patrname, wAddStud.student.Age, wAddStud.student.Phone, wAddStud.student.Course, wAddStud.student.Group, wAddStud.student.Room));[wAddStud.student.Room].Students.Add(students.Count - 1);

}();

}void buttonRemoveStudent_Click(object sender, RoutedEventArgs e)

{(dataGrid.SelectedIndex< 0) return;(MessageBox.Show("Выдействительнохотитеудалитьвыбранногостудента?", "", MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes)

{= (dataGrid.SelectedItem as DGStudent).ID;= rooms[roomindex].Students[selind];[students[studind].Room].Students.RemoveAt(selind);.RemoveAt(studind);(int i = studind; i <students.Count; i++)

{[students[i].Room].Students.Remove(i + 1);[students[i].Room].Students.Add(i);

}();

}

}void buttonSave_Click(object sender, RoutedEventArgs e)

{= true;.Close();

}void buttonClose_Click(object sender, RoutedEventArgs e)

{= false;.Close();

}void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)

{.DialogResult = dialogresult;

}

void buttonEditStudent_Click(object sender, RoutedEventArgs e)

{(dataGrid.SelectedIndex< 0) return;= (dataGrid.SelectedItem as DGStudent).ID;= rooms[roomindex].Students[selind];= new StudentWindow(this, students[studind], rooms);.ShowDialog();(wEditStud.DialogResult == true)

{(students[studind].Room != wEditStud.student.Room)

{[students[studind].Room].Students.RemoveAt(selind);[studind] = new Student(wEditStud.student.Name, wEditStud.student.Surname, wEditStud.student.Patrname, wEditStud.student.Age, wEditStud.student.Phone, wEditStud.student.Course, wEditStud.student.Group, wEditStud.student.Room);[students[studind].Room].Students.Add(studind);

}students[studind] = new Student(wEditStud.student.Name, wEditStud.student.Surname, wEditStud.student.Patrname, wEditStud.student.Age, wEditStud.student.Phone, wEditStud.student.Course, wEditStud.student.Group, wEditStud.student.Room);

}();

}void dataGrid_MouseDoubleClick(object sender, MouseButtonEventArgs e)

{_Click(null, null);

}void buttonApply_Click(object sender, RoutedEventArgs e)

{(textMax.Text == "")

{.Text = dataGrid.Items.Count.ToString();[roomindex].Max = dataGrid.Items.Count;

}

{

{c = int.Parse(textMax.Text);(c <dataGrid.Items.Count)

{.Text = dataGrid.Items.Count.ToString();[roomindex].Max = dataGrid.Items.Count;

}rooms[roomindex].Max = c;

}

{.Text = rooms[roomindex].Max.ToString();

}

}.Content = ", изнихсвободно: " + (rooms[roomindex].Max - dataGrid.Items.Count).ToString();

}void dataGrid_PreviewKeyUp(object sender, KeyEventArgs e)

{(e.Key == Key.Delete) buttonRemoveStudent_Click(null, null);

}

}

}