Скачиваний:
34
Добавлен:
17.06.2021
Размер:
2.81 Mб
Скачать

10.2 Использование метода ранжирования проектов в приложении

Для начала создадим список вопросов, на которые будет отвечать студент. Для данного примера создадим два вопроса (Рисунок 10.1) и по два ответа для них. Обязательным шагом является настройка оценки ответа (более подробно при критерии написано в главе 9), так как именно по ней будет выстраиваться ранжирование. В данной программе каждая оценка имеет свой вес. Для более лучшей наглядности выберем оценку “Безразлично” для всех ответов на вопросы (Рисунок 10.2).

Рисунок 10.1 – Создание вопросов

Рисунок 10.2 – Оценки ответов на вопросы

Далее нужно создать проекты (факультеты) и для каждого проекта определить номера влияющих ответов (Рисунок 10.3).

Рисунок 10.3 – Номера влияющих ответов на проекты

Создадим критерии оценки проектов и также установим для них номера влияющих вопросов (Рисунок 10.4).

Рисунок 10.4 – Номера влияющих вопросов на критерии

43

Совершаем вход под обычным пользователем (студентом) и начинаем проходить тест из тех вопросов, которые мы создали. В первом вопросе выберем ответ №2 (программирование, базы данных), а во втором - №3 (да) (Рисунок 10.5 и Рисунок 10.6).

Рисунок 10.5 – Ответ №2

Рисунок 10.6 – Ответ №3

Получаем результаты, которые изображены на рисунке 10.7.

Рисунок 10.7 – Результаты ранжирования

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

44

ЗАКЛЮЧЕНИЕ

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

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

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

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

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

Данное приложение имеет удобную для дальнейшего расширения структуру, что позволяет в дальнейшем расширить функционал этого приложения и использовать разработанное ПО в полной мере по своей предметной области.

Таким образом, основная задача курсового проекта была выполнена. Курсовой проект был выполнен в соответствии с основными требованиями и положениями. Учтены все необходимые нормы и ГОСТы.

45

СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ

[1]Построение диаграммы классов: [Электронный ресурс]. – Режим доступа: https://flexberry.github.io/ru/gpg_class-diagram.html.

[2]Бизнес-планирование на предприятии и автоматизация процессов ведения отчетности: [Электронный ресурс]. – Режим доступа: https://studbooks.net/1708054/ekonomika/modeli_predstavleniya_sistemy.

[3]Многопоточное клиент-серверное приложение TCP в C# в .NET: [Электронный ресурс]. Режим доступа: https://metanit.com/sharp/net/4.3.php.

[4]Руководство по программированию в Windows Forms: [Электронный ресурс]. – Режим доступа: https://metanit.com/sharp/windowsforms/.

[5]Метод Ранжирования проектов: [Электронный ресурс]. – Режим доступа: https://ru.qaz.wiki/wiki/Condorcet_method.

[6]Живицкая Е. Н., Едемская О. П. Системный анализ и проектирование информационных систем / учебно-методическое пособие. – Мн.: БГУИР, 2005.

59 с.: ил.

[7]Руководство по Entity Framework: [Электронный ресурс]. – Режим доступа: https://metanit.com/sharp/entityframework/.

[8]Составление документа “Руководство пользователя”: [Электронный ресурс]. – Режим доступа: https:// studfile.net/preview/3998113/page:10/.

[9]SQL-запросы: [Электронный ресурс]. – Режим доступа: https:// webformyself.com/sql-zapros-update/.

[10]Язык C# и платформа .NET Core: [Электронный ресурс]. – Режим доступа: https:// metanit.com/sharp/tutorial/1.1.php.

46

ПРИЛОЖЕНИЕ А (обязательное)

Листинг программы с комментариями

using HierarchyAnalyzeMethod.Database; using HierarchyAnalyzeMethod.Model; using System;

using System.Collections.Generic; using System.Drawing;

using System.Linq;

using System.Security.Cryptography; using System.Text;

using System.Windows.Forms;

