Современные технологии программирования |
Лабораторные работы по теме "Калькулятор простых дробей" |
Выполните лабораторные работы с 1 по 6 по теме вашей курсовой работы "Калькулятор простых дробей".
Лабораторная работа №1 Тип простые дроби
Лабораторная работа №2 Тип память для простых дробей
Лабораторная работа №3 Тип данных процессор простых дробей
Лабораторная работа №4 Редактор простых дробей
Лабораторная работа №5 Управление калькулятором простых дробей
Лабораторная работа №6 Интерфейс калькулятора простых дробей
Лабораторная работа №1. Абстрактный тип данных простая дробь
Тема: Классы Object Pascal, С++
Цель: Сформировать практические навыки: реализации абстрактных типов данных с помощью классов Object Pascal,
С++.Задание
Object Pascal
,С++
в соответствии с приведенной ниже спецификацией.
Спецификация типа данных “простые дроби”.
ADT TFrac
Данные
Простая дробь (тип TFrac) - это пара целых чисел: числитель и знаменатель
(a/b). Простые дроби изменяемые.Операции
Операции могут вызываться только объектом простая дробь (тип
TFrac), указатель на который в них передаётся по умолчанию. При описании операций этот объект называется “сама дробь”.
КонструкторЧисло |
|
Начальные значения: |
Пара целых чисел (a) и (b). |
Процесс: |
Создаёт простую дробь (тип TFrac) с числителем a, и знаменателем (b). В случае необходимости дробь предварительно сокращается. Например: КонструкторЧисло (6,3) = (2/1) КонструкторЧисло (0,3) = (0/3). |
КонструкторСтрока |
|
Начальные значения: |
Строковое представление простой дроби . Например: ‘7/9’. |
Процесс: |
Создаёт простую дробь (тип TFrac), представленную строкой f =’a/b’, с числителем a и знаменателем b. Например: КонструкторСтрока(‘6/3’) = 6/3 КонструкторСтрока (‘0/3’) = 0/3 |
Копировать: |
|
Вход: |
Нет. |
Предусловия: |
Нет. |
Процесс: |
Создаёт копию самой дроби (тип TFrac) с числителем, и знаменателем такими же, как у самой дроби. |
Выход: |
Простая дробь (тип TFrac). Например: c = 6/3, Копировать(c) = 6/3 |
Постусловия: |
Нет. |
Сложить |
|
Вход: |
Простая дробь d (тип TFrac). |
Предусловия: |
Нет. |
Процесс: |
Создаёт и возвращает простую дробь (тип TFrac), полученную сложением самой дроби q = a1/b1 с d =a2/b2: ((a1/b1)+(a2/b2)=(a1*b2 + a2*b1)/( b1* b2)). Например: q = 1/2, d = -3/4 q.Сложить(d) = -1/4. |
Выход: |
Простая дробь (тип TFrac). |
Постусловия: |
Нет. |
Умножить |
|
Вход: |
Простая дробь d (тип TFrac). |
Предусловия: |
Нет. |
Процесс: |
Создаёт простую дробь (тип TFrac), полученную умножением самой дроби q = a1/b1 на d = a2/b2 ((a1/b1)*(a2/b2)=(a1* a2)/( b1* b2)). |
Выход: |
Простая дробь (тип TFrac). |
Постусловия: |
Нет. |
Вычесть |
|
Вход: |
Простая дробь d (тип TFrac). |
Предусловия: |
Нет. |
Процесс: |
Создаёт и возвращает простую дробь (тип TFrac), полученную вычитанием d = a2/b2 из самой дроби q = a1/b1: ((a1/b1)-(a2/b2)=(a1* b2-a2*b1)/(b1*b2)). Например: q = (1/2), d = (1/2) q.Вычесть(d) = (0/1). |
Выход: |
Простая дробь (тип TFrac). |
Постусловия: |
Нет |
Делить |
|
Вход: |
Простая дробь d (тип TFrac). |
Предусловия: |
Числитель числа d не равно 0. |
Процесс: |
Создаёт и возвращает простую дробь (тип TFrac), полученное делением самой дроби q = a1/b1 на дробь d = a2/b2: ((a1/b1)/(a2/b2)=(a1* b2)/( a2*b1)). |
Выход: |
Простая дробь (тип TFrac). |
Постусловия: |
Нет. |
Квадрат |
|
Вход: |
Нет. |
Предусловия: |
Нет. |
Процесс: |
Создаёт и возвращает простую дробь (тип TFrac), полученную умножением самой дроби на себя: ((a/b)*(a/b)=(a* a)/( b* b)). |
Выход: |
Простая дробь (тип TFrac). |
Постусловия: |
Нет. |
Обратное |
|
Вход: |
Нет. |
Предусловия: |
Числитель дроби (a/b) не равен нулю (a<>0). |
Процесс: |
Создаёт и возвращает простую дробь (тип TFrac), полученное делением единицы на саму дробь: 1/( (a/b) = b/a. |
Выход: |
Простая дробь (тип TFrac) |
Постусловия: |
Нет. |
Минус |
|
Вход: |
Простая дробь (q) (тип TFrac). |
Предусловия: |
Нет. |
Процесс: |
Создаёт простую дробь, являющуюся разностью простых дробей z и q, где z - простая дробь (0/1). |
Выход: |
Простая дробь (тип TFrac). |
Постусловия: |
Нет. |
Равно |
|
Вход: |
Простая дробь d (тип TFrac). |
Предусловия: |
Нет |
Процесс: |
Сравнивает саму простую дробь q и d. Возвращает значение True, если q и d - тождественные простые дроби, и значение False - в противном случае. |
Выход: |
Булевское значение. |
Постусловия: |
Нет. |
Больше |
|
Вход: |
Простая дробь d (тип TFrac). |
Предусловия: |
Нет. |
Процесс: |
Сравнивает саму простую дробь q и d. Возвращает значение True, если q > d, - значение False - в противном случае. |
Выход: |
Булевское значение. |
Постусловия: |
Нет. |
ВзятьЧислительЧисло |
|
Вход: |
|
Предусловия: |
Нет. |
Процесс: |
Возвращает значение числителя дроби в числовом формате. |
Выход: |
Целое значение. |
Постусловия: |
Нет. |
ВзятьЗнаменательЧисло |
|
Вход: |
Нет. |
Предусловия: |
Нет. |
Процесс: |
Возвращает значение знаменателя дроби в числовом формате. |
Выход: |
Целое значение. |
Постусловия: |
Нет. |
ВзятьЧислительСтрока |
|
Вход: |
Нет. |
Предусловия: |
Нет. |
Процесс: |
Возвращает значение числителя дроби в строковом формате. |
Выход: |
Строка. |
Постусловия: |
Нет. |
ВзятьЗнаменательСтрока |
|
Вход: |
Нет. |
Предусловия: |
Нет. |
Процесс: |
Возвращает значение знаменателя дроби в строковом формате. |
Выход: |
Строка. |
Постусловия: |
Нет. |
ВзятьДробьСтрока |
|
Вход: |
Нет. |
Предусловия: |
Нет. |
Процесс: |
Возвращает значение простой дроби, в строковом формате. |
Выход: |
Строка. |
Постусловия: |
Нет. |
end TFracRatio
Рекомендации к выполнению
Содержание отчета
Контрольные вопросы
Лабораторная работа №2. Абстрактный тип данных (ADT) “память для простых дробей”
Тема: Классы Object Pasca, С++l
Цель: Сформировать практические навыки: реализации абстрактного типа данных с помощью классов Object Pascal, С++
Задание
Спецификация типа данных “память для простых дробей”.
ADT TMemory
Данные
Память для простых дробей (тип TMemory, в дальнейшем - память) - это память для хранения объекта “простая дробь” (тип TFrac) и значения “состояние памяти”. Объект “память для простых дробей” - изменяемый. Он имеет два состояния, обозначаемых значениями: “Включена” (_On), “Выключена” (_Off). Её изменяют операции: Записать (Store), Добавить (Add), Очистить (Clear).
Операции
Конструктор |
|
Начальные значения: |
Нет. |
Процесс: |
Создаёт объект “память” типа TMemory. Создаёт и записывает в поле “простая дробь” объекта “память” (тип TMemory) объект “простая дробь” (тип TFrac) со значением 0/1. Память устанавливается в состояние “Выключена”, в поле “состояние памяти” заносится значение (_Off). |
Записать |
|
Вход: |
(E) – объект “простая дробь” (тип TFrac). |
Предусловия: |
Нет. |
Процесс: |
В объект “память” (тип TMemory) в поле “простая дробь” записывается копия объекта Е. Память устанавливается в состояние “Включена”, в поле “состояние памяти” заносится значение (_On). |
Выход: |
Нет. |
Постусловия: |
Состояние памяти – “Включена” (_On). |
Взять |
|
Вход: |
Нет. |
Предусловия: |
Нет. |
Процесс: |
Создаёт и возвращает копию объекта хранящегося в объекте “память” (тип TMemory) в поле “простая дробь” (тип TFrac). |
Выход: |
Объект типа TFrac. |
Постусловия: |
Состояние памяти – “Включена” (_On). |
Добавить |
|
Вход: |
(Е) – простая дробь (объект типа TFrac). |
Предусловия: |
Нет. |
Процесс: |
В поле “простая дробь” объекта “память” (тип TMemory) записывается объект “простая дробь” (тип TFrac), полученный в результате сложения числа (Е) и числа, хранящегося в памяти в поле “простая дробь”. |
Выход: |
Нет. |
Постусловия: |
Состояние памяти – “Включена” (_On). |
Очистить |
|
Вход: |
Нет. |
Предусловия: |
Состояние памяти – “Включена” (_On). |
Процесс: |
В поле “простая дробь” объекта “память” (тип TMemory) записывается объект “простая дробь” (тип TFrac) со значением 0/1. Память устанавливается в состояние “Выключена” (_Off). |
Выход: |
Нет. |
Постусловия: |
Состояние памяти – “Выключена” (_Off). |
ЧитатьСостояниеПамяти |
|
Вход: |
Нет. |
Предусловия: |
Нет. |
Процесс: |
Копирует и возвращает значение поля “состояние памяти” объекта “память” (тип TMemory) в формате строки. |
Выход: |
Значение поля “состояния памяти” (типа String). |
Постусловия: |
Нет. |
ЧитатьЧисло |
|
Вход: |
Нет. |
Предусловия: |
Нет. |
Процесс: |
Копирует и возвращает значение поля “простая дробь” объекта “память” (тип TMemory) в формате строки. |
Выход: |
Значение объекта “простая дробь” (тип String). |
Постусловия: |
Нет. |
end
TCMemoryРекомендации к выполнению
Ниже приведены диаграмма классов и состояний для класса память.
Рис. Диаграмма классов Память.
Рис. Диаграмма состояния Память
Содержание отчета
Лабораторная работа №3. Абстрактный тип данных: Процессор простых дробей
Тема: Классы Object Pascal, С++
Цель: Сформировать практические навыки: реализации абстрактного типа данных с помощью классов Object Pascal, С++.
Задание
Спецификация типа данных “Процессор простых дробей”.
ADT
TProcДанные
Процессор простых дробей (тип TProc) выполняет двухоперандные операции TOprtn = (None, Add, Sub, Mul, Dvd) и однооперандные операции - функции TFunc = (Rev, Sqr). Если операция или функция не может быть выполнена, в поле Error типа String заносится сообщение об ошибке. Левый операнд и результат операции хранится в поле Lop_Res, правый - в поле Rop. Оба поля имеют тип TFrac. Процессор может находиться в состоянии “операция установлена”: поле Operation не равно None (значение типа TOprtn) или в состоянии операция не установлена: поле Operation = None. Значения типа TProc - изменяемые. Они изменяются операциями: Сброс операции (OprtnClear), Выполнить операцию (OprtnRun), Вычислить функцию (FuncRun), Установить операцию (OprtnSet), Установить левый операнд (Lop_Res_Set), Установить правый операнд (Rop_Set), Сброс калькулятора (ReSet).
Операции
Конструктор |
|
Начальные значения: |
Нет |
Процесс: |
Создаёт объект процессор простых дробей типа TProc. Поля Lop_Res, Rop инициализируются объектами (тип TFrac) со значением 0/1. В поле Error заносится пустая строка. Процессор устанавливается в состояние: “операция не установлена”: (Operation = None). |
СбросПроцессора |
|
Вход: |
Нет. |
Предусловия: |
Нет. |
Процесс: |
Поля объекта процессор простых дробей: Lop_Res, Rop инициализируются объектами (тип TFrac) со значением 0/1. В поле Error заносится пустая строка. Процессор устанавливается в состояние: “операция не установлена”: (Operation = None). |
Выход: |
Нет |
Постусловия: |
Состояние процессора – “операция сброшена” (Operation = None). |
СбросОперации |
|
Вход: |
Нет. |
Предусловия: |
Нет. |
Процесс |
Процессор устанавливается в состояние: “операция не установлена”: (Operation = None). |
Выход: |
Нет |
Постусловия: |
Состояние процессора – “операция сброшена” (Operation = None). |
ВыполнитьОперацию |
|
Вход: |
Нет. |
Предусловия: |
Нет. |
Процесс |
Вызывает выполнение текущей операции (записанной в поле Operation). Операция (Operation) выполняется над значениями, хранящимися в полях Rop и Lop_Res. Результат сохраняется в поле Lop_Res. Если Operation = None, никакие действия не выполняются. Если операция не может быть выполнена, в поле Error заносится сообщение об ошибке. Состояние объекта не изменяется. |
Выход: |
Нет |
Постусловия: |
Состояние процессора не изменяется. |
ВычислитьФункцию |
|
Вход: |
Вид функции (Func: TFunc). |
Предусловия: |
Нет |
Процесс |
Вызывает выполнение текущей функции (Func). Функция (Func) выполняется над значением, хранящимся в поле Rop. Результат сохраняется в нём же. Если операция не может быть выполнена, в поле Error заносится сообщение об ошибке. Состояние объекта не изменяется. |
Выход: |
Нет |
Постусловия: |
Состояние процессора не меняется. |
ЧитатьЛевыйОперанд |
|
Вход: |
Нет. |
Предусловия: |
Нет. |
Процесс |
Создаёт и возвращает копию объекта, указатель на который хранится в Lop_Res. |
Выход: |
Объект типа TFrac. |
Постусловия: |
Состояние процессора не изменяется. |
ЗаписатьЛевыйОперанд |
|
Вход: |
Переменная (Operand) типа TFrac. |
Предусловия: |
Нет. |
Процесс |
Создаёт копию объекта Operand и заносит указатель на него в поле Lop_Res. |
Выход: |
Нет. |
Постусловия: |
Состояние процессора не изменяется. |
ЧитатьПравыйОперанд |
|
Вход: |
Нет. |
Предусловия: |
Нет. |
Процесс |
Создаёт и возвращает копию объекта, указатель на который хранится в Rop. |
Выход: |
Объект типа TFrac. |
Постусловия: |
Состояние процессора не меняется. |
ЗаписатьПравыйОперанд |
|
Вход: |
Переменная (Operand) типа TFrac. |
Предусловия: |
Нет. |
Процесс |
Создаёт копию объекта Operand и заносит указатель на него в поле Rop. |
Выход: |
Нет. |
Постусловия: |
Состояние процессора не изменяется. |
ЧитатьСостояние |
|
Вход: |
Нет. |
Предусловия: |
Нет. |
Процесс |
Копирует и возвращает значение поля Operation. |
Выход: |
Значение поля Operation. |
Постусловия: |
Состояние процессора не изменяется. |
ЗаписатьСостояние |
|
Вход: |
Переменная (Oprtn) типа TOprtn. |
Предусловия: |
Нет. |
Процесс |
Заносит значение Oprtn в поле Operation. |
Выход: |
Нет. |
Постусловия: |
Состояние процессора изменяется на Oprtn. |
ЧитатьОшибку |
|
Вход: |
Нет. |
Предусловия: |
Нет. |
Процесс |
Копирует и возвращает значение поля Error. |
Выход: |
Значение поля Error. |
Постусловия: |
Состояние процессора не изменяется. |
СбросОшибки |
|
Вход: |
Нет. |
Предусловия: |
Нет. |
Процесс |
Очищает поле Error. |
Выход: |
Нет. |
Постусловия: |
Состояние процессора не изменяется. |
Рекомендации к выполнению
2/1 + 3/1 * (4/1)2
Шаг |
Вход |
Метод |
Rop |
Lop_Res |
Operation |
0 |
Конструктор |
0/1 |
0/1 |
None |
|
1 |
2 |
0/1 |
0/1 |
None |
|
2 |
+ |
Lop_Res_Set; OprtnSet |
0/1 |
2/1 |
Add |
3 |
3 |
0/1 |
2/1 |
Add |
|
4 |
* |
Rop_Set; OprtnRun; OprtnSet; |
3/1 |
2/1+3/1 |
Mul |
5 |
4 |
4/1 |
2/1+3/1 |
Mul |
|
6 |
Sqr |
Rop_Set; FuncRun |
(4/1)^2 |
2/1+3/1 |
Mul |
7 |
= |
OprtnRun |
(4/1)^2 |
2/1+3/1* (4/1)^2 |
Mul |
8 |
C |
ReSet |
0/1 |
0/1 |
None |
Содержание отчета
Лабораторная работа №4. Редактор простых дробей
Тема: Классы Object Pascal, С++
Цель: Сформировать практические навыки реализации классов средствами объектно-ориентированного программирования Object Pascal, С++.
Задание
На Унифицированном языке моделирования UML (Unified Modeling Language) наш класс можно обозначить следующим образом:
РедакторПростыхДробей |
строка: String |
дробьЕстьНоль: Boolean |
добавитьЗнак: String |
добавитьЦифру(a: Integer): String |
добавитьНоль: String |
забойСимвола: String |
очистить: String |
конструктор |
читатьСтрокаВформатеСтроки: String (метод свойства) |
писатьСтрокаВформатеСтроки(a: String) (метод свойства) |
редактировать(a: Integer): String |
Обязанность: ввод, хранение и редактирование строкового представления простых дробей. |
Рекомендации к выполнению
Содержание отчета
Контрольные вопросы
Лабораторная работа №5. Управление калькулятором простых дробей
Тема: Классы Object Pascal, С++
Цель: Сформировать практические навыки реализации классов средствами объектно-ориентированного программирования Object Pascal, С++.
Задание
На Унифицированном языке моделирования UML (Unified Modeling Language) наш класс можно обозначить следующим образом:
УправлениеКалькуляторомПростыхДробей (тип TCtrl) |
состояниеКалькулятора: TCtrlState |
редактор: TEditor |
процессор: TProc |
память: TMemory |
число: TFrac |
выполнитьКомандуКалькулятора(a: Integer; var b, MState: String): String |
выполнитьКомандуРедактора(a: Integer): String |
выполнитьОперацию(a: Integer): String |
выполнитьФункцию(a: Integer): String |
вычислитьВыражение(a: Integer): String |
установитьНачальноеСостояниеКалькулятора(a: Integer): String |
выполнитьКомандуюПамяти(a: Integer; var MState: String): String |
очиститьПамять(var MState: String): String |
записатьВПамять(var MState: String): String |
считатьИзПамяти(var MState: String): String |
добавитьКЧислуВПамяти(var MState: String): String |
читатьПисатьСостояниеКалькулятора: TCtrlState (свойство, опирающееся на поле) |
выполнитьКомандуБуфераОбмена(a: Integer; var b: String): String |
записатьВБуферОбмена(a: Integer; var b: String): String |
читатьИзБуферОбмена(a: Integer; var b: String): String |
сменитьОснованиеСистемыСчисления(b: integer; var s:String) |
конструктор |
деструктор |
Обязанность: управление выполнением команд калькулятора |
Рекомендации к выполнению
Рекомендации к выполнению
Логика работы объекта “управление калькулятором” класс TCtrl может быть описана с помощью таблицы переходов, которая отражает изменение состояния калькулятора и результат работы объекта под действием команд пользователя. Таблица переходов строится на основе анализа прецедентов (вариантов использования), приведённых в спецификации.
Для построения таблицы переходов необходимо:
Состояние калькулятора: Start (Начальное – после запуска приложения или выполнения команды С) |
|||
Вход (команда пользователя) |
Результирующее состояние |
Действия |
Примечание |
Команды ввода и редактирования |
Editing |
Изменение состояния редактируемой строки. (Вызов редактора). |
|
Операция (Op) |
Start |
Введённая операция становится текущей. |
|
Функция (Fun) |
Start |
Действия отсутствуют. |
|
Error |
|||
Команды памяти |
Start |
Действия отсутствуют. |
|
Команды буфера обмена |
Start |
Действия отсутствуют. |
|
Вычислить (=) |
Start |
Действия отсутствуют. |
|
Новое выражение (С) |
Start |
Действия отсутствуют. |
Состояние калькулятора: Editing (Редактирование) |
|||
Вход (команда пользователя) |
Результирующее состояние |
Действия |
Примечание |
Команды ввода и редактирования |
|||
Операция (Op) |
|
|
|
|
|||
Функция (Fun) |
|
|
|
|
|||
Взять из памяти (MR), (MS),(M+) |
|||
Вставить из буфера обмена, Копировать в буфер обмена |
|||
Вычислить (=) |
|
|
|
|
|||
Новое выражение (С) |
Состояние калькулятора: OpChange (смена операрации) |
|||
Вход (команда пользователя) |
Результирующее состояние |
Действия |
Примечание |
Команды ввода и редактирования |
|||
Операция (Op) |
|||
Функция (Fun) |
|
|
|
|
|||
Взять из памяти (MR) |
|||
Вставить из буфера обмена |
|||
Вычислить (=) |
|
|
|
|
|||
Новое выражение (С) |
Состояние калькулятора: ExpDone (Выражение вычислено) |
|||
Вход (команда пользователя) |
Результирующее состояние |
Действия |
Примечание |
Команды ввода и редактирования |
|||
Операция (Op) |
|||
Функция (Fun) |
|
|
|
|
|||
Взять из памяти (MR) |
|||
Копировать из буфера обмена (MR) |
|||
(MS),(MC),(M+), Вставить в буфер обмена |
|||
Вычислить (=) |
|
|
|
|
|||
Новое выражение (С) |
Состояние калькулятора: FunDone (Функция вычислена),) |
|||
Вход (команда пользователя) |
Результирующее состояние |
Действия |
Примечание |
Команды ввода и редактирования |
|||
Операция (Op) |
|
|
|
|
|||
Функция (Fun) |
|
|
|
|
|||
Взять из памяти (MR) |
|||
Копировать из буфера обмена (MR) |
|||
(MS),(MC),(M+), Вставить в буфер обмена |
|||
Вычислить (=) |
|
|
|
|
|||
Новое выражение (С) |
Состояние калькулятора: ValDone (Значение введено) |
|||
Вход (команда пользователя) |
Результирующее состояние |
Действия |
Примечание |
Команды ввода и редактирования |
|||
Операция (Op) |
|
|
|
|
|||
Функция (Fun) |
|
|
|
|
|||
Взять из памяти (MR) |
|||
Копировать из буфера обмена (MR) |
|||
(MS),(MC),(M+), Вставить в буфер обмена |
|||
Вычислить (=) |
|
|
|
|
|||
Новое выражение (С) |
Диаграмма классов для Управления калькулятором простых дробей представлено на рисунке ниже.
Содержание отчета
Контрольные вопросы
Лабораторная работа №6. Интерфейс калькулятора простых дробей
Тема: Классы Object Pascal, С++
Цель: Сформировать практические навыки реализации классов средствами объектно-ориентированного программирования Object Pascal, С++.
Задание
На Унифицированном языке моделирования UML (Unified Modeling Language) наш класс можно обозначить следующим образом:
ИнтерфейсКалькулятораПростыхДробей |
строкаПростаяДробь: TStaticText |
состояниеПамяти: TStaticText |
кнопки ввода: TBitButton |
FormCreate(Sender: TObject) |
ButtonClick(Sender: TObject) |
FormKeyPress(Sender: TObject; var Key: Char) |
Методы для обработки команд меню |
Обязанность: Обеспечить пользователю возможность управления калькулятором через клавиатуру и командные кнопки для выполнения вычислений |
Рекомендации к выполнению
Содержание отчета
Контрольные вопросы