Описание программы
В ходе выполнения лабораторной работы, с целью автоматизации проведения необходимых расчетов, был разработан программный продукт lab4.exe, который выполняет следующие функции:
Генерация массивов данных с равномерным, экспоненциальным и релеевским законами распределения (представляют интервалы времени между нахождением ошибок).
Подсчет характеристик fm и gm для 60%, 80% и 100% элементов массивов
Вывод полученных результатов в виде таблиц в файл.
Реализуемые в программе массивы чисел представляют прототип массивов интервалов времени между обнаружением ошибок в какой – то программной системе. (Более подробные теоретические сведения см. предыдущий раздел). Далее программа для каждого массива рассчитывает значение первоначального числа ошибок в программной системе (при этом используются 60%, 80%, 100% сгенерированных массивов). Производится расчет характеристик fm и gm и их разности с целью дальнейшего анализа результатов и определения оценки B – числа первоначальных ошибок в программной системе. Подсчет fm и gm завершается при достижении их разности значения 0,0001. Считается, что такая точность достаточна для получения корректных результатов (при уменьшении данного значения последовательности fm и gm сходятся медленно, и m может достигать значений порядка нескольких тысяч).
Данный программный продукт полностью реализован на языке Pascal.
Текст программы
uses CRT;
const
MAX = 30;
var
i:integer;
a_60, a_80, a_100:real;
f:Text;
procedure GenerateRandom(max, floor:integer; var aRandom_60, aRandom_80, aRandom_100:real);
var
i:integer;
x, sumR, sumIR:real;
begin
repeat
sumR := 0; sumIR := 0;
writeln(f);
for i := 1 to max do
begin
x := random(floor);
write(f, x:6:2);
sumR := sumR + x;
sumIR := sumIR + i*x;
if i = Round(max*0.6) then
aRandom_60 := sumIR/sumR;
if i = Round(max*0.8) then
aRandom_80 := sumIR/sumR;
if (i mod 10 = 0) then
writeln(f);
end;
aRandom_100 := sumIR/sumR;
writeln(f);
until ((aRandom_100 > (max + 1)/2) and
(aRandom_80 > (Round(max*0.8) + 1)/2) and
(aRandom_60 > (Round(max*0.6) + 1)/2));
end;
procedure GenerateExponential(max:integer; b:real; var aExp_60, aExp_80, aExp_100:real);
var
i:integer;
y,w:real;
sumE, sumIE:real;
begin
repeat
sumE := 0; sumIE := 0;
writeln(f);
for i := 1 to max do
begin
y := -ln(random)/b;
w := b*exp(-b*y);
write(f, w:6:2);
sumE := sumE + w;
sumIE := sumIE + i*w;
if i = Round(max*0.6) then
aExp_60 := sumIE/sumE;
if i = Round(max*0.8) then
aExp_80 := sumIE/sumE;
if (i mod 10 = 0) then
writeln(f);
end;
aExp_100 := sumIE/sumE;
writeln(f);
until ((aExp_100 > (max + 1)/2) and
(aExp_80 > (Round(max*0.8) + 1)/2) and
(aExp_60 > (Round(max*0.6) + 1)/2));
end;
procedure GenerateRelay(max:integer; c:real; var aRel_60, aRel_80, aRel_100:real);
var
i:integer;
y,w:real;
sumR, sumIR:real;
begin
repeat
sumR := 0; sumIR := 0;
writeln(f);
for i := 1 to max do
begin
y := c*sqrt(-2*ln(random));
w := y/sqr(c)*exp(-sqr(y)/(2*sqr(c)));
write(f, w:6:2);
sumR := sumR + w;
sumIR := sumIR + i*w;
if i = Round(max*0.6) then
aRel_60 := sumIR/sumR;
if i = Round(max*0.8) then
aRel_80 := sumIR/sumR;
if (i mod 10 = 0) then
writeln(f);
end;
aRel_100 := sumIR/sumR;
writeln(f);
until ((aRel_100 > (max + 1)/2) and
(aRel_80 > (Round(max*0.8) + 1)/2) and
(aRel_60 > (Round(max*0.6) + 1)/2));
end;
procedure CheckEstimations(max:integer; a:real);
const
MIN_VAL = 0.0001;
var
i,m : integer;
gm,fm,d, d_new : real;
begin
{A_100}
writeln(f);
writeln(f,'_________________________________');
writeln(f,'| m | Fm | Gm | Delta |');
writeln(f,'_________________________________');
m := max + 1;
d_new:= 32767;
repeat
gm := 0; fm := 0;
d:=d_new;
for i := 1 to max do
fm := fm + 1/(m-i);
gm := max/(m - a);
d_new := fm - gm;
writeln(f,'|',m:5,'|',fm:8:5,'|',gm:8:5,'|',d_new:7:5,'|');
m := m + 1;
until (abs(d) < abs(d_new));
writeln(f,'_________________________________');
end;
begin
clrscr;
randomize;
assign(f,'lab4.txt');
rewrite(f);
{равномерное распределение}
writeln(f,'------------Генерация ',MAX,' чисел (равномерное распределение)------------');
writeln('Генерация ',MAX,' чисел (равномерное распределение)...');
GenerateRandom(MAX, 20, a_60, a_80, a_100);
writeln(f,'100% - A = ',a_100:6:3,', (n+1)/2 = ',(MAX+1)/2:6:3);
writeln(f,'80% - A = ',a_80:6:3,', (n+1)/2 = ',(Round(MAX*0.8)+1)/2:6:3);
writeln(f,'60% - A = ',a_60:6:3,', (n+1)/2 = ',(Round(MAX*0.6)+1)/2:6:3);
writeln(f);
writeln(f,'------------Вычисление оценок для ',MAX ,' чисел------------');
writeln('Вычисление оценок для ',MAX ,' чисел...');
CheckEstimations(MAX, a_100);
writeln(f);
writeln(f,'------------Вычисление оценок для ',Round(MAX*0.8) ,' чисел------------');
writeln('Вычисление оценок для ',Round(MAX*0.8) ,' чисел..');
CheckEstimations(Round(MAX*0.8), a_80);
writeln(f);
writeln(f,'------------Вычисление оценок для ',Round(MAX*0.6) ,' чисел------------');
writeln('Вычисление оценок для ',Round(MAX*0.6) ,' чисел...');
CheckEstimations(Round(MAX*0.6), a_60);
{экспоненциальное распределение}
writeln(f);
writeln;
writeln(f,'------------Генерация ',MAX,' чисел(экспоненциальное распределение)------------');
writeln('Генерация ',MAX,' чисел(экспоненциальное распределение)...');
GenerateExponential(MAX, 0.1, a_60, a_80, a_100);
writeln(f,'100% - A = ',a_100:6:3,', (n+1)/2 = ',(MAX+1)/2:6:3);
writeln(f,'80% - A = ',a_80:6:3,', (n+1)/2 = ',(Round(MAX*0.8)+1)/2:6:3);
writeln(f,'60% - A = ',a_60:6:3,', (n+1)/2 = ',(Round(MAX*0.6)+1)/2:6:3);
writeln(f);
writeln(f,'------------Вычисление оценок для ',MAX ,' чисел------------');
writeln('Вычисление оценок для ',MAX ,' чисел...');
CheckEstimations(MAX, a_100);
writeln(f);
writeln(f,'------------Вычисление оценок для ',Round(MAX*0.8) ,' чисел------------');
writeln('Вычисление оценок для ',Round(MAX*0.8) ,' чисел..');
CheckEstimations(Round(MAX*0.8), a_80);
writeln(f);
writeln(f,'------------Вычисление оценок для ',Round(MAX*0.6) ,' чисел------------');
writeln('Вычисление оценок для ',Round(MAX*0.6) ,' чисел...');
CheckEstimations(Round(MAX*0.6), a_60);
{релеевское распределение}
writeln(f);
writeln;
writeln(f,'------------Генерация ',MAX,' чисел (релеевское распределение)------------');
writeln('Генерация ',MAX,' чисел (релеевское распределение)...');
GenerateRelay(MAX, 8, a_60, a_80, a_100);
writeln(f,'100% - A = ',a_100:6:3,', (n+1)/2 = ',(MAX+1)/2:6:3);
writeln(f,'80% - A = ',a_80:6:3,', (n+1)/2 = ',(Round(MAX*0.8)+1)/2:6:3);
writeln(f,'60% - A = ',a_60:6:3,', (n+1)/2 = ',(Round(MAX*0.6)+1)/2:6:3);
writeln(f);
writeln(f,'------------Вычисление оценок для ',MAX ,' чисел------------');
writeln('Вычисление оценок для ',MAX ,' чисел...');
CheckEstimations(MAX, a_100);
writeln(f);
writeln(f,'------------Вычисление оценок для ',Round(MAX*0.8) ,' чисел------------');
writeln('Вычисление оценок для ',Round(MAX*0.8) ,' чисел..');
CheckEstimations(Round(MAX*0.8), a_80);
writeln(f);
writeln(f,'------------Вычисление оценок для ',Round(MAX*0.6) ,' чисел------------');
writeln('Вычисление оценок для ',Round(MAX*0.6) ,' чисел...');
CheckEstimations(Round(MAX*0.6), a_60);
close(f);
end.
