Санкт-Петербургский государственный электротехнический университет «ЛЭТИ»
Кафедра МОЭВМ
Лабораторная работа № 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 |
If then |
1 |
2 |
:= |
20 |
3 |
for to do |
10 |
4 |
Writeln |
5 |
5 |
get_data(x, y, nrow , ncol); |
1 |
6 |
square(x ,y ,a ,g ,nrow ,ncol); |
1 |
7 |
write_data(); |
1 |
Операнды
№ |
Операнд |
f1i |
1 |
rmax |
3 |
2 |
cmax |
5 |
3 |
ncol |
12 |
4 |
nrow |
11 |
5 |
y |
8 |
6 |
g |
5 |
7 |
a |
3 |
8 |
x |
9 |
9 |
i |
21 |
10 |
j |
9 |
11 |
k |
14 |
12 |
0 |
1 |
13 |
l |
9 |
14 |
5 |
2 |
15 |
2 |
4 |
Число простых операторов ŋ1= 7
Общее число всех операторов N1= 39
Число простых операндов ŋ 2= 15
Общее число всех операторов N2=116
Словарь ŋ=ŋ1+ŋ2=7+15=22
Опытная (экспериментальная) длина Nэ=N1+N2=39+116=155
Теоретическая длина программы NТ = ŋ1log2 ŋ1+ŋ2 log2 ŋ2= 7log27+15log215=
= 7 * 2.8 + 15 * 3.9= 78.25
| Nэ - NТ|/ Nэ *100% =49.51%
Объем V=Nэlog2ŋ = 155log222=155*5.24=691.21
Потенциальный объем V*=Nlog2ŋ =(ŋ 1* +ŋ 2*)log2 (ŋ 1* + ŋ 2*)=(3 + 10) log2(3 +10)=13* log213=13*3.7=48.1
Граничный объем Vгр=(ŋ 1*log2ŋ 1*+ŋ 2*log2ŋ 2* ) log2(ŋ 2* + ŋ 1*)= (3*log23+10*log210) log2(3 + 10) = 140.5040
Уровень программы L=V*/V=48.1/1826.55 = 0.05764
Сложность программы S=1/L=1/0,0043=17.34
Оценка уровня программы L^=2/ ŋ1 * ŋ2/N2=2/7*15/116=0.03694
Информационное (интеллектуальное) содержание программы
I=2ŋ2 /ŋ1N2 *(N1 +N2) log2 (ŋ 1+ ŋ2) = 2 * 15 / (7 * 116 ) * ( 39+116)log222
= 119.91
Работа по программированию E=Nlog2 ŋ/L = V2 /V*=9932.87
Время программирования Tпр =E/S =9932.87/17.34=572.82
Уровень языка программирования λ= V**L=48.1* 0.05764=2.77
Ожидаемое число ошибок B=E/E0*k=