Санкт-Петербургский государственный электротехнический университет «ЛЭТИ»
Кафедра МОЭВМ
Лабораторная работа № 1
по дисциплине
«Метрология Программного обеспечения»
Преподаватель: Кирьянчиков В.А.
Выполнилa: Нго Макеме
Факультет: КТИ
Группа: 0305
Санкт-Петербург
2004
Для заданного варианта программы обработки данных, представленной на языке Паскаль, разработать вычислительный алгоритм и варианты программ его реализации на языках программи-рования Си и Ассемблер. Добиться, чтобы программы на Паскале и Си были работоспособны и давали корректные результаты (это потребуется в дальнейшем при проведении с ними измерительных экспериментов). Для получения ассемблерного представления программы можно либо самостоятельно написать код на ассемблере, реализующий заданный алгоритм, либо установить опцию "Code generation/Generate assembler source" при компиляции текста программы, представленной на языке Си. При этом в ассемблерном представлении программы нужно удалить директивы описаний и отладочные директивы, оставив только исполняемые операторы.
Примечание!
******************************************************************
В заданных на Паскале вариантах программ обработки данных важен только вычислительный алгоритм, реализуемый программой. Поэтому для получения более корректных оценок характеристик программ следует учитывать только вычислительные операторы и по возможности исключить операторы, обеспечивающие интерфейс с пользователем и выдачу текстовых сообщений.
В сути алгоритма, реализуемого программой, нужно разобраться достаточно хорошо для возможности внесения в программу модификаций, выполняемых в дальнейшем с целью проведения измерений и улучшения характеристик качества программы.
Для измеряемых версий программ в дальнейшем нужно будет исключить операции ввода данных с клавиатуры и вывода на печать, потребляющие основную долю ресурса времени при выполнении программы. Поэтому можно уже в этой работе предусмотреть соответствующие преобразования исходной программы.
****************************************************************** Для каждой из разработанных программ (включая исходную прог-рамму на Паскале) определить следующие метрические характеристики (по Холстеду):
1. Измеримые характеристики программ:
- число простых(отдельных)операторов, в данной реализации;
- число простых (отдельных) операндов, в данной реализации;
- общее число всех операторов в данной реализации;
- общее число всех операндов в данной реализации;
- число вхождений j-го оператора в тексте программы;
- число вхождений j-го операнда в тексте программы;
- словарь программы;
- длину программы.
2. Расчетные характеристики программы:
- длину программы;
- реальный, потенциальный и граничный объемы программы;
- уровень программы;
- интеллектуальное содержание программы;
- работа программиста;
- время программирования;
- уровень используемого языка программирования;
ожидаемое число ошибок в программе.
Для каждой характеристики следует рассчитать как саму харак-теристику, так и ее оценку.
Расчет оценок программ выполнить двумя способами:
1) вручную или с помощью одного из доступных пакетов математических вычислений DERIVE, MATHCAD или MATLAB.
2) с помощью программы автоматизации расчета метрик Холстеда, краткая инструкция по работе с которой приведена в файле usage.rtf (для С- и Паскаль-версий программ).
Для варианта расчета с использованием программы автоматизации желательно провести анализ влияния учета тех или иных групп операторов исследуемой программы на вычисляемые характеристики за счет задания разных ключей запуска.
Результаты расчетов представить в виде таблиц с текстовыми комментариями.
Паскаль
program matr1;
{ pascal program to perform matrix multiplication }
const rmax = 5;
cmax = 5;
type ary = array[1..rmax] of real;
arys = array[1..cmax] of real;
ary2 = array[1..rmax,1..cmax] of real;
ary2s = array[1..cmax,1..cmax] of real;
var y : ary;
g : arys;
x : ary2;
a : ary2s;
nrow,ncol : integer;
procedure get_data(var x: ary2;
var y: ary;
var nrow,ncol: integer);
{ get the values for nrow, ncol, and arrays x,y }
var i,j : integer;
begin
nrow:=2;
ncol:=2;
for i:=1 to nrow do
begin
x[i,1]:=1;
for j:=2 to ncol do
x[i,j]:=i*x[i,j-1];
y[i]:=2*i
end
end; { procedure get_data }
procedure write_data;
{ print out the answers }
var
i,j : integer;
begin
{ClrScr;}
writeln;
writeln(' X Y');
for i:=1 to nrow do
{ LA SUITE DU PROGRAMME}
begin
for j:=1 to ncol do
write(x[i,j]:7:1,' ');
writeln(':',y[i]:7:1)
end;
writeln(' A G');
for i:=1 to ncol do
begin
for j:=1 to ncol do
write(a[i,j]:7:1,' ');
writeln(':',g[i]:7:1)
end
end; { write_data }
procedure square(x: ary2;
y: ary;
var a: ary2s;
var g: arys;
nrow, ncol: integer);
{matrix multiplication routine }
{ a= transpose x times x }
{ g= y times x }
var
i,k,l : integer;
begin { square }
for k:=1 to ncol do
begin
for l:=1 to k do
begin
a[k,l]:=0;
for i:=1 to nrow do
begin
a[k,l]:=a[k,l]+x[i,l]*x[i,k];
if k<>l then a[l,k]:=a[k,l]
end
end; { l-loop }
g[k]:=0;
for i:=1 to nrow do
g[k]:=g[k]+y[i]*x[i,k]
end { k-loop }
end; { square }
begin { MAIN program }
get_data(x, y,nrow , ncol);
square(x ,y ,a ,g ,nrow ,ncol);
write_data
end.
Метрические характеристики
Операторы
№ |
Оператор |
f1j |
1 |
; |
44 |
2 |
: |
46 |
3 |
, |
34 |
4 |
Real |
4 |
5 |
() |
10 |
6 |
Const |
1 |
7 |
= |
26 |
8 |
Integer |
6 |
9 |
If then |
1 |
10 |
:= |
20 |
11 |
* |
4 |
12 |
- |
1 |
13 |
+ |
2 |
14 |
<> |
1 |
15 |
. |
13 |
16 |
for to do |
10 |
17 |
Writeln |
5 |
18 |
[] |
24 |
Операнды
№ |
Операнд |
f1i |
1 |
rmax |
3 |
2 |
cmax |
5 |
3 |
ary |
4 |
4 |
arys |
3 |
5 |
ary2 |
4 |
6 |
ary2s |
3 |
7 |
array |
4 |
8 |
ncol |
11 |
9 |
nrow |
10 |
10 |
y |
9 |
11 |
g |
7 |
12 |
a |
10 |
13 |
x |
11 |
14 |
i |
22 |
15 |
j |
9 |
16 |
k |
14 |
17 |
0 |
1 |
18 |
l |
9 |
19 |
5 |
2 |
20 |
2 |
4 |
Число простых операторов ŋ1= 18
Общее число всех операторов N1= 252
Число простых операндов ŋ 2= 20
Общее число всех операторов N2=155
Словарь ŋ=ŋ1+ŋ2=18+20=38
Опытная (экспериментальная) длина Nэ=N1+N2=252+155=407
Теоретическая длина программы NТ =ŋ1log2 ŋ1+ŋ2 log2 ŋ2= 18log218+20log220=
= 18*4.17+20*5.52= 75.05 +86.43 = 161.48
| Nэ - NТ|/ Nэ *100% =60%
Объем V=Nэlog2ŋ =407log238=407*5.24=2135.90
Потенциальный объем V*=Nlog2ŋ =(ŋ 1* +ŋ 2*)log2 (ŋ 1* + ŋ 2*)=(6 + 7)log2(6 +7)=13*log213=13*3.7=48.1
Граничный объем Vгр=(ŋ 1*log2ŋ 1*+ŋ 2*log2ŋ 2* )log2(ŋ 2* + ŋ 1*)= (6*log26 +7*log27)log2(6 + 7) = ( 15.50 + 19.65 ) * 3.7 = 130.05
Уровень программы L=V*/V=48.1/2135.90 = 0,02251
Сложность программы S=1/L=1/0,0043=44.40
Оценка уровня программы L^=2/ ŋ1 * ŋ2/N2=2/18*20/155=0.0143
Информационное (интеллектуальное) содержание программы
I=2ŋ2 /ŋ1N2 *(N1 +N2) log2 (ŋ 1+ ŋ2) = 2 * 20 / (18 * 155 ) * ( 252 + +155)log238= 2*20/2790*407*5.24= 2*0.0071*2135.90= 30.62
Работа по программированию E=Nlog2 ŋ/L=V2/V*=2135.90*2135.90/48.1=94845.50
Время программирования Tпр =E/S= 94845.50/44.40=2136.15
Уровень языка программирования λ=V**L=48.1*0,02251=1.0827
Ожидаемое число ошибок B=E/E0*k=