- •Национальный исследовательский университет «Высшая школа экономики»
- •Контрольное домашнее задание
- •Формулировка задания
- •Описание программы Постановка задачи Характеристики комплекса задач
- •Оценка характеристик на основе метрик Холстеда
- •Третий критерий
- •Алгоритмическая сложность на основе метрики Маккейба
- •Оценка характеристик программы на основе модели функциональных указателей Оценочные элементы программы f1..F5
- •Значения коэффициентов регулировки сложности
- •Расчет показателей
- •Расчет силы связности
- •Расчет силы сцепления
- •Оценка надежности программы Оценка надежности программы на основе модели Джелински-Моранды:
- •Оценка надежности программы на основе модели Миллса:
Оценка характеристик на основе метрик Холстеда
Составим таблицы, необходимые для вычисления характеристик программы по методике Холстеда:
Заполним каждую из таблиц для каждого файла:
Таблица 2 Словарь операторов и операций для файла MainWindow.xaml.cs
№ п/п |
Операторы, операции |
Номера строк |
Количество повторений |
1 |
using |
1 |
1 |
2 |
namespace |
3 |
1 |
3 |
public |
8, 10 |
2 |
4 |
partial |
8 |
1 |
5 |
class |
8 |
1 |
6 |
: |
8 |
1 |
7 |
void |
15, 21 |
2 |
8 |
object |
15, 21 |
2 |
9 |
RoutedEventArgs |
15, 21 |
2 |
10 |
new |
17, 23 |
2 |
11 |
Task1_Window.Show(); |
18 |
1 |
12 |
Task2_Window.Show(); |
24 |
1 |
13 |
FirstTask |
17 |
1 |
14 |
FirstTask() |
17 |
1 |
15 |
SecondTask |
23 |
1 |
16 |
SecondTask() |
23 |
1 |
17 |
{ .. } |
4..27, 9..26, 11..13, 16..19, 22..25 |
5 |
18 |
( .. ) |
10, 12, 15, 17, 18, 21, 23, 24 |
8 |
19 |
= |
17, 23 |
2 |
20 |
; |
12, 17, 18, 23, 24 |
5 |
21 |
. |
18, 24 |
2 |
22 |
System |
1 |
1 |
23 |
InitializeComponent() |
12 |
1 |
Всего |
23 оператора/операции |
27 строк |
45 повторений |
Таблица 3 Словарь операндов для файла MainWindow.xaml.cs
№ п/п |
Операнды |
Номера строк |
Количество повторений |
1 |
System.Windows |
1 |
1 |
2 |
MainWindow |
8 |
1 |
3 |
Window |
8 |
1 |
4 |
MainWindow() |
10 |
1 |
5 |
FirstTaskButton_Click() |
15 |
1 |
6 |
SecondTaskButton_Click() |
21 |
1 |
7 |
sender |
15, 21 |
2 |
8 |
e |
15, 21 |
2 |
9 |
Task1_Window |
17, 18 |
2 |
10 |
Task2_Window |
23, 24 |
2 |
11 |
KDZ_Ternovoy |
3 |
1 |
Всего |
11 операндов |
27 строк |
15 повторений |
Таблица 4 Словарь операторов и операций для файла FirstTask.xaml.cs
№ п/п |
Операторы, операции |
Номера строк |
Количество повторений |
1 |
using |
1,2,3 |
3 |
2 |
namespace |
5 |
1 |
3 |
public |
10,12 |
2 |
4 |
partial |
10 |
1 |
5 |
class |
10 |
1 |
6 |
: |
10 |
1 |
7 |
void |
19,26,37,52 |
4 |
8 |
object |
19,26,52 |
3 |
9 |
RoutedEventArgs |
26,52 |
2 |
10 |
TextChangedEventArgs |
19 |
1 |
11 |
. |
2,3,8,16,22,29,31,32,41,42,46,47,54 |
25 |
12 |
GeneralMethods.validateInputTextAsInteger() |
22,29 |
2 |
13 |
Convert.ToInt64() |
22,29,31 |
3 |
14 |
changeFormElementStates() |
22,37 |
2 |
15 |
= |
16,31,32,41,42,46,47 |
7 |
16 |
; |
1,2,3,14,16,22,31,32,41,42,46,47,54 |
13 |
17 |
this |
54 |
1 |
18 |
bool |
37 |
1 |
19 |
if |
29..33,39..44 |
2 |
20 |
else |
44..49 |
1 |
21 |
private |
19,26,37,52 |
4 |
22 |
nearest.ToString() |
32 |
1 |
23 |
> |
22,29 |
2 |
24 |
&& |
22,29 |
2 |
25 |
InitializeComponent() |
14 |
1 |
26 |
Task1MethodContainer.searchForNearestPerfect() |
31 |
1 |
Всего |
26 оператора/операции |
57 строк |
88 повторений |
Таблица 5 Словарь операндов для файла FirstTask.xaml.cs
№ п/п |
Операнды |
Номера строк |
Количество повторений |
1 |
System |
1 |
1 |
2 |
System.Windows |
2 |
1 |
3 |
SystemWindows.Controls |
3 |
1 |
4 |
KDZ_Ternovoy |
5 |
1 |
5 |
FirstTask |
10 |
1 |
6 |
Window |
10 |
1 |
7 |
FirstTask() |
12 |
1 |
8 |
searchForNearestPerfectButton.IsEnabled |
16,42,47 |
3 |
9 |
false |
16,42 |
2 |
10 |
inputNumberTextBox_TextChanged() |
19 |
1 |
11 |
searchForNearestPerfectButton_Click() |
26 |
1 |
12 |
changeFormElementStates() |
37 |
1 |
13 |
closeFirstTaskButton_Click() |
52 |
1 |
14 |
inputNumberTextBox.Text |
22,29,31 |
5 |
15 |
sender |
19,26,52 |
3 |
16 |
e |
19,26,52 |
3 |
17 |
0 |
22,29 |
2 |
18 |
nearest |
31,32 |
2 |
19 |
outputTextBox.Content() |
32 |
1 |
20 |
validateState |
37,39 |
1 |
21 |
wrongInputNumberLabel.Visibility |
41,46 |
2 |
22 |
Visibility.Visible |
41 |
1 |
23 |
Visibility.Hidden |
46 |
1 |
24 |
searchForNearestPerfectButton.IsEnabled |
42,47 |
2 |
25 |
true |
47 |
1 |
Всего |
25 операндов |
57 строк |
40 повторений |
Таблица 6 Словарь операторов и операций для файла Task1MethodContainer.cs
№ п/п |
Операторы, операции |
Номера строк |
Количество повторений |
1 |
using |
1 |
1 |
2 |
namespace |
3 |
1 |
3 |
public |
8, 28 |
2 |
4 |
class |
8 |
1 |
5 |
static |
12, 28 |
2 |
6 |
private |
12 |
1 |
7 |
Int64 |
12,28,14,31 |
4 |
8 |
bool |
12 |
1 |
9 |
if |
15,20,37,41 |
4 |
10 |
else |
41 |
1 |
11 |
return |
16,23,39,43,51 |
5 |
12 |
int |
17 |
1 |
13 |
while |
35..46 |
1 |
14 |
try |
33..47 |
1 |
15 |
catch |
48..50 |
1 |
16 |
= |
14,17,31,21 |
4 |
17 |
== |
20,23 |
2 |
18 |
; |
1,14,15,16,21,23,31,35,43,45,51 |
12 |
19 |
<= |
15 |
1 |
20 |
< |
17 |
1 |
21 |
++ |
4,17 |
2 |
22 |
% |
20 |
1 |
23 |
+ |
21,41,43 |
3 |
24 |
- |
37,39 |
2 |
25 |
? .. : .. |
23 |
1 |
26 |
{..} |
4..54, 9..53, 13..24, 18..22, 25..52, 34..47, 37..46, 38..40, 24..44, 49..50 |
10 |
27 |
( .. ) |
12,15,17,20,23,28,35,37,40 |
9 |
28 |
isPerfect |
37,41 |
2 |
Всего |
28 оператора/операции |
54 строчки |
77 повторений |
Таблица 7 Словарь операндов для файла Task1MethodContainer.cs
№ п/п |
Операнды |
Номера строк |
Количество повторений |
1 |
System |
1 |
1 |
2 |
Task1MethodContainer |
3 |
1 |
3 |
isPerfect |
12 |
1 |
4 |
number |
12,15,17,20, 23 |
5 |
5 |
sum |
14,21,23 |
3 |
6 |
0 |
14,20,31,51,15 |
5 |
7 |
false |
16,23 |
2 |
8 |
i |
17,20,23 |
3 |
9 |
1 |
17 |
1 |
10 |
true |
23 |
1 |
11 |
searchForNearestPerfect |
28 |
1 |
12 |
basicNumber |
28,37,41,39,43 |
5 |
13 |
delta |
31,37,39,41,43,45 |
6 |
Всего |
13 операндов |
54 строчки |
35 повторений |
Таблица 8 Словарь операторов и операций для файла Task2MethodContainer.cs
№ п/п |
Операторы, операции |
Номера строк |
Количество повторений |
1 |
using |
1,2,3,4 |
4 |
2 |
namespace |
6 |
1 |
3 |
public |
20,58,72,99,103,109,115 |
7 |
4 |
class |
11,94 |
2 |
5 |
static |
14,20,58,72 |
4 |
6 |
private |
14,96,97 |
3 |
7 |
int |
14,16,20,26,34,40,48,50,58,72,96,97,103,109,115 |
23 |
8 |
return |
16,54,68,86 |
4 |
9 |
List<List<Point>> |
20,22 |
3 |
10 |
List<Point> |
23,36,,47,72 |
4 |
11 |
double |
27,28,31 |
3 |
12 |
new |
22,36,47,50,60,62,74,76,78 |
11 |
13 |
List<List<Point>>() |
22 |
1 |
14 |
List<Point>() |
36,47 |
2 |
15 |
= |
22,26,27,28,31,34,36,38,43,37,38,60,61,62,63,64,65,66,74,75,76,78,85,105,106,112,118 |
27 |
16 |
getNumberOfPolyLines() |
26 |
1 |
17 |
/ |
27,31 |
2 |
18 |
* |
31,40,50 |
9 |
19 |
for |
34..44,38..41,48..51 |
3 |
20 |
foreach .. in |
80..83 |
1 |
21 |
< |
38,48 |
2 |
22 |
+ |
16,27,38,48,82,84 |
9 |
23 |
++ |
34,38,48 |
3 |
24 |
Add |
40,42,50,52,82,84 |
6 |
25 |
Math.Cos() |
40,50 |
2 |
26 |
Math.Sin() |
40,50 |
2 |
27 |
+= |
43 |
1 |
28 |
{..} |
7..121,12..89,15..17,21..55,35..44,39..41,49..51,59..69,73..88,81..83.95..120,100..12,104..107,110..113,116..119 |
19 |
29 |
(..) |
14,16,20,22,26,27,34,36,38,40,42,46,47,48,50,52,58,60,62,72,74,76,78,80,82,84,99,103 |
46 |
30 |
, |
20,33,40,50,58,72,82,84,103 |
12 |
31 |
. |
2,3,4,31,40,42,50,52,61,62,63,64,65,66,75,76,82,84,85,105,106 |
38 |
32 |
; |
1,2,3,4,16,22,23,26,27,28,31,34,36,38,40,42,43,47,48,50,52,54,60,61,62,63,64,65,66,68,74,75,76,78,82,84,86,96,96,105,106,111,112,117,118 |
49 |
Всего |
28 оператора/операции |
строк |
304 повторения |
Таблица 9 Словарь операндов для файла Task2MethodContainer.cs
№ п/п |
Операнды |
Номера строк |
Количество повторений |
1 |
System |
1,2,3,4,82,84 |
6 |
2 |
KDZ_Ternovoy |
6 |
1 |
3 |
Task2MethodContainer |
11 |
1 |
4 |
getNumberOfPolyLines() |
14 |
1 |
5 |
K |
6,14,16,20,26,31,38,48 |
8 |
6 |
18 |
16 |
1 |
7 |
2 |
16,31,61 |
4 |
8 |
getPolylineList() |
20 |
1 |
9 |
0 |
34,84
|
3 |
10 |
1 |
27,38 |
3 |
11 |
Math.PI |
1 |
31 |
12 |
length |
20,27,50 |
4 |
13 |
numberOfPolylines |
26,27,34 |
3 |
14 |
deltaLength |
27,28,43 |
3 |
15 |
tempDeltalength |
28,40,40,43 |
4 |
16 |
polylineList |
22,42,52,54 |
4 |
17 |
pointList |
23,26,30,42,47,50,52,72,80,84 |
11 |
18 |
degree |
34 |
3 |
19 |
i |
38,40,48,50 |
10 |
20 |
cornerDelta |
31,40,50 |
5 |
21 |
getLine() |
58 |
1 |
22 |
X |
58,63,72,82,84,103,105,109 |
11 |
23 |
Y |
58,65,72,82,84,103,106,115 |
11 |
24 |
X1 |
58,63,64 |
3 |
25 |
Y1 |
58,65,66 |
3 |
26 |
line |
60,61,62,63,64,65,66,68 |
8 |
27 |
line.StrokeThickness |
61 |
1 |
28 |
line.Stroke |
62 |
1 |
29 |
Colors.Black |
62,76 |
2 |
30 |
getPolyline |
72 |
1 |
31 |
polyline |
74,75,76,85,86 |
6 |
32 |
polyline.StrokeThickness |
75 |
1 |
33 |
points |
78,82,84,85 |
4 |
34 |
polyline.Stroke |
76 |
1 |
35 |
Point |
20,22,23,26,40,47,50,72,80,82,84,94,99,103 |
15 |
36 |
m_X |
96,111,112 |
3 |
37 |
m_Y |
97,118,119 |
3 |
Всего |
37 операндов |
122 строки |
182 повторения |
Таблица 10 Словарь операторов и операций для файла GeneralMethods.cs
№ п/п |
Операторы, операции |
Номера строк |
Количество повторений |
1 |
using |
1 |
1 |
2 |
namespace |
3 |
1 |
3 |
class |
8 |
1 |
4 |
static |
11 |
1 |
5 |
public |
11 |
1 |
6 |
bool |
11 |
1 |
7 |
string |
11 |
1 |
8 |
Int64 |
13 |
1 |
9 |
try |
14 |
1 |
10 |
catch |
18 |
1 |
11 |
return |
20,22 |
2 |
12 |
Convert.ToInt64() |
16 |
1 |
13 |
{..} |
4..26,9..25,12..23,15..17,19..21 |
5 |
14 |
(..) |
11,16,18 |
3 |
15 |
; |
1,13,16,20,22 |
5 |
16 |
. |
16 |
1 |
17 |
= |
16 |
1 |
Всего |
17 операторов/операций |
26 строк |
28 повторений |
Таблица 11 Словарь операндов для файла GeneralMethods.cs
№ п/п |
Операнды |
Номера строк |
Количество повторений |
1 |
System |
1 |
1 |
2 |
KDZ_Ternovoy |
3 |
1 |
3 |
validateInputTextAsInteger |
11 |
1 |
4 |
inputText |
11,16 |
2 |
5 |
GeneralMethods |
8 |
1 |
6 |
number |
13,16 |
2 |
7 |
FormatException |
18 |
1 |
8 |
false |
20 |
1 |
9 |
true |
22 |
1 |
Всего |
9 операндов |
26 строки |
11 повторений |
Таблица 12 Словарь операторов и операций для файла Task2MethodContainer.cs
№ п/п |
Операторы, операции |
Номера строк |
Количество повторений |
1 |
using |
1,2,3,4,5 |
5 |
2 |
namespace |
7 |
1 |
3 |
public |
12,14 |
2 |
4 |
partial |
12 |
1 |
5 |
class |
12 |
1 |
6 |
: |
12 |
1 |
7 |
InitializeComponent() |
16 |
1 |
8 |
drawPicture.RaiseEvent() |
20 |
1 |
9 |
private |
25,39,44,49,54,82 |
6 |
10 |
void |
25,39,44,49,54,82 |
6 |
11 |
new |
20 |
1 |
12 |
bool |
25 |
1 |
13 |
Button |
25 |
1 |
14 |
RoutedEventArgs |
20,54,82 |
3 |
15 |
Label |
25 |
1 |
16 |
object |
20,54,82,39,44,49 |
6 |
17 |
TextChangedEventArgs |
39,44,49 |
3 |
18 |
changeFormElementStates() |
41,46,51 |
3 |
19 |
GeneralMethods. validateInputTextAsInteger() |
41,46,51,56 |
6 |
20 |
Task2MethodContainer .getPolylineList() |
64 |
1 |
21 |
List<List<Point>> |
64 |
1 |
22 |
Convert.ToInt32() |
60,61,64 |
3 |
23 |
&& |
51,56 |
4 |
24 |
> |
51 |
1 |
25 |
< |
51 |
1 |
26 |
MyCanvas.Children.Add |
70,76 |
2 |
27 |
Task2MethodContainer.getLine() |
70 |
1 |
28 |
Task2MethodContainer.getPolyline() |
76 |
1 |
29 |
this |
84 |
1 |
30 |
this.Close() |
84 |
1 |
31 |
. |
2,3,4,5,10,17,18,19,20,29,30,34,35,41,46,51,56,59,60,61,64,65,70,76,84 |
54 |
32 |
; |
1,2,3,4,29,30,34,35,65,74,74 |
12 |
33 |
{..} |
8..88,13..87, … |
14 |
34 |
(..) |
20,25,39,41,46,49,51,54,56,60,61,64,68,70,74,76,82 |
31 |
35 |
if |
27,56 |
2 |
36 |
else |
32 |
1 |
37 |
for |
74..79 |
1 |
38 |
foreach in |
68 |
1 |
39 |
int |
60,61,65,74 |
4 |
40 |
! |
27 |
1 |
Всего |
40 операторов/операций |
88 строк |
188 повторений |
Таблица 13 Словарь операндов для файла Task2MethodContainer.cs
№ п/п |
Операнды |
Номера строк |
Количество повторений |
1 |
System; |
1 |
1 |
2 |
System.Windows |
2 |
1 |
3 |
System.Windows.Controls |
3 |
1 |
4 |
System.Windows.Documents |
4 |
1 |
5 |
System.Collections.Generic |
5 |
1 |
6 |
KDZ_Ternovoy |
7 |
1 |
7 |
SecondTask |
12 |
1 |
8 |
Window |
12 |
1 |
9 |
SecondTask() |
14 |
1 |
10 |
XTextBox.Text |
17,41,56,60 |
4 |
11 |
YTextBox.Text |
18,46,56,61 |
4 |
12 |
KTextBox.Text |
19,51,56,64 |
6 |
13 |
"0" |
17,18 |
2 |
14 |
"5" |
19 |
1 |
15 |
Button.ClickEvent |
20 |
1 |
16 |
validateState |
25,27 |
2 |
17 |
button |
25,30,35 |
3 |
18 |
label |
25,29,34 |
3 |
19 |
label.Visibility |
29,34 |
2 |
20 |
Visibility.Visible |
29 |
1 |
21 |
Visibility.Hidden |
34 |
1 |
22 |
button.IsEnabled |
30,35 |
2 |
23 |
true |
35 |
1 |
24 |
false |
30 |
1 |
25 |
sender |
39,44,49,54,82 |
5 |
26 |
e |
39,44,49,54,82 |
5 |
27 |
XTextBox_TextChanged |
39 |
1 |
28 |
YTextBox_TextChanged |
44 |
1 |
29 |
KTextBox_TextChanged |
49 |
1 |
30 |
drawPicture_Click |
54 |
1 |
31 |
wrongXLabel |
41 |
1 |
32 |
wrongYLabel |
46 |
1 |
33 |
wrongKLabel |
51 |
1 |
34 |
X |
60,70,76 |
5 |
35 |
Y |
61,70,76 |
5 |
34 |
numberOfFigures |
65,68,74 |
3 |
35 |
polyLineList.Count |
65 |
1 |
36 |
polyLineList |
64,65,68,76 |
4 |
35 |
numberOfFigures |
65,68,74 |
3 |
36 |
closeSecondTaskButton_Click |
82 |
1 |
34 |
pointList.X |
70 |
1 |
35 |
pointList.Y |
70 |
1 |
34 |
250 |
64 |
1 |
35 |
1 |
65 |
1 |
36 |
0 |
74 |
1 |
Всего |
36 операндов |
88 строк |
89 повторений |
Таблица 14 Входные и выходные переменные программы
Входные переменные |
Выходные переменные |
inputNumberTextBox.Text |
outputTextBox.Content |
XTextBox.Text |
|
YTextBox.Text |
|
KTextBox.Text |
|
Расчет характеристик программы:
Таблица 15 Значения метрик Холстеда для программы
Наименование характеристики |
Обозначение и формула для вычисления |
Значение |
Число простых (уникальных) операторов и операций |
n1 |
162 |
Число простых (уникальных) операндов |
n2 |
131 |
Общее число всех операторов и операций |
N1 |
730 |
Общее число всех операндов |
N 2 |
372 |
Число входных и выходных переменных (параметров) |
n 2* |
5 |
Словарь программы |
n = n n |
293 |
Длина реализации программы |
N = N1 + N2 |
1102 |
Объем программы (в битах) |
V = (N1 + N2) log2(n 1 + n 2) |
8211,15 |
Потенциальный объем программы |
V* = (n2* + 2) · log2(n2* + 2) |
19,65 |
Уровень реализации программы |
L = V*/V |
0,002 |
Уровень реализации языка |
= L V* |
0,0393 |
Работа программирования |
E = V / L |
4105575 |
Вывод
Уровень реализации исследуемой программы весьма низкий, так как потенциальный объем программы в значительной степени меньше ее реального объема (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