Характеристики комплекса задач 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Характеристики комплекса задач



Описание программы

Постановка задачи

Характеристики комплекса задач

Назначение комплекса задач

Комплекс задач, реализованный в данной программе, направлен на решение задания (сформулировано ранее).

Перечень объектов, в интересах которых решаются задачи

Задачи решаются в интересах любого заинтересованного в этом человека (т.е. человека, запустившего программу).

Периодичность решения задач

Задачи могут решаться практически с любой периодичностью (), необходимой пользователю.

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

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

Связи разрабатываемого программного средства

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

Выходная информация

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

Входная информация

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


Алгоритм задачи

Рис. 1 Алгоритм разработанной программы

Исходный текст программы

Программа состоит из нескольких файлов:

MainWindow.xaml.cs

using System.Windows;

 

namespace KDZ_Ternovoy

{

/// <summary>

/// Логика взаимодействия для Window1.xaml

/// </summary>

public partial class MainWindow: Window

{

public MainWindow()

{

InitializeComponent();

}

 

private void FirstTaskButton_Click(object sender, RoutedEventArgs e)

{

FirstTask Task1_Window = new FirstTask();

Task1_Window.Show();

}

 

private void SecondTaskButton_Click(object sender, RoutedEventArgs e)

{

SecondTask Task2_Window = new SecondTask();

Task2_Window.Show();

}

}

}

 

FirstTask.xaml.cs

using System;

using System.Windows;

using System.Windows.Controls;

 

namespace KDZ_Ternovoy

{

/// <summary>

/// Логика взаимодействия для FirstTask.xaml

/// </summary>

public partial class FirstTask: Window

{

public FirstTask()

{

InitializeComponent();

// Сразу же отключаем кнопку

searchForNearestPerfectButton.IsEnabled = false;

}

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

private void inputNumberTextBox_TextChanged(object sender, TextChangedEventArgs e)

{

// Проверка на корректность введенных значений

changeFormElementStates(GeneralMethods.validateInputTextAsInteger(inputNumberTextBox.Text) && Convert.ToInt64(inputNumberTextBox.Text) > 0);

}

 

// Вызов метода поиска ближайшего совершенного числа

private void searchForNearestPerfectButton_Click(object sender, RoutedEventArgs e)

{

// Еще раз провалидируем входные данные (мало ли)

if (GeneralMethods.validateInputTextAsInteger(inputNumberTextBox.Text) && Convert.ToInt64(inputNumberTextBox.Text) > 0)

{

Int64 nearest = Task1MethodContainer.searchForNearestPerfect(Convert.ToInt64(inputNumberTextBox.Text));

outputTextBox.Content = nearest.ToString();

}

}

 

// Изменение состояний элементов на форме

private void changeFormElementStates(bool validateState)

{

if (!validateState)

{

wrongInputNumberLabel.Visibility = Visibility.Visible;

searchForNearestPerfectButton.IsEnabled = false;

}

else

{

wrongInputNumberLabel.Visibility = Visibility.Hidden;

searchForNearestPerfectButton.IsEnabled = true;

}

}

 

// Выход

private void closeFirstTaskButton_Click(object sender, RoutedEventArgs e)

{

this.Close();

}

}

}

 

SecondTask.xaml.cs

using System;

using System.Collections.Generic;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Documents;

 

namespace KDZ_Ternovoy