namespace HierarchyAnalyzeMethod.View

{

public static class Helper

{

public static Form AdminForm; public static Form UsersForm; public static Form QuestionsForm; public static Form CriteriaForm; public static Form AlternavesForm; private static string _login = "";

private static string _passHash = "";

public static Form ShowEditorForm(Form main, ref Form form, Type typeForm)

{

if (form == null)

{

form = (Form) Activator.CreateInstance(typeForm); if (main.IsMdiContainer)

{

form.MdiParent = main;

form.WindowState = FormWindowState.Maximized;

}

else

form.Location = new Point(main.Left + (main.Width - form.Width) / 2, main.Top + (main.Height - form.Height) / 2);

form.FormClosing += (FormClosingEventHandler) ((o, e) =>

{

((Control) o).Hide(); e.Cancel = true;

});

}

else

{

if (form.WindowState == FormWindowState.Minimized) form.WindowState = FormWindowState.Normal;

form.BringToFront(); form.Visible = false;

}

form.Show();

47

Продолжение приложения А

if (form is IUpdate)

((IUpdate) form).ReloadTable(); return form;

}

public static string GetMd5Hash(string input)

{

using (MD5 md5 = MD5.Create())

{

byte[] hash = md5.ComputeHash(Encoding.UTF8.GetBytes(input)); StringBuilder stringBuilder = new StringBuilder();

for (int index = 0; index < hash.Length; ++index) stringBuilder.Append(hash[index].ToString("x2"));

return stringBuilder.ToString();

}

}

public static void CalculateCriteriaAssessmentWeights()

{

foreach (Criterion criterion in DataHolder.Criteria)

{

double num = 0.0;

foreach (int significantIssue in criterion.SignificantIssues)

{

int questionNumber = significantIssue;

Question question = DataHolder.Questions.Find((Predicate<Question>) (x => x.Number == questionNumber));

if (question != null)

{

Answer selectedAnswer = question.SelectedAnswer; if (selectedAnswer != null)

{

if (selectedAnswer.NegativeAppreciation)

num += 1.0 / (double) selectedAnswer.Assessment; else

num += (double) selectedAnswer.Assessment;

}

}

}

criterion.AssessmentWeight = num;

}

int count1 = DataHolder.Criteria.Count; double[,] matrix1 = new double[count1, count1]; for (int i = 0; i < count1; i++)

{

for (int index = i; index < count1; ++index)

{

if (i == index)

{

matrix1[i, index] = 1.0;

}

else

{

48

Продолжение приложения А

Criterion criterion = DataHolder.Criteria.Find((Predicate<Criterion>) (x => x.Number == i + 1));

matrix1[i, index] = criterion.AssessmentWeight; matrix1[index, i] = 1.0 / criterion.AssessmentWeight;

}

}

}

double[] vector = Helper.CalculateVector(count1, matrix1); for (int i = 0; i < count1; i++)

DataHolder.Criteria.Find((Predicate<Criterion>) (x => x.Number == i + 1)).GoldWeight = vector[i];

int count2 = DataHolder.Alternatives.Count; List<double[]> numArrayList = new List<double[]>(); double[,] matrix2 = new double[count2, count1];

for (int cr = 0; cr < count1; cr++)

{

double[,] matrix3 = new double[count2, count2]; int[] significantIssues =

DataHolder.Criteria.Find((Predicate<Criterion>) (x => x.Number == cr + 1)).SignificantIssues;

for (int i = 0; i < count2; i++)

{

int[] evaluationAnswers = DataHolder.Alternatives.Find((Predicate<Alternative>) (x => x.Number == i + 1)).EvaluationAnswers;

double num1 = 0.0;

foreach (int num2 in significantIssues)

{

int questionNumber = num2; Question question =

DataHolder.Questions.Find((Predicate<Question>) (x => x.Number == questionNumber));

if (question != null)

{

Answer selectedAnswer = question.SelectedAnswer; if (selectedAnswer != null && ((IEnumerable<int>)

evaluationAnswers).Contains<int>(selectedAnswer.Number))

{

if (selectedAnswer.NegativeAppreciation)

num1 += 1.0 / (double) selectedAnswer.Assessment; else

num1 += (double) selectedAnswer.Assessment;

}

}

}

for (int index = i; index < count2; ++index) matrix3[i, index] = i != index ? num1 : 1.0;

}

Helper.PrepateMatrix(count2, matrix3); numArrayList.Add(Helper.CalculateVector(count2, matrix3));

}

for (int j = 0; j < count1; j++)

49

Продолжение приложения А

DataHolder.Criteria.Find((Predicate<Criterion>) (x => x.Number == j + 1)).AlternativesGoldWeights = numArrayList[j];

for (int index1 = 0; index1 < count2; ++index1)

{

for (int index2 = 0; index2 < count1; ++index2) matrix2[index1, index2] = numArrayList[index2][index1];

}

double[] numArray = Helper.MultMatrixVector(count2, matrix2, vector); for (int i = 0; i < count2; i++)

DataHolder.Alternatives.Find((Predicate<Alternative>) (x => x.Number == i + 1)).GoldWeight = numArray[i];

}

private static double[] MultMatrixVector(int size, double[,] matrix, double[] vector)

{

double[] numArray = new double[size];

for (int index1 = 0; index1 < size; ++index1)

{

for (int index2 = 0; index2 < vector.Length; ++index2) numArray[index1] += matrix[index1, index2] * vector[index2];

}

return numArray;

}

private static void PrepateMatrix(int size, double[,] matrix)

{

for (int index1 = 0; index1 < size; ++index1)

{

for (int index2 = index1; index2 < size; ++index2)

{

if (index1 != index2)

matrix[index2, index1] = 1.0 / matrix[index1, index2];

}

}

}

private static double[] CalculateVector(int size, double[,] matrix)

{

double[] numArray1 = new double[size];

for (int index1 = 0; index1 < size; ++index1)

{

for (int index2 = 0; index2 < size; ++index2) numArray1[index2] += matrix[index1, index2];

}

for (int index1 = 0; index1 < size; ++index1)

{

for (int index2 = 0; index2 < size; ++index2) matrix[index1, index2] /= numArray1[index2];

}

double[] numArray2 = new double[size];

for (int index1 = 0; index1 < size; ++index1)

{

50

Продолжение приложения А

for (int index2 = 0; index2 < size; ++index2) numArray2[index1] += matrix[index1, index2];

numArray2[index1] /= (double) size;

}

return numArray2;

}

public static void ShowPanel(Form form, Type type, params object[] args)

{

form.SuspendLayout(); try

{

UserControl instance = (UserControl) Activator.CreateInstance(type); instance.Dock = DockStyle.Fill;

form.Controls.Add((Control) instance); form.Controls.RemoveAt(0);

if (!(instance is IParams)) return;

((IParams) instance).Params = args;

}

finally

{

form.ResumeLayout();

}

}

public static void CreateDatabase()

{

if (!DatabaseSettings.CreateDatabase(DatabaseSettings.Database)) throw new Exception(ServerSQL.LastError);

using (ServerSQL serverSql = new ServerSQL(false, DatabaseSettings.Database))

{

if (!serverSql.Connected) return;

serverSql.ExecSQL("USE " + DatabaseSettings.Database);

if (!serverSql.ExecSQL("CREATE TABLE `Users` (`Id` INT NOT NULL

AUTO_INCREMENT COMMENT 'Код пользователя', `Lastname` VARCHAR( 250 ) NOT NULL COMMENT 'Фамилия', `Firstname` VARCHAR( 250 ) NOT NULL COMMENT 'Имя', `Secondname` VARCHAR( 250 ) NOT NULL COMMENT 'Отчество', `PassportSeria` VARCHAR( 4 ) NOT NULL COMMENT 'Серия паспорта', `PassportNumber` VARCHAR( 6 ) NOT NULL COMMENT 'Номер паспорта', `Login` VARCHAR( 250 ) NOT NULL COMMENT 'Логин' UNIQUE, `Password` VARCHAR( 250 ) NOT NULL COMMENT 'Пароль', PRIMARY

KEY (`Id`), UNIQUE (`Lastname`,`Firstname`,`Secondname`)) ENGINE = InnoDB")) throw new Exception("Create table \"Users\": " +

ServerSQL.LastError);

if (!serverSql.ExecSQL("CREATE TABLE `Questions` (`Id` INT NOT NULL

AUTO_INCREMENT COMMENT 'Код вопроса', `Number` INT NOT NULL COMMENT 'Номер вопроса' UNIQUE, `Question` VARCHAR( 250 ) NOT NULL COMMENT 'Вопрос', PRIMARY KEY (`Id`)) ENGINE = InnoDB"))

throw new Exception("Create table \"Questions\": " + ServerSQL.LastError);

51

Продолжение приложения А

if (!serverSql.ExecSQL("CREATE TABLE `Answers` (`Id` INT NOT NULL

AUTO_INCREMENT COMMENT 'Код вопроса', `QuestionId` INT NOT NULL COMMENT 'Код вопроса', `Number` INT NOT NULL COMMENT 'Номер ответа' UNIQUE, `Answer` VARCHAR( 250 ) NOT NULL COMMENT 'Ответ', `Assessment` INT NOT NULL COMMENT 'Оценка ответа', PRIMARY KEY (`Id`)) ENGINE = InnoDB"))

throw new Exception("Create table \"Questions\": " + ServerSQL.LastError);

if (!serverSql.ExecSQL("CREATE TABLE `Criteria` (`Id` INT NOT NULL

AUTO_INCREMENT COMMENT 'Код критерия', `Number` INT NOT NULL COMMENT 'Номер критерия' UNIQUE, `Content` VARCHAR( 250 ) NOT NULL COMMENT 'Текст', `SignificantIssues` VARCHAR( 250 ) NOT NULL COMMENT 'Номера вопросов для оценки критерия', PRIMARY KEY (`Id`)) ENGINE = InnoDB"))

throw new Exception("Create table \"Criteria\": " + ServerSQL.LastError);

if (!serverSql.ExecSQL("CREATE TABLE `Alternatives` (`Id` INT NOT NULL AUTO_INCREMENT, `Number` INT NOT NULL UNIQUE, `Caption` VARCHAR( 250 ) NOT NULL, `Ranges` VARCHAR( 250 ) NOT NULL, `EvaluationAnswers` VARCHAR( 250

) NOT NULL COMMENT 'Номера оценочных ответов', PRIMARY KEY (`Id`)) ENGINE = InnoDB"))

throw new Exception("Create table \"Alternatives\": " + ServerSQL.LastError);

if (!serverSql.ExecSQL("CREATE TABLE `Ways` (`Id` INT NOT NULL AUTO_INCREMENT, `Number` INT NOT NULL, `AlternativeId` INT NOT NULL, `SolePayment` INT NOT NULL, `LoanPercentage` INT NOT NULL, `LoanInsuranceAmount` INT NOT NULL, `AnInitialFee` INT NOT NULL, `MaxLoanRepaymentPeriod` INT NOT NULL, PRIMARY KEY (`Id`)) ENGINE = InnoDB"))

throw new Exception("Create table \"Ways\": " + ServerSQL.LastError);

}

}

public static void DeleteDatabase()

{

if (!DatabaseSettings.DeleteDatabase(DatabaseSettings.Database)) throw new Exception(ServerSQL.LastError);

}

public static void SqlFrom(string sql, GetReaded readed)

{

using (ServerSQL serverSql = new ServerSQL(false, DatabaseSettings.Database))

{

if (!serverSql.Connected) return;

serverSql.ExecSQL("USE " + DatabaseSettings.Database); serverSql.SqlFrom(sql, readed);

}

}

public static void SelectFromTable(string table, GetReaded readed, string orderby = null)

{

52