министерство образования РФ
Санкт-Петербургский государственный электротехнический университет «ЛЭТИ»
Кафедра МОЭВМ
Лабораторная работа № 1
по дисциплине
«Метрология Программного обеспечения»
Преподаватель: Кирьянчиков В.А.
Выполнилa: Нго Макеме
Факультет: КТИ
Группа: 0305
Санкт-Петербург
2004
Постановка задачи:
Для заданного варианта программы обработки данных, представленной на языке Паскаль, разработать вычислительный алгоритм и варианты программ его реализации на языках программирования Си и Ассемблер.
Для каждой из разработанных программ (включая исходную программу на Паскале) определить следующие метрические характеристики (по Холстеду):
1. Измеримые характеристики программ:
- число простых(отдельных)операторов, в данной реализации;
- число простых (отдельных) операндов, в данной реализации;
- общее число всех операторов в данной реализации;
- общее число всех операндов в данной реализации;
- число вхождений j-го оператора в тексте программы;
- число вхождений j-го операнда в тексте программы;
- словарь программы;
- длину программы.
2. Расчетные характеристики программы:
- длину программы;
- реальный, потенциальный и граничный объемы программы;
- уровень программы;
- интеллектуальное содержание программы;
- работа программиста;
- время программирования;
- уровень используемого языка программирования;
-
ожидаемое число ошибок в программе.
Паскаль
-
Текст программы
program besy;
var x,ordr : real;
done : boolean;
function bessy(x,n: real): real;
const small = 1.0E-8;
euler = 0.57721566;
pi = 3.1415926;
pi2 = 0.63661977;
var j : integer;
x2,sum,sum2,t,t2,
ts,term,xx,y0,y1,
ya,yb,yc,ans,a,b,
sina,cosa : real;
begin
if x<12 then
begin
xx:=0.5*x;
x2:=xx*xx;
t:=ln(xx)+euler;
sum:=0.0;
term:=t;
y0:=t;
j:=0;
repeat
j:=j+1;
if j<>1 then sum:=sum+1/(j-1);
ts:=t-sum;
term:=-x2*term/(j*j)*(1-1/(j*ts));
y0:=y0+term
until abs(term)<small;
term:=xx*(t-0.5);
sum:=0.0;
y1:=term;
j:=1;
repeat
j:=j+1;
sum:=sum+1/(j-1);
ts:=t-sum;
term:=(-x2*term)/(j*(j-1))*((ts-0.5/j)/(ts+0.5/(j-1)));
y1:=y1+term
until abs(term)<small;
y0:=pi2*y0;
y1:=pi2*(y1-1/x);
if n=0.0 then ans:=y0
else if n=1.0 then ans:=y1
else
begin
ts:=2.0/x;
ya:=y0;
yb:=y1;
for j:=2 to trunc(n+0.01) do
begin
yc:=ts*(j-1)*yb-ya;
ya:=yb;
yb:=yc
end;
ans:=yc
end;
bessy:=ans;
end
else bessy:=sqrt(2/(pi*x))*sin(x-pi/4-n*pi/2)
end;
begin
done:=false;
writeln;
ordr:=1;
repeat
{ write('Order? ');
readln(ordr);}
if ordr<0.0 then done:=true
else
begin
repeat
{ write('Arg? ');
readln(x)}
x:=5;
until x>=0.0;
writeln(
bessy(x,ordr));
ordr:=-1;
end
until done
end.
Метрические характеристики
Операторы
№ |
Оператор |
f1j |
1 |
Program |
1 |
2 |
; |
48 |
3 |
Var |
2 |
4 |
: |
6 |
5 |
, |
20 |
6 |
Real |
4 |
7 |
function bessy |
1 |
8 |
() begin end |
32 |
9 |
Const |
1 |
10 |
= |
6 |
11 |
Integer |
1 |
12 |
If then else |
5 |
13 |
< |
4 |
14 |
:= |
40 |
15 |
* |
17 |
16 |
Ln |
1 |
17 |
+ |
9 |
18 |
repeat until |
2 |
19 |
<> |
1 |
20 |
/ |
13 |
21 |
- |
16 |
22 |
Trunk |
1 |
23 |
Abs |
2 |
24 |
Sqrt |
1 |
25 |
Sin |
1 |
26 |
. |
1 |
27 |
Boolean |
1 |
28 |
for to do |
1 |
29 |
Writeln |
1 |
Операнды
№ |
Операнд |
f1i |
1 |
x |
11 |
2 |
ordr |
5 |
3 |
done |
4 |
4 |
besy |
1 |
5 |
bessy |
2 |
6 |
n |
5 |
7 |
small |
3 |
8 |
1.0e-8 |
1 |
9 |
euler |
2 |
10 |
0.57721566 |
1 |
11 |
pi |
4 |
12 |
3.1415926 |
1 |
13 |
pi2 |
3 |
14 |
0.63661977 |
1 |
15 |
j |
19 |
16 |
x2 |
4 |
17 |
sum |
9 |
18 |
sum2 |
1 |
19 |
t |
7 |
20 |
t2 |
1 |
21 |
ts |
8 |
22 |
term |
12 |
23 |
xx |
6 |
24 |
y0 |
8 |
25 |
y1 |
8 |
26 |
ya |
4 |
27 |
yb |
5 |
28 |
yc |
4 |
29 |
ans |
5 |
30 |
a |
1 |
31 |
b |
1 |
32 |
sina |
1 |
33 |
cosa |
1 |
34 |
12 |
1 |
35 |
0.5 |
4 |
36 |
0.0 |
5 |
37 |
0 |
1 |
38 |
1 |
15 |
39 |
2.0 |
1 |
40 |
1.0 |
1 |
41 |
2 |
3 |
42 |
0.01 |
1 |
43 |
4 |
1 |
44 |
true |
1 |
45 |
false |
1 |
46 |
-1 |
1 |
-
Число простых операторов
ŋ1=29
-
Общее число всех операторов
N1=239
-
Число простых операндов
ŋ 2=46
-
Общее число всех операторов
N2=185
-
Словарь
ŋ=ŋ1+ŋ2=29+46=75
-
Опытная (экспериментальная) длина
Nэ=N1+N2=239+185=424
-
Теоретическая длина программы
NТ = ŋ1log2ŋ1+ŋ2log2ŋ2=29log229+46log246=29*4.85+46*5.52= 140.65 +253.92 =394.57
| Nэ - NТ|/ Nэ *100% =7%
-
Объем
V=Nэlog2ŋ =424log275=424*6.22=2637.28
-
Потенциальный объем
V*=Nlog2ŋ =(ŋ 1* +ŋ 2*)log2 (ŋ 1* + ŋ 2*)=(2 + 3) log2(2 +3)=5* log25=5*2,32=11,6
-
Граничный объем
Vгр=(ŋ 1*log2ŋ 1*+ŋ 2*log2ŋ 2* ) log2(ŋ 2* + ŋ 1*)=(2*log22 +3*log23) log2(2 + 3) = ( 2 * 1 + 3 * 1,58 ) * 2,32 = ( 2 + 4,74 ) * 2,32 = =6,74*2,32=15,64
-
Уровень программы
L=V*/V=11,6/2637,28=0,0043
-
Сложность программы
S=1/L=1/0,0043=227,35
-
Оценка уровня программы
L^=2/ ŋ1 * ŋ2/N2=2/29*46/185=0.0171
-
Информационное (интеллектуальное) содержание программы
I=2ŋ2 /ŋ1N2 *(N1 +N2) log2 (ŋ 1+ ŋ2) = 2 * 46 / (29 * 185 ) * ( 239 + +185)log275=45.097
-
Работа по программированию
E=Nlog2 ŋ/L = V2 /V*=2637.282 /11,6=566560,155
-
Время программирования
Tпр=E/S = 599590,155/227,35=2637.3
-
Уровень языка программирования
λ= V**L=11,6*0.0043=0,04988
-
Ожидаемое число ошибок
B=E/E0*k=0.8799
Данные, полученные с помощью программы автоматизации расчета метрик Холстеда.
Учитывается операторы описания типов в качестве операторов программы и учитывается «;» в качестве оператора программы
Statistics for module lab1.lxm
=====================================
The number of different operators : 27
The number of different operands : 47
The total number of operators : 220
The total number of operands : 180
Dictionary ( D) : 74
Length ( N) : 400
Length estimation ( ^N) : 389.448
Volume ( V) : 2483.78
Potential volume ( *V) : 19.6515
Limit volume (**V) : 38.2071
Programming level ( L) : 0.00791192
Programming level estimation ( ^L) : 0.0193416
Intellect ( I) : 48.0402
Time of programming ( T) : 17440.5
Time estimation ( ^T) : 6946.06
Programming language level (lambda) : 0.155481
Work on programming ( E) : 313929
Error ( B) : 1.53969
Error estimation ( ^B) : 0.827927
Table:
====================================
Operators:
| 1 | 26 | ()
| 2 | 17 | *
| 3 | 9 | +
| 4 | 16 | -
| 5 | 13 | /
| 6 | 64 | ;
| 7 | 4 | <
| 8 | 1 | <>
| 9 | 43 | =
| 10 | 2 | abs
| 11 | 1 | bessy
| 12 | 1 | boolean
| 13 | 1 | const
| 14 | 1 | for
| 15 | 1 | function
| 16 | 4 | if
| 17 | 1 | integer
| 18 | 1 | ln
| 19 | 1 | program
| 20 | 1 | readln
| 21 | 4 | real
| 22 | 2 | repeat
| 23 | 1 | sin
| 24 | 1 | sqrt
| 25 | 1 | trunc
| 26 | 2 | write
| 27 | 1 | writeln
Operands:
| 1 | 1 | 'Arg? '
| 2 | 1 | 'Order? '
| 3 | 1 | 0
| 4 | 4 | 0.0
| 5 | 1 | 0.01
| 6 | 4 | 0.5
| 7 | 1 | 0.57721566
| 8 | 1 | 0.63661977
| 9 | 15 | 1
| 10 | 1 | 1.0
| 11 | 1 | 1.0E-8
| 12 | 1 | 12
| 13 | 3 | 2
| 14 | 1 | 2.0
| 15 | 1 | 3.1415926
| 16 | 1 | 4
| 17 | 1 | a
| 18 | 5 | ans
| 19 | 1 | b
| 20 | 2 | bessy
| 21 | 1 | besy
| 22 | 1 | cosa
| 23 | 3 | done
| 24 | 2 | euler
| 25 | 1 | false
| 26 | 18 | j
| 27 | 5 | n
| 28 | 4 | ordr
| 29 | 4 | pi
| 30 | 3 | pi2
| 31 | 1 | sina
| 32 | 3 | small
| 33 | 9 | sum
| 34 | 1 | sum2
| 35 | 7 | t
| 36 | 1 | t2
| 37 | 12 | term
| 38 | 1 | true
| 39 | 8 | ts
| 40 | 9 | x
| 41 | 4 | x2
| 42 | 6 | xx
| 43 | 8 | y0
| 44 | 8 | y1
| 45 | 4 | ya
| 46 | 5 | yb
| 47 | 4 | yc
Summary:
=====================================
The number of different operators : 27
The number of different operands : 47
The total number of operators : 220
The total number of operands : 180
Dictionary ( D) : 74
Length ( N) : 400
Length estimation ( ^N) : 389.448
Volume ( V) : 2483.78
Potential volume ( *V) : 19.6515
Limit volume (**V) : 38.2071
Programming level ( L) : 0.00791192
Programming level estimation ( ^L) : 0.0193416
Intellect ( I) : 48.0402
Time of programming ( T) : 17440.5
Time estimation ( ^T) : 6946.06
Programming language level (lambda) : 0.155481
Work on programming ( E) : 313929
Error ( B) : 1.53969
Error estimation ( ^B) : 0.827927
Си
-
Текст программы
#include <math.h>
#include <stdio.h>
float bessy (float x, float n)
{
const float small = 1.0E-8;
const float euler = 0.57721566;
const float pi = 3.1415926;
const float pi2 = 0.63661977;
int j;
float x2,sum,sum2,t,t2,
ts,term,xx,y0,y1,
ya,yb,yc,ans,a,b,
sina,cosa;
if (x<12) {
xx = 0.5 * x;
x2 = xx * xx;
t= log(xx) + euler;
sum = 0.0;
term = t;
y0 = t;
j = 0;
do{
j=j+1;
if (j != 1) {sum = sum + 1 / (j - 1);}
ts = t - sum;
term = -x2 * term / (j * j)*(1 - 1/(j * ts));
y0 = y0 + term;
}while ( fabs(term) >= small);
term = xx * (t - 0.5);
sum = 0.0;
y1 = term;
j = 1;
do{
j = j + 1;
sum = sum + 1.0 / (j - 1);
ts = t - sum;
term = (-x2 * term)/(j * (j - 1))*((ts - 0.5/j)/(ts + 0.5/(j - 1)));
y1 = y1 + term;
}while (fabs(term) >= small);
y0 = pi2 * y0;
y1 = pi2 * (y1 - 1/x);
if (n==0.0) {ans = y0;}
else {if (n==1.0) {ans = y1;}
else
{
ts = 2.0 / x;
ya = y0;
yb = y1;
for (j=2; j<ceil(n+0.01);j+1)
{
yc = ts * (j - 1) * yb - ya;
ya = yb;
yb = yc;
}
ans = yc;
}}
return ans;
}
else return sqrt(2 /(pi * x)) * sin(x - pi/4 - n * pi/2);
}
void main (void)
{
float x;
float ordr;
int done;
done = 0;
ordr = 1;
do{
if (ordr<0.0) {done = 1;}
else
{
do{
x = 5;
}while (x < 0.0);
printf("%f",bessy(x,ordr));
ordr = -1;
}
}while (done == 0);
}
Метрические характеристики
Операторы
№ |
Оператор |
f1j |
1 |
#include |
2 |
2 |
<math.h> |
1 |
3 |
<stdio.h> |
1 |
4 |
float |
10 |
5 |
const |
4 |
6 |
int |
2 |
7 |
bessy |
2 |
8 |
() {} |
51 |
9 |
; |
55 |
10 |
= |
42 |
11 |
, |
20 |
12 |
if else |
5 |
13 |
< |
4 |
14 |
== |
3 |
15 |
* |
17 |
16 |
log |
1 |
17 |
+ |
10 |
18 |
do while |
4 |
19 |
>= |
2 |
20 |
“%f” |
1 |
21 |
- |
16 |
22 |
ceil |
1 |
23 |
fabs |
2 |
24 |
sqrt |
1 |
25 |
sin |
1 |
26 |
/ |
13 |
27 |
!= |
1 |
28 |
for |
1 |
29 |
printf |
2 |
30 |
return |
2 |
31 |
void |
2 |
32 |
main |
1 |
Операнды
№ |
Операнд |
f1i |
1 |
x |
11 |
2 |
ordr |
5 |
3 |
n |
5 |
4 |
small |
3 |
5 |
1.0e-8 |
1 |
6 |
euler |
2 |
7 |
0.57721566 |
1 |
8 |
pi |
4 |
9 |
3.1415926 |
1 |
10 |
pi2 |
3 |
11 |
0.63661977 |
1 |
12 |
j |
21 |
13 |
x2 |
4 |
14 |
sum |
9 |
15 |
sum2 |
1 |
16 |
t |
7 |
17 |
t2 |
1 |
18 |
ts |
8 |
19 |
term |
12 |
20 |
xx |
6 |
21 |
y0 |
8 |
22 |
y1 |
8 |
23 |
ya |
4 |
24 |
yb |
5 |
25 |
yc |
4 |
26 |
ans |
5 |
27 |
a |
1 |
28 |
b |
1 |
29 |
sina |
1 |
30 |
cosa |
1 |
31 |
12 |
1 |
32 |
0.5 |
4 |
33 |
0.0 |
5 |
34 |
0 |
3 |
35 |
1 |
16 |
36 |
2.0 |
1 |
37 |
1.0 |
2 |
38 |
2 |
3 |
39 |
0.01 |
1 |
40 |
4 |
1 |
41 |
-1 |
1 |
42 |
done |
4 |
1. Число простых операторов
ŋ1=32
-
Общее число всех операторов
N2=280
-
Число простых операндов
ŋ 2=42
-
Общее число всех операторов
N2=186
-
Словарь
ŋ=ŋ1+ŋ2=32+42=74
-
Опытная (экспериментальная) длина
Nэ=N1+N2=260+186=446
-
Теоретическая длина программы
NТ = ŋ1log2ŋ1+ŋ2log2ŋ2=32log232+42log242=32*5+42*5.39= 160 +226.38 =386.38
| Nэ - NТ|/ Nэ *100% =13.4%
-
Объем
V=Nэlog2ŋ =446log274=446*6.2=2740.4
-
Потенциальный объем
V*=Nlog2ŋ =(ŋ 1* +ŋ 2*)log2 (ŋ 1* + ŋ 2*)NТ=(2 +3)log2(2 +3) =5 log25=5*2,32=11,6
-
Граничный объем
Vгр=(ŋ 1*log2ŋ 1*+ŋ 2*log2ŋ 2* ) log2(ŋ 2* + ŋ 1*)=(2 log22+3log23) log2(2 +3)=(2*1+3*1,58)*2,32=(2+4,74)*2,32=15,64
-
Уровень программы
L=V*/V=11,6/2740.4=0,00423
-
Сложность программы
S=1/L=1/0.00423=236,24
-
Оценка уровня программы
L=2/ ŋ1 * ŋ2/N2=2/32*42/186=0.0141
-
Информационное (интеллектуальное) содержание программы
I=2ŋ2 /ŋ1N2 *(N1 +N2) log2 (ŋ 1+ ŋ2) = 2 * 42 / (32 * 186 ) * ( 280 + +186)log274=38.63964
-
Работа по программированию
E=Nlog2 ŋ/L = V2 /V*=2740.42/11,6=647395,88
-
Время программирования
Tпр=E/S = 647395,88/236,24=2740.42
-
Уровень языка программирования
λ= V**L=11,6*0.00423=0,049068
-
Ожидаемое число ошибок
B=E/E0*k=0,9135
Данные, полученные с помощью программы автоматизации расчета метрик Холстеда.
Учитывается операторы описания типов в качестве операторов программы и учитывается «;» в качестве оператора программы
Statistics for module LAB1.lxm
=====================================
The number of different operators : 29
The number of different operands : 43
The total number of operators : 257
The total number of operands : 188
Dictionary ( D) : 72
Length ( N) : 445
Length estimation ( ^N) : 374.211
Volume ( V) : 2745.62
Potential volume ( *V) : 19.6515
Limit volume (**V) : 38.2071
Programming level ( L) : 0.0071574
Programming level estimation ( ^L) : 0.015774
Intellect ( I) : 43.3094
Time of programming ( T) : 21311.4
Time estimation ( ^T) : 8131.7
Programming language level (lambda) : 0.140654
Work on programming ( E) : 383605
Error ( B) : 1.75982
Error estimation ( ^B) : 0.915206
Table:
====================================
Operators:
| 1 | 1 | !=
| 2 | 31 | ()
| 3 | 17 | *
| 4 | 10 | +
| 5 | 20 | ,
| 6 | 14 | -
| 7 | 13 | /
| 8 | 57 | ;
| 9 | 4 | <
| 10 | 42 | =
| 11 | 3 | ==
| 12 | 2 | >=
| 13 | 3 | _-
| 14 | 2 | bessy
| 15 | 1 | ceil
| 16 | 4 | const
| 17 | 4 | dowhile
| 18 | 2 | fabs
| 19 | 10 | float
| 20 | 1 | for
| 21 | 5 | if
| 22 | 2 | int
| 23 | 1 | log
| 24 | 1 | main
| 25 | 1 | printf
| 26 | 2 | return
| 27 | 1 | sin
| 28 | 1 | sqrt
| 29 | 2 | void
Operands:
| 1 | 1 | "%f"
| 2 | 3 | 0
| 3 | 5 | 0.0
| 4 | 1 | 0.01
| 5 | 4 | 0.5
| 6 | 1 | 0.57721566
| 7 | 1 | 0.63661977
| 8 | 17 | 1
| 9 | 2 | 1.0
| 10 | 1 | 1.0E-8
| 11 | 1 | 12
| 12 | 3 | 2
| 13 | 1 | 2.0
| 14 | 1 | 3.1415926
| 15 | 1 | 4
| 16 | 1 | 5
| 17 | 1 | a
| 18 | 5 | ans
| 19 | 1 | b
| 20 | 1 | cosa
| 21 | 4 | done
| 22 | 2 | euler
| 23 | 21 | j
| 24 | 5 | n
| 25 | 5 | ordr
| 26 | 4 | pi
| 27 | 3 | pi2
| 28 | 1 | sina
| 29 | 3 | small
| 30 | 9 | sum
| 31 | 1 | sum2
| 32 | 7 | t
| 33 | 1 | t2
| 34 | 12 | term
| 35 | 8 | ts
| 36 | 11 | x
| 37 | 4 | x2
| 38 | 6 | xx
| 39 | 8 | y0
| 40 | 8 | y1
| 41 | 4 | ya
| 42 | 5 | yb
| 43 | 4 | yc
Summary:
=====================================
The number of different operators : 29
The number of different operands : 43
The total number of operators : 257
The total number of operands : 188
Dictionary ( D) : 72
Length ( N) : 445
Length estimation ( ^N) : 374.211
Volume ( V) : 2745.62
Potential volume ( *V) : 19.6515
Limit volume (**V) : 38.2071
Programming level ( L) : 0.0071574
Programming level estimation ( ^L) : 0.015774
Intellect ( I) : 43.3094
Time of programming ( T) : 21311.4
Time estimation ( ^T) : 8131.7
Programming language level (lambda) : 0.140654
Work on programming ( E) : 383605
Error ( B) : 1.75982
Error estimation ( ^B) : 0.915206
Ассемблер
-
Текст программы
.386p
ifndef ??version
?debug macro
endm
publicdll macro name
public name
endm
endif
?debug V 300h
?debug S "LAB1.CPP"
?debug C E9BA656930084C4142312E435050
?debug C E94019CA1814433A5C42435C494E434C5544455C4D4154482E48
?debug C E94019CA1815433A5C42435C494E434C5544455C5F444546532E48
?debug C E94019CA1815433A5C42435C494E434C5544455C535444494F2E48
?debug C E94019CA1816433A5C42435C494E434C5544455C5F4E46494C452E+
?debug C 48
?debug C E94019CA1815433A5C42435C494E434C5544455C5F4E554C4C2E48
LAB1_TEXT segment byte public use16 'CODE'
LAB1_TEXT ends
DGROUP group _DATA,_BSS
assume cs:LAB1_TEXT,ds:DGROUP
_DATA segment word public use16 'DATA'
d@ label byte
d@w label word
_DATA ends
_BSS segment word public use16 'BSS'
b@ label byte
b@w label word
_BSS ends
LAB1_TEXT segment byte public use16 'CODE'
?debug C E801084C4142312E435050BA656930
;
; float bessy (float x, float n)
;
?debug L 4
assume cs:LAB1_TEXT
@bessy$qff proc far
?debug B
enter 76,0
push si
?debug C E6016E0E0A0A000001780E0A060000
?debug B
;
; {
; const float small = 1.0E-8;
;
?debug L 6
mov dword ptr [bp-4],large 0322BCC77h
;
; const float euler = 0.57721566;
;
?debug L 7
mov dword ptr [bp-8],large 03F13C468h
;
; const float pi = 3.1415926;
;
?debug L 8
mov dword ptr [bp-12],large 040490FDAh
;
; const float pi2 = 0.63661977;
;
?debug L 9
mov dword ptr [bp-16],large 03F22F983h
;
;
; int j;
; float x2,sum,sum2,t,t2,
; ts,term,xx,y0,y1,
; ya,yb,yc,ans,a,b,
; sina,cosa;
;
; if (x<12) {
;
?debug L 17
fld dword ptr [bp+6]
fcomp dword ptr DGROUP:s@
fstsw word ptr [bp-66]
fwait
mov ax,word ptr [bp-66]
sahf
jb short @@15
jmp @1@646
@@15:
;
; xx = 0.5 * x;
;
?debug L 18
fld dword ptr [bp+6]
fmul dword ptr DGROUP:s@+4
fstp dword ptr [bp-40]
;
; x2 = xx * xx;
;
?debug L 19
fld dword ptr [bp-40]
fmul dword ptr [bp-40]
fstp dword ptr [bp-20]
;
; t= log(xx) + euler;
;
?debug L 20
fld dword ptr [bp-40]
sub sp,8
fstp qword ptr [bp-86]
fwait
call far ptr _log
add sp,8
fadd dword ptr [bp-8]
fstp dword ptr [bp-28]
;
; sum = 0.0;
;
?debug L 21
fwait
mov dword ptr [bp-24],large 0
;
; term = t;
;
?debug L 22
mov eax,dword ptr [bp-28]
mov dword ptr [bp-36],eax
;
; y0 = t;
;
?debug L 23
mov eax,dword ptr [bp-28]
mov dword ptr [bp-44],eax
;
; j = 0;
;
?debug L 24
xor si,si
@1@86:
;
; do{
; j=j+1;
;
?debug L 26
mov ax,si
inc ax
mov si,ax
;
; if (j != 1) {sum = sum + 1 / (j - 1);}
;
?debug L 27
cmp si,1
je short @1@142
mov bx,si
dec bx
mov ax,1
cwd
idiv bx
mov word ptr [bp-66],ax
fild word ptr [bp-66]
fadd dword ptr [bp-24]
fstp dword ptr [bp-24]
fwait
@1@142:
;
; ts = t - sum;
;
?debug L 28
fld dword ptr [bp-28]
fsub dword ptr [bp-24]
fstp dword ptr [bp-32]
;
; term = -x2 * term / (j * j)*(1 - 1/(j * ts));
;
?debug L 29
mov ax,si
imul si
fwait
mov word ptr [bp-66],ax
fild word ptr [bp-66]
fld dword ptr [bp-20]
fchs
fmul dword ptr [bp-36]
fdivr
mov word ptr [bp-66],si
fild word ptr [bp-66]
fmul dword ptr [bp-32]
fld1
fdivr
fld1
fsubr
fmul
fstp dword ptr [bp-36]
;
; y0 = y0 + term;
;
?debug L 30
fld dword ptr [bp-44]
fadd dword ptr [bp-36]
fstp dword ptr [bp-44]
fwait
;
; }while ( fabs(term) >= small);
;
?debug L 31
fld dword ptr [bp-36]
sub sp,8
fstp qword ptr [bp-86]
fwait
call far ptr _fabs
add sp,8
fcomp dword ptr [bp-4]
fstsw word ptr [bp-66]
fwait
mov ax,word ptr [bp-66]
sahf
jb short @@16
jmp @1@86
@@16:
;
; term = xx * (t - 0.5);
;
?debug L 32
fld dword ptr [bp-40]
fld dword ptr [bp-28]
fsub dword ptr DGROUP:s@+4
fmul
fstp dword ptr [bp-36]
;
; sum = 0.0;
;
?debug L 33
fwait
mov dword ptr [bp-24],large 0
;
; y1 = term;
;
?debug L 34
mov eax,dword ptr [bp-36]
mov dword ptr [bp-48],eax
;
; j = 1;
;
?debug L 35
mov si,1
@1@226:
;
; do{
; j = j + 1;
;
?debug L 37
mov ax,si
inc ax
mov si,ax
;
; sum = sum + 1.0 / (j - 1);
;
?debug L 38
fld dword ptr [bp-24]
mov ax,si
dec ax
mov word ptr [bp-66],ax
fild word ptr [bp-66]
fld1
fdivr
fadd
fstp dword ptr [bp-24]
;
; ts = t - sum;
;
?debug L 39
fld dword ptr [bp-28]
fsub dword ptr [bp-24]
fstp dword ptr [bp-32]
;
; term = (-x2 * term)/(j * (j - 1))*((ts - 0.5/j)/(ts + 0.5/(j - 1)));
;
?debug L 40
fld dword ptr [bp-32]
mov word ptr [bp-66],si
fild word ptr [bp-66]
fdivr dword ptr DGROUP:s@+4
fsub
fld dword ptr [bp-32]
mov ax,si
dec ax
mov word ptr [bp-66],ax
fild word ptr [bp-66]
fdivr dword ptr DGROUP:s@+4
fadd
fdiv
mov dx,si
dec dx
mov ax,si
imul dx
mov word ptr [bp-66],ax
fild word ptr [bp-66]
fld dword ptr [bp-20]
fchs
fmul dword ptr [bp-36]
fdivr
fmul
fstp dword ptr [bp-36]
;
; y1 = y1 + term;
;
?debug L 41
fld dword ptr [bp-48]
fadd dword ptr [bp-36]
fstp dword ptr [bp-48]
fwait
;
; }while (fabs(term) >= small);
;
?debug L 42
fld dword ptr [bp-36]
sub sp,8
fstp qword ptr [bp-86]
fwait
call far ptr _fabs
add sp,8
fcomp dword ptr [bp-4]
fstsw word ptr [bp-66]
fwait
mov ax,word ptr [bp-66]
sahf
jb short @@17
jmp @1@226
@@17:
;
; y0 = pi2 * y0;
;
?debug L 43
fld dword ptr [bp-16]
fmul dword ptr [bp-44]
fstp dword ptr [bp-44]
;
; y1 = pi2 * (y1 - 1/x);
;
?debug L 44
fld1
fdiv dword ptr [bp+6]
fsubr dword ptr [bp-48]
fmul dword ptr [bp-16]
fstp dword ptr [bp-48]
;
; if (n==0.0) {ans = y0;}
;
?debug L 45
fld dword ptr [bp+10]
fldz
fcompp
fstsw word ptr [bp-66]
fwait
mov ax,word ptr [bp-66]
sahf
jne short @1@338
mov eax,dword ptr [bp-44]
mov dword ptr [bp-64],eax
jmp @1@562
@1@338:
;
; else {if (n==1.0) {ans = y1;}
;
?debug L 46
fld dword ptr [bp+10]
fld1
fcompp
fstsw word ptr [bp-66]
fwait
mov ax,word ptr [bp-66]
sahf
jne short @1@394
mov eax,dword ptr [bp-48]
jmp @1@534
@1@394:
;
; else
; {
; ts = 2.0 / x;
;
?debug L 49
fld dword ptr [bp+6]
fdivr dword ptr DGROUP:s@+8
fstp dword ptr [bp-32]
;
; ya = y0;
;
?debug L 50
fwait
mov eax,dword ptr [bp-44]
mov dword ptr [bp-52],eax
;
; yb = y1;
;
?debug L 51
mov eax,dword ptr [bp-48]
mov dword ptr [bp-56],eax
;
; for (j=2; j<ceil(n+0.01);j+1)
;
?debug L 52
mov si,2
jmp short @1@478
@1@422:
;
; {
; yc = ts * (j - 1) * yb - ya;
;
?debug L 54
mov ax,si
dec ax
mov word ptr [bp-66],ax
fild word ptr [bp-66]
fmul dword ptr [bp-32]
fmul dword ptr [bp-56]
fsub dword ptr [bp-52]
fstp dword ptr [bp-60]
;
; ya = yb;
;
?debug L 55
fwait
mov eax,dword ptr [bp-56]
mov dword ptr [bp-52],eax
;
; yb = yc;
;
?debug L 56
mov eax,dword ptr [bp-60]
mov dword ptr [bp-56],eax
?debug L 52
mov ax,si
inc ax
@1@478:
mov word ptr [bp-66],si
fild word ptr [bp-66]
fstp tbyte ptr [bp-76]
fld dword ptr [bp+10]
fadd qword ptr DGROUP:s@+12
sub sp,8
fstp qword ptr [bp-86]
fwait
call far ptr _ceil
add sp,8
fld tbyte ptr [bp-76]
fcompp
fstsw word ptr [bp-66]
fwait
mov ax,word ptr [bp-66]
sahf
jb short @1@422
;
; }
; ans = yc;
;
?debug L 58
mov eax,dword ptr [bp-60]
@1@534:
mov dword ptr [bp-64],eax
@1@562:
;
; }}
; return ans;
;
?debug L 60
fld dword ptr [bp-64]
@1@590:
jmp short @1@674
;
; }
;
?debug L 61
jmp short @1@674
@1@646:
;
; else return sqrt(2 /(pi * x)) * sin(x - pi/4 - n * pi/2);
;
?debug L 62
fld dword ptr [bp-12]
fmul dword ptr [bp+6]
fdivr dword ptr DGROUP:s@+8
sub sp,8
fstp qword ptr [bp-86]
fwait
call far ptr _sqrt
add sp,8
fstp tbyte ptr [bp-76]
fld dword ptr [bp-12]
fdiv dword ptr DGROUP:s@+20
fsubr dword ptr [bp+6]
fld dword ptr [bp+10]
fmul dword ptr [bp-12]
fdiv dword ptr DGROUP:s@+8
fsub
sub sp,8
fstp qword ptr [bp-86]
fwait
call far ptr _sin
add sp,8
fld tbyte ptr [bp-76]
fmul
jmp short @1@590
@1@674:
;
; }
;
?debug L 63
pop si
leave
ret
?debug C E603616E730E02C0FF000279630E02C4FF000279+
?debug C 620E02C8FF000279610E02CCFF000279310E02D0+
?debug C FF000279300E02D4FF000278780E02D8FF000474+
?debug C 65726D0E02DCFF000274730E02E0FF0001740E02+
?debug C E4FF000373756D0E02E8FF000278320E02ECFF00+
?debug C 016A04040600037069320E02F0FF000270690E02+
?debug C F4FF000565756C65720E02F8FF0005736D616C6C+
?debug C 0E02FCFF0001780E0A060000016E0E0A0A0000
?debug E
?debug E
@bessy$qff endp
;
; void main (void)
;
?debug L 65
assume cs:LAB1_TEXT
_main proc far
?debug B
enter 10,0
push si
?debug B
;
; {
; float x;
; float ordr;
; int done;
;
; done = 0;
;
?debug L 71
xor si,si
;
; ordr = 1;
;
?debug L 72
mov dword ptr [bp-8],large 03F800000h
@2@58:
;
; do{
; if (ordr<0.0) {done = 1;}
;
?debug L 74
fld dword ptr [bp-8]
fldz
fcompp
fstsw word ptr [bp-10]
fwait
mov ax,word ptr [bp-10]
sahf
jbe short @2@114
mov si,1
jmp short @2@198
@2@114:
;
; else
; {
; do{
; x = 5;
;
?debug L 78
mov dword ptr [bp-4],large 040A00000h
;
; }while (x < 0.0);
;
?debug L 79
fld dword ptr [bp-4]
fldz
fcompp
fstsw word ptr [bp-10]
fwait
mov ax,word ptr [bp-10]
sahf
ja short @2@114
;
; printf("%f",bessy(x,ordr));
;
?debug L 80
fld dword ptr [bp-8]
sub sp,4
fstp dword ptr [bp-16]
fld dword ptr [bp-4]
sub sp,4
fstp dword ptr [bp-20]
fwait
push cs
call near ptr @bessy$qff
add sp,8
sub sp,8
fstp qword ptr [bp-20]
push offset DGROUP:s@+24
fwait
call far ptr _printf
add sp,10
;
; ordr = -1;
;
?debug L 81
mov dword ptr [bp-8],large 0BF800000h
@2@198:
;
; }
; }while (done == 0);
;
?debug L 83
or si,si
je short @2@58
;
; }
;
?debug L 84
pop si
leave
ret
?debug C E604646F6E6504040600046F7264720E02F8FF00+
?debug C 01780E02FCFF00
?debug E
?debug E
_main endp
?debug C E9
?debug C FA00000000
LAB1_TEXT ends
_DATA segment word public use16 'DATA'
s@ label byte
db 0
db 0
db '@A'
db 0
db 0
db 0
db '?'
db 0
db 0
db 0
db '@{'
db 20
db 174
db 'G'
db 225
db 'z'
db 132
db '?'
db 0
db 0
db 128
db '@%f'
db 0
_DATA ends
LAB1_TEXT segment byte public use16 'CODE'
LAB1_TEXT ends
public _main
public @bessy$qff
extrn _printf:far
extrn _sqrt:far
extrn _sin:far
extrn _log:far
extrn _fabs:far
extrn _ceil:far
_s@ equ s@
?debug C EA050A
?debug C E31800000023010400
?debug C EC055F6D61696E181800
?debug C E319000000230E0400
?debug C EC0A40626573737924716666191800
?debug C E31A00000023040401
?debug C EB075F7072696E74661A00
?debug C E31B0B5F657863657074696F6E6C22001E01
?debug C E31C000200150204
?debug C E31D09657863657074696F6E1C001E07
?debug C E31E000000230F0400
?debug C EB055F737172741E00
?debug C E31F000000230F0400
?debug C EB045F73696E1F00
?debug C E320000000230F0400
?debug C EB045F6C6F672000
?debug C E321000000230F0400
?debug C EB055F666162732100
?debug C E322000000230F0400
?debug C EB055F6365696C2200
?debug C E60666706F735F740606000673697A655F740A06+
?debug C 000B5F657863657074696F6E6C1B070009657863+
?debug C 657074696F6E1D0700
?debug C E20004747970650400046E616D651C0004617267+
?debug C 311000046172673210000672657476616C10C022+
?debug C 000000
?debug C E20004747970650400046E616D651C0004617267+
?debug C 310F0004617267320F000672657476616C0FC01C+
?debug C 000000
end
Метрические характеристики
Операторы
№ |
Оператор |
f1j |
1 |
.386p |
1 |
2 |
far |
15 |
3 |
sahf |
8 |
4 |
ifndef |
1 |
5 |
endm |
2 |
6 |
publicdll |
1 |
7 |
macro |
1 |
8 |
name |
2 |
9 |
public |
9 |
10 |
endif |
1 |
11 |
segment |
6 |
12 |
assume |
3 |
13 |
label |
5 |
14 |
call |
8 |
15 |
dword ptr |
107 |
16 |
qword ptr |
8 |
17 |
word ptr |
34 |
18 |
push |
4 |
19 |
pop |
2 |
20 |
mov |
61 |
21 |
fmul |
15 |
22 |
fcomp |
4 |
23 |
fcompp |
4 |
24 |
large |
9 |
25 |
leave |
2 |
26 |
fstsw |
8 |
27 |
ja |
1 |
28 |
: |
39 |
29 |
jb |
4 |
30 |
jbe |
1 |
31 |
fsubr |
3 |
32 |
ends |
6 |
33 |
extrn |
6 |
34 |
db |
23 |
35 |
word |
5 |
36 |
tbyte ptr |
4 |
37 |
jmp |
10 |
38 |
sub |
9 |
39 |
xor |
2 |
40 |
fwait |
24 |
41 |
byte |
6 |
42 |
use16 |
6 |
43 |
group |
1 |
44 |
proc |
2 |
45 |
add |
8 |
46 |
fadd |
7 |
47 |
fsub |
6 |
48 |
enter |
2 |
49 |
fld |
31 |
50 |
fldz |
3 |
51 |
fld1 |
5 |
52 |
jne |
2 |
53 |
fdiv |
4 |
54 |
fdivr |
8 |
55 |
fsp |
27 |
56 |
ret |
2 |
57 |
endp |
2 |
58 |
, |
86 |
59 |
cmp |
1 |
60 |
inc |
3 |
61 |
fild |
9 |
62 |
je |
2 |
63 |
or |
1 |
64 |
short |
15 |
65 |
offset |
1 |
66 |
near |
1 |
67 |
ptr |
8 |
68 |
cwd |
1 |
69 |
idiv |
1 |
70 |
imul |
1 |
71 |
fchs |
2 |
72 |
equ |
1 |
73 |
end |
1 |
74 |
dec |
5 |
Операнды
№ |
Операнд |
f1i |
1 |
ax |
31 |
2 |
eax |
19 |
3 |
sp |
17 |
4 |
[bp-8] |
6 |
5 |
[bp-10] |
4 |
6 |
[bp-4] |
6 |
7 |
[bp-20] |
5 |
8 |
[bp-16] |
4 |
9 |
[bp-66] |
30 |
10 |
[bp-40] |
5 |
11 |
[bp-28] |
6 |
12 |
[bp-32] |
7 |
13 |
[bp-76] |
4 |
14 |
[bp-12] |
4 |
15 |
[bp-86] |
6 |
16 |
[bp-64] |
3 |
17 |
[bp-48] |
7 |
18 |
[bp-60] |
3 |
19 |
[bp-52] |
3 |
20 |
[bp-56] |
4 |
21 |
[bp-36] |
11 |
22 |
[bp-44] |
7 |
23 |
[bp-24] |
8 |
24 |
[bp+6] |
6 |
25 |
[bp+10] |
4 |
26 |
si |
30 |
27 |
cs |
4 |
28 |
ds |
1 |
29 |
_DATA |
5 |
30 |
_BSS |
3 |
31 |
‘CODE’ |
3 |
32 |
DGROUP |
13 |
33 |
‘DATA’ |
2 |
34 |
‘BSS’ |
1 |
35 |
LAB1_TEXT |
9 |
36 |
@bessy$qff |
4 |
37 |
76 |
1 |
38 |
d@ |
1 |
39 |
d@w |
1 |
40 |
b@ |
1 |
41 |
b@w |
1 |
42 |
0322bcc77h |
1 |
43 |
03f13c468h |
1 |
44 |
040490fdah |
1 |
45 |
03f22f983h |
1 |
46 |
03f800000h |
1 |
47 |
040a00000h |
1 |
48 |
0bf800000h |
1 |
49 |
bx |
3 |
50 |
dx |
3 |
51 |
_log |
2 |
52 |
_fabs |
3 |
53 |
_ceil |
2 |
54 |
_sqrt |
2 |
55 |
_sin |
2 |
56 |
_main |
3 |
57 |
_printf |
2 |
58 |
@@15 |
2 |
59 |
s@ |
3 |
60 |
s@+4 |
3 |
61 |
s@+8 |
3 |
62 |
s@+20 |
1 |
63 |
s@+24 |
1 |
64 |
s@+12 |
1 |
65 |
_s@ |
1 |
66 |
@1@646 |
2 |
67 |
@1@86 |
2 |
68 |
@@16 |
2 |
69 |
@1@226 |
2 |
70 |
@1@338 |
2 |
71 |
@1@394 |
2 |
72 |
@1@422 |
2 |
73 |
@1@142 |
2 |
74 |
@@17 |
2 |
75 |
@1@562 |
2 |
76 |
@1@534 |
2 |
78 |
@1@478 |
2 |
79 |
@1@590 |
2 |
80 |
@1@674 |
3 |
81 |
@2@114 |
3 |
82 |
@2@198 |
2 |
83 |
@2@58 |
2 |
84 |
0 |
15 |
85 |
8 |
14 |
86 |
10 |
2 |
87 |
20 |
1 |
88 |
174 |
1 |
89 |
225 |
1 |
90 |
132 |
1 |
91 |
128 |
1 |
92 |
1 |
4 |
93 |
2 |
1 |
94 |
4 |
2 |
95 |
‘@%f’ |
1 |
96 |
‘?’ |
2 |
97 |
‘z’ |
1 |
98 |
‘G’ |
1 |
99 |
‘@A’ |
1 |
100 |
‘@{’ |
1 |
-
Число простых операторов
ŋ1=74
-
Общее число всех операторов
N2=719
-
Число простых операндов
ŋ 2=100
-
Общее число всех операторов
N2=426
-
Словарь
ŋ=ŋ1+ŋ2=74+100=174
-
Опытная (экспериментальная) длина
Nэ=N1+N2=719+426=1145
-
Теоретическая длина программы
NТ = ŋ1log2ŋ1+ŋ2log2ŋ2=74log274+100log2100=74*6.2+100*6.64= 458.8 +664 = 1122.8
| Nэ - NТ|/ Nэ *100% = 2%
-
Объем
V=Nэlog2ŋ =1145log2174=1145*7.44=8518.8
-
Потенциальный объем
V*=Nlog2ŋ = (ŋ1* +ŋ2*)log2 (ŋ 1* + ŋ 2*)=(2 +3)log2(2 +3)=5 log25=5*2,32=11,6
-
Граничный объем
Vгр=(ŋ 1*log2ŋ 1*+ŋ 2*log2ŋ 2* ) log2(ŋ 2* + ŋ 1*)=(2log22+3log23) log2(2 + 3 ) = ( 2 * 1 + 3 * 1,58 ) * 2,32 = ( 2 + 4,74 ) * 2,32 = 15,64
-
Уровень программы
L=V*/V=11,6/8518.8=0.00136
-
Сложность программы
S=1/L=1/0.00136=735,294
-
Оценка уровня программы
L^=2/ ŋ1 * ŋ2/N2=2/74*100/719=0.00376
-
Информационное (интеллектуальное) содержание программы
I=2ŋ2 /ŋ1N2 *(N1 +N2) log2 (ŋ 1+ ŋ2) = 2 * 74 / 100 * 719 * ( 719 + +426)log2174=32.030688
-
Работа по программированию
E=Nlog2 ŋ/L = V2 /V*=8518.82/11,6=6256030,469
-
Время программирования
Tпр=E/S = 6256030,469/735,294=8508,203
-
Уровень языка программирования
λ= V**L=11,6*0.00136=0,015776
-
Ожидаемое число ошибок
B=E/E0*k=2,8396
Метрические характеристики (по Холстеду)
Сводная таблица
|
Паскаль |
Си |
Ассемблер |
||
Расчетное |
Программное |
Расчетное |
Программное |
Расчетное
|
|
Измеримые характеристики программы |
|||||
Число простых операторов |
29 |
27 |
32 |
29 |
74 |
Число простых операндов |
46 |
47 |
42 |
43 |
100 |
Общее число всех операторов |
239 |
220 |
280 |
257 |
719 |
Общее число всех операндов |
185 |
180 |
186 |
188 |
426 |
Число вхождений j-го оператора |
- |
- |
- |
- |
-
|
Число вхождений j-го операнда |
- |
- |
- |
- |
-
|
Словарь программы |
75 |
74 |
74 |
72 |
174 |
Длина программы |
424 |
400 |
446 |
445 |
1145 |
Расчетные характеристики программы |
|||||
Длина программы |
394.57 |
389.448 |
368.38 |
374.211 |
1122.8 |
Реальный, потенциальный и граничный объемы |
2637.28 122.2 453.315 |
2483.78 19.6515 38.2071 |
2740.4 122.2 457.122 |
2745.62 19.6515 38.2071 |
8518.8 655.875 3690.655 |
Уровень программы |
0.0463 |
0.00791192 |
0.04459 |
0.0071574 |
0.07699 |
Интеллектуальное содержание программы |
45.097 |
48.0402 |
38.63964 |
43.3094 |
32.030688 |
Работа программиста |
56916.9 |
313929 |
61454.928 |
383605 |
110646.0125 |
Время программирования |
2635.386 |
17440.5 |
2740.269 |
21311.4 |
8521.79876 |
Уровень языка |
2.08962 |
0.155481 |
1.72302 |
0.140654 |
50.495846 |
Ожидаемое число ошибок |
0.006 |
1.53969 |
0.006 |
1.75982 |
0.00012 |