Санкт-Петербургский государственный электротехнический университет
Кафедра МОЭВМ
Отчет по лабораторной работе №1.
Расчет метрическимх характеристик
качества разработки программ
по метрикам Холстеда
Выполнил:
Студент гр.3351
Сергеев М. В.
Санкт-Петербург
2007г.
Постановка задачи
Для заданного варианта процедуры, реализованной на языке Pascal, разработать аналогичный алгоритм и реализовать его на языках программирования С иAssembler(в ассемблерном представлении програмы нужно удалить директивы описаний и отладочные директивы, оставив только исполняемые операторы).
Для каждой из программ определить следующие метрические характеристики(по Холстеду):
1. Измеримые характеристики программ:
число простых (отдельных) операторов, в данной реализации;
число простых (отдельных) операндов, в данной реализациии;
общее число всех операторов в данной реализации;
общее число всех операндов в данной реализации;
число вхождения j-го оператора в тексте программы;
число вхождения j-го операнда в тексте программы;
словарь программы;
длина программы.
2. Расчетные характеристики программы:
длина программы;
реальный, потенциальный и граничный объем программы;
уровень программы;
интеллектуальное содержание программы;
уровень используемого языка прораммирования.
Исходные тексты программ
Pascal
program prog_pas;
type Tarr = array [1..8] of real;
procedure QuickSort(var x: Tarr; n: integer);
Var left,right : array[1..20] of integer;
i,j,sp,mid : integer;
pivot : real;
procedure swap(var p,q: real);
var hold : real;
begin
hold:=p;
p:=q;
q:=hold
end; { swap }
begin
left[1]:=1;
right[1]:=n;
sp:=1;
while sp>0 do
begin
if left[sp]>=right[sp] then sp:=sp-1
else
begin
i:=left[sp];
j:=right[sp];
pivot:=x[j];
mid:=(i+j)div 2;
if (j-i)>5 then
if ((x[mid]<pivot)and(x[mid]>x[i])) or ((x[mid]>pivot)and(x[mid]<x[i]))
then swap(x[mid],x[j])
else
if((x[i]<x[mid])and(x[i]>pivot)) or ((x[i]>x[mid])and(x[i]<pivot))
then swap(x[i],x[j]);
pivot:=x[j];
while i<j do
begin
while x[i]<pivot do i:=i+1;
j:=j-1;
while (i<j)and(pivot<x[j]) do j:=j-1;
if i<j then swap(x[i],x[j])
end; { while }
j:=right[sp]; { pivot to i }
swap(x[i],x[j]);
if i-left[sp]>=right[sp]-i then
begin { put shorter part first }
left[sp+1]:=left[sp];
right[sp+1]:=i-1;
left[sp]:=i+1
end
else
begin
left[sp+1]:=i+1;
right[sp+1]:=right[sp];
right[sp]:=i-1
end;
sp:=sp+1 { push stack }
end { if }
end { while }
end; { QUICK SORT }
var mass: Tarr; j: integer;
begin
for j:=8 downto 1 do mass[j]:= j;
QuickSort(mass, 8);
end.
C
void swap (float &p, float &q)
{
float hold;
hold = p;
p = q;
q = hold;
}
void quicksort(float x[], int n)
{
int left[20], right[20];
int i,j,sp,mid;
float pivot;
left[1] = 1;
right[1] = n;
sp = 1;
while (sp>0)
{
if (left[sp] >= right[sp])
{ sp = sp-1; }
else
{
i = left[sp];
j = right[sp];
pivot = x[j];
mid = (i+j) % 2;
if ((j-i)>5)
if (((x[mid]<pivot) && (x[mid]>x[i])) || ((x[mid]>pivot) && (x[mid]<x[i])))
swap(x[mid],x[j]);
else
if (((x[i]<x[mid]) && (x[i]>pivot)) || ((x[i]>x[mid]) && (x[i]<pivot)))
swap(x[i],x[j]);
pivot = x[j];
while (i<j)
{
while (x[i]<pivot)
{ i = i+1; }
j = j-1;
while ((i<j) && (pivot<x[j]))
{ j = j-1; }
if (i<j)
{ swap(x[i],x[j]); }
} // while
j = right[sp]; // pivot to i
swap(x[i],x[j]);
if (i-left[sp]>=right[sp]-i)
{ // put shorter part first
left[sp+1] = left[sp];
right[sp+1] = i-1;
left[sp] = i+1;
}
else
{
left[sp+1] = i+1;
right[sp+1] = right[sp];
right[sp] = i-1;
}
sp = sp+1; // push stack
} // if
} // while
}
int main()
{
float array[] = {0, 1, 3, 2, 12, 5, 9, 7, 14};
quicksort(array, 8);
return 0;
}
Assembler
;
; void swap (float &p, float &q)
;
assume cs:_TEXT
push bp
mov bp,sp
sub sp,4
push si
push di
mov si,word ptr [bp+4]
mov di,word ptr [bp+6]
;
; {
; float hold;
; hold = p;
;
fld dword ptr [si]
fstp dword ptr [bp-4]
;
; p = q;
;
fld dword ptr [di]
fstp dword ptr [si]
;
; q = hold;
;
fwait
mov ax,word ptr [bp-2]
mov dx,word ptr [bp-4]
mov word ptr [di+2],ax
mov word ptr [di],dx
;
;
; }
;
pop di
pop si
mov sp,bp
pop bp
ret
;
; void quicksort(float x[], int n)
;
assume cs:_TEXT
push bp
mov bp,sp
sub sp,92
push si
push di
mov si,word ptr [bp+4]
;
; {
; int left[20], right[20];
; int i,j,sp,mid;
; float pivot;
;
; left[1] = 1;
;
mov word ptr [bp-50],1
;
; right[1] = n;
;
mov ax,word ptr [bp+6]
mov word ptr [bp-90],ax
;
; sp = 1;
;
mov word ptr [bp-4],1
jmp @2@898
@2@58:
;
;
; while (sp>0)
; {
; if (left[sp] >= right[sp])
;
mov bx,word ptr [bp-4]
shl bx,1
lea ax,word ptr [bp-52]
add bx,ax
mov ax,word ptr [bx]
mov bx,word ptr [bp-4]
shl bx,1
lea dx,word ptr [bp-92]
add bx,dx
cmp ax,word ptr [bx]
jl short @2@114
;
; { sp = sp-1; }
;
mov ax,word ptr [bp-4]
dec ax
jmp @2@870
@2@114:
;
; else
; {
; i = left[sp];
;
mov bx,word ptr [bp-4]
shl bx,1
lea ax,word ptr [bp-52]
add bx,ax
mov di,word ptr [bx]
;
; j = right[sp];
;
mov bx,word ptr [bp-4]
shl bx,1
lea ax,word ptr [bp-92]
add bx,ax
mov ax,word ptr [bx]
mov word ptr [bp-2],ax
;
; pivot = x[j];
;
mov bx,word ptr [bp-2]
mov cl,2
shl bx,cl
fld dword ptr [bx+si]
fstp dword ptr [bp-10]
;
; mid = (i+j) % 2;
;
mov ax,di
fwait
add ax,word ptr [bp-2]
mov bx,2
cwd