Реализация жизненного цикла программного обеспечения

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

Рубрика Программирование, компьютеры и кибернетика
Вид лабораторная работа
Язык русский
Дата добавления 20.09.2016
Размер файла 1,7 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

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

Размещено на http://www.allbest.ru/

Федеральное агентство связи

Федеральное государственное образовательное бюджетное учреждение

высшего профессионального образования

«Сибирский государственный университет телекоммуникаций и информатики»

(ФГОБУ ВПО «СибГУТИ»)

Кафедра математического моделирования бизнес-процессов

ИНДИВИДУАЛЬНОЕ ЗАДАНИЕ

По дисциплине «Программная инженерия»

Тема: Реализация жизненного цикла программного обеспечения

Новосибирск - 2015

Реферат

46 стр., 22 рис., 8 табл., 5 прил.

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

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

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

Работа может быть использована для дальнейших разработок по выполнению работ.

ТАБЛИЦА, СУЩНОСТЬ, ПРОГРАММНЫЙ ПРОДУКТ, РЕФАКТОРИНГ, ОХРАННАЯ СЛУЖБА, ЗАДАЧА, ТЕСТИРОВАНИЕ, ФУНКЦИОНАЛЬНЫЕ ТРЕБОВАНИЯ, НЕФУНКЦИОНАЛЬНЫЕ ТРЕБОВАНИЯ, IDEF0, ЧЕРНЫЙ ЯЩИК, MS VISUAL STUDIO, LIFO, СОРТИРОВКИ

Обозначения и сокращения

ПО - программное обеспечение

MS - Microsoft

VS - VisualStudio

ФИО - Фамилия Имя Отчество

LIFO - LastInFirstOut(последний пришел, первый вышел)

Введение

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

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

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

Данная тема актуальна в современном мире, потому что большинство компаний переходит на электронные системы и всё больше заказчиков в этой области.

Задание на разработку ИС

При выполнении лабораторных работ была установлена системная программа для реализации ПО, а именно MicrosoftVisualStudio 2015 Community, в которой использовался язык C#.

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

Данное ПО было протестировано различными способами, все ошибки исправлены и прокомментированы, было посчитано среднее время работы программы на различных платформах.

Вариант 2.

№ вар.

Предметная область

Вид списка

Методы сортировки

2.

Ювелирный магазин: названия изделий, комитенты (кто сдал на комиссию), журнал сдачи изделий на продажу, журнал покупки изделий.

Очередь FIFO

2,12,20

Сортировки:

2

Сортировка пузырьком

12

Сортировка слиянием

20

Сортировка извлечением

Основная часть

Лабораторная работа №1

Тема: Постановка задачи на создание программного продукта

Цель: изучение и системное представление бизнес-процессов, подлежащих программированию, приобретение навыков системного анализа объектов и процессов реального мира на предмет организации программного управления.

Ход работы

В рассматриваемом бизнес-процессе участвуют следующие субъекты: названия изделий, комитенты, журнал сдачи изделий на продажу, журнал покупки изделий.

Цель процесса: Учет продажи ювелирных изделий, сданных на комиссию и классифицированных по названиям.

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

Вся полученная информация хранится у главного сотрудника фирмы, который формирует отчетность.

Из Базы Данных можно получить такую информацию, как:

1. Количество изделий (название, дата сдачи, дата выдачи, дата продажи)

2. Провести сортировку по дате сдачи на комиссию и выдачи на продажу.

Бизнес-процесс можно разбить на следующие подзадачи, для наглядности была построена организационная диаграмма:

1) Сдача ювелирных изделий на комиссию

2) Создание журнала учета с названиями изделий

3) Учет изделий сданных на продажу в журнале

4) Учет проданных изделий в журнале

Описание:

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

Создание журнала учета с названиями изделий: Классификация изделий по названию, весу, металлу.

Учет изделий сданных на продажу в журнале: Список изделий, сданных на комиссию и сданных на продажу.

Учет проданных изделий в журнале: Учет проданных изделий из имеющихся, сданных.

При выполнении бизнес-процесса выполняются следующие операции:

· Сдача юв.изделий на комиссию

· Составление договора между комитетом и комиссионером

· Создание журнала учета

· Классификация изделий по характеристикам

· Учет изделий сданных на продажу

· Учет проданных изделий

· Выбор в консоли необходимых параметров сортировки

· Выбор периода

· Вывод информации на экран

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

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

Лабораторная работа №2

Техническое задание на создание программного обеспечения

Цель: Освоение методики предварительного анализа разрабатываемой программы; освоение задач формулирования функциональных и нефункциональных требований к программной реализации отдельных задач и к программе в целом; выработка навыков разработки технического задания.

Ход работы

1. Назначение и цель программы:

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

При создании ПО мы учитываем основные цели ради которых она создавалась. Автоматизация сортировки, упрощение заполнение данных, которые поступают в консоль. Также возможность получения нужной информации/отчета по предприятию на данный момент. Это позволит упростить ввод данных и сортировку по выбранным признакам, сократит время поиска необходимой информации в БД.

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

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

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

В ходе разработки программы необходимо реализовать ряд задач:

1) Создание в БД нового объекта (Вид запроса (сдача/покупка) - ФИО комитента - Номер телефона - Вид изделия - Характеристика)

2) Заполнение значений атрибутов объекта