{

/// <summary>

/// Логика взаимодействия для SecondTask.xaml

/// </summary>

public partial class SecondTask: Window

{

public SecondTask()

{

InitializeComponent();

XTextBox.Text = "0";

YTextBox.Text = "0";

KTextBox.Text = "5";

drawPicture.RaiseEvent(new RoutedEventArgs(Button.ClickEvent));

 

}

 

 

private void changeFormElementStates(bool validateState, Button button, Label label)

{

if (!validateState)

{

label.Visibility = Visibility.Visible;

button.IsEnabled = false;

}

else

{

label.Visibility = Visibility.Hidden;

button.IsEnabled = true;

}

}

 

private void XTextBox_TextChanged(object sender, TextChangedEventArgs e)

{

changeFormElementStates(GeneralMethods.validateInputTextAsInteger(XTextBox.Text), drawPicture, wrongXLabel);

}

 

private void YTextBox_TextChanged(object sender, TextChangedEventArgs e)

{

changeFormElementStates(GeneralMethods.validateInputTextAsInteger(YTextBox.Text), drawPicture, wrongYLabel);

}

 

private void KTextBox_TextChanged(object sender, TextChangedEventArgs e)

{

changeFormElementStates(GeneralMethods.validateInputTextAsInteger(KTextBox.Text) && (Convert.ToInt64(KTextBox.Text) > 2 && Convert.ToInt64(KTextBox.Text) < 16), drawPicture, wrongKLabel);

}

 

private void drawPicture_Click(object sender, RoutedEventArgs e)

{

if (GeneralMethods.validateInputTextAsInteger(KTextBox.Text) && GeneralMethods.validateInputTextAsInteger(XTextBox.Text) && GeneralMethods.validateInputTextAsInteger(YTextBox.Text))

{

 

MyCanvas.Children.Clear();

int X = Convert.ToInt32(XTextBox.Text);

int Y = Convert.ToInt32(YTextBox.Text);

 

 

List<List<Point>> polyLineList = Task2MethodContainer.getPolylineList(Convert.ToInt32(KTextBox.Text), 250);

int numberOfFigures = polyLineList.Count - 1;

 

//Добавим основы

foreach (Point pointList in polyLineList[numberOfFigures])

{

MyCanvas.Children.Add(Task2MethodContainer.getLine(X, Y, X + pointList.X, Y + pointList.Y));

}

 

//Добавим многоугольники

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

{

MyCanvas.Children.Add(Task2MethodContainer.getPolyline(X, Y, polyLineList[i]));

 

}

}

}

 

private void closeSecondTaskButton_Click(object sender, RoutedEventArgs e)

{

this.Close();

}

}

}

 

GeneralMethods.cs

using System;

 

namespace KDZ_Ternovoy

{

/// <summary>

/// Общие методы

/// </summary>

class GeneralMethods

{

// Проверка на корректность строки (число ли там)

static public bool validateInputTextAsInteger(string inputText)

{

Int64 number;

try

{

number = Convert.ToInt64(inputText);

}

catch (FormatException)

{

return false;

}

return true;

}

}

}

 

Task1MethodContainer.cs

using System;

 

namespace KDZ_Ternovoy

{

/// <summary>

/// Методы для первого задания

/// </summary>

public class Task1MethodContainer

{

 

// Проверка на совершенность числа

static private bool isPerfect(Int64 number)

{

Int64 sum = 0;

if (number <= 0)

return false;

for (int i = 1; i < number; i++)

{

// Суммируем все делители числа

if (number % i == 0)

sum += i;

}

return (number == sum)? true: false;

}

 

 

// Поиск ближайшего совершенного числа

static public Int64 searchForNearestPerfect(Int64 basicNumber)

{

// Отколнение от нашего числа

Int64 delta = 0;

 

try

{

while (true)

{

if (isPerfect(basicNumber - delta))

{

return basicNumber - delta;

}

else if (isPerfect(basicNumber + delta))

{

return basicNumber + delta;

}

delta++;

}

}

catch

{

}

return 0;

}

}

}

 

Task2MethodContainer.cs

using System;

using System.Collections.Generic;

using System.Windows.Shapes;

using System.Windows.Media;

 

namespace KDZ_Ternovoy

