Научная статья на тему 'Оценивание качества программного обеспечения САПР на основе метрических характеристик'

Оценивание качества программного обеспечения САПР на основе метрических характеристик Текст научной статьи по специальности «Компьютерные и информационные науки»

CC BY
937
82
i Надоели баннеры? Вы всегда можете отключить рекламу.
Ключевые слова
СЛОЖНОСТЬ ПРОГРАММ / COMPLEXITY OF PROGRAMS / ПРОГРАММНЫЕ МЕТРИКИ / SOFTWARE METRICS / ЯЗЫКИ ПРОГРАММИРОВАНИЯ ВЫСОКОГО УРОВНЯ / HIGH LEVEL PROGRAMMING LANGUAGES / ЯЗЫК MODULA-2 / THE LANGUAGE MODULA-2

Аннотация научной статьи по компьютерным и информационным наукам, автор научной работы — Карпович Елена Евгеньевна

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

i Надоели баннеры? Вы всегда можете отключить рекламу.

Похожие темы научных работ по компьютерным и информационным наукам , автор научной работы — Карпович Елена Евгеньевна

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

Assessing the quality of software applications on the basis of metric characteristics

In this article the assignment of metric characteristics of software quality is defined. The classification of software metrics is presented. The existing approaches to the definition of software metrics are considered. The possibilities of automation definition, analysis and visualization of metric characteristics of the programs in high level languages are discussed.

Текст научной работы на тему «Оценивание качества программного обеспечения САПР на основе метрических характеристик»

© Е.Е. Карпович, 2013

УДК 681.324.067 Е.Е. Карпович

ОЦЕНИВАНИЕ КАЧЕСТВА ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ САПР НА ОСНОВЕ МЕТРИЧЕСКИХ ХАРАКТЕРИСТИК

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

Ключевые слова: сложность программ, программные метрики, языки программирования высокого уровня, язык М001ЛА-2.

Метрология программного обеспечения является относительно новым и весьма актуальным направлением технологии программирования, связанным с измерением различных характеристик программ и процесса их разработки. С помощью метрик можно оценивать стоимость программных проектов, управлять ресурсами проектирования, оценивать эффективность методов и инструментальных средств разработки программного обеспечения, а также качество и надежность разрабатываемых программ.

Метрики включают в себя измерения сложности, трудоемкости программирования, корректности, тестируемости, познаваемости, сопровождаемости, достоверности и точности, оценки ресурсов, стоимости разработки программных продуктов, распределения персонала и.т.д.

Термин «метрика программного обеспечения» означает числовую характеристику некоторого свойства программы. Метрики обеспечивают количественный подход к оцениванию качества программного обеспечения и процесса его разработки.

Одной из важнейших проблем метрологии программных продуктов является формализация характеристик качества и методология их оценки. Для определения адекватности качества функционирования программ, наличия технических возможностей программных средств к взаимодействию, совершенствованию и развитию необходимо использовать стандарты в области оценки характеристик их качества. Основой регламентирования показателей качества программных средств ранее являлся международный стандарт ISO 9126:1991 (ГОСТ Р ИСО/ МЭК 9126-93) "Информационная технология. Оценка программного продукта. Характеристики качества и руководство по их применению".

Завершается разработка и формализован последний проект состоящего из четырех частей стандарта ISO 9126-1-4 для замены небольшой редакции 1991 года. Проект состоит из следующих частей под общим заголовком "Информационная технология — характеристики и метрики качества программного обеспечения": "Часть 1. Характеристики и субхарактеристики качества" Часть

2. Внешние метрики качества" "Часть 3. Внутренние метрики качества" "Часть 4. Метрики качества в использовании" (см. публикации Липаева В.В. [1,2]).

Результаты исследования метрических характеристик качества представлены в SWEBOK (Software Engineering Body of Knowledge), в документ, издаваемый комитетом Software Engineering Coordinating Committee, в который вовлечено сообщество IEEE Computer Society. Назначение SWEBOK состоит в объединении знаний по инженерии программного обеспечения (разработке программного обеспечения) [3].

Рассмотрим способы классификация измеряемых характеристик программного обеспечения. В настоящее время в программной инженерии еще не сформировалась окончательно система метрик. Действуют разные подходы к определению их набора и методов измерения. Однако всП множество метрик программного обеспечения можно разбить на три большие группы:

> метрики программного продукта, которые используются при измерении его характеристик — свойств;

> метрики процесса, которые используются при измерении свойства процесса ЖЦ создания продукта.

> метрики использования.

Метрики программного продукта включают:

• внешние метрики, обозначающие свойства продукта, видимые пользователю;

• внутренние метрики, обозначающие свойства, видимые только команде разработчиков.

• Внешние метрики продукта — это метрики:

• надежности продукта, которые служат для определения числа дефектов;

• функциональности, с помощью которых устанавливаются наличие и правильность реализации функций в продукте;

• сопровождения, с помощью которых измеряются ресурсы продукта (скорость, память, среда); применимости продукта, которые способствуют определению степени доступности для изучения и использования;

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

• Внутренние метрики продукта включают:

• метрики размера, необходимые для измерения продукта с помощью его внутренних характеристик;

• метрики сложности, необходимые для определения сложности продукта;

• метрики стиля, которые служат для определения подходов и технологий создания отдельных компонентов продукта и его документов.

Внутренние метрики позволяют определить производительность продукта и являются релевантными по отношению к внешним метрикам.

Внешние и внутренние метрики задаются на этапе формирования требований к программному обеспечению предметом планирования и управления достижением качества конечного программного продукта.

Метрики продукта часто описываются комплексом моделей для установки различных свойств, значений модели качества или прогнозирования. Стандарт ISO/IEC 9126-2 определяет следующие типы мер:

• мера размера программ в разных единицах измерения (число функций, строк в программе, размер дисковой памяти и др.);

• мера времени (функционирования системы, выполнения компонента и др.);

• мера усилий (производительность труда, трудоемкость и др.);

• мера учета (количество ошибок, число отказов, ответов системы и др.).

Примером широко используемых метрик программных продуктов являются

метрики Холстеда — это характеристики программ, выявляемые на основе статической структуры программы на конкретном языке программирования: число вхождений наиболее часто встречающихся операндов и операторов; длина описания программы как сумма числа вхождений всех операндов и операторов и др.

Метрики процесса включают время разработки, число ошибок, найденных на этапе тестирования и др. Практически используются следующие метрики процесса:

• общее время разработки и отдельно время для каждой стадии;

• время модификации моделей;

• время выполнения работ на процессе;

• число найденных ошибок при инспектировании;

• стоимость проверки качества;

• стоимость процесса разработки.

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

Рассмотрим подробно метрики программного продукта, базирующиеся на статистическом анализе текстов программ. К ним относятся:

• метрики, основанные на лексическом анализе программ,

• метрики структурной сложности.

Лингвистические исследования количественных характеристик текстов позволили установить ряд эмпирических закономерностей, имеющих важное значение и в текстах программ на языках высокого уровня. Результаты таких исследований впервые были опубликованы в работе М. Холстеда [4]. Любая программа определяет некоторое упорядоченное множество действий над операндами с помощью операторов. Операнд - это некоторая постоянная или переменная величина, обрабатываемая в программе, а оператор представляет собой обозначение конкретного действия, выполняемого по отношению к операнду.

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

• nul - число отдельных (уникальных) операторов в программе;

• nu2 - число отдельных (уникальных) операндов в программе;

• N1 - общее число всех операторов в программе;

• N2 - общее число всех операндов в программе;

• flj - частота встречаемости j-го оператора в программе, где j = 1,2, „.nul;

• f2i - частота встречаемости i-го операнда в программе, где i = 1,2, ...nu2.

Лля выше перечисленных характеристик справедливы следующие соотношения:

nul nu2

Nl = X flj N2 = x f2i

j=l i=l

Учитывая эти основные метрические характеристики для программы, можно определить:

n=nu1+nu2 — словарь программы,

N=N1+N2 — длина реализации программы,

N'= nu1*log2(nu1) + nu2*log2(nu2) — теоретическая длина программы (для стилистически корректных программ отклонение N от N' не превышает 10%)

V=N*log2n — объем программы,

L'=2*nu2/(nu1*N2) - уровень программы,

Ep = N'* log2n/L' - оценка трудоемкости разработки программы,

Ec = V/L' - оценка трудоемкости изучения программы.

Словарь программы - это сумма отдельных операторов и отдельных операндов программы, длина реализации равна сумме всех операторов и операндов. Длина реализации программы N может быть близко аппроксимирована как функция N'(n1,n2), эта аппроксимация является достаточно точной для хорошо написанных программ.

Оценка объема программы V представляет собой объем программы в битах, делая его независимым от набора символов языка, на котором написана программа. Уровень программы является мерой краткости реализации алгоритма. Наивысшим уровнем, на котором может быть представлен алгоритм, представляется в форме вызова процедуры. Уровень такого представления равен 1. Более длинные представления алгоритма, включающие много операторов и повторяющееся использование операндов, имеют более низкий уровень.

По определению уровень L=V/V*, где V* — объем операции, выраженной в виде вызова процедуры. Определение V* — непростая задача, поэтому используют оценку уровня L' по формуле: L'=2*nu2/(nu1*N2).

Предполагая, что трудоемкость программирования возрастает при увеличении объема программы и уменьшается при увеличении уровня, Холстед предложил в качестве трудоемкости разработки программы оценку Ep, получаемую по формуле: Ep =V/L = N'* log2n/L' .

Для оценки трудоемкости изучения текста программы была предложена оценка Ec, которая вычисляется по формуле: Ec=V/N'.

Были проведены эксперименты, подтверждающие практичность метрической теории программ для различных языков высокого уровня [5].

Структурная сложность программ определяется:

• количеством взаимодействующих компонентов;

• сложностью взаимодействия;

• числом связей между компонентами.

На уровне программной единицы (процедуры, подпрограммы) структурную сложность можно оценить с помощью метрики Мак-Кейба [6]. Мак-Кейб выполнял численные измерения независимых путей выполнения в программах на основе анализа их исходных текстов и предложил в качестве меры сложности тестирования программ использовать цикломатическое число управляющего графа программы.

Любая программа (или алгоритм) представляется в виде управляющего ориентированного графа G=(V,E) c V вершинами и E дугами, где вершины соответствуют операторам, а дуги определяют передачи управления от одного оператора к другому. Такой граф называется графом потока управления или управляющим графом программы. Цикломатическое число управляющего графа программы определяется по формуле: Cm=m-n+2,

где m — количество дуг графа, n - число вершин графа.

Метрика Мак-Кейба Cp или цикломатическая сложность программы (или подпрограммы) - это число линейно независимых маршрутов, проходящих через программный код, она равно цикломатическому числу управляющего графа программы, увеличенному на 1, Cp=Cm+1. Метрику Мак-Кейба можно определять на основе статического анализа текста программы следующим образом:

Ср=1, если программа линейной структуры, т. е. не включает операторы IF-ELSE, CASE и циклы.

В общем случае, если программа включает условные операторы и циклы, то

Ср = CI+CLOOP+ICASE +1;

где CI — число условных операторов; CLOOP — число операторов цикла; ICASE — число ветвей в операторах CASE.

Рассмотрим возможности автоматизации определения, анализа и визуализации метрических характеристик программ. Примеры практического освоения методов метрического оценивания программ и задания для лабораторных работ представлены в практикуме Черникова Б.В. и Поклонова Б.Е. [7]. В данном учебном пособии студентам предлагается вручную просматривать тексты простых программ и оценивать их с использованием метрик. Лля более сложных программ объем ручных расчетов существенно возрастает, что приводит к ошибкам в оценке программного обеспечения. В связи с этим становится актуальной проблема разработки инструментальных программных средств поддержки процесса оценивания качества программного обеспечения. Примером такой программы является разработанная автором программа MERA, предназначенная для оценивания сложности программ на языке MODULA-2 и описанная в [8, 9].

Язык MODULA-2 - это паскаль — подобный язык программирования, разработанный Н. Виртом для создания системного программного обеспечения в 1977 году в Институте информатики г. Цюриха. Язык Модула-2 — структурный, модульный язык программирования, с синтаксисом, основанным на языке

Паскаль. Компиляторы языка Модула-2 были разработаны для персональных ЭВМ, работающих под управлением операционной системы MS DOS, в начале 90-х годов прошлого века.

Программа MERA предназначена для автоматизации вычисления метрических характеристик сложности программ на языке Модула-2. Исходными данными для подсистемы является синтаксически правильный текст программного модуля или модуля реализации, содержащий произвольное количество вложенных процедур. Программа MERA является статическим анализатором исходного текста программ и выполняет следующие функции:

— определение метрических характеристик модуля;

— определение метрических характеристик вложенных процедур;

— вычисление суммарных метрик сложности и трудоемкости разработки модуля.

Результаты записываются текстовый файл, имя которого совпадает с именем модуля, а расширение — .mtr. Пример файла метрик приведен ниже.

Программа MERA выполняет следующие действия:

1. Вводит имя файла, в котором находится измеряемая программа пользователя. Файл имеет расширение ".mod"

2. Формирует имя файла, в который записывается метрические характеристики. Файл имеет имя <имя программы>.т^

3. Текст программы пользователя считывается в оперативную память в массив TEXTPGM и формируется таблица внутренних процедур с помощью процедуры VVODMOD.

4. Затем в цикле производится анализ текста модуля и входящих в него процедур и расчет метрик.

5. Тексты процедур считываются в оперативную память с помощью процедуры VVODPRC.

6. Для модуля подсчитывается число импортируемых процедур с помощью процедуры CHETIMP; для процедуры — число параметров KPAR с помощью процедуры PARPROC.

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

7. Определение числа констант NCS производится с помощью процедуры CHETCONS.

8. Анализ описаний переменных и построение таблицы переменных производится процедурой CHETVAR.

9. С помощью процедуры CHETOPR производится анализ текста выполняемых операторов программы пользователя, построение таблицы операторов TABOPR и определение следующих элементарных метрик программы:

ETA1 — ЧИСДО ОТДЕДЬНЫХ ОПЕРАТОРОВ;

ETA2 — ЧИСДО ОТДЕДЬНЫХ ПЕРЕМЕННЫХ;

NO1 — ОБЩЕЕ ЧИСДО ОПЕРАТОРОВ;

NO2 — ОБЩЕЕ ЧИСДО ИСПОДЬЗОВАНИЙ ПЕРЕМЕННЫХ;

ICASE -ОБЩЕЕ ЧИСДО АДЬТЕРНАТИВ В ОПЕРАТОРАХ CASE.

10. На основе этих элементарных характеристик производится подсчет метрик Холстеда процедурой HMETRIC и топологических метрик с помощью процедуры FPMERA. Выходные результаты записываются в файл с именем <имя программы>.т^.

Пример файла метрических характеристик. MODULE TEST4;

(* ВСТРОЕННЫЕ ФУНКЦИИ ОБРАБОТКИ СТРОК *) FROM InOut IMPORT ReadString, WriteString, WriteCard, WriteLn, WriteInt; FROM Strings IMPORT Concat, CompareStr, Assign, Copy, Delete,

Insert, Length, Pos; VAR S1,S2: ARRAY[0..80] OF CHAR; STR: ARRAY[0..80] OF CHAR;

I: CARDINAL; CHR : CHAR; BEGIN

WriteString(' ВВЕДИТЕ СТРОКУ '); WriteLn; ReadString(STR); WriteLn; WriteString(STR); WriteLn; WriteString(' ПРИСВАИВАНИЕ '); WriteLn; WriteString('Assing(STR,S1) S1= '); Assign(STR,S1); WriteString(Sl); WriteLn; WriteString(' КОНКАТЕНАЦИЯ СТРОК '); WriteLn; WriteString('Concat(STR,S1,S2) S2= '); Concat(STR,S1,S2); WriteString(S2); WriteLn;

WriteString(' ПЕРЕСЫЛКА СТРОКИ '); WriteLn; WriteString('Copy(S1,1,3,S2) S1,S2= ');

Copy(S1,1,3,S2); WriteString(S1); WriteLn; WriteString(S2); WriteLn; WriteString(' ДЛИНА СТРОКИ '); WriteLn; WriteString('Length(STR) '); WriteLn; I:=Length(STR); WriteString('STR= '); WriteString(STR); WriteString(' Length(STR)= '); WriteCard(I,4); WriteLn; WriteString(' УДАЛЕНИЕ СТРОКИ '); WriteLn; WriteString('Delete(STR,1,6) STR= '); Delete(STR,1,6); WriteString(STR); WriteLn; WriteString(' ВСТАВКА ПОДСТРОКИ '); WriteLn; WriteString('Insert("***",STR,4) STR= '); Insert('***',STR,4); WriteString(STR); WriteLn;

WriteString(' ОПРЕДЕЛЕНИЕ ПОЗИЦИИ ПОДСТРОКИ '); WriteLn; WriteString('Pos("***",STR) '); I:=Pos('***',STR); WriteCard(I,4); WriteLn; WriteString('Pos("***",S1) '); I:=Pos('***',S1); WriteCard(I,4); WriteLn; I:=Length(S1); WriteString('Length(S1) = '); WriteCard(I,4); WriteLn; WriteString(' СРАВНЕНИЕ СТРОК '); WriteLn; WriteString('CompareStr(S1,STR)= ' ); WriteInt(CompareStr(S1,STR),4); END TEST4.

МЕТРИЧЕСКИЕ ХАРАКТЕРИСТИКИ МОДУЛЯ TEST4 В МОДУЛЕ TEST4 НЕТ ОПИСАНИЙ ПРОЦЕДУР ДЛИНА МОДУЛЯ = 1972 ЧИСЛО СТРОК ИСХОДНОГО ТЕКСТА = 52 ЧИСЛО ИМПОРТИРУЕМЫХ МОДУЛЕЙ = 2

ЧИСЛО ИМПОРТИРУЕМЫХ ПРОЦЕДУР И ДРУГИХ ОБЪЕКТОВ = 13 В МОДУЛЕ TEST4 НЕТ ОПИСАНИЙ КОНСТАНТ

ЧИСЛО КОНСТАНТ ЫСБ = 0

ЧИСЛО ОБЪЯВЛЕНИЙ ПЕРЕМЕННЫХ ЕТА2= 5

ЧИСЛО ОПЕРАТОРОВ ЕТА1= 11

ЧИСЛО ПЕРЕМЕННЫХ ЕТА2= 5

ОБЩЕЕ ЧИСЛО ОПЕРАТОРОВ N01= 66

ОБЩЕЕ ЧИСЛО ИСПОЛЬЗОВАНИЙ ПЕРЕМЕННЫХ N02= 32

МЕТРИКИ ХОЛСТЕЛА

СЛОВАРЬ ПРОГРАММЫ — ЕТА = 16

ЛЛИНА ПРОГРАММЫ — N = 98

ОБЪЕМ ПРОГРАММЫ — V = 265.38892

ОЦЕНКА ЛЛИНЫ ПРОГРАММЫ — NH = 31.92203

УРОВЕНЬ ПРОГРАММЫ — LN = 0.02273

УСИЛИЯ НА ИЗУЧЕНИЕ ПРОГРАММЫ — ЕС = 11677.11247

УСИЛИЯ НА РАЗРАБОТКУ ПРОГРАММЫ — ЕР = 21068.53679

ПОТОКОВЫЕ МЕТРИКИ

МЕТРИКА МАК-КЕЙБА СР = 1

ОБОБЩЕННАЯ ПОТОКОВАЯ МЕТРИКА ГР = 41

* ТАБЛИЦА ПЕРЕМЕННЫХ

* ИМЯ ПЕРЕМЕННОЙ * ЧИСЛО ИСПОЛЬЗОВАНИЙ

и«

* Б1 * 8 *

* Б2 * 4 *

* БТН * 12 *

* I * 8 *

* CHR * 0 *

* ТАБЛИЦА ОПЕРАТОРОВ

* ИМЯ ОПЕРАТОРА 51! * ЧИСЛО ИСПОЛЬЗОВАНИЙ

* WriteString * 29 *

* WriteLn * 22 *

* ReadString * 1 *

* Assign * 1 *

* Concat * 1 *

* Copy * 1 *

!I! # _ * 4 *

* WriteCard * 4 *

* Delete * 1 *

* Insert * 1 *

* WriteInt * 1 *

СУММАРНЫЕ ЗНАЧЕНИЯ МЕТРИК

СУММАРНОЕ ЗНАЧЕНИЕ МЕТРИКИ УСИЛИЙ НА РАЗРАБОТКУ ЕРБиМ = 21068.53679

СУММАРНОЕ ЗНАЧЕНИЕ МЕТРИКИ УСИЛИЙ НА ИЗУЧЕНИЕ

БСБиМ = 11677.11247

СУММАРНОЕ ЗНАЧЕНИЕ МЕТРИКИ МАК-КЕЙБА СРБиМ = 1 СУММАРНОЕ ЗНАЧЕНИЕ ОБОБЩЕННОЙ ПОТОКОВОЙ МЕТРИКИ ЕРБиМ = 41

СУММАРНОЕ ЗНАЧЕНИЕ МЕТРИКИ "ЧИСЛО СТРОК В ПРОГРАММЕ НБТНБиМ = 52

СУММАРНОЕ ЗНАЧЕНИЕ МЕТРИКИ "ЛЛИНА ПРОГРАММЫ" ОЕБиМ = 1972

СУММАРНОЕ ЗНАЧЕНИЕ МЕТРИКИ "ЧИСЛО ОПЕРАТОРОВ" ШБУМ = 66

Заключение

Язык MODULA-2 не получил такого широкого применения, как языки программирования Pascal, C++ и C#. Тем не менее, выше описанный алгоритм анализа исходного кода и определения метрических характеристик сложности программ является основой для разработки статических анализаторов программного кода на языках Pascal, C++ и C# современных версий. Такие статические анализаторы могут использоваться в учебном процессе при проведении практических и лабораторных занятий по дисциплинам «Технология программирования» и «Метрология программного обеспечения».

- СПИСОК ЛИТЕРАТУРЫ

1. Липаев В. В. Выбор и оценивание характеристик качества программных средств. Методы и стандарты. М: СИНТЕГ, 2001, -228 с.

2. Липаев В. В. Программная инженерия. Методологические основы. Учебник. — Москва: Теис, 2006.- 608 с.

3. http //swebok.sorlik.ru/10_software_quality.html

4. M. Halstead Elements of software science. 1977. Purdue University/ Имеется русский перевод — Холстед М. Начала науки о программах: пер. с англ. М.: Финансы и статистика, 1981. - 128 с.

5. Gordon R. D. Measuring improvement in program clarity. - IEEE Transations of software engineering, v. SE-5, N 2, 1979, c. 79-90.

6. McCabe T. J. A complexity measure. - IEEE Transations of software engineering, v. SE-2, N 4, 1976, c. 308-320.

7. Черников Б.В., Поклонов Б.Е. Оценка качества программного обеспечения: Практикум: Учебное пособие. М.: ИД ФОРУМ, 2012.- 400 с.

8. Инструментальная система тестирования, отладки и оценки качества программ на языке Модула-2. Отчет о НИР. ДЕП.№ 90.Г20428. НИОВТ МЭИ, 1990, 2-й, промежуточный — 41 с. Научный руководитель: Рякин О.М.

9. Программная документация по инструментальной системе программирования на языке Модула-2. Отчет о НИР. ДЕП. №91.Г27021. НИОВТ МЭИ, 1991, 3-й, заключительный, 61 с. Научный руководитель: Рякин О.М. ШНЭ

КОРОТКО ОБ АВТОРЕ -

Карпович Елена Евгеньевна - доцент кафедры САПР, Московский государственный горный университет, [email protected]

i Надоели баннеры? Вы всегда можете отключить рекламу.