Декомпозиция системы на компоненты

Оглавление

Оглавление.. 2

Введение.. 3

1. Порядок выполнения курсовой работы... 3

2. Варианты заданий.. 4

3. Декомпозиция системы на компоненты... 9

4. Методические указания.. 15

5. Рекомендации по программированию... 15

6. Среда программирования Visual C++ 6.0. 18

6.1. Общий вид окна. 18

6.2. Создание консольного приложения и работа с ним.. 19

6.3. Компиляция и запуск проекта. 20

6.4. Отладка программы.. 21

6.5. Создание рабочего пространства для нескольких проектов. 21

7. Содержание отчета.. 21

8. Список литературы... 21


Введение

 

Курсовая работа предназначена для отработки навыков программирования задач средней сложности у студентов дневного и заочного отделения специальностей "Автоматизированные системы управления" по основам алгоритмизации и программирования.

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

 


Порядок выполнения курсовой работы

Курсовая работа выполняется индивидуально каждым студентом в соответствии с выданным преподавателем вариантом. Обязательным является использование в курсовой работе объектно-ориентированного подхода и пользовательских классов. Курсовая работа выполняется в среде MS Visual C++6.0.

В процессе работы автор должен

  1. Выполнить анализ предметной области.
  2. Разработать пользовательские классы.
  3. Разработать алгоритмы, реализующие компонентные функции классов и перегруженные операции.
  4. Разработать пользовательский интерфейс для ввода и получения информации.
  5. Предусмотреть обработку исключительных ситуаций, возникающих во время работы программы.
  6. Провести отладку и тестирование программы.
  7. Оформить для нее документацию.

Все этапы работы должны быть отражены в пояснительной записке.

Таблица 1 Примерный график выполнения работы

Этап курсовой работы Неделя семестра
1 Анализ предметной области, декомпозиция системы на компоненты (классы, объекты, модули).   1-3
2 Разработка пользовательских классов. 4-5
3 Разработка алгоритмов, используемых при решении задачи. 6-8
4 Разработка интерфейса. 9
5 Отладка и тестирование программы. 10-12
6 Оформление пояснительной записки. 13
7 Защита курсовой работы. 14-15

 


 


Варианты заданий

2.1. Калькуляторы

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

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

3)Предусмотреть возможность просмотра этого файла из программы калькулятора.

В варианте указаны вид данных, обрабатываемых калькулятором, и операции, выполняемые калькулятором.

Таблица 2 Калькуляторы

Вариант Вид данных Операции
1 Двадцатипятизначные числа. Сложение, вычитание, умножение, деление, целочисленное деление, остаток от деления, отмена последней операции, сброс результата.
2 Обыкновенные и десятичные дроби. Сложение, вычитание, умножение, деление, преобразование десятичной дроби в обыкновенную и обратно, отмена последней операции, сброс результата.
3 Комплексные числа в алгебраической, тригонометрической и экспоненциальной формах. Сложение, вычитание, умножение, деление, возведение в целую степень, извлечение квадратного корня (по формуле Муавра), преобразование из одной формы в другую, отмена последней операции, сброс результата.
4 Даты в российском, американском и английском форматах. - дата1-дата2=кол-во месяцев - дата1-дата2=кол-во недель - дата1-дата2=кол-во дней - дата1-дата2=кол-во часов - дата1-дата2=кол-во минут - дата1-дата2=кол-во секунд - дата1-месяцы=дата2 - дата1-недели=дата2 - дата1-дни=дата2 - дата1-часы=дата2 - дата1-минуты=дата2 - дата1-секунды=дата2 - дата1+месяцы=дата2 - дата1+недели=дата2 - дата1+дни=дата2 - дата1+часы=дата2 - дата1+минуты=дата2 - дата1+секунды=дата2 Обратить внимание на проверку правильности вводимой информации (33 июня не бывает)
5 Обыкновенные дроби в двух формах: - числитель/ знаменатель; - целая часть числитель/знаменатель. Сложение, вычитание, умножение, деление, возведение в целую степень, сокращение дроби, обмен местами числителя и знаменателя дроби, смена знака, отмена последней операции, сброс результата.
6 Квадратные уравнения (в действительных или комплексных числах) Вычисление корней в форме, заданной пользователем.
7 Углы, измеряемые в градусной системе мер (1 градус=60 минут, 1 минута=60 секунд) Сложение, вычитание, умножение, деление, нахождение тригонометрических и обратных тригонометрических функций, изменение знака угла.
8 Выражения со скобками Вычисление заданного выражения со скобками, проверка правильности заданного выражения.
9 Целые и вещественные числа в различных системах счисления, основания систем счисления взять следующие: 2, 3, 8, 9, 10, 16. Перевод чисел из одной системы счисления в другую.
10 Логарифмы чисел при различных основаниях. Сложение, вычитание, умножение, деление, возведение в степень, переход к другому основанию.
11 Многочлены (до 8-ой степени, задаются коэффициенты). Сложение, вычитание, умножение, деление, возведение в целую степень, подстановка многочлена вместо переменной в другой многочлен, вычисление значения многочлена.
12 Система уравнений с тремя неизвестными (задаются коэффициенты). Ввод, хранение уравнений в памяти (до 4 систем), вычисление неизвестных.
13 Алгебраические или трансцендентные уравнения (задаются функции, интервалы, на которых есть корень, точность вычислений). Решение уравнения методами половинного деления, Ньютона или итераций (в зависимости от выбора пользователя).
14 Интервалы времени (задаются в часах, минутах, секундах). Ввод данных, ввод только в часах, минутах или секундах, нахождение величины временного интервала, суммы, разности, преобразование интервала в часы, минуты, секунды.
15 Римские цифры. Сложение, вычитание, умножение, целочисленное деление, остаток от целочисленного деления, перевод из римской системы счисления в десятичную и обратно, отмена последней операции, сброс результата.