3) Сохранение значений (формирование журнала об изделиях)

5) Формирование статистики о работе (продаже изделий).

6) Чек/накладная.

7) Доступ к БД с любого ПК на котором установлено ПО

3. Функциональные требования к программе:

3.1 Требования к задаче «Создание в базе данных нового объекта

В консоли программы выбрать из списка «Создать запись». Требуется прописать первичную информацию через пробел:

· ФИО комитента (полностью). Поле не может быть пустым, допустимые символы -буквы

· Вид запроса (сдача/покупка). Поле не может быть пустым, допустимые символы -буквы

· Номер телефона - Поле не может быть пустым, допустимые символы -цифры

· Вид изделия. Требования: поле не может оставаться пустым, допустимые символы - буквы

· Характеристика изделия - Поле не может быть пустым, допустимые символы - буквы, цифры

· Дата - Поле не может быть пустым, допустимые символы -цифры

Пример ввода:

Сдача

Быков В.Е

Серьги

Золото 585

12.10.13

После заполнение строки в консоли при нажатии на ENTER создается запись о сданном изделии. Источником назначения и записи служит сотрудник юв.магазина.

3.2 Требования к задаче «Заполнение значений заранее заданных атрибутов объекта»

После выполнения предыдущего пункта в базе данных (стеке) появляется запись

3.3 Редактирование ранее созданной записи и сохранение в БД новой информации.

После создания новой записи есть возможность вернуться к ней, путем выбора из списка. Сохранение данных осуществляется путем выбора пункта «5.Сохранение БД» в консоли, и вводе названия файла, после чего запись заносится в файл БД

3.4Требования к задаче «Составление результатов в журнале по заданным параметрам»

В консоли программы прописывается пункт «4.Статистическая обработка» При выборе данного пункта пользователь попадает в подпункты по параметрам:

· Дата

· Вид изделия

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

При выборе определённого подпункта формируется отчет и выводится в консоль

3.5 Требования к задаче «Формирование отчета по всем записям»

Для реализаций этой задачи требуется написать пункт «2. Отчет по всем записям из файла» в главном корне консоли этой программы.

3.6 Требование к задаче «Доступ к БД с любого ПК на котором установлено ПО»

Данное требование обязательно для исполнения. Для того что бы оно работало надо перенести ПО и БД файл на другой ПК.

Разрабатываемая программа должна базироваться на ОС Windows 7/8/8.1/10.

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

4. Нефункциональные требования

Из нефункциональных свойств необходимо выделить:

· Удобство интерфейса - использование графического вида так и консольного не повлияет на работу специалиста на ПО для данного предприятия

· Безопасность данных - не является обязательной функцией

· Обязательный язык программы - русский

· Хранение данных должно осуществляется до тех пока это необходимо

Лабораторная работа №3

Тема: Разработка функциональной структуры программного обеспечения

Ход работы

Построим функциональную модель разрабатываемого ПО в виде контекстной диаграммы в нотации IDEF0 при помощи пакета BPWin.

Рисунок 1. Диаграмма IDEF0

Рисунок 2. 1-ая Декомпозиция

Рисунок 3. Этапы процесса А1

Рисунок 4. Этапы процесса А2

Рисунок 5. Этапы процесса А3

Описание стрелок диаграмм в виде таблиц

Таблица 3.1 Описание стрелок диаграммы А0

Наименование стрелки

Тип стрелки

Источник стрелки

Приемник стрелки

Список изделий

Input

Внешняя граница

Специальное ПО для автоматизации учета контроля на предприятии

Заявка на сдачу/покупку изделия

Input

Внешняя граница

Специальное ПО для автоматизации учета контроля на предприятии

Журнал изделий

Output

Специальное ПО для автоматизации учета контроля на предприятии

Внешняя граница

Журнал статистики о работе

Output

Специальное ПО для автоматизации учета контроля на предприятии

Внешняя граница

Кодекс РФ

Control

Внешняя граница

Специальное ПО для автоматизации учета контроля на предприятии

Администратор

Mechanism

Внешняя граница

Специальное ПО для автоматизации учета контроля на предприятии

Таблица 3.2 Описание стрелок 1-ой декомпозиции

Наименование стрелки

Тип стрелки

Источник Стрелки

Приемник стрелки

Список изделий

Input

Внешняя граница

Ввод и изменение данных

Заявка на сдачу/покупку изделия

Input

Внешняя граница

Ввод и изменение данных

Администратор

Mechanism

Внешняя граница

Ввод и изменение данных

Кодекс РФ

Control

Внешняя граница

Правила ухода за ювелирными изделиями

Информация об изделиях и заявках

Internal

Ввод и изменение данных

Формирование списка изделий

Журнал изделий

Output

Формирование списка изделий

Внешняя граница

Журнал статистики о работе

Output

Формирование списка продаж/сдачи изделий на продажу

Внешняя граница

Администратор

Mechanism

Внешняя граница

Формирование списка изделий

Администратор

Mechanism

Внешняя граница

Формирование списка продаж/сдачи изделий на продажу

Таблица 3.3 Описание стрелок этапов процесса А1

Наименование стрелки

Тип стрелки

Источник стрелки

Приемник стрелки

Список изделий

Input

Внешняя граница

Получение данных о товаре

Заявка на сдачу/покупку изделия

Input

Внешняя граница

Получение данных о заявке

Введенные данные

Internal

