курсач 4 сем исит в э / моя записка
.pdf10.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