2.2. Динамические структуры данных

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

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

 

Таблица 3 Структуры данных

Варант Вид данных Операции
16 Бинарное дерево Создать идеально сбалансированное дерево, распечатать его (в виде дерева), найти величину наибольшего элемента дерева, напечатать элементы из всех листьев дерева, найти длину пути от корня до ближайшей вершины с элементом Е.  
17 Бинарное дерево Создать идеально сбалансированное дерево, распечатать его (в виде дерева), определить максимальную глубину о дерева, определить есть ли в дереве хотя бы 2 одинаковых элемента, определить входит ли элемент Е в дерево, если таких элементов несколько, то определить число вхождений элемента Е в дерево.     
18 Бинарное дерево Создать идеально сбалансированное дерево Т, распечатать его (в виде дерева), построить и напечатать по уровням дерево поиска Т1 для дерева Т, удалить из непустого дерева Т все четные элементы, найти количество вершин на n-ом уровне непустого дерева Т (корень - вершина 0 уровня).
19 Линейный список Составить программу, которая содержит информацию о наличие автобусов в автобусном парке. Сведения об автобусе содержат: - номер автобуса; - фамилию и инициалы водителя; - номер маршрута. Программа должна обеспечивать: - формирование данных обо всех автобусах в виде списка; - формирование списка автобусов выехавших из парка; - формирование списка автобусов оставшихся в парке; - вывод сведений об автобусах находящихся на маршруте и об автобусах оставшихся в парке.
20 Бинарное дерево Составить программу, которая содержит текущую информацию о книгах в библиотеке. Сведения о книгах содержат: - номер УДК; - фамилию и инициалы автора; - название; - год издания; - количество экземпляров в библиотеке. Программа должна обеспечить: - начальное формирование данных обо всех книгах в виде бинарного дерева; - добавление данных о книгах, поступающих в библиотеку; - удаление данных о списываемых книгах; - выдачу данных о наличии в библиотеке требуемой книги.  
21 Линейный список Составить программу, которая содержит текущую информацию о книгах в библиотеке. Сведения о книгах содержат: - номер УДК; - Фамилию и инициалы автора; - Название; - Год издания; - Количество экземпляров в библиотеке. Программа должна обеспечить: - начальное формирование данных обо всех книгах в виде линейного списка; - добавление данных о книгах, поступающих в библиотеку; - изменение данных при вводе информации о том, что пользователь берет или возвращает книгу; - выдаче данных о наличии книг в библиотеке.  
22 Линейный список Составить программу, которая моделирует заполнение гибкого диска. В процессе работы файлы могут записываться на диск и удаляться с него. Файлы могут иметь произвольную длину. Если при удалении образовался свободный участок, то вновь записываемый файл помещается на этом свободном участке, либо, если он не помещается на этом участке, то его следует разместить после последнего записанного файла. Если файл превосходит длину самого большого участка, выдается аварийное сообщение. Рекомендуется создать список свободных участков и список занятых участков памяти на диске.
23 Бинарное дерево Составить программу, которая формирует англо-русский словарь. Словарь должен содержать английское слово, русское слово и количество обращений к слову. Программа должна: - обеспечить начальный ввод словаря(по алфавиту) с конкретными значениями счетчиков обращений; - формирует новое дерево, в котором слова отсортированы не по алфавиту, а по количеству обращений. Пользователь должен иметь возможность добавлять новые слова, удалять существующие, выполнять писк нужного слова, выполнять просмотр обоих вариантов словаря
24 Список Составить программу, которая содержит информацию о квартирах, содержащихся в базе данных бюро обмена квартир. Сведения о каждой квартире содержат: - количество комнат; - общую площадь; - этаж; - адрес; Программа должна обеспечить: - формирование картотеки; - ввод заявки на обмен; - поиск подходящего варианта (при равенстве количества комнат и этажа и различии площадей в пределах 10% выводится соответствующая карточка, а сами сведения удаляются из списка, в противном случае поступившая заявка включается в список); - Вывод всего списка.
25 Бинарное дерево Автоматизированная информационная система на железнодорожном вокзале содержит сведения об отправлении поездов дальнего следования. Для каждого поезда указывается: - номер поезда; - станция назначения; - время отправления. Составить программу, которая 1. обеспечивает первоначальный ввод данных в информационную систему и формирование дерева; 2. производит вывод всего дерева; 3. вводит номер поезда и выводит данные об этом поезде; 4. вводит название станции назначения и выводит данные о всех поездах, которые следуют до этой станции.

 

