ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ
Тверской Государственный Технический Университет
Кафедра «Информационные технологии»
Расчетно-графическая работа
по дисциплине «Метрология и Стандартизация»
(Вариант 9)
Выполнил: студент 2-го курса
Группы ИСТ – 0502
Косоуров Д.А.
Проверил: Котов С.Л.
Тверь 2007
Часть 1:
1. По заданной матрице вызовов и достижимости построить модульную структуру программы:
![]() |
2.Построить список путей вызовов (путей тестирования):
М1 – М2 – М4;
М1 – М2 – М5 – М8 – M11;
М1 – М2 – М5 – М9 – M11;
М1 – М3 – М6 – M10;
М1 – М3 – М7 – М10;
М1 – М3 – М7 – М11;
М1 – М3 – М7 – М12.
3. Определить количественные характеристики программы:
а) иерархическую сложность:
J=N/L, где N – число вершин в графе,
L – число уровней в графе (количество вершин в самом длинном пути);
J=12/5=2,4.
б) структурную сложность:
S=D/N, где N – число вершин,
D – число ребер в графе;
S=14/12=1.166666667…
в) тестируемость:
- доступность модулей:
A(Mj) = ∑nx=1 A(Mx)/ C(Mx), где A(Mx) – доступность модуля Mх, вызывающего модуль Mj,
C(Mx) – количество модулей, которые вызывают модуль Mj;
А(М1)=1
А(М2)=А(М3)=А(М1)/С(М1)=1/2;
А(М4)=А(М5)=1/2/2=1/4;
А(М6)=А(М7)=1/2/2=1/4;
А(М8)= А(М9)=1/4/2=1/8;
А(М10)=А(М6)+A(M7)/1+3=(1/4+1/4)/4=1/8
A(M11)=A(M7)+A(M8)+A(M9)/3+1+1=(1/4+1/8+1/8)/5=1/10
А(М12)=1/4/3=1/12.
- тестируемость i-го пути:
Pi = [ ∑kj=1 1/A(Mj) ]-1, где к – число модулей на j-ом пути вызова,
A(Mj) – доступность модуля Mj на пути Pi;
Р1=[ 1/А(М1)+1/А(М2)+1/А(М4)]-1=[1+2+4]-1=1/7;
P2=[1/A(M1)+1/A(M2)+1/A(M5) +1/A(M8)+1/A(M11)]-1=[1+2+4+8+10]-1=1/25;
P3=[1/A(M1)+1/A(M2)+1/A(M5) +1/A(M9)+1/A(M11)]-1=[1+2+4+8+10]-1=1/25;
P4=[1/A(M1)+1/A(M3)+1/A(M6)+1/A(M10)]-1=[1+2+4+8]-1=1/15;
P5=[1/A(M1)+1/A(M3)+1/A(M7)+1/A(M10)]-1=[1+2+4+8]-1=1/15;
P6=[1/A(M1)+1/A(M3)+1/A(M7)+1/A(M11)]-1=[1+2+4+10]-1=1/17;
P7=[1/A(M1)+1/A(M3)+1/A(M7)+1/A(M12)]-1=[1+2+4+12]-1=1/19.
- тестируемость:
Т = [ (1/NB)*(∑ai=1 1/Pi) ]-1, где NB – количество путей вызовов,
Pi – тестируемость i-ого пути;
Т=[(1/7)*(1/1/7+1/1/25+1/1/25+1/1/15+1/1/15+1/1/17+1/1/19)]-1=[(1/7)*(123)]-1=0,0569.
-энтропия вызовов:
E = [∑Li*log2(Li/∑Li)]/ ∑Li,гдеLi – длина (количество модулей) i-ого пути в графе вызовов
[3*log2(3/29)+2*5*log2(5/29)+4*4*log2(4/29)]/29=
=[3*(-3,273)+10*(-2,536)+16*(-2,858)]/29==[-9,819 – 25,36 – 45,728]/29=
=-80,907/29=-2.789896552.
Часть 2:
Текст программы:
#include "stdafx.h"
#include "stdio.h"
#include "math.h"
int main()
{
int m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11,m12;
printf ("Preved,eto moy test na ydachy.Dlja nachala vvedi 2 ili 3\n");//////////////////////////////////////////////////////////(sobitie M1)
scanf ("%i",&m1);
if (m1==2)
{
printf ("vvedi 4 ili 5\n");////////////////////////////////////////////////////////////////////////////.//////////////(sobitie M2)
scanf ("%i",&m2);
if (m2==4)
{
printf ("100 rublei viigral:(\n");///////////////////////////////////////.///////////////////////////(sobitie M4)
}
else
{
printf ("8 ili 9\n");///////////////////////////////////////////////////////////////////////////////////////(sobitie M5)
scanf ("%i",&m5);
if (m5==8||m5==9)
{
printf ("Sorval cush:1000 rublikov:)\n");////////////////////////(sobitie M11)
}
}
}
else
printf ("6 ili 7\n");//////////////////////////////////////////////////////////////////////////////////////////////////////////////(sobitie M3)
scanf ("%i",&m3);
{
if (m3==6)
{
printf ("molodec,100 rublei yje viigral.Vozmesh bonus,esli vvedesh 10\n");//(sobitie M6)
scanf ("%i",&m6);
if (m6==10)
{
printf ("Geroi!!!Viigral 500 rublei\n");/////////////////////////////(sobitie M10)
}
}
else
{
printf ("Superslojno!Vvedi 10,11 ili 12\n");//…///////////////////////////////////////////(sobitie M7)
scanf ("%i",&m7);
{
switch (m7)
{
case 10:
printf ("Geroi!!!Viigral 500 rublei\n");////////////////(sobitie M10)
break;
case 11:
printf ("Sorval cush:1000 rublikov:)\n");///////////(sobitie M11)
break;
case 12:
printf ("Nichego.500 rublei-toje dengi\n");////////(sobitie M12)
break;
}
}
}
}
return 1;
}
Граф вызовов по исходному тексту программы
Матрица вызовов достижимости
M1 | М2 | М3 | М4 | М5 | М6 | М7 | М8 | М9 | М10 | М11 | М12 | |
М1 | ///// | + | + | * | * | * | * | * | * | * | * | * |
М2 | ////// | + | + | * | * | * | ||||||
М3 | ////// | + | + | * | * | * | ||||||
М4 | ///// | |||||||||||
M5 | ///// | + | + | |||||||||
M6 | ///// | + | ||||||||||
M7 | ///// | + | + | + | ||||||||
M8 | ///// | + | ||||||||||
М9 | ///// | + |
Примечание: + означает непосредственный вызов модуля
* означает вызов через цепочку последовательных вызовов
· иерархическая сложность:
J=N/L, где N – число вершин в графе, L – число уровней в графе (количество вершин в самом длинном пути);
J=12/5=2,4.
· структурная сложность:
S=D/N, где N – число вершин,
D – число ребер в графе;
S=14/12=1.166666667…
· Цикломатическая сложность графа программы (цикломатическое число Маккейба):
Z(G) = e – v + 2*p, где е – число дуг ориентированного графа G,
v – число вершин ориентированного графа G;
p – Число компонентов связанности графа(количество, которое необходимо добавить для преобразование графа в сильно связанный);
Z(G)=14-12+2*4=10.
тестируемость:
- доступность модулей:
A(Mj) = ∑nx=1 A(Mx)/ C(Mx), где A(Mx) – доступность модуля Mх, вызывающего модуль Mj, C(Mx) – количество модулей, которые вызывают модуль Mj;
А(М1)=1
А(М2)=А(М3)=А(М1)/С(М1)=1/2;
А(М4)=А(М5)=1/2/2=1/4;
А(М6)=А(М7)=1/2/2=1/4;
А(М8)= А(М9)=1/4/2=1/8;
А(М10)=А(М6)+A(M7)/1+3=(1/4+1/4)/4=1/8
A(M11)=A(M7)+A(M8)+A(M9)/3+1+1=(1/4+1/8+1/8)/5=1/10
А(М12)=1/4/3=1/12.
- тестируемость i-го пути:
Pi = [ ∑kj=1 1/A(Mj) ]-1, где к – число модулей на j-ом пути вызова,
A(Mj) – доступность модуля Mj на пути Pi;
Р1=[ 1/А(М1)+1/А(М2)+1/А(М4)]-1=[1+2+4]-1=1/7;
P2=[1/A(M1)+1/A(M2)+1/A(M5) +1/A(M8)+1/A(M11)]-1=[1+2+4+8+10]-1=1/25;
P3=[1/A(M1)+1/A(M2)+1/A(M5) +1/A(M9)+1/A(M11)]-1=[1+2+4+8+10]-1=1/25;
P4=[1/A(M1)+1/A(M3)+1/A(M6)+1/A(M10)]-1=[1+2+4+8]-1=1/15;
P5=[1/A(M1)+1/A(M3)+1/A(M7)+1/A(M10)]-1=[1+2+4+8]-1=1/15;
P6=[1/A(M1)+1/A(M3)+1/A(M7)+1/A(M11)]-1=[1+2+4+10]-1=1/17;
P7=[1/A(M1)+1/A(M3)+1/A(M7)+1/A(M12)]-1=[1+2+4+12]-1=1/19.
- тестируемость:
Т = [ (1/NB)*(∑ai=1 1/Pi) ]-1, где NB – количество путей вызовов,
Pi – тестируемость i-ого пути;
Т=[(1/7)*(1/1/7+1/1/25+1/1/25+1/1/15+1/1/15+1/1/17+1/1/19)]-1=[(1/7)*(123)]-1=0,0569.
Средняя текстовая сложность модуля (усилие на разработку по Холстеду):
E=V/L, где V – объем программы,
L – уровень программы;
V=N*Log2Y; N=N1+N2;
Y=Y1+Y2, где Y1 – количество уникальных операторов в программе;
Y2 – количество уникальных операндов в программе;
Y=4+12=16;
N=24+13
V=37*log216=37*4=148;
L=V*/V;
V* = (2+U)Log2(2+U), где V* - потенциальный объем программы,
U – число входных и выходных данных программы;
V*=(2+13)*log2(2+13)=58,0633;
L=58,0633/148=0.395;
E=148/0,395=374,683.
Часть 3:
№ функции | Наименование (содержание) функции | Объем функции ПС (строк исходного текста) | Количество функций | Суммарный объем функции ПС (строки сходного текста) |
Функции, обеспечивающие ввод-вывод и обработку данных | ||||
Библиотечные функции ввода/ вывода высокого уровня | ||||
Библиотечные функции ввода/ вывода с консольного терминала и порта. | ||||
Инициализация вызовов и выделение памяти через главную функцию |
· общий объем разрабатываемого ПС (Vo). Это сумма объемов входящих в него функций. Из таблицы:
Vo = V1 +… + Vn ≈ 45 (строк исходного текста).
· По таблице и для объема ПС Vo ≈ 0,1 ТСИ определяем значение базовой трудоемкости разработки ПС, тоже по таблице:
Норм < 7 чел.-дней
· ПС «Средство тестирования» относим к очень низкому уровню сложности, поэтому согласно таблице:
Ксложн = 0,73
Базовая трудоемкость равна:
Тб=Норм∙Ксложн<7∙0,73=5,11 чел.-дней
· Общая трудоемкость разработки определяется
То = Тб ∙Кн ∙Ккач
Значение Кн определяем по таблице ПС " Средство тестирования " разрабатывается на известном разработчикам типе ЭВМ (на ПЭВМ типа IBM PC) и в известной ОС (MS Windows), при наличии известных разработчикам аналогов, т.е. коэффициент новизны
Кн = 0,7
Значение Ккач является произведением коэффициентов Кнад,, Кпроизв, Кдокум и Кпик,, значения которых выбираются из таблицы
- коэффициент, учитывающий требования к надежности ПС
Кнад = 0,92;
- коэффициент, учитывающий требования к производительности ПС
Кпроизв = 0,9;
- коэффициент, учитывающий требования к уровню информативности документации на фазах жизненного цикла ПС
Кдокум = 0,91;
-коэффициент повторного использования программных компонентов
Кпик = 0,95.
Ккач = 0,92*0,9*0,91*0,95=0,715806.
Общая трудоемкость разработки будет равна
То = 5,11*0,7*0,715806=2,5604 чел.-дней
· Трудоемкость разработки ПС с учетом конкретных условий разработки (Тур) рассчитывается по формуле:
Тур = То ∙ Кср.упр.жиз∙Кср.разр
Значение поправочного коэффициента, учитывающего использование средств управления жизненным циклом выбирается из таблицы:
Кср.упр.жиз = 1,17
Значение поправочного коэффициента, учитывающего конкретные условия и средства разработки ПС выбирается из табл.5.11:
Кср.разр = 1
Подсчитываем Тур
Тур = 4,40.1,09.1=2,995 чел.-дней
· Разработчик известен, поэтому в таблицах находим значения коэффициентов Кквал и Копыт:
поправочный коэффициент, учитывающий уровень квалификации разработчика ПС
Кквал=1,26;
поправочный коэффициент, учитывающий опыт разработчика ПС
Копыт =1,0.
Рассчитываем трудоемкость с учетом рейтинга разработчиков:
Тр=2,995*1,26*1,0 = 3,7737 чел.-дней
Вывод:.
Первая Часть: Основное требование было описать модульную структуру программы по заданной матрице вызовов и достижимости. Модульная структура программы помогает выявить связи между модулями и определить количество входных и выходных модулей.
Вторая Часть: Основной целью являлось написание программы по заданной матрице вызовов и достижимости и проверка, используя её, первой части работы. Очевидно, что эта программа имеет небольшой объём, не достаточные требования к надёжности и производительности, не имеет документации, и разработчик не является профессионалом. Всё это говорит о низком уровне качества ПС, но она удовлетворяет поставленным ей требованиям, т.к. создавалась с целью обучения.
Часть третья: Основной целью был анализ текста программы и расчёт трудоёмкости. Прошу заметить, что размеры моей программы (кол-во строк) намного меньше минимальных размеров, данных в таблице. Поэтому все рассчитанные трудоемкости на самом деле меньше, чем это написано выше. Но, несмотря на это, с помощью коэффициентов заданных в таблицах, я успешно вычислил следующие виды трудоёмкостей: значение базовой трудоемкости разработки ПС, базовая трудоемкость, общая трудоемкость разработки, трудоемкость разработки ПС с учетом конкретных условий разработки.