{

/// <summary>

/// Методы для второй задачи

/// </summary>

class Task2MethodContainer

{

// Получение количества многоугольников в зависимости от количества лучей

static private int getNumberOfPolyLines(int K)

{

return (int)(18/(K + 2) + 2);

}

 

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

static public List<List<Point>> getPolylineList(int K, int length)

{

List<List<Point>> polylineList = new List<List<Point>>();

List<Point> pointList;

 

// Считаем расстояние между многоугольниками

int numberOfPolylines = getNumberOfPolyLines(K);

double deltaLength = length / (numberOfPolylines + 1);

double tempDeltalength = deltaLength;

 

// Отклонение каждого луча в радианах

double cornerDelta = 2 * Math.PI / K;

 

// Собственно, получение координат

for (int degree = 0; degree < numberOfPolylines; degree++)

{

pointList = new List<Point>();

 

for (int i = 1; i < K + 1; i++)

{

pointList.Add(new Point((int)(tempDeltalength * Math.Cos(cornerDelta * i)), (int)(tempDeltalength * Math.Sin(cornerDelta * i))));

}

polylineList.Add(pointList);

tempDeltalength += deltaLength;

}

 

//Получим фиальные точки (это будут концы лучей)

pointList = new List<Point>();

for (int i = 1; i < K + 1; i++)

{

pointList.Add(new Point((int)(length * Math.Cos(cornerDelta * i)), (int)(length * Math.Sin(cornerDelta * i))));

}

polylineList.Add(pointList);

 

return polylineList;

}

 

// Получение объекта линии по заданным точкам

static public Line getLine(int X, int Y, int X1, int Y1)

{

Line line = new Line();

line.StrokeThickness = 2;

line.Stroke = new SolidColorBrush(Colors.Black);

line.X1 = X;

line.X2 = X1;

line.Y1 = Y;

line.Y2 = Y1;

 

return line;

}

 

// Получение объекта ломанной линии по точкам

static public Polyline getPolyline(int X, int Y, List<Point> pointList)

{

Polyline polyline = new Polyline();

polyline.StrokeThickness = 2;

polyline.Stroke = new SolidColorBrush(Colors.Black);

 

PointCollection points = new PointCollection();

 

foreach (Point point in pointList)

{

points.Add(new System.Windows.Point(X + point.X, Y + point.Y));

}

points.Add(new System.Windows.Point(X + pointList[0].X, Y + pointList[0].Y));

polyline.Points = points;

return polyline;

 

}

}

 

/// <summary>

/// Класс точки

/// </summary>

class Point

{

private int m_X;

private int m_Y;

 

public Point()

{

}

 

public Point(int X, int Y)

{

this.X = X;

this.Y = Y;

}

 

public int X

{

get { return m_X; }

set { m_X = value; }

}

 

public int Y

{

get { return m_Y; }

set { m_Y = value; }

}

}

}

 


Вывод

Уровень реализации исследуемой программы весьма низкий, так как потенциальный объем программы в значительной степени меньше ее реального объема (V* = 19,65; V = 8211,15).


Исходный граф

Исходный управляющий граф, построенный по алгоритму программы:

Рис. 2 Управляющий граф разработанной программы

 

Найдем цикломатическое число:

Z = m – n +2 = 28 – 22 + 2 = 8,

Где m – количество дуг, а n – количество вершин.

Модифицированный граф

Как видно, некоторые из вершин можно убрать, так как они образуют линейную последовательность операторов:

Рис. 3 Модифицированный управляющий граф разработанной программы

 

Цикломатическое число осталось таким же:

Z = m – n +2 = 22 – 16 + 2 = 8,

Первый критерий

Определяем минимальный набор маршрутов, проходящих через каждый оператор ветвления и по каждой дуге:

M1: 1- 2 - 3 - 4 - 6 -7- 4 - 6 -9- 10 -13- 4 - 6 -9- 10 - 11 -12-9- 10 - 11 -13- 4 - 2 - 3 - 14 - 16 -20- 14 - 16 -19- 14 - 2 -22; p1=22

Вычислим уровень сложности:

S1= p 1 = 22

Второй критерий

Определяем число проверок каждого линейно независимого цикла и линейно независимого циклического участка программы:

Общее число проверок = Z = 8 Таким образом, общее число циклических и ациклических участков в графе равно 8.

 

Циклические участки:

M1: 2 - 3 - 4; p1=3

M2: 2 - 3 - 14; p2=3

M3: 4 - 6 -7; p3=2

M4: 4 - 6 -9- 10 - 11 -13; p4 =4