Декомпозиция системы на компоненты

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

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

Операция – это услуга, которую может предоставить класс. На практике над объектами выполняются  операции пяти видов.

Таблица 4 Операции над объектами

Конструктор имеет то же имя, что и класс; определяет способ создания объекта или его инициализации
Деструктор операция, выполняющая очистку памяти, когда объект класса выходит за пределы области видимости или он удаляется; имеет то же имя, что и класс со знаком «~» перед ним.
Модификатор операция, которая изменяет состояние объекта
Селектор операция, считывающая состояние объекта, но не меняющая состояния
Итератор операция, позволяющая организовать доступ ко всем частям объекта в строго определенной последовательности

 

Объекты могут создаваться различными способами. Некоторые объекты являются локальными переменными, другие глобальными, третьи – членами классов и т.д.             

Между объектами могут существовать различные отношения:

· ассоциация;

· наследование;

· агрегация;

· зависимость;

· и др.

Отношения двух любых объектов основываются на предположениях, которыми один обладает относительно другого: об операциях, которые можно выполнять и об ожидаемом поведении. Связь – это специфическое сопоставление, через которое  один объект (клиент) запрашивает услугу у другого объекта (сервера) или через которое один объект находит путь к другому. Она дает классу возможность узнавать об атрибутах, операциях и связях другого класса. В нотации языка UML взаимодействие между классами отражают связывающими их линиями. Чтобы один класс мог послать сообщение другому, между ними должна существовать связь.

Ассоциация – это смысловая связь, которая не имеет направления и не объясняет, как классы общаются друг с другом. Однако именно это требуется на ранней стадии анализа, поэтому мы фиксируем только участников, их роли и мощность отношения. B дaльнейшeм она, как правило, конкретизируетсяи принимает вид одного из рассматриваемых далее отношений. На диаграммах UML эту связь отображают обыкновенной ли­нией, связывающую классы:

 

рис. 1. Связь между класами

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

Связи наследования также называют обобщениями (generalization) и изображают в виде больших белых стрелок от класса-потомка к классу-предку.

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

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

рис. 2. Отношение наследования

 

 

Агрегация. В то время как связи обозначают равноправные или «клиент-серверные» отношения между объектами, агрегация описывает отношения целого и части, приводящие к соответствующей иерархии объектов, причем, идя от целого (агрегата) мы можем придти к его частям (атрибутам). В этом смысле агрегация – специализированный частный случай ассоциации. Объект, являющийся атрибутом другого объекта (агрегата), имеет связь со своим агрегатом. Через эту связь агрегат может посылать ему сообщения.

Агрегации отображают в виде линии с ромбиком у класса, яв­ляющегося целым:

рис. 3 Отношение агрегации

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