Получение данных о товаре

Проверка данных

Информация об изделиях и заявках

Output

Проверка данных

Внешняя граница

Администратор

Mechanism

Внешняя граница

Получение данных о заявке

Администратор

Mechanism

Внешняя граница

Получение данных о Товаре

Таблица 3.4 Описание стрелок этапов процесса А2

Наименование стрелки

Тип стрелки

Источник стрелки

Приемник стрелки

1

2

3

4

Информация об изделиях и заявках

Input

Внешняя граница

Подготовка персонала

Отсортированный список изделий

Internal

Сортировка изделий по виду

Формирование и изменение данных о заявках

Данные

Internal

Формирование и изменение данных о заявках

Сохранение данных

Кодекс РФ

Control

Внешняя граница

Подготовка персонала

Журнал изделий

Output

Сохранение данных

Внешняя граница

Статистика

Output

Сохранение данных

Внешняя граница

Администратор

Mechanism

Внешняя граница

Сортировка изделий по виду

Администратор

Mechanism

Внешняя граница

Формирование и изменение данных о заявках

Таблица 3.5 Описание стрелок этапов процесса А3

Наименование стрелки

Тип стрелки

Источник стрелки

Приемник стрелки

1

2

3

4

Информация об изделиях и заявках

Input

Внешняя граница

Сортировка заявок

Сведения

Internal

Сортировка заявок

Составление журнала статистики о работе

Журнал статистики о работе

Output

Составление журнала статистики о работе

Внешняя граница

Администратор

Mechanism

Внешняя граница

Сортировка заявок

Вывод: В результате выполнения данной лабораторной работы нами была построена функциональная модель разрабатываемого ПО в виде контекстной диаграммы в нотации IDEF0.Также была создана диаграмма декомпозиции А0 на дочерние подпроцессы (задачи) и для всех функциональных блоков диаграммы А0 построены диаграммы декомпозиции А2 на подзадачи.

Лабораторная работа №4

Тема: Разработка программного кода. Рефакторин

Цель: освоение средства разработки программного кода MS VisualStudio для программирования алгоритмов внутренней сортировки, изучение и освоение применения процедуры рефакторинга для улучшения программного кода.

Ход работы

Сортировка пузырьком - простейший алгоритм сортировки, применяемый чисто для учебных целей. Практического применения этому алгоритму нет, так как он не эффективен, особенно если необходимо отсортировать массив большого размера. К плюсам сортировки пузырьком относится простота реализации алгоритма. Алгоритм сортировки пузырьком сводится к повторению проходов по элементам сортируемого массива. Проход по элементам массива выполняет внутренний цикл. За каждый проход сравниваются два соседних элемента, и если порядок неверный элементы меняются местами. Внешний цикл будет работать до тех пор, пока массив не будет отсортирован. Таким образом внешний цикл контролирует количество срабатываний внутреннего цикла Когда при очередном проходе по элементам массива не будет совершено ни одной перестановки, то массив будет считаться отсортированным. Для реализации был выбран массив из 5 элементов, имеющих строковый тип и хранящих наименования ювелирных изделий. string[] myArray = { "Серьги", "Кольцо", "Ожерелье", "Кулон", "Подвеска" };

Алгоритм сортировки пузырьком массива Arrayиз 5 элементов:

1. Если первый элемент больше второго - меняем местами

2. Если второй больше третьего - меняем местами

3. Если третий больше четвертого - меняем местами

4. Если четвертый больше пятого - меняем местами

5. Если первый элемент больше второго - меняем местами

6. Если второй больше третьего - меняем местами

7. Если третий больше четвертого - меняем местами

8. Если четвертый больше пятого - меняем местами

9. Если первый элемент больше второго - меняем местами

10. Если второй больше третьего - меняем местами

11. Если третий больше четвертого - меняем местами

12. Если четвертый больше пятого - меняем местами

13. Если первый элемент больше второго - меняем местами

14. Если второй больше третьего - меняем местами

15. Если третий больше четвертого - меняем местами

16. Если четвертый больше пятого - меняем местами

17. Если первый элемент больше второго - меняем местами

18. Если второй больше третьего - меняем местами

19. Если третий больше четвертого - меняем местами

20. Если четвертый больше пятого - меняем местами

Листинг программы реализующий алгоритм сортировки слиянием для массива из 5 элементов (Приложение 1)

ФункцияString.Compare(arg1,arg2) производит сравнение строк arg1 и arg2, и возвращает отрицательное число если первая предшествует второй при сортировке, ноль - если строки равны, положительное число - если первая следует после второй.

Сложность алгоритма равна О(n*(n-1)).

Листинг модифицированного программного кода:

using System;

usingSystem.Collections.Generic;

usingSystem.Linq;

usingSystem.Text;

namespaceProgEng

{

classProgram

{

staticvoid Main(string[] args)

{

string[] myArray = { "Серьги", "Кольцо", "Ожерелье", "Кулон", "Подвеска" };

Console.WriteLine("{0}, {1}, {2}, {3}, {4}.", myArray[0], myArray[1], myArray[2], myArray[3], myArray[4]);

string s;

for (inti = 0; i<myArray.Length; i++)

for (int j = 1; j <myArray.Length; j++)

if (String.Compare(myArray[j - 1], myArray[j]) > 0)

{

s = myArray[j];

myArray[j] = myArray[j - 1];

myArray[j - 1] = s;

}

Console.WriteLine("{0}, {1}, {2}, {3}, {4}.", myArray[0], myArray[1], myArray[2], myArray[3], myArray[4]);

Console.ReadLine();

}

}

}

