Скачиваний:
50
Добавлен:
01.05.2014
Размер:
306.18 Кб
Скачать

Санкт-Петербургский государственный электротехнический университет

Кафедра МОЭВМ

Отчет по лабораторной работе №1.

Расчет метрическимх характеристик

качества разработки программ

по метрикам Холстеда

Выполнил:

Студент гр.3351

Сергеев М. В.

Санкт-Петербург

2007г.

Постановка задачи

Для заданного варианта процедуры, реализованной на языке Pascal, разработать аналогичный алгоритм и реализовать его на языках программирования С иAssembler(в ассемблерном представлении програмы нужно удалить директивы описаний и отладочные директивы, оставив только исполняемые операторы).

Для каждой из программ определить следующие метрические характеристики(по Холстеду):

1. Измеримые характеристики программ:

  • число простых (отдельных) операторов, в данной реализации;

  • число простых (отдельных) операндов, в данной реализациии;

  • общее число всех операторов в данной реализации;

  • общее число всех операндов в данной реализации;

  • число вхождения j-го оператора в тексте программы;

  • число вхождения j-го операнда в тексте программы;

  • словарь программы;

  • длина программы.

2. Расчетные характеристики программы:

  • длина программы;

  • реальный, потенциальный и граничный объем программы;

  • уровень программы;

  • интеллектуальное содержание программы;

  • уровень используемого языка прораммирования.

  1. Исходные тексты программ

    1. 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.

    1. 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;

}

    1. 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

Соседние файлы в папке Лабораторная работа №1
  • #
    01.05.2014306.18 Кб50lab1.doc
  • #
    01.05.201419.46 Кб55Метрики.xls