рис. 4. Отношение композиции

Зависимость – отношение, при котором один класс пользуется услугами другого класса. Отношения зависимости между классами изображают в виде стрелки, проведенной пунктирной линией:

рис. 5. Отношение зависимости

Объявления классов и функций принято отделять от реализации последних. Хорошим стилем считается, когда объявления собраны в заголовочный файл с расширением.h, а реализации – в файле с расширением.cpp (имена файлов одинаковые).

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

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

Для выполнения арифметического действия Калькулятор должен знать две даты и знак операции. Следовательно, класс Калькулятор должен включать три объекта класса Дата (регистры): для операнда_1, операнда_2 и результата. Над операндами выполняется какая-то арифметическая операция, знак этой операции тоже можно хранить в отдельной переменной класса Калькулятор. Результат калькулятор выдает в виде одной из четырех форм: дата, количество дней, недель или месяцев. Таким образом, мы определили, что класс Калькулятор будет содержать следующие компонентные данные:

date op1,op2,rez;//операнды и результат

int znak;//код операции

int form;//код формы для вывода результата

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

class Сalc

{

Date op1;//операнд 1

Date op2;//операнд 2

Date res;//результат

int znak;//знак операции

int form;//форма вывода результата

public:

Calc();//конструктор

void set_op1(date);//модификатор для операнда 1

void set_op2(date); //модификатор для операнда 2

Date get_res();//селектор для получения результата

void set_znak(int); //модификатор для знака операции

void set_form(int); //модификатор для формы вывода

void execute();//вычисление результата

};

В классе Calc используются переменные типа Date – данные, с которыми работает Калькулятор. Между классами Calc и Date существует отношение агрегации, причем, это будет не просто агрегация, а композиция, т. к. операнды не могут существовать отдельно от калькулятора.

Рассмотрим свойства класса Дата. Над Датой можно выполнять операции, Дату надо вводить и выводить. Ввод и вывод Даты проще всего выполнять в виде строки. Но для выполнения операций с датами надо предусматривать представление Даты в виде чисел. Операции по сложению и вычитанию дат можно выполнять по следующему алгоритму:

1. Перевести обе даты в дни.

2. Выполнить операцию.

3. Перевести результат в требуемую форму (дата, дни, недели, месяцы и т. п.)

Таким образом, класс Date должен иметь следующие компонентные данные:

int d;//количество дней в дате

char* s;//представление даты в виде строки

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

void days_to_string(); - переводит дни в строку

void string_to_days(); - переводит строку в дни

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

Date operator -(Date&D);

Date operator +(Date D);

Date& operator =(const Date &D);

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

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

class date

{

char *date_string;//строка для хранения даты в виде дд.мм.гггг.

int days;//количество дней в дате для выполнения расчетов

public:

date();//конструктор

date(const date&);//конструктор копирования

~date();//деструктор

//инициализация даты: заполняет атрибут date_string, вычисляет //количество дней в этой дате, затем заполняет атрибут days

void init(char*);

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

void days_to_string();

// вспомогательная функция для вычисления дней в дате

void string_to_days();

//перегруженная функция для сложения двух дат

date operator+(date&);

//перегруженная функция для сложения двух дат

date operator-(date&);

//перегруженная функция присваивания

date& operator=(const date&);

//дружественная функция для ввода даты

friend istream&operator>>(istream&in,date&);

//дружественная функция для вывода даты

friend ostream&operator<<(ostream&in,date&);

};

Класс «Диалог с пользователем» осуществляет ввод данных в виде строк, заносит эти строки в операнды калькулятора, вводит операцию, заносит ее в знак операции калькулятора, вводит форму, требуемого результата, заносит ее в соответствующий атрибут калькулятора, получает результат и выводит его в нужной форме. Эти действия повторяются до тех пор, пока пользователь не введет команду для окончания расчетов. Для ввода данных можно использовать меню. Таким образом, класс Диалог может иметь следующую реализацию:

class Dialog

{

public:

Calc c;//калькулятор для выполнения расчетов

void menu();//меню для диалога с пользователем

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

void doing();

};

Основная функция будет иметь вид:

void main()

{

Dialog d;

d.doing();

}

Этот пример был рассмотрен для того,чтобы упростить работу по декомпозиции классов при выполнении курсовой работы. Но ни в коем случае не следует считать, что выполнить работу можно только таким способом!



Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: