Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ekonom.docx
Скачиваний:
8
Добавлен:
06.09.2019
Размер:
44.06 Кб
Скачать

Организационно-экономический раздел

Все расчеты в данном разделе будут выполнены согласно методологии описанной в [7].

Согласно исходным данным (Таблица 1) по подпрограмме "matrmultiply"

η2* = 3(двумерный массив А) + 3(двумерный массив B) +3(двумерный массив C) + 1(переменная l) + 1(переменная m) + 1(переменная n) = 12;

Таблица 1. Исходные данные

Количество вхождений

Операторы

Количество вхождений

Операнды

1

{}

2

A

5

for

2

B

5

()

3

C

7

=

3

l

12

;

2

m

5

<

3

n

5

++

9

i

4

[]

9

j

12

,

4

k

1

*

1

+=

3

<>

Расчет характеристик для одномодульной программы по исходным данным

1. Находим размер словаря операндов:

η2 η2* * log2 η2*. = 12 * log2 12 = 43

2. Находим общую длину функции:

Ν = 2* η2 * log2 η2 = 2 * 43 * log2 43 = 467 слов

3. Находим объем функции, приняв в первом приближении η1 = η2 :

V = Ν* log2 η = Ν* log22 = 467 * log2 (2*43) = 3001 бит

4. Находим потенциальный объем и уровень реализации функции

V* = (η2* + 2) * log2 (η2* + 2) = (12+2)* log2 (12+2) = 53 бит

L = V* / V = 116 / 10734 = 0,02

5. Находим календарное время программирования, считая число программистов в бригаде n = 1, а производительность ν = 30 команд в день:

Т = 3N / (8 nν) = 3 * 467 / (8 * 1 * 30) = 6 дней

6. Находим начальное количество ошибок:

Во = V / 1600 = 3001 / 1600 = 2

7. Находим наработку на отказ, приняв длительность отладки равной τ=T/2 и продолжительность работы 8 часов в день:

tH = τ / ln Во = 8 * T / (2 * ln Во ) = 8 * 5,8 /(2* ln 2 )= 34 часа

Расчет характеристик для одномодульной программы по результатам реализации

После реализации программы были определены словари операторов и операндов: количество операторов η1 = 12, количество операндов η2 =15.

1. Находим общую длину функции:

Ν= 0,91* η * log2 η =(12 + 15)* log2(12 + 15) =128

2. Находим объем функции, приняв в первом приближении η1 = η2 :

V = Ν* log2η =128 * log2(12 + 15) = 609 бит

3. Находим потенциальный объем и уровень реализации функции:

V* = (η2* + 2) * log2 (η2* + 2) = (12+2)* log2 (12+2) = 53 бит

L = V* / V = 53 / 609 =0,09

4. Находим календарное время программирования, считая число программистов в бригаде n = 1, а производительность ν = 30 команд в день:

Т = 3N / (8 nν) = 3 * 128 / (8 * 1 * 30) =2 дня

5. Находим начальное количество ошибок:

Во = V / 1600 = 609 / 1600 = 0

6. Находим наработку на отказ, приняв длительность отладки равной τ=T/2 и продолжительность работы 8 часов в день:

tH = τ / ln Во = 8 * T / (2 * ln Во ) = 8 * 9 /(2* ln 0,4 )

Величина наработки на отказ стремится к бесконечности. Это означает, что программа может работать бесконечно долго до появления ошибки.

Расчет характеристик для программы, состоящей из нескольких модулей

Выполним расчет по исходным данным в предположении, что программа будет разбита на несколько функций, т.к. число входных и выходных переменных одномодульной программы отличается от оптимального (η2опт* =8). Параметры всех функций будем считать одинаковыми.

1. Определим число уровней иерархии и количество функций программы

i = (log2 η2* )/ 3 + 1 = (log2 12) / 3 + 1 = 2;

k = η2* / 8 = 12 / 8 ≈ 2;

2. Рассчитаем длину программы из двух функций и длину одного модуля:

N =k ( 220 + log k) = 2 (220 + log 2) = 442 слова;

Nk = N / k = 442/ 2=221 слово;

3. Находим количество операндов программы из двух модулей и количество операндов в одном модуле

η2 = η2* log22* / k ) + k log2 k = 12*log2 (12/2) + 2 log2 2=33;

η2k = η2 / k = 33/2 = 17;

4. Рассчитаем объём программы из двух модулей и объем одного модуля

V = kNk * log2 2 η2k = 2* 221 *log2 (2*17) = 2249 бит

Vk = 2249 / 2 = 1125 бит

5. Находим потенциальный объем и уровень реализации программы:

V* = 3 (η2 k * + 2) * log2 (η2 k * + 2) =3 (12+2)* log2 (12+2) = 107 бит

L = V* / V = 102 / 3730 =0,048

6. Находим календарное время программирования, считая число программистов в бригаде n = 1, а производительность ν = 30 команд в день:

Т = 3N / (8 nν) = 3 *442 / (8 * 1 * 30) =6 дней

7. Находим начальное количество ошибок:

Во = V / 1600 = 2249 / 1600 = 1

Округлим значение Во до 1.

8. Находим наработку на отказ, приняв длительность отладки равной τ=T/2 и продолжительность работы 8 часов в день:

tH = τ / ln Во = 8 * T / (2 * ln Во ) = 8 * 6 /(2* ln 1,4 ) = 71 час

Из таблицы ниже (Таблица 4) видно, что для рассматриваемого случая лучше реализовать многомодульную программу. В этом случае уменьшаются длина и объем программы, а также календарное время программирования и начальное количество ошибок.

Таблица 2. Результаты расчетов для подпрограммы "matrmultiply"

Характеристики

Одномодульная программа

Многомо-дульная программа

Расчет по исходным данным

Расчет по реализации

Реальные данные

Количество операндов в краткой записи η2*

12

12

Количество операторов η1

12

12

Количество операндов η2

43

16

16

33

Длина подпрограммы Ν, слов

467

128

154

442

Объём подпрограммы V, битов

3001

609

315

2249

Потенциальный объём подпрограммы V, битов

53

53

-

107

Уровень реализации подпрограммы

0,02

0,09

-

0,048

Календарное время программирования Т, дней

6

2

1

6

Начальное количество ошибок Во, штук

2

0

0

1

Начальная наработка на отказ tH, часов

35

-

71

Текст подпрограммы:

void matrmultiply(array<double,2>^A, array<double,2>^B, array<double,2>^C, int l, int m, int n)

{

for(int i=0; i<l; i++)

for(int j=0; j<n; j++)

C[i,j]=0.0;

for(int i=0; i<l; i++)

for(int j=0; j<n; j++)

for(int k=0; k<m; k++)

C[i,j]+=A[i,k]*B[k,j];

}

Расчет метрических характеристик для подпрограммы "LUP" - LUP разложения матрицы:

Таблица 3. Результаты расчетов для подпрограммы "LUP"

Характеристики

Одномодульная программа

Расчет по исходным данным

Расчет по реализации

Реальные данные

Количество операндов в краткой записи η2*

11

Количество операторов η1

19

19

Количество операндов η2

38

16

15

Длина подпрограммы Ν, слов

399

180

272

Объём подпрограммы V, битов

2493

923

1142

Потенциальный объём подпрограммы V, битов

48

48

-

Уровень реализации подпрограммы

0,02

0,05

-

Календарное время программирования Т, дней

5

2

1

Начальное количество ошибок Во, штук

2

1

2

Начальная наработка на отказ tH, часов

29

0

-

Текст подпрограммы:

bool LUP(array<double,2>^A, array<double,2>^C, array<double,2>^P, int n)

{

double tmp;

for(int i = 0; i < n; i++)

for(int j = 0; j < n; j++)

C[i,j] = A[i,j];

for( int i = 0; i < n; i++)

P[i,i]=1.0;

for( int i = 0; i < n; i++ )

{

double pivotValue = 0;

int pivot = -1;

for( int row = i; row < n; row++ )

{

if( fabs(C[row,i]) > pivotValue )

{

pivotValue = fabs(C[row,i]);

pivot = row;

}

}

if( pivotValue == 0 )

{

MessageBox::Show("Ошибка! Матрица вырождена");

return false;

}

if( pivot != i )

{

for(int j = 0; j < n; j++)

{

P[pivot,j]=tmp;

P[pivot,j]=P[i,j];

P[i,j]=tmp;

}

for(int j = 0; j < n; j++)

{

C[pivot,j]=tmp;

C[pivot,j]=C[i,j];

C[i,j]=tmp;

}

}

for( int j = i+1; j < n; j++ )

{

C[j,i] /= C[i,i];

for( int k = i+1; k < n; k++ )

C[j,k] -= C[j,i] * C[i,k];

}

}

return true;

}

Расчет метрических характеристик для подпрограммы "vectmatrmultiply" перемножения вектора на матрицу:

Таблица 4. Результаты расчетов для подпрограммы "vectmatrmultiply"

Характеристики

Одномодульная программа

Расчет по исходным данным

Расчет по реализации

Реальные данные

Количество операндов в краткой записи η2*

11

Количество операторов η1

12

19

Количество операндов η2

38

13

15

Длина подпрограммы Ν, слов

399

116

98

Объём подпрограммы V, битов

2493

539

260

Потенциальный объём подпрограммы V, битов

48

48

-

Уровень реализации подпрограммы

0,02

0,09

-

Календарное время программирования Т, дней

5

1

1

Начальное количество ошибок Во, штук

2

0

0

Начальная наработка на отказ tH, часов

29

0

-

Текст подпрограммы:

void vectmatrmultiply(array<double>^A, array<double,2>^B, array<double,2>^C, int m, int n)

{

for(int i=0; i<m; i++)

C[i,1]=0.0;

for(int i=0; i<m; i++)

{

for(int k=0; k<n; k++)

C[i,1]+=A[i]*B[k,i];

}

}

Расчет метрических характеристик для подпрограммы "scalar" скалярного перемножения векторов:

Таблица 5. Результаты расчетов для подпрограммы "scalar"

Характеристики

Одномодульная программа

Расчет по исходным данным

Расчет по реализации

Реальные данные

Количество операндов в краткой записи η2*

8

Количество операторов η1

12

12

Количество операндов η2

24

9

9

Длина подпрограммы Ν, слов

220

92

56

Объём подпрограммы V, битов

1229

404

164

Потенциальный объём подпрограммы V, битов

33

33

-

Уровень реализации подпрограммы

0,03

0,08

-

Календарное время программирования Т, дней

3

1

1

Начальное количество ошибок Во, штук

1

0

0

Начальная наработка на отказ tH, часов

0

0

-

Текст подпрограммы:

double scalar(array<double>^A, array<double>^B, int n)

{

double sum = 0.0;

for(int i=0; i<n; i++)

sum+=A[i]*B[i];

return sum;

}

Имеющиеся расхождения между результатами расчетов и реальными данными связаны с тем, что рассчитанные значений являются статистическими. Они не могут являться абсолютными ориентирами при разработке ПО, т.к. не учитывают человеческий фактор.