Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Отчет 2 кон.doc
Скачиваний:
13
Добавлен:
08.11.2019
Размер:
703.49 Кб
Скачать

46

Министерство образования и науки Российской Федерации

Пензенский государственный университет

Факультет вычислительной техники

Кафедра "Информационно-вычислительные системы"

Наследование

Отчет о лабораторной работе №2

по дисциплине «Технологии программирования»

Выполнил: ст.гр.08ВО1

Немова О.С.

Проверил:

Зимин А.П.

2012

1 Задание

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

Функция main должна содержать массив из элементов базового класса, заполненный ссылками на производные классы. В этой функции должно демонстрироваться использование всех разработанных элементов классов.

1. Описать базовый класс “Элемент”.

Закрытые поля:

  • имя элемента (строка символов);

  • количество входов элемента;

  • количество выходов элемента.

Методы:

  • конструктор класса без параметров;

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

  • конструктор, задающий значения всех полей элемента.

Свойства:

  • имя элемента (только чтение);

  • количество входов элемента;

  • количество выходов элемента.

2. На основе класса “Элемент” описать производный класс “Комбинационный элемент”, представляющий собой комбинационный элемент (двоичный вентиль), который может иметь несколько входов и один выход.

Поле — массив значений входов.

Методы:

  • конструкторы;

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

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

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

3. На основе класса “Элемент” описать производный класс “Память”, представляющий собой триггер. “Триггер” имеет входы, соответствующие типу триггера (см. далее вариант задания), и входы установки и сброса. Все триггеры считаются синхронными, сам синхровход в состав триггера не включается.

Поля:

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

  • состояние на прямом выходе триггера;

  • состояние на инверсном выходе триггера.

Методы:

  • конструктор (по умолчанию сбрасывает экземпляр класса);

  • конструктор копирования;

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

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

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

  • метод, переопределяющий операцию == для экземпляров класса.

4. Создать класс “Регистр”, используя класс “Память” как вложенный класс.

Поля:

  • состояние входа «Сброс» — один для экземпляра класса;

  • состояние входа «Установка» — один для экземпляра класса;

  • массив типа Память заданной в варианте размерности;

  • массив (массивы), содержащий значения на соответствующих входах элементов массива типа “Память”.

Методы:

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

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

  • метод, вычисляющий значение нового состояния экземпляра класса.

Все поля классов “Элемент”, “Комбинационный элемент” и “Память” должны быть описаны с ключевым словом private.

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

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

Конкретный тип комбинационного элемента, тип триггера и разрядность регистра выбираются в соответствии с вариантом задания (Таблица 1):

Таблица 1 – Варианты заданий

Вариант

Комбинационный элемент

Число входов

Триггер

Разрядность регистра

1

И-НЕ

4

RS

8

2

ИЛИ

5

RST

10

3

МОД2-НЕ

6

D

12

4

И

8

Т

8

5

ИЛИ-НЕ

8

V

9

6

И

4

RS

10

7

ИЛИ-НЕ

5

JK

11

8

МОД2

5

D

8

9

И

4

Т

10

10

ИЛИ

3

JK

8

11

И-НЕ

3

RS

12

12

ИЛИ-НЕ

4

RST

4

13

МОД2

5

D

10

14

МОД2-НЕ

6

Т

10

15

ИЛИ-НЕ

8

V

10

16

И

8

JK

6

17

И-НЕ

8

RS

10

18

ИЛИ

8

Т

10

19

МОД2

6

JK

8

20

МОД2-НЕ

5

V

10

2 Описание программы

2.1 Общие сведения

Разработанные программы имеют наименование Second. Программы написаны на языке C#, их текст содержится в файлах Program.cs, Element.cs, ComEl.cs, Registr.cs, Trigger.cs . Для функционирования программ на персональном компьютере должна быть установлена операционная система Windows и Microsoft .NET Framework 3.0.

2.2 Диаграммы

2.2.1 Диаграмма вариантов использования

Диаграмма вариантов использования программы Second представлена на рисунке 1.

Исходя из анализа предметной области и потребностей пользователя, были определены следующие варианты использования:

  1. Вывести значения на выходе элемента

  2. Ввести значения на входах элемента

  3. Опросить заданный вход элемента

  4. Вывести значения на выходах триггера

  5. Ввести значения на входах триггера

  6. Опросить заданный вход триггера

  7. Вывести значения с выходов регистра

  8. Ввести значения на входах регистра

  9. Опросить заданный выход регистра

Рисунок 1 – Диаграмма вариантов использования

Вариант использования «Вывести значения выходов элемента»:

Краткое описание:

Данный вариант использования позволяет вывести значения выходов элемента. Этот вариант использования включает в себя вариант:

  1. Ввести значения на входах элемента.

Основной поток событий:

1) Пользователь инициализирует вариант вывода значения выхода элемента.

2) Инициализируется вариант использования «Ввести значения на входах элемента».

3) Инициализируется вариант вывода значений выходов элемента.

Вариант использования «Ввести значения на входах элемента»:

Краткое описание:

Данный вариант использования позволяет пользователю ввести значения на входах элемента. Значения вводятся в двоичном виде (0, 1), на каждый вход элемента соответственно.

Основной поток событий:

1) Пользователь инициализирует вариант ввода значений на входах элемента.

Вариант использования «Опросить заданный вход элемента»

Краткое описание:

Данный вариант использования позволяет пользователю опросить заданный вход элемента. Этот вариант использования включает в себя вариант:

  1. Ввести значения на входах элемента.

Основной поток событий:

1) Пользователь инициализирует вариант опроса значения на заданном входе элемента.

2) Пользователь инициализирует вариант ввода значений на входах элемента.

3) Инициализируется вариант вывода значения заданного входа элемента.

Вариант использования «Вывести значения выходов триггера»:

Краткое описание:

Данный вариант использования позволяет вывести значения выходов триггера. Этот вариант использования включает в себя вариант:

  1. Ввести значения на входах триггера.

Основной поток событий:

1) Пользователь инициализирует вариант вывода значения выхода триггера.

2) Инициализируется вариант использования «Ввести значения на входах триггера».

3) Инициализируется вариант вывода значений выходов триггера.

Вариант использования «Ввести значения на входах триггера»:

Краткое описание:

Данный вариант использования позволяет пользователю ввести значения на входах триггера. Значения вводятся в двоичном виде (0, 1), на каждый вход триггера соответственно.

Основной поток событий:

1) Пользователь инициализирует вариант ввода значений на входах триггера.

Вариант использования «Опросить заданный выход триггера»

Краткое описание:

Данный вариант использования позволяет пользователю опросить заданный вход триггера. Этот вариант использования включает в себя вариант:

  1. Ввести значения на входах триггера.

Основной поток событий:

1) Пользователь инициализирует вариант опроса значения на заданном входе триггера.

Вариант использования «Вывести значения выходов регистра»:

Краткое описание:

Данный вариант использования позволяет вывести значения выходов регистра. Этот вариант использования включает в себя вариант:

  1. Ввести значения на входах регистра.

Основной поток событий:

1) Пользователь инициализирует вариант вывода значения выхода регистра.

2) Инициализируется вариант использования «Ввести значения на входах регистра».

3) Инициализируется вариант вывода значений выходов регистра.

Вариант использования «Ввести значения на входах регистра»:

Краткое описание:

Данный вариант использования позволяет пользователю ввести значения на входах регистра. Значения вводятся в двоичном виде (0, 1), на каждый вход регистра соответственно.

Основной поток событий:

1) Пользователь инициализирует вариант ввода значений на входах регистра.

Вариант использования «Опросить заданный выход регистра»

Краткое описание:

Данный вариант использования позволяет пользователю опросить заданный вход регистра. Этот вариант использования включает в себя вариант:

  1. Ввести значения на входах регистра.

Основной поток событий:

1) Пользователь инициализирует вариант опроса значения на заданном выходе регистра.

2.2.2 Диаграмма классов

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

Element, ComEl, Trigger, Register и Program как классы, отвечающие за обмен информацией с пользователем.

Функциональное назначение системы:

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

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

  1. имена существительные и именные группы становятся объектами и атрибутами

  2. глаголы и глагольные группы становятся операциями и ассоциациями

Диаграмма классов представлена на рисунке 2.

Рисунок 2 – Диаграмма классов

Описание классов:

  1. Класс Element – базовый класс.

Атрибуты класса:

Name –типа string, хранит имя элемента.

QtyIn – типа int, хранит количество входов элемента.

QtyOut - типа int, хранит количество выходов элемента.

Методы класса:

NameP() – метод доступа к переменной Name.

QtyIn()- метод доступа к переменной QtyIn.

QtyOut()- метод доступа к переменной QtyOut.

Equals() – метод сравнивает экземпляр данного класса, с указанным в запросе.

GetHashCode() – метод переопределения хэш-кода.

  1. Класс Trigger, состоит в связи наследования с классом Element, связи агрегирования с классом Register и в связи ассоциации с классом Program.

Атрибуты класса:

Input - булевого типа, массив, содержащий значения 2 входов триггера.