M5: 9- 10 - 11 -13; p5 =2

M6: 14 - 16 -20; p6=2

M7: 14 - 16 -19; p7=2

Ациклические маршруты:

M8: 1- 2 -22; p8=1

Метрика структурной сложности:

S2 = p1+p2+p3+p4+p5+p6+p7+p8 = 3+3+2+4+2+2+2+1 = 19


Третий критерий

Так как циклы, идущие от вершин 4 и 14 независимы друг от друга (2 подзадачи в программе), то в третьем критерии можно рассматривать комбинации всех маршрутов внутри этих независимых циклов:

M1: 1- 2 -22; p1=2

M2: 1- 2 - 3 - 4 - 6 -9- 10 - 11 -13- 4 - 2 -22; p2=8

M3: 1- 2 - 3 - 4 - 6 -7- 2 -22; p3=5

M4: 1- 2 - 3 - 4 - 6 -9- 10 -13- 4 - 2 -22; p4=7

M5: 1- 2 - 3 - 4 - 6 -9- 10 - 11 -12-9- 10 - 11 -13- 4 - 2 -22; p5=10

M6: 1- 2 - 3 - 4 - 6 -9- 10 - 11 -12-9- 10 -13- 4 - 2 -22; p6=9

M7: 1- 2 - 3 - 14 - 16 -20- 14 - 2 -22; p7=6

M8: 1- 2 - 3 - 14 - 16 -19- 14 - 2 -22; p8=6

M9: 1- 2 - 3 - 14 - 16 -20- 14 - 16 -19- 14 - 2 -22; p9=8

M10: 1- 2 - 3 - 4 - 6 -7-9- 10 - 11 -13- 4 - 2 -22; p10=8

M11: 1- 2 - 3 - 4 - 6 -7- 4 - 6 -9- 10 -13- 4 - 2 -22; p11=9

M12: 1- 2 - 3 - 4 - 6 -7- 4 - 6 -9- 10 - 11 -12-9- 10 - 11 -13- 2 -22; p12=11

M13: 1- 2 - 3 - 4 - 6 -7- 4 - 6 -9- 10 - 11 -12-9- 10 -13- 2 -22; p13=10

M14: 1- 2 - 3 - 4 - 2 -22; p14=4

M15: 1- 2 - 3 - 14 - 2 -22-9-5-9- 11 - 2 - 14; p15=7

M16: 1- 2 - 3 - 4 - 2 - 3 - 14 - 2 -22; p16=7

Посчитаем третий критерий:

S3= 2+2+5+7+10+9+6+6+8+8+9+11+10+4+7+7 = 111

Таблица 16 Матрица смежности управляющего графа

                                 
                                 
                                 
                                 
                                 
                                 
                                 
                                 
                                 
                                 
                                 
                                 
                                 
                                 
                                 
                                 
                                 

Таблица 17 Матрица достижимости управляющего графа

                                 
                                 
                                 
                                 
                                 
                                 
                                 
                                 
                                 
                                 
                                 
                                 
                                 
                                 
                                 
                                 
                                 

Расчет показателей

Общее количество ФП:

F= 12+4+42 = 56

Количество функциональных указателей:

FP = F*(0.65+0,01*∑ki) = 56*(0.65+0.01*24) = 49,84

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

 

Расчет силы связности

Программа состоит из 19 программных модулей. Рассмотрим их по типам связности:

Методы

isPerfect

searchForNearestPerfect

getNumberOfPolyLines

getPolylineList

getLine

getPolyline

validateInputTextAsInteger

выполняют автономные опецерации со входными данными (расчеты, заполнение массивов).

Тип связности – функциональный, сила связности – 10.

 

Методы

FirstTaskButton_Click

SecondTaskButton_Click

closeSecondTaskButton_Click

closeFitrstTaskButton_Click

отвечают за взаимодействие форм программы (открытие, закрытие).

Тип связности – функциональный, сила связности – 10

 

Методы

changeFormElementStates

changeFormElementStates

inputNumberTextBox_TextChanged

XTextBox_TextChanged

YTextBox_TextChanged

KTextBox_TextChanged

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

Тип связности – функциональный, сила связности - 9

 

Методы

drawPicture_Click

searchForNearestPerfectButton_Click

отвечают за ход выполнения подпрограмм, в них важен порядок действий внутри модуля. Каждый из этих методов решает более одной «задачи».

Тип связности – коммуникационный, сила связности – 7.

Расчет силы сцепления

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

 

Методы

getPolylineList

getPolyline

являются вызываемыми, их входными параметрами являются простые и структурные данные (массивы, числа, строки). Следовательно, рассматриваемые модули имеют сцепление по образцу, сила сцепления - 3.

 

Методы

isPerfect

searchForNearestPerfect

getNumberOfPolyLines

getLine

validateInputTextAsInteger

являются вызываемыми, их входными параметрами являются простые данные (числа). Следовательно, рассматриваемые модули имеют сцепление по данным, сила сцепления - 1.

 

Методы

changeFormElementStates

changeFormElementStates

inputNumberTextBox_TextChanged

XTextBox_TextChanged

YTextBox_TextChanged

KTextBox_TextChanged

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

Эти методы отвечают за взаимодействие между формами и имеют сцепление по управлению, сила сцепления - 4.

 

Методы

drawPicture_Click

searchForNearestPerfectButton_Click

являются вызывающими, в них происходит вызов всех основных методов для расчета и вывода результата.

Эти методы имеют сцепление по управлению, сила сцепления - 4.

Вывод

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

Если принять DQ = 1 (программа нормального качества), получим количество максимально допустимых ошибок 50. Кроме того, на основе функциональных показателей можно вычислить другие характеристики ПС, такие как производительность, удельная стоимость и документированность.

 

Учитывая другие показатели (связность, сцепление), можно достаточно четко оценить уровень качества программы. В решении преобладают модули с силой связности 7 и 10, что говорит о достаточно высоком качестве программы и её легкой тестируемости. Сила же сцепления программных модулей принимает значения 1,3 и 4 что говорит об уровне качества программы выше среднего.


Оценка надежности программы

Оценка надежности программы на основе модели Джелински-Моранды:

Программа была протестирована серией из 20 тестов.

В результате, было обнаружено 2 ошибки (в 5 и 13 тестах).

 

Предполагая, что исправление найденной ошибки не повлекло появления новых ошибок, оценим количество ошибок N в программе до начала тестирования и количество оставшихся ошибок с помощью модели Джелински-Моранды:

 

· количество обнаруженных ошибок n = 1

· интервал продолжительности обнаружения первой ошибки t1 = 5

· интервал продолжительности обнаружения первой ошибки t2 = 13

Таким образом:

В результате преобразований получаем

Следовательно, N = 1,6 ≈ 2. В соответствии с моделью Джелински-Моранды, в начале тестирования в программе содержалось две ошибки. В ходе тестирования обе ошибки обнаружены, значит осталось N-n = 0 необнаруженных ошибок.

Оценка надежности программы на основе модели Миллса:

В разработанную программу было преднамеренно внесено 8 ошибок.

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

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

· количество преднамеренно внесенных ошибок W = 8

· количество обнаруженных ошибок из внесенных V = 8

· «собственные» ошибки S = 2

· предполагаемые ошибки в программе r = 3

Для оценки количества ошибок до начала тестирования используем формулу

Следовательно, в соответствии с моделью Миллса, в начале тестирования в программе имелось 2 ошибки.

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

Видно, что количество предполагаемых ошибок не превышает количество найденных «собственных» ошибок (S < r). Подставляем данные в соответствующую формулу:

Следовательно, степень отлаженности программы составляет 66%.

Описание программы

Постановка задачи

Характеристики комплекса задач

Назначение комплекса задач

Комплекс задач, реализованный в данной программе, направлен на решение задания (сформулировано ранее).



Поделиться:


Последнее изменение этой страницы: 2017-01-24; просмотров: 720; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.137.180.32 (0.222 с.)