Описание:

Внешнийциклfor(inti=0;i<myArray.Length;i++) служит для повторения процесса прохода по массиву 5 раз.

Циклfor(intj=1;j<myArray.Length;j++)нужен для сравнения всех соседних элементов массива.

Рисунок 6. Скриншот работы программы

Вывод

В данной программе мы освоили средства разработки программного кода MS Visual Studio для программирования алгоритмов внутренней сортировки, изучили и освоили применения процедуры рефакторинга для улучшения программного кода. Создали консольное приложение, реализовали алгоритм и сортировку.

Лабораторная работа №5

инженерия программный код

Тема: Сборка и анализ программного продукта

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

Ход работы

Очередь FIFO (акроним First In, First Out - «первым пришёл - первым ушёл») - способ организации и манипулирования данными относительно времени и приоритетов. Это выражение описывает принцип технической обработки очереди или обслуживания конфликтных требований путём упорядочения процесса по принципу: «первым пришёл - первым обслужен» (ПППО). Тот, кто приходит первым, тот и обслуживается первым, пришедший следующим ждёт, пока обслуживание первого не будет закончено, и так далее.

Этот принцип аналогичен поведению лиц, стоящих в очереди, когда люди получают обслуживание в том порядке, в котором они занимали очередь. То же самое происходит, например, на нерегулируемом перекрёстке, когда водители ожидают своей очереди на продолжение движения (в американских ПДД нет правила «помеха справа», приоритет определяется по принципу FIFO). ПППО также используется как сокращённое название для алгоритма FIFO планирования работы операционной системы, по которому процессорное время выделяется каждому процессу в порядке их поступления на обслуживание. В более широком смысле, абстракция LIFO или Last-In-First-Out («последним пришёл - первым ушёл») является противоположностью абстракции FIFO. Разница, возможно, станет яснее, если принять во внимание реже используемый синоним FILO, означающий First-In-Last-Out («первым пришёл - последним ушёл»). В сущности, обе абстракции являются конкретными случаями более общего понятия работы со списком. Разница не в списке (данных), а в правиле доступа к содержимому. В первом случае добавление делается к одному концу списка, а снятие с другого, во втором случае добавление и снятие делается на одном конце.

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

Алгоритм состоит из повторяющихся проходов по сортируемому массиву. За каждый проход элементы последовательно сравниваются попарно и, если порядок в паре неверный, выполняется обмен элементов. Проходы по массиву повторяются N-1 раз или до тех пор, пока на очередном проходе не окажется, что обмены больше не нужны, что означает - массив отсортирован. При каждом проходе алгоритма по внутреннему циклу, очередной наибольший элемент массива ставится на своё место в конце массива рядом с предыдущим «наибольшим элементом», а наименьший элемент перемещается на одну позицию к началу массива («всплывает» до нужной позиции, как пузырёк в воде, отсюда и название алгоритма).

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

Сортировка слиянием - стабильный алгоритм сортировки. Это означает, что порядок «равных» элементов не изменяется в результате работы алгоритма. В некоторых задачах это свойство достаточно важно.

Сортировка извлечением (методом простого включения: сдвиг-вставка, вставками, вставка и сдвиг)

Хотя этот метод сортировки намного менее эффективен, чем сложные алгоритмы (такие как быстрая сортировка), у него есть ряд преимуществ:

1. прост в реализации;

2. эффективен на небольших наборах данных, на наборах данных до десятков элементов может оказаться лучшим;

3. эффективен на наборах данных, которые уже частично отсортированы;

4. это устойчивый алгоритм сортировки (не меняет порядок элементов, которые уже отсортированы);

5. может сортировать массив по мере его получения;

6. не требует временной памяти, даже под стек.

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

Ход работы

Запустим программу и загрузим данные из файла:

Рисунок 7. Запуск программы

Перейдем к работе с данными

Рисунок 8. Работа с данными

Удалим пару элементов:

Рисунок 9. Удаление элементов

Добавим элемент:

Рисунок 10.

Отсортируем по фамилии:

Рисунок 11.

По типу операции:

Рисунок 12. Сортировка по типу операции

По типу украшения:

Рисунок 13.Сортировка по типу украшения

Вывод числа совершенных операций:

Рисунок 14. Вывод числа совершенных операций

Листинг программы:

Класс Data- данные, состоящие из трех строковых параметров (фамилия сотрудника, район и тип преступления)

using System;

usingSystem.Collections.Generic;

usingSystem.Linq;

usingSystem.Text;

namespaceProgEng

{

classData

{

string name { get; set; }//Фамилия

string type { get; set; }//Тип операции

string vid { get; set; }//Продукция

stringsostav { get; set; }//Состав

public Data(string name, string type, string vid, stringsost)//конструктор

{

this.name = name;

this.type = type;

this.sostav = sost;

this.vid = vid;

}

publicstringReturnData()//Возвращает всю информацию в виде одной строки

{

return name + " " + type + " " + vid + " " + sostav;

}

publicstaticintNameCompare(Data d1, Data d2)//Сравнивает 2 объекта по полю фамилия

{

returnString.Compare(d1.name, d2.name);

}

publicstaticintTypeCompare(Data d1, Data d2)//Сравнивает 2 объекта по полю тип сделки

{

returnString.Compare(d1.type, d2.type);

}

publicstaticintVidCompare(Data d1, Data d2)//Сравнивает 2 объекта по полю вид продукции

{

returnString.Compare(d1.vid, d2.vid);

}

publicstaticintSostavCompare(Data d1, Data d2)//Сравнивает 2 объекта пополю состав изделия

{

returnString.Compare(d1.sostav, d2.sostav);

}}}