Out - булевого типа, для хранения данных на прямом выходе триггера.

NOut - булевого типа, для хранения данных на инверсном выходе триггера.

Qt - булевого типа, для хранения данных внутри триггера

Методы класса:

SetValue() - устанавливает значения на входы триггера, в случае успешной операции метод возвращает true.

Параметры: Value - массив типа bool.

GetValue() – позволяет опрашивать состояния отдельного входа.

Параметры: Index – типа int, номер входа, Error – типа bool.

GetOut() – возвращает значения типа bool с прямого выхода триггера.

GetNOut() - возвращает значения типа bool с инверсного выхода триггера.

Calculate() – вычисляет состояние на выходах триггера.

В классе Trigger переопределены следующие методы: Equals() – метод сравнивает экземпляр данного класса, с указанным в запросе, GetHashCode() – метод переопределения хэш-кода.

  1. Класс ComEl, состоит в связи наследования с классом Element, и в связи ассоциации с классом Program.

Атрибуты класса:

Inputs – типа bool, массив, содержит значения на входах элемента.

Методы класса:

GetValue – метод позволяющий опрашивать состояние отдельного входа.

Параметры: Index – типа int, номер входа, Error – типа bool.

SetInp – метод устанавливает значения на входах элемента, возвращает true в случае успешной операции.

Параметры: Value - массив типа bool.

Result() - метод вычисляющий значение выхода.

В классе ComElпереопределены следующие методы: Equals() – метод сравнивает экземпляр данного класса, с указанным в запросе, GetHashCode() – метод переопределения хэш-кода.

  1. Класс Register состоит в связи ассоциации с классом Program, а также в связи агрегирования с классом Trigger.

Атрибуты класса:

Reg – массив типа Trigger, задает размерность регистра

Input – массив типа bool, содержит значения на соответствующих входах элементов массива типа Trigger.

Qt – массив типа bool, содержит значения внутри триггеров, массив типа Trigger.

Методы класса:

SetValue() – метод устанавливает значения на входах регистра.

Параметры: NewValue - массив типа bool.

GetOut() – метод позволяющий опрашивать состояние отдельного входа.

Параметры: Index – типа int, номер входа, Error – типа bool.

Result() – вычисляет значение на выходах регистра.

В классе Register переопределены следующие методы: Equals() – метод сравнивает экземпляр данного класса, с указанным в запросе, GetHashCode() – метод переопределения хэш-кода.

  1. Класс Program состоит в связях ассоциации с классами ComEl и Registr.

Атрибуты класса:

ArrElem – массив типа Element.

Rg – переменная типа Register.

Reg - переменная типа Register

Reg2 - переменная типа Register

Методы класса:

Main() – метод является точкой входа в программу, обеспечивает интерфейс консольного приложения.

First() – обеспечивает вычисления для класса ComEl.

Second() – обеспечивает вычисления для класса Trigger.

Fird() – обеспечивает вычисления для класса Register.

2.2.3 Диаграмма последовательности

Диаграмма последовательности для варианта использования: «Вывести значения на выходе элемента» с включённым вариантом «Ввести значения на входах элемента» представлена на рисунке 4, «Опросить заданный вход элемента» с включённым вариантом «Ввести значения на входах элемента» представлена на рисунке 5, Диаграмма последовательности для варианта использования: «Вывести значения на выходах триггера» с включённым вариантом «Ввести значения на входах триггера» представлена на рисунке 6, «Опросить заданный вход триггера» с включённым вариантом «Ввести значения на входах триггера» представлена на рисунке 7, Диаграмма последовательности для варианта использования: «Вывести значения на выходах регистра» с включённым вариантом «Ввести значения на входах регистра» представлена на рисунке 8, «Опросить заданный выход регистра» с включённым вариантом «Ввести значения на входах регистра» представлена на рисунке 9.

Рисунок 4 – Диаграмма последовательности для варианта использования «Вывести значения на выходе элемента» с включённым вариантом

«Ввести значения на входах элемента»

Описание диаграммы представленной на рисунке 4.

При запуске программы запускается метод Main() класса Program. После этого пользователь выбирает использование класса «Комбинационный элемент» и запускается метод First(), затем выбирает вариант ввода значений на входах КЭ и вводит эти значения. Далее введенные значения заносятся в массив tmp. После чего вызываем метод класса ComEl SetInp() посредством которого задаем значения входов. Затем пользователь выбирает вариант вывода значения на выходе и на монитор выводится значение на выходе элемента вычисленные и возвратимые методом Result() класса ComEl.

Рисунок 5 – Диаграмма последовательности для вариантов использования «Опросить заданный вход элемента» с включённым вариантом

«Ввести значения на входах элемента»

Описание диаграммы представленной на рисунке 5.

При запуске программы запускается метод Main() класса Program. После этого пользователь выбирает использование класса «Комбинационный элемент» и запускается метод First(), затем выбирает вариант ввода значений на входах КЭ и вводит эти значения. Далее введенные значения заносятся в массив tmp. После чего вызываем метод класса ComEl SetInp() посредством которого задаем значения входов. Затем пользователь выбирает вариант опроса заданного входа и на монитор выводятся значение на заданном входе элемента возвратимые методом GetValue() класса ComEl.

Рисунок 6 – Диаграмма последовательности для варианта использования «Вывести значения на выходах триггера» с включённым вариантом

«Ввести значения на входах триггера»

Описание диаграммы представленной на рисунке 6.

При запуске программы запускается метод Main() класса Program. После этого пользователь выбирает использование класса «Память» и запускается метод Second(), затем выбирает вариант ввода значений на входах триггера и вводит эти значения. Далее введенные значения заносятся в массив tmp. После чего вызываем метод класса Trigger SetValue() посредством которого задаем значения входов. Затем пользователь выбирает вариант вывода значения на выходах и на монитор выводится значения на выходах триггера вычисленные методом Calculate() и возвратимые методами GetOut() и GetNOut() класса Trigger.

Рисунок 7 – Диаграмма последовательности для варианта использования «Опросить заданный вход триггера» с включённым вариантом

«Ввести значения на входах триггера»

Описание диаграммы представленной на рисунке 7.

При запуске программы запускается метод Main() класса Program. После этого пользователь выбирает использование класса «Память» и запускается метод Second(), затем выбирает вариант ввода значений на входах триггера и вводит эти значения. Далее введенные значения заносятся в массив tmp. После чего вызываем метод класса Trigger SetValue() посредством которого задаем значения входов. Затем пользователь выбирает вариант опроса заданного входа и на монитор выводятся значение на заданном входе триггера возвратимые методом GetValue() класса Trigger.

Рисунок 8 – Диаграмма последовательности для варианта использования «Вывести значения на выходах регистра» с включённым вариантом

«Ввести значения на входах регистра»

Описание диаграммы представленной на рисунке 8.

При запуске программы запускается метод Main() класса Program. После этого пользователь выбирает использование класса «Регистр» и запускается метод Fird(), затем выбирает вариант ввода значений на входах регистра и вводит эти значения. Далее введенные значения заносятся в массив tmp. После чего вызываем метод класса Registr SetValue() посредством которого задаем значения входов. Затем пользователь выбирает вариант вывода значения на выходах и на монитор выводится значения на выходах регистра вычисленные методом и возвратимые методом Result() класса Registr.

Рисунок 9 – Диаграмма последовательности для варианта использования «Опросить заданный выход регистра» с включённым вариантом

«Ввести значения на входах регистра»

Описание диаграммы представленной на рисунке 9.

При запуске программы запускается метод Main() класса Program. После этого пользователь выбирает использование класса «Регистр» и запускается метод Fird(), затем выбирает вариант ввода значений на входах регистра и вводит эти значения. Далее введенные значения заносятся в массив tmp. После чего вызываем метод класса Registr SetValue() посредством которого задаем значения входов. Затем пользователь выбирает вариант вывода значения на заданном выходе и на монитор выводятся значения на заданном выходе регистра возвратимые методом GetOut() класса Registr.

3 Тестирование

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

Для использования класса «Комбинационный элемент» необходимо нажать клавишу «1». Далее для запуска функции установки значений на входах КЭ необходимо нажать клавишу «1» после этого выведется приглашение ввести значения на входах КЭ (Рисунок Б.2), для опроса заданного входа КЭ необходимо нажать клавишу «2» (Рисунок Б.3), для запуска функции вычисления значений на выходе КЭ и просмотра результата необходимо нажать клавишу «3» (Рисунок Б.4). Чтобы выйти в главное меню необходимо нажать клавишу «4».

1)Ввести значения на входах КЭ (Рисунок Б.2).

Пользователь должен ввести 4-значное число(таблица 1), состоящее из «1» и «0», что будет соответствовать значениям на каждом из 4 входов комбинационного элемента ИЛИ-НЕ:

Таблица 1 - Тестовые входные данные для КЭ ИЛИ-НЕ:

1

2

3

4

Out

0

1

0

1

1

2) Вывести значения с определенного выхода (Рисунок Б.3).

Чтобы вывести значение с определенного входа КЭ необходимо нажать клавишу «2». Далее пользователь должен ввести номер входа и нажать «Enter»(Рисунок Б.3).

3)Вывести текущие значения на выходе.

Чтобы вывести значения на выходе КЭ необходимо нажать клавишу «3» (Рисунок Б.4). Правильность выходного значения можно проверить по таблице истинности КЭ ИЛИ-НЕ с 4 входами (таблица 2):

Таблица 2 - Таблица истинности КЭ ИЛИ-НЕ с 4 входами

1

2

3

4

Out

0

1

0

1

1

Для использования класса «Память» необходимо нажать клавишу «3». Далее для запуска функции установки значений на входах триггера необходимо нажать клавишу «1» после этого выведется приглашение ввести значения на входах триггера (Рисунок Б.5), для опроса заданного выхода триггера необходимо нажать клавишу «2» (Рисунок Б.6), для запуска функции вычисления значений на выходах триггера и просмотра результата необходимо нажать клавишу «3» (Рисунок Б.7). Чтобы выйти в главное меню необходимо нажать клавишу «4».

1)Ввести значения на входах триггера (Рисунок Б.5).

Пользователь должен ввести 2-хзначное число, состоящее из «1» и «0», что будет соответствовать значениям на каждом из 2 входов триггера(таблица 3):

Таблица 3 - Тестовые входные данные для триггера

T

Qt

Qt+1

Не Q

0

1

1

0

2) Вывести значения с определенного выхода.

Чтобы вывести значение с определенного выхода триггера необходимо нажать клавишу «2». Далее пользователь должен ввести номер выхода и нажать «Enter»(Рисунок Б.6). Правильность выходных данных можно проверить по таблице состояний RST-триггера (таблица 4).

3)Вывести текущие значения на выходах.

Чтобы вывести значения на выходах триггера необходимо нажать клавишу «3» (рисунок Б.7). Правильность выходных данных можно проверить по таблице состояний RST-триггера (таблица 4):

Таблица 4 - Состояния RST-триггера

T

Qt

Qt+1

Не Q

1

1

1

0

0

1

1

0

0

0

0

1

1

0

0

1

Для использования класса «Регистр» необходимо нажать клавишу «3». Далее для запуска функции установки значений на входах регистра необходимо нажать клавишу «1» после этого выведется приглашение ввести значения на входах регистра (Рисунок Б.8), для опроса заданного выхода регистра необходимо нажать клавишу «2» (Рисунок Б.9), для запуска функции вычисления значений на выходах регистра и просмотра результата необходимо нажать клавишу «3» (Рисунок Б.10). Чтобы выйти в главное меню необходимо нажать клавишу «4».

1)Ввести значения на входах регистра(Рисунок Б.8).

Пользователь должен ввести 8-мизначное число(таблица 5), состоящее из «1» и «0», что будет соответствовать значениям на каждом из 2 входов чеиырех триггеров из которых состоит регистр:

Таблица 5 - Тестовые входные данные для регистра

R

1

1

1

1

S

0

0

0

0

2) Вывести значения с определенного выхода.

Чтобы вывести значение с определенного выхода регистра необходимо нажать клавишу «2». Далее пользователь должен ввести номер выхода и нажать «Enter»(Рисунок Б.9). Правильность выходных данных можно проверить по таблице состояний RST-триггера (таблица 4).

3)Вывести текущие значения на выходах.

Чтобы вывести значения на выходах регистра необходимо нажать клавишу «3» (рисунок Б.10). Правильность выходных данных можно проверить по таблице состояний T-триггера (таблица 4).

Для выхода из программы необходимо нажать клавишу «4».

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

Результат работы программы совпал с ожидаемым, следовательно, программа работает верно.

Выводы

В результате выполнения лабораторной работы было созданы приложения, позволяющие пользователю имитировать комбинационный элемент «ИЛИ-НЕ» с 4 входами, RST - Триггер, и регистр. В соответствии с ожидаемыми результатами и результатом работы программы в тестовом режиме можно сделать вывод, что разработанная программа Second.exe работает верно, а требования задания выполнены в полном объеме.

Список используемой литературы:

  1. Павловская Т.А. С#. Программирование на языке высокого уровня. Учебник для ВУЗов. – СПб.: Питер, 2009. – 432с.: ил.

  2. http://msdn.microsoft.com/ru-ru/library/ms123401.aspx - библиотека MSDN

  3. http://Intuit.ru - "Интернет университет информационных технологий"

ЛИСТИНГ ПРОГРАММЫ

Приложение А

(обязательное)

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]