![](/user_photo/46612_vacAi.jpg)
Примеры выполнения лабораторных работ / Лабораторная работа 3
.pdfФЕДЕРАЛЬНОЕ АГЕНТСТВО СВЯЗИ Федеральное государственное бюджетное образовательное учреждение
высшего образования "Санкт-Петербургский государственный университет телекоммуникаций им. проф. М.А. Бонч-Бруевича"
Факультет «Инфокоммуникационных сетей и систем» Кафедра «Программной инженерии и вычислительной техники»
Отчет по лабораторной работе №3 На тему «Оценка характеристик программы на основе лексического анализа»
Дисциплина: «Управление программными проектами»
студентка гр. ИКПИ-51 |
________________ |
Павшева М.В. |
преподаватель каф. ПИиВТ |
________________ |
д.т.н., проф. Фомин В. В. |
Санкт-Петербург
2018
Постановка задачи
Требуется оценить характеристики программы на основе метрик. Программа реализует следующее задание: Следует выполнить копирование
положительных элементов двух исходных массивов А и В в массив С. Размер исходных массивов А и В ввести с клавиатуры. Массивы А и В заполняются случайными числами в диапазоне от -100 до 100. Сформированный массив С вывести на экран.
Операторы
№ |
Оператор |
Число |
|
|
операторов |
1. |
using |
1 |
2. |
class |
1 |
3. |
public static |
4 |
4. |
return |
1 |
5. |
new |
5 |
6. |
Random |
2 |
7. |
.Length |
8 |
8. |
.Next |
1 |
9. |
Console.WriteLine() |
2 |
10. |
Console.Write() |
1 |
11. |
Console.ReadLine() |
3 |
12. |
Console.Clear() |
1 |
13. |
for () |
3 |
14. |
do { } while () |
1 |
15. |
if |
2 |
16. |
int[] |
5 |
17. |
string |
2 |
18. |
char |
1 |
19. |
Fill() |
2 |
20. |
.Parse |
3 |
21. |
Print() |
3 |
22. |
Copy() |
2 |
23. |
Array.Copy() |
2 |
24. |
= |
14 |
25. |
>= |
1 |
26. |
!= |
1 |
27. |
== |
2 |
28. |
< |
3 |
29. |
++ |
4 |
30. |
[ ] |
16 |
31. |
{ } |
35 |
32. |
( ) |
13 |
33. |
, |
25 |
34. |
; |
38 |
35. |
. |
32 |
36. |
int[…] |
4 |
37. |
Random() |
1 |
38. |
“ ” |
8 |
39. |
‘ ’ |
2 |
![](/html/46612/250/html_MvmgTMMVQ_.cSzl/htmlconvd-hh9H4e3x1.jpg)
Операнды |
|
|
|
|
|
1. |
j |
2 |
2. |
b |
7 |
3. |
i |
13 |
4. |
g |
5 |
5. |
a |
16 |
6. |
c |
5 |
7. |
str |
3 |
8. |
str1 |
1 |
9. |
p |
5 |
10. |
r |
3 |
Метрики Холстеда
n1 – число уникальных операторов программы, включая символыразделители, имена процедур и знаки операций (словарь операторов).
n2 – число уникальных операндов программы (словарь операндов). N1 – общее число операторов в программе.
N2 – общее число операндов в программе.
n1 = 39
n2 = 10
N1 = 60
N2 = 253
Словарь программы: n = n1 + n2 = 49
Длина программы: N = N1 + N2 = 313
Объём программы: V = N * log2 n = 313*log2 49 = 313 * 5,615 = 1757,495
Оценка реализации: L*= (2 * n2 )/ (n1 * N2) = 20/9867 = 0,002
Трудность понимания: Ec = V/ L* = 1757,495/0,002 = 8787,5
Трудоемкость кодирования: D = (n1 * N2) (2n2) = 1/ L* = 493,35
Уровень языка выражения: * = V/ D2 = 1757,495/493,35^2 = 1757,495/243394,2225 = 0,007
Информационное содержание I = V / D = 1757,495/493,35= 3,56
Оптимальная модульность: M = n2*/6 = 10/6 = 1,67
Метрики Джилба
Значение характеристики определяется количеством используемых операторов if:
= 2
Значение характеристики определяется количеством используемых в программе
циклов:
= 4
Значение характеристики определяется количеством используемых в программе
модулей в решении.
= 4
Общее количество операторов условия 6, из них 2 оператора if и четыре оператора цикла
(3 for, 1 do {} while ()).
Общее число всех используемых операторов: L = 1*11 + 2*8 + 3*5 + 4*3 + 5*2 + 8*2 + 32 + 38 + 25 + 13 + 35 + 16 + 14 = 253.
Абсолютная сложность программы: CL=6
Cl=CL/L=6/263=0.0228.
Количество связей между модулями: = 3 (по одной связи между основным и каждым из дополнительных модулей.)
Отношение числа связей между модулями к числу модулей: f = N4SV / L mod = 81/4 = 20.25
Заключение
Из полученных результатов анализа текста программы следует, что исходный код имеет невысокую сложность, так как на 253 оператора текста приходится 6 операторов условий. Общее число программных модулей решения также невелико (4 модуля), что подтверждает низкий уровень сложности программы.
Приложение 1. Листинг программы
1.using System;
2.class Programm
3.{
4.public static int[] Copy(int[] a)
5.{
6.int[] b = new int[a.Length];
7.int j = 0;
8.for (int i = 0; i < a.Length; i++)
9.{
10.if (a[i] >= 0) { b[j] = a[i]; j++;}
11.}
12.return b;
13.}
14.
15.public static void Fill (ref int[] a, Random g)
16.{
17.for (int i = 0; i < a.Length; i)
18.{
19.a[i] = g.Next(-100, 100);
20.}
21.}
22.
23.public static void Print(int[] a, string str, string str1)
24.{
25.Console.WriteLine(str);
26.for (int i = 0; i < a.Length; i++)
27.{
28.if (a[i] != 0) Console.Write(str, a[i]);
29.}
30.Console.WriteLine();
31.}
32.
33.static void Main(string[] args)
34.{
35.int[] a, b, c, p;
36.Random g = new Random();
37.char r;
38.do
39.{
40.Console.Clear();
41.Console.WriteLine("Определите размер первого массива");
42.a = new int[int.Parse(Console.ReadLine())];
43.Console.WriteLine("Определите размер второго массива");
44.b = new int[int.Parse(Console.ReadLine())];
45.c = new int[a.Length + b.Length];
46.Fill(ref a, g);
47.Fill(ref b, g);
48.Print(a, "{0,5}", "Первый массив");
49.Print(b, "{0,5}", "Второй массив");
50.p = Copy(a);
51.Array.Copy(p, 0, c, 0, a.Length);
52.p = Copy(b);
53.Array.Copy(p, 0, c, a.Length, b.Length);
54.Print(c, "{0,5}", "Результирующий массив");
55.Console.WriteLine();
56.Console.WriteLine("Выполнить повторение программы? Y/N");
57.r = char.Parse(Console.ReadLine());
58.} while (r == 'Y' || r == 'y');
59.}
60.}