
volkov / лабораторная1
.docУльяновский государственный университет
Факультет Математики и информационных технологий
Кафедра Информационных технологий
Лабораторная работа №1
по предмету:
«Методы разработки программного обеспечения»
Тема: «Метрическая оценка ПО»
Выполнил: студент гр. ПРИ – 31,
Иванов И.И.
Проверил: Волков М.А.
Ульяновск – 2013
Постановка задачи
Написать программу на языке Паскаль выполняющую следующие функции:
-
Ввод данных о студентах группы
-
Запись в файл на диске
-
Поиск записи
-
Вывод на экран найденных записей
Программу необходимо написать в трех вариантах:
-
Линейный (весь текст в одном модуле)
-
С использованием модулей для каждой функции
-
С использованием переменных ссылочного типа
Вариант 1: Линейный
program Laba1_1;
{$APPTYPE CONSOLE}
uses
SysUtils;
type
TStudent = record
FirstName, SecondName, Group: string[20];
end;
var
SecondName: string[20];
Student: TStudent;
Students: file of TStudent;
begin
AssignFile(Students, 'Students.dat');
Reset(Students);
repeat
Write('Enter name (Empty for quit):');
Readln(Student.FirstName);
if Student.FirstName <> '' then
begin
Write('Enter secondname:');
Readln(Student.SecondName);
Write('Enter group:');
Readln(Student.Group);
Write(Students, Student)
end;
until Student.FirstName = '';
CloseFile(Students);
Write('Enter secondname for search:');
Read(SecondName);
AssignFile(Students, 'Students.dat');
Reset(Students);
while not Eof and (Student.SecondName <> SecondName) do
Read(Students, Student);
CloseFile(Students);
if Eof then
Writeln('Not found')
else
begin
Writeln('name:', Student.FirstName);
Writeln('secondname:', Student.SecondName);
Writeln('group:', Student.Group);
end;
end.
Вариант 2: Модули для каждой функции
program Laba1_2;
{$APPTYPE CONSOLE}
uses
SysUtils,
Unit2_1 in 'Unit2_1.pas',
Unit2_2 in 'Unit2_2.pas';
begin
EnterData;
SearchData;
end.
unit Unit2_1;
interface
procedure EnterData;
implementation
type
TStudent = record
FirstName, SecondName, Group: string[20];
end;
var
Student: TStudent;
Students: file of TStudent;
procedure EnterData;
begin
AssignFile(Students, 'Students.dat');
Reset(Students);
repeat
Write('Enter name (Empty for quit):');
Readln(Student.FirstName);
if Student.FirstName <> '' then
begin
Write('Enter secondname:');
Readln(Student.SecondName);
Write('Enter group:');
Readln(Student.Group);
Write(Students, Student)
end;
until Student.FirstName = '';
CloseFile(Students);
end;
end.
unit Unit2_2;
interface
procedure SearchData;
implementation
type
TStudent = record
FirstName, SecondName, Group: string[20];
end;
var
SecondName: string[20];
Student: TStudent;
Students: file of TStudent;
procedure SearchData;
begin
Write('Enter secondname for search:');
Read(SecondName);
AssignFile(Students, 'Students.dat');
Reset(Students);
while not Eof and (Student.SecondName <> SecondName) do
Read(Students, Student);
CloseFile(Students);
if Eof then
Writeln('Not found')
else
begin
Writeln('name:', Student.FirstName);
Writeln('secondname:', Student.SecondName);
Writeln('group:', Student.Group);
end;
end;
end.
Вариант 3: Переменные ссылочного типа
program Laba1_3;
{$APPTYPE CONSOLE}
uses
SysUtils;
type
PStudent = ^TStudent;
TStudent = record
FirstName, SecondName, Group: string[20];
end;
var
SecondName: string[20];
Student: PStudent;
Students: file of TStudent;
begin
New(Student);
AssignFile(Students, 'Students.dat');
Reset(Students);
repeat
Write('Enter name (Empty for quit):');
Readln(Student.FirstName);
if Student.FirstName <> '' then
begin
Write('Enter secondname:');
Readln(Student.SecondName);
Write('Enter group:');
Readln(Student.Group);
Write(Students, Student^)
end;
until Student.FirstName = '';
CloseFile(Students);
Write('Enter secondname for search:');
Read(SecondName);
AssignFile(Students, 'Students.dat');
Reset(Students);
while not Eof and (Student.SecondName <> SecondName) do
Read(Students, Student^);
CloseFile(Students);
if Eof then
Writeln('Not found')
else
begin
Writeln('name:', Student.FirstName);
Writeln('secondname:', Student.SecondName);
Writeln('group:', Student.Group);
end;
Dispose(Student);
end.
Расчет программ с помощью различных моделей
-
Метрики сложности.
-
Метрики Холстеда
n1 число различных операций
n2 число различных операндов
N1 общее число всех операций
N2 общее число всех операндов
N = n1 log2 n1 + n2 log2 n2 длина программы
V =N log2 n объем программы
L* = 2 n2 / (n1 N2) оценка реализации
Ec = V / L* трудность понимания
D = (n1 N2) / 2 n2 = 1 / L* трудоемкость кодирования
*=
V
/ D2 уровень
языка выражения
I = V / D информационное содержания
M = n2* / 6 оптимальная модульность
Параметр |
Программа №1 |
Программа №2 |
Программа №3
|
n1 |
11 |
13 |
13 |
n2 |
13 |
15 |
13 |
N2 |
43 |
71 |
46 |
N1 |
33 |
40 |
35 |
N |
86.16 |
106.71 |
96.21 |
V |
395.04 |
512.99 |
452.23 |
L* |
0.0716 |
0.0576 |
0.0571 |
Ec |
5517.32 |
8906.08 |
7919.96 |
D |
13.97 |
17.36 |
17.51 |
|
2.02 |
1.70 |
1.47 |
I |
28.28 |
29.55 |
25.83 |
M |
2.17 |
2.5 |
2.17 |
-
Метрики Джилба
Lloop количество операторов цикла
LIF количество операторов условия
Lmod количество модулей
f = N 4SV / Lmod отношение числа связи м/у модулями к
числу модулей
f * = N *SV / Lmod отношение числа ненормальных выходов к
общему числу операторов
Параметр |
Программа №1 |
Программа №2 |
Программа №3
|
Lloop |
2 |
2 |
2 |
LIF |
2 |
2 |
2 |
Lmod |
1 |
3 |
1 |
f |
0 |
2/3 |
0 |
f * |
0 |
0 |
0 |
-
Метрики Мак-Кейба
(G)
= m
– n
+ p цикломатическое
число
(G)
=
(G)
+ 1 = m
– n
+ 2 цикломатическая сложность
Параметр |
Программа №1 |
Программа №2 |
Программа №3
|
|
|
|
|
|
24 |
29 |
24 |
-
Метрика Майерса
[1
÷
2] интервальная
мера
Параметр |
Программа №1 |
Программа №2 |
Программа №3
|
[ |
2433 |
2940 |
2435 |
-
Прогноз модели.
-
Модели Холстеда
P = 3/8 (Ra - 1) 2 Ra прогноз системных ресурсов
B = N log2 n / 3000 прогноз числа ошибок
Параметр |
Программа №1 |
Программа №2 |
Программа №3
|
P |
|
|
|
B |
0.132 |
0.171 |
0.151 |
-
Модель фирмы IBM
B = 23 МИМ i + 2 ИМ I прогноз числа ошибок
Параметр |
Программа №1 |
Программа №2 |
Программа №3
|
МИМ i |
0 |
0 |
0 |
ИМ i |
3 |
5 |
4 |
B |
6 |
10 |
8 |
-
Оценочные модели.
-
Джелински – Моранды
R(t) = exp [ - k (B – (i – 1 )) (ti – ti-1)] интенсивность обнаружения ошибок
Параметр |
Программа №1 |
Программа №2 |
Программа №3
|
R(t) |
|
|
|
B |
|
|
|
K |
|
|
|
-
Нельсона
Rj (t) = exp [ ln (1 - Pj)]
Параметр |
Программа №1 |
Программа №2 |
Программа №3
|
Pj |
|
|
|
Rj (t) |
|
|
|
Выводы
Из трех программ программа, написанная линейно, по метрикам – наилучшая. Модульная программа, которая теоретически должна была лучше по показателям, оказалась худшей. Это можно объяснить тем, что функции модулей используются однократно. В реальных программах, при применении процедурного подхода, модульность программы значительно улучшит ее показатели за счет процедур и функций вызываемых многократно из разных мест программы.
Тоже относится и к программе написанной с использованием переменных ссылочного типа. Здесь улучшение произойдет из-за уменьшения количества операндов, используемых в программе.
Литература
-
Лекции по Метрологии программного обеспечения
-
Информация из сети Интернет:
http://www.aanet.ru/~web_k46/textbooks/std_pro/face.htm
http://www.iis.nsk.su/preprints/AUTOREF/chern/AUTOREF/AUTOREF.html