Класс List - реализует экземпляр односвязного списка с указателемна следующий и полем с данными. (Приложение 2)

Класс FIFO - хранит ссылку на первый элемент очереди и позволяет работать с ней, осуществляя операции добавления (в конец), удаления (из начала) и сортировки. (Приложение 3)

Класс Program - описывает интерфейс программы, осуществляющей работу с экземпляром класса FIFO, и позволяет считывать и сохранять информацию в файл. (Приложение 4)

Лабораторная работа №6

Тема: Управление качеством программного продукта

Цель: Освоение методики обеспечения качества разработанного программного кода, тестирования программы в ручном режиме, анализ производительности.

Ход работы

Стрессовое тестирование:

Считаем список из файла, введем в команду цифру 5:

Рисунок 6.1 Вывод команды

Программа укажет, что такой команды нет.

Перейдем к работе со списком, попробуем добавить элемент из двух строк:

Рисунок 6.2 Добавим элемент из двух строк

Программа укажет на неверное число элементов.

Время работы сортировок (в тактах процессора)

AMDFX6300 3.51ГГц, 8Гб ОЗУ

Таблица 6.1

Sort1

2955

8166

36615

6398984

60003594

Sort2

2929

3550

4921

36984

138195

Sort3

1071

3504

17475

1567697

13017903

Размер

10

50

100

500

1000

Intel Atom CPU N2800 1.86ГГц, 2ГбОЗУ

Таблица 6.2

Sort1

7588

16765

85676

14234642

120346543

Sort2

3540

4801

6737

92887

436058

Sort3

3577

6265

38562

3107200

22409739

Размер

10

50

100

500

1000

Intel Core i3-2348M 2.30 ГГц, 4ГБОЗУ

Таблица 6.3

Sort1

6201

8032

70254

10605410

73254744

Sort2

3205

4216

5632

50698

254398

Sort3

2433

4008

27152

2157252

18675438

Размер

10

50

100

500

1000

Рисунок 6.3 -Sort1. Сортировка пузырьком

Рисунок 6.4 -Sort2. Сортировка слиянием.

Рисунок 6.5-Sort3. Сортировка извлечением

Модифицированный код сортировки (Приложение 5)

Приложения

Приложение 1. (Лабораторная работа №4) Листинг программы, реализующий алгоритм сортировки слиянием для массива из 5 элементов

using System;

usingSystem.Collections.Generic;

usingSystem.Linq;

usingSystem.Text;

namespaceProgEng

{

classProgram

{

staticvoid Main(string[] args)

{

string[] myArray = { "Иванов Вадим", "Акинфеев Игорь", "Иванов Артем", "Петров Кирилл", "Николаев Игорь" };

string s;

if (String.Compare(myArray[0], myArray[1]) > 0)

{

s = myArray[1];

myArray[1] = myArray[0];

myArray[0] = s;

}

if (String.Compare(myArray[1], myArray[2]) > 0)

{

s = myArray[2];

myArray[2] = myArray[1];

myArray[1] = s;

}

if (String.Compare(myArray[2], myArray[3]) > 0)

{

s = myArray[3];

myArray[3] = myArray[2];

myArray[2] = s;

}

if (String.Compare(myArray[3], myArray[4]) > 0)

{

s = myArray[4];

myArray[4] = myArray[3];

myArray[3] = s;

}

if (String.Compare(myArray[0], myArray[1]) > 0)

{

s = myArray[1];

myArray[1] = myArray[0];

myArray[0] = s;

}

if (String.Compare(myArray[1], myArray[2]) > 0)

{

s = myArray[2];

myArray[2] = myArray[1];

myArray[1] = s;

}

if (String.Compare(myArray[2], myArray[3]) > 0)

{

s = myArray[3];

myArray[3] = myArray[2];

myArray[2] = s;

}

if (String.Compare(myArray[3], myArray[4]) > 0)

{

s = myArray[4];

myArray[4] = myArray[3];

myArray[3] = s;

}

if (String.Compare(myArray[0], myArray[1]) > 0)

{

s = myArray[1];

myArray[1] = myArray[0];

myArray[0] = s;

}

if (String.Compare(myArray[1], myArray[2]) > 0)

{

s = myArray[2];

myArray[2] = myArray[1];

myArray[1] = s;

}

if (String.Compare(myArray[2], myArray[3]) > 0)

{

s = myArray[3];

myArray[3] = myArray[2];

myArray[2] = s;

}

if (String.Compare(myArray[3], myArray[4]) > 0)

{

s = myArray[4];

myArray[4] = myArray[3];

myArray[3] = s;

}

if (String.Compare(myArray[0], myArray[1]) > 0)

{

s = myArray[1];

myArray[1] = myArray[0];

myArray[0] = s;

}

if (String.Compare(myArray[1], myArray[2]) > 0)

{

s = myArray[2];

myArray[2] = myArray[1];

myArray[1] = s;

}

if (String.Compare(myArray[2], myArray[3]) > 0)

{

s = myArray[3];

myArray[3] = myArray[2];

myArray[2] = s;

}

if (String.Compare(myArray[3], myArray[4]) > 0)

{

s = myArray[4];

myArray[4] = myArray[3];

myArray[3] = s;

}

if (String.Compare(myArray[0], myArray[1]) > 0)

{

s = myArray[1];

myArray[1] = myArray[0];

myArray[0] = s;

}

if (String.Compare(myArray[1], myArray[2]) > 0)

{

s = myArray[2];

myArray[2] = myArray[1];

myArray[1] = s;

}

if (String.Compare(myArray[2], myArray[3]) > 0)

{

s = myArray[3];

myArray[3] = myArray[2];

myArray[2] = s;

}

if (String.Compare(myArray[3], myArray[4]) > 0)

{

s = myArray[4];

myArray[4] = myArray[3];

myArray[3] = s;

}

Console.WriteLine("{0}, {1}, {2}, {3}, {4}.", myArray[0], myArray[1], myArray[2], myArray[3], myArray[4]);

Console.ReadLine();

}

}

}

Приложение 2. (Лабораторная работа №5)

using System;

usingSystem.Collections.Generic;

usingSystem.Linq;

usingSystem.Text;

namespaceProgEng

{

classList

{

privateData data;//Поледанных

privateListnext;//Указатель на следующий элемент

publicList(Datadata)//Конструктор нового элемента с заданными данными

{

this.data = data;

this.next = null;

}

publicList()//Конструктор пустого элемента

{

this.data = null;

this.next = null;

}

publicListInsertAt(inti, Data data)//Добавляет элемент в i-позицию

{

List s = newList(data);

if (i == 0)

{

s.next = this;

return s;

}

List l = this;

for (int j = 1; j <i; j++, l = l.next) ;

s.next = l.next;

l.next = s;

returnthis;

}

publicList Add(Data data)//Добавляет элемент в конец списка

{

if (this.data == null)

returnnewList(data);

List s = newList(data);

List l = this;

while (l.next != null)

l = l.next;

l.next = s;

returnthis;

}

publicListRemoveFrom(inti)//Удаляет элемент из i-позиции

{

if (i == 0)

returnthis.next;

List s = this;

for (int j = 1; j <i; j++, s = s.next) ;

s.next = s.next.next;

returnthis;

}

publicDataGet(int i)//Возвращает поле данных элемента i-позиции

{

List s = this;

for (int j = 0; j <i; j++, s = s.next) ;

returns.data;

}

publicintValue()//Возвращает кол-во элементов списка

{

if (this.data == null)

return 0;

List s = this;

int k = 0;

while (s != null)

{

s = s.next;

k++;

}

return k;

}

publicListSwapElem(int d1, int d2)//Меняетдваэлементаспискаместами

{

List s = this, l = this, k = this, f;

if (d1 == d2)//Если равны выходим сразу

return k;

for (inti = 1; i< d1; i++)//Ищемэлементподномером d1

s = s.next;

for (inti = 1; i< d2; i++)//Ищемэлементподномером d2

l = l.next;

if (d1 == 0)//Если d1 первый элемент

{

if (l == k)//Если d2 второй элемент

{

k = l.next;

l.next = k.next;

k.next = l;

return k;

}

s = k.next;//Если d2 не второй

k.next = l.next.next;

l.next.next = s;

s = l.next;

l.next = k;

return s;

}

if (d2 == 0)//Если d2 первый элемент

{

if (s == k)//Если d1 второй элемент

{

k = s.next;

s.next = k.next;

k.next = s;

return k;

}

l = k.next;//Если d1 не второй

k.next = s.next.next;

s.next.next = l;

l = s.next;

s.next = k;

return l;

}

if (s.next == l)//Если d1 стоит после d2

{

f = l.next;

l.next = f.next;

f.next = l;

s.next = f;

return k;

}

if (l.next == s)//Если d2 стоит после d1

{

f = s.next;

s.next = f.next;

f.next = s;

l.next = f;

return k;

}

f = l.next.next;//Все остальные случаи

l.next.next = s.next.next;

s.next.next = f;

f = l.next;

l.next = s.next;

s.next = f;

return k;

}

publicstaticintNameCompare(List L, int a, int b)//Сравнивает два элемента списка под номерами a и b по полю фамилия

{

int k = 0;

List La = L, Lb = L;

for (inti = 0; i< a; i++)

La = La.next;

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

Lb = Lb.next;

k = Data.NameCompare(La.data, Lb.data);

return k;

}

publicstaticintTypeCompare(List L1, List L2, int a, int b)//Сравнивает элемент из списка l1 под номером а иих l2 подномером b пополю тип сделки

{

int k = 0;

List La = L1, Lb = L2;

for (inti = 0; i< a; i++)

La = La.next;

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

Lb = Lb.next;

k = Data.TypeCompare(La.data, Lb.data);

return k;

}

publicstaticintVidCompare(List L, int a, int b)//Сравнивает два элемента списка под номерами a и b пополю вид продукции

{

int k = 0;

List La = L, Lb = L;

for (inti = 0; i< a; i++)

La = La.next;

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

Lb = Lb.next;

k = Data.VidCompare(La.data, Lb.data);

return k;

}

internalvoid View()

{

for (inti = 0; i<this.Value();i++){Console.WriteLine("{0}", this.Get(i).ReturnData());} }}}

Приложение 3. (Лабораторная работа №5)

using System;

usingSystem.Collections.Generic;

usingSystem.Linq;

usingSystem.Text;

usingSystem.Collections;

namespaceProgEng

{

classFIFO

{

privateListRoot;//Указатель на первый элемент списка

public FIFO(Data d)//Конструктор

{

this.Root = newList(d);

}

public FIFO()//Конструктор

{

this.Root = null;

}

publicboolIsEmpty()//Проверка на пустоту

{

if (this.Root == null)

returntrue;

if (Root.Value() == 0)

returntrue;

returnfalse;

}

publicvoidClear()//Удаляет список, делая очередь пустой

{

this.Root = null;

}

publicvoid Add(Data data)//Добавлениеэлемента

{

if (Root != null)

Root = Root.Add(data);

else

Root = newList(data);

}

publicvoidRemove()//Удаление элемента

{

if (Root != null)

Root = Root.RemoveFrom(0);

}

publicDataGet()//Возвращает значение первого элемента

{

returnRoot.Get(0);

}

publicvoid Sort1()//Сортировка пузырьком

{

for (inti = 0; i<Root.Value(); i++)

for (int j = 1; j <Root.Value(); j++)

if (List.NameCompare(Root, j - 1, j) > 0)

Root = Root.SwapElem(j - 1, j);

}

publicvoid Sort2()//Сортировка слиянием

{

Root = merge_sort(Root);

}

publicstaticList merge(List a, List b)//функциясливаетдвасписка

{

List c = newList();

//количество использованных вершин

int kol1 = 0;//в списке а

int kol2 = 0;//в списке b

for (inti = 0; i<a.Value() + b.Value(); i++)

{//если мы уже полностью использовали вектора а,

//то нам осталось дописать элементы вектора b

if (kol1 == a.Value())

{

c=c.Add(b.Get(kol2));

kol2++;

continue;

}

if (kol2 == b.Value())//наоборот

{

c=c.Add(a.Get(kol1));

kol1++;

continue;

}//так как наши списки еще не полностью

//использованы, то нужно сравнить какое

//значение ставить на следующее место

if (List.TypeCompare(a,b,kol1,kol2)<0)

{

c=c.Add(a.Get(kol1));

kol1++;

}

else

{

c=c.Add(b.Get(kol2));

kol2++;

}

}

return c;

}

//функция рекурсивно сортирует список

publicstaticListmerge_sort(List a)

{//если размер меньше или 1, то он отсортирован

if (a.Value() <= 1)

return a;

List b = newList();//Иначе разбиваем на два меньших списка

List c = newList();

int k = a.Value() / 2;

for(inti=0;i<k;i++){

b=b.Add(a.Get(i));

}

for (inti = k; i<a.Value(); i++)

{

c=c.Add(a.Get(i));

}

returnmerge(merge_sort(b), merge_sort(c));//Слияем их, предварительно вызвав для каждого из них сортировку

}

publicvoid Sort3()//Сортировка извлечением

{

for (inti = 0; i<Root.Value() - 1; i++)

{

int k = i;

for (int j = i; j <Root.Value(); j++)

{

if (List.VidCompare(Root, k, j) > 0)

k = j;

}

Root = Root.SwapElem(i, k);

}

}

publicvoidView()//Выводит в консоль элементы очереди

{

Root.View();

}

internalvoidStat()//Выводит в консоль число совершенных операций

{

Console.WriteLine("Числоопераций - {0}", Root.Value());

}}}

Приложение 4. (Лабораторная работа №5)

using System;

usingSystem.Collections.Generic;

usingSystem.Linq;

usingSystem.Text;

namespaceProgEng

{

classProgram

{

constint Work = 9, Exit = 0, File = 1, EquWork = 2, Clear = 3, Save = 4;

staticvoid Main(string[] args)

{

FIFO S = newFIFO();

int Check = Work;

while (Check != Exit)

{

if (!S.IsEmpty())

S.View();

Console.WriteLine("Выберетеоперацию:");

Console.WriteLine("1 - Считатьсписокизфайла");

Console.WriteLine("2 - Работа со списком");

if (!S.IsEmpty())

{

Console.WriteLine("3 - Очистка списка");

Console.WriteLine("4 - Сохранение в файл");

}

Console.WriteLine("0 - Выход из программы");

try

{

Check = Int32.Parse(Console.ReadLine());

Console.Clear();

}

catch (FormatException ex)

{

Console.Clear();

Console.WriteLine("Ошибкаввода - {0}", ex);

Check = Work;

}

switch (Check)

{

case File:

{

try

{

S.Clear();

System.IO.StreamReader file =

newSystem.IO.StreamReader(@"c:\users\ag-volk\documents\visual studio 2010\Projects\ProgEngNast\ProgEngNast\T.txt");

string line;

while ((line = file.ReadLine()) != null)

{

string[] s = newstring[3];

s = line.Split(' ');

S.Add(newData(s[0], s[1], s[2], s[3]));

}

file.Close();

}

catch (FormatException ex)

{

Console.WriteLine("Ошибкачтения - {0}", ex);

S.Clear();

}

break;

}

caseEquWork:

{

int Key = Work;

while (Key != Exit)

{

if (S.IsEmpty())

{

try

{

Console.WriteLine("Списокпуст");

Console.WriteLine("1 - Добавитьэлемент");

Console.WriteLine("0 - Выход");

Key = Int32.Parse(Console.ReadLine());

Console.Clear();

if (Key==1)

{

Console.WriteLine("Введитеэлемент:");

string[] s = Console.ReadLine().Split(' ');

S.Add(newData(s[0], s[1], s[2], s[3]));

break;

}

else

Console.WriteLine("Ошибка - {0}");

}

catch (FormatException ex)

{

Console.WriteLine("Ошибка - {0}", ex);

Key = Work;

}

}

else

{

Console.WriteLine("Вашсписок:");

S.View();

Console.WriteLine("1 - Добавитьэлемент");

Console.WriteLine("2 - Удалитьэлемент");

Console.WriteLine("3 - Редактировать элемент");

Console.WriteLine("10 - Сортировать список по фамилиям клиентов");

Console.WriteLine("11 - Сортировать список по типу операции");

Console.WriteLine("12 - Сортировать список по типу продукции");

Console.WriteLine("20 - Вывести кол-во совершенных операций");

Console.WriteLine("0 - Выход");

Key = Int32.Parse(Console.ReadLine());

Console.Clear();

try

{

switch (Key)

{

case 1:

{

Console.WriteLine("Введитеэлемент:");

string[] s = Console.ReadLine().Split(' ');

S.Add(newData(s[0], s[1], s[2], s[3]));

break;

}

case 2:

{

S.Remove();

break;

}

case 3:

{

Console.WriteLine("Введите новое значение элемента:");

string[] s = Console.ReadLine().Split(' ');

S.Remove();

S.Add(newData(s[0], s[1], s[2], s[3]));

break;

}

case 10:

{

S.Sort1();

break;

}

case 11:

{

S.Sort2();

break;

}

case 12:

{

S.Sort3();

break;

}

case 20:

{

S.Stat();

break;

}

default:

break;

}

}

catch (FormatException ex)

{

Console.WriteLine("Ошибка - {0}", ex);

Key = Work;

}

}

}

break;

}

case Clear:

{

S.Clear();

break;

}

case Save:

{

try

{

string line;

FIFO f = newFIFO();

System.IO.StreamWriter file =

newSystem.IO.StreamWriter(@"c:\users\ag-volk\documents\visual studio 2010\Projects\ProgEngNast\ProgEngNast\T.txt");

while (!S.IsEmpty())

{

line = S.Get().ReturnData();

file.WriteLine(line);

f.Add(S.Get());

S.Remove();

}

while (!f.IsEmpty())

{

S.Add(f.Get());

f.Remove();

}

file.Close();

}

catch (FormatException ex)

{

Console.WriteLine("Ошибказаписи - {0}", ex);

S.Clear();

}

break;

}

default:

{

if ((Check != 0) || (Check != 9))

Console.WriteLine("Ошибкаввода - Неверныйдиапазон");

break; } } } } }}

Приложение 5. (Лабораторная работа №6)

publicvoid Sort(int key)

{

if (key == 1)//Сортировкапузырьком

{

for (inti = 0; i<Root.Value(); i++)

for (int j = 1; j <Root.Value(); j++)

if (List.NameCompare(Root, j - 1, j) > 0)

Root = Root.SwapElem(j - 1, j);

}

else

if (key == 2)//Сортировка слиянием

{

Root = merge_sort(Root);

}

else//Сортировкаизвлечением

{

for (inti = 0; i<Root.Value() - 1; i++)

{

int k = i;

for (int j = i; j <Root.Value(); j++)

{

if (List.VidCompare(Root, k, j) > 0)

k = j;

}

Root = Root.SwapElem(i, k); } } }

publicstaticList merge(List a, List b)//функциясливаетдвасписка

{

List c = newList();

//количество использованных вершин

int kol1 = 0;//в списке а

int kol2 = 0;//в списке b

for (inti = 0; i<a.Value() + b.Value(); i++)

{//если мы уже полностью использовали вектора а,

//то нам осталось дописать элементы вектора b

if (kol1 == a.Value())

{ c=c.Add(b.Get(kol2));

kol2++;

continue; }

if (kol2 == b.Value())//наоборот

{

c=c.Add(a.Get(kol1));

kol1++;

continue;}//так как наши списки еще не полностью

//использованы, то нужно сравнить какое

//значение ставить на следующее место

if (List.TypeCompare(a,b,kol1,kol2)<0)

{ c=c.Add(a.Get(kol1));

kol1++; }

else

{ c=c.Add(b.Get(kol2));

kol2++; } }

return c; }

//функция рекурсивно сортирует список

publicstaticListmerge_sort(List a)

{//если размер меньше или 1, то он отсортирован

if (a.Value() <= 1)

return a;

List b = newList();//Иначе разбиваем на два меньших списка

List c = newList();

int k = a.Value() / 2;

for(inti=0;i<k;i++){

b=b.Add(a.Get(i));

}

for (inti = k; i<a.Value(); i++)

{

c=c.Add(a.Get(i));

}

returnmerge(merge_sort(b), merge_sort(c));//Слияем их, предварительно вызвав для каждого из них сортировку }

Размещено на Allbest.ru

...

Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.