
Современные технологии программирования |
Лабораторные работы |
содержание |
Лабораторный практикум в формате Microsoft Word
Внимательно прочтите следующие рекомендации
Каждая из четырёх лабораторных работ должна быть выслана со страниц нашего сайта. С порядком отправки выполненной работы можно ознакомиться в инструкции по отправке, доступной по адресу: http://ndo.sibsutis.ru/dist03/newsystem.htm. После проверки работы преподавателем Вы получите рецензию с оценкой и возможными замечаниями по представленному решению для исправления или доработки. В этом случае после доработки Вы должны повторно выслать работу на проверку.
Лабораторная работа №1 Абстрактный тип данных (ADT) Множество (на шаблоне)
Лабораторная работа №2 Класс «редактор»
Лабораторная работа №3 Параметризованный абстрактный тип данных «Процессор»
Лабораторная работа №4 Управление калькулятором
Лабораторная работа №5 Панель управления калькулятором (Интерфейс)
Введение
Целями данного лабораторного практикума является формирование практических навыков:
проектирования программ в технологии «абстрактных типов данных»;
реализации абстрактных типов данных с помощью классов С++;
использования библиотеки визуальных компонентов для построения интерфейса.
Результатом выполнения предлагаемых в практикуме лабораторных работ станет приложение под Windows «Калькулятор».
Задание
Реализовать калькулятор для выполнения вычислений над заданными в соответствии с вариантом курсового проекта числами, используя классы С++ и библиотеку визуальных компонентов для построения интерфейса.
Варианты чисел:
действительные числа, представленные в системе счисления с основанием р (р-ичные числа),
простые дроби,
комплексные числа.
Общие требования
1. Калькулятор обеспечивает вычисление выражений с использованием операций: +, -, *. / и функций: Sqr (возведение в квадрат), Rev (1/x - вычисление обратного значения) без учёта приоритета операций. Приоритет функций одинаковый, выше приоритета операций.
2. Предусмотреть возможность ввода операндов в выражение:
с клавиатуры,
с помощью командных кнопок,
из буфера обмена,
из памяти.
3. Необходимо реализовать команду (=). которая завершает вычисление выражения. Она выполняет текущую операцию.
4. Необходимо реализовать команду С (начать вычисление нового выражения), которая устанавливает калькулятор в начальное состояние. Она сбрасывает текущую операцию и устанавливает нулевое значение для отображаемого числа и операндов.
5. Интерфейс выполнить в стиле стандартного калькулятора Windows (вид - обычный).
6. Приложение должно иметь основное окно для ввода исходных данных, операций и отображения результата и окно для вывода сведений о разработчиках приложения.
7. Основное окно должно содержать список из трёх меню:
Правка:
Содержит два пункта: копировать и вставить. Эти команды используются для работы с буфером обмена;
Настройка:
Содержит команды выбора режима работы приложения;
Справка:
Этот команда для вызова справки о приложении.
4. Калькулятор должен обеспечивать возможность ввода исходных данных с помощью:
командных кнопок (мышью),
клавиатуры: цифровой и алфавитно-цифровой.
5. Вводимые числа выравнивать по правому краю.
6. Калькулятор должен быть снабжён памятью. Для работы с памятью необходимы команды:
MC («Очистить»),
MS («Сохранить»),
MR («Копировать»),
M+ («Добавить к содержимому памяти»).
Память может находиться в двух состояниях, которые отображаются на панели:
«Включена» (M). В памяти храниться занесённое значение
«Выключена» ( ). В памяти находится ноль.
Состояние памяти меняется командами Записать и Добавить.
7. Для редактирования вводимых значений необходимы команды:
BackSpase (удалить крайний справа символ отображаемого числа),
CE (заменить отображаемое число нулевым значением)
Добавить символ, допустимый в изображении числа (арабские цифры, знак, разделители).
8. Снабдите компоненты интерфейса всплывающими подсказками.
Вариант 1 – «Калькулятор р-ичных чисел».
Требования.
Калькулятор обеспечивает работу с числами в системах счисления с основанием в диапазоне от 2 до 16.
Основание системы счисления – настраиваемый параметр. Настройку можно установить в основном окне или добавить в меню «Настройка».
Исходные числа и результат вводятся и выводятся в формате фиксированная точка [-]<р - ичное целое без знака><разделитель>[< р - ичная дробь без знака >] Необходимо обеспечить возможность работы в режимах:
«целые» (вводятся только р-ичные целые числа),
«действительные» (вводятся р-ичные числа с целой и дробной частями).
4. Кнопки для ввода цифровой информации необходимо связать с используемой системой счисления. Для пользователя необходимо сделать доступными кнопки только для ввода цифр используемой системы счисления.
5. При смене системы счисления отображаемое число должно выражаться в новой системе счисления.
Необходимо предусмотреть следующие варианты (прецеденты) использования калькулятора:
Выполнение одиночных операций: «операнд1» «оператор» «операнд2» «=» «результат»
Пример. 5 + 2 = 7 (р = 10)
Выполнение операций с одним операндом: «операнд» «оператор» «=» «результат»
Пример. 5 * = 25 (р = 10)
Повторное выполнение последней операции: «=»«результат» «=» «результат»
Пример. 5 + 4 = 9 = 13 = 17(р = 10)
Выполнение операции над отображаемым значением в качестве обоих операндов: «результат» «оператор» «=» «результат»
Пример. 2 + 3 = 5 = 8 + = 16(р = 10)
Вычисление функций: «операнд» «Sqr» «результат»
Пример. 5 «Sqr» 25 (р = 10)
Вычисление выражений: «операнд1» «функция1» «оператор1» «операнд2» «функция2» «оператор2» …«операндN» «операторN» «=»«результат»
Пример.
ввод |
6 |
Sqr |
+ |
2 |
Sqr |
/ |
10 |
+ |
6 |
= |
Отображаемый результат |
6 |
36 |
36 |
2 |
4 |
40 |
10 |
4 |
6 |
10 |
Операнды выражений могут копироваться из памяти, буфера обмена или вводиться с помощью кнопок и клавиатуры.
Вариант 2 – «Калькулятор простых дробей».
Требования.
1. Калькулятор должен обеспечить ввод и редактирование целых чисел в обычной записи и рациональных дробей в записи:
[-]<целое без знака>|[-]<числитель><разделитель><знаменатель>. <числитель>::= <целое без знака> <знаменатель>::= <целое без знака> <разделитель>::= ‘/’ | ‘|’
2. Предусмотреть настройку калькулятора на отображение результата в двух форматах: «дробь» или «число». В формате «дробь» результат всегда отображается в виде дроби. В формате «число» результат отображается в виде числа, если дробь может быть сокращена, так что знаменатель равен 1.
Необходимо предусмотреть следующие варианты использования (прецеденты) калькулятора:
Выполнение одиночных операций: «операнд1» «оператор» «операнд2» «=» «результат»
Пример. 5/1 + 2/1 = 7/1.
Выполнение операций с одним операндом: «операнд» «оператор» «=» «результат»
Пример. 5/1 * = 25/1.
Повторное выполнение операции: «=»«результат» «=» «результат»
Пример. 5/1 + 4/1 = 9/1 = 13/1 = 17.
Выполнение операции над отображаемым значением в качестве обоих операндов: «результат» «оператор» «=» «результат»
Пример. 2/1 + 3/1 = 5/1 = 8/1 + = 16/1.
Вычисление функций: «операнд» «Sqr» «результат»
Пример. 5/1 «Sqr» 25/1.
Вычисление выражений: «операнд1» «функция1» «оператор1» «операнд2» «функция2» «оператор2» …«операндN» «операторN» «=»«результат»
Пример.
ввод |
6/1 |
Sqr |
+ |
2/1 |
Sqr |
/ |
10/1 |
+ |
6/1 |
= |
Отображаемый результат |
6/1 |
36/1 |
36/1 |
2/1 |
4/1 |
40/1 |
10/1 |
4/1 |
6/1 |
10/1 |
Операнды могут выражений могут копироваться из памяти, из буфера обмена или вводиться с помощью кнопок и клавиатуры.
Вариант 3 – «Калькулятор комплексных чисел».
Требования.
1. Калькулятор обеспечивает ввод комплексных чисел в записи:
[-]<действительная часть><разделитель>[-] <мнимая часть> <действительная часть>::= <действительное число без знака с целой и\или дробной частями> <мнимая часть>::= <действительное число без знака с целой и\или дробной частями> <разделитель>::= ‘i*’
2. Предусмотреть настройку калькулятора на отображение результата в двух форматах: “комплексное” или “действительное” число. В формате «комплексное» результат всегда отображается в виде комплексного числа. В формате «действительное» результат отображается в виде действительного, если мнимая часть равна 0.
3. Калькулятор должен вычислять функции: Pwr - возведение в целую степень, Root - извлечение целого корня (Предусмотреть возможность вывода всех корней), Mdl - вычисление модуля комплексного числа, Cnr - вычисление аргумента комплексного числа в градусах, Cnr - вычисление аргумента комплексного числа в радианах. Предусмотреть ввод показателя степени для возведения в степень и извлечения корня. Результат вычисления указанных выше функций отображайте в отдельных компонентах. Эти операции вычисляются отдельно, а не в составе выражения.
Необходимо предусмотреть следующие варианты использования калькулятора (прецеденты):
Выполнение одиночных операций: «операнд1» «оператор» «операнд2» «=» «результат»
Пример. 5 + 2 = 7.
Выполнение операций с одним операндом: «операнд» «оператор» «=» «результат»
Пример. 5 * = 25.
Повторное выполнение операции: «=» «результат» «=» «результат»
Пример. 5 + 4 = 9 = 13 = 17.
Выполнение операции над отображаемым значением в качестве обоих операндов: «результат» «оператор» «=» «результат»
Пример. 2 + 3 = 5 = 8 + = 16.
Вычисление функций: «операнд» «Sqr» «результат»
Пример. 5 «Sqr» 25 (р = 10)
Вычисление выражений: «операнд1» «функция1» «оператор1» «операнд2» «функция2» «оператор2» …«операндN» «операторN» «=»«результат»
Пример.
ввод |
6 |
Sqr |
+ |
2 |
Sqr |
/ |
10 |
+ |
6 |
= |
Отображаемый результат |
6 |
36 |
36 |
2 |
4 |
40 |
10 |
4 |
6 |
10 |
Операнды выражений могут копироваться из памяти, буфера обмена или вводиться с помощью кнопок и клавиатуры.
Рекомендации к выполнению
В качестве буфера обмена используйте глобальный объект ClipBoard класса TClipBoard, доступный во всех работающих приложениях.
Диаграмма классов UML для калькулятора представлена на рисунке.
Здесь класс число в зависимости от варианта может быть: р-ичное число, простая дробь, комплексное число.
3. Для выполнения задания вам необходимо выполнить лабораторные работы, приведённые в методических указаниях. Рекомендуемый порядок выполнения:
Вариант - калькулятор р-ичных чисел:
a. Лабораторная работа. Абстрактный тип данных простая дробь.
b. Лабораторная работа. Абстрактный тип данных комплексное число.
c. Лабораторная работа. Абстрактный тип данных p - ичное число.
d. Лабораторная работа. Редактор p - ичных чисел.
e. Лабораторная работа. Параметризованный абстрактный тип данных «Память».
f. Лабораторная работа. Параметризованный абстрактный тип данных «Процессор».
g. Лабораторная работа. Управление калькулятором.
h. Лабораторная работа. Интерфейс калькулятора.
Вариант - калькулятор простых дробей:
a. Лабораторная работа. Абстрактный тип данных простая дробь.
b. Лабораторная работа. Абстрактный тип данных комплексное число.
c. Лабораторная работа. Абстрактный тип данных p - ичное число.
d. Лабораторная работа. Редактор простых дробей.
e. Лабораторная работа. Параметризованный абстрактный тип данных «Память».
f. Лабораторная работа. Параметризованный абстрактный тип данных «Процессор».
g. Лабораторная работа. Управление калькулятором.
h. Лабораторная работа. Интерфейс калькулятора.
Вариант - калькулятор комплексных чисел:
a. Лабораторная работа. Абстрактный тип данных простая дробь.
b. Лабораторная работа. Абстрактный тип данных комплексное число.
c. Лабораторная работа. Абстрактный тип данных p - ичное число.
d. Лабораторная работа. Редактор комплексных чисел.
e. Лабораторная работа. Параметризованный абстрактный тип данных «Память».
f. Лабораторная работа. Параметризованный абстрактный тип данных «Процессор».
g. Лабораторная работа. Управление калькулятором.
h. Лабораторная работа. Интерфейс калькулятора.
Литература
Вендров А.М. Проектирование программного обеспечения экономических информационных систем. Учебник. — 2-е изд., перераб. и доп. – М.: Финансы и статистика, 2005. 544 c.: ил.
Орлов С.А. Технологии разработки программного обеспечения. Разработка сложных программных систем: Учебное пособие для вузов. СПб.: Питер, 2003. – 472с.: ил.
Г. Буч. Обьектно-ориентированное проектирование с примерами приложений на С++, 2-ое издание. Учебник/: Пер. с англ. - М.: Издательство Бином, СПб.: Невский Диалект, 1999. - 560с
наверх
содержание
Лабораторная работа №1
Лабораторная работа. Абстрактный тип данных (ADT) Множество (на шаблоне)
Тема: Классы C++Builder и шаблоны, стандартный класс TList
Цель: Сформировать практические навыки: реализации абстрактных типов данных с помощью классов C++Builder и шаблонов
Задание
В соответствии с приведенной ниже спецификацией реализовать тип «множество». Для тестирования в качестве значения для типаT выберите тип int.
Протестировать каждую операцию, определенную на типе данных одним из методов тестирования.
Спецификация типа данных «множество»
ADT TSet Данные Множества - это изменяемые неограниченные наборы элементов типа T. Содержимое множества изменяется следующими операциями:
Опустошить (опустошение множества);
Добавить (добавление элемента во множество);
Удалить (извлечение элемента из множества).
Множество поддерживает следующую дисциплину записи и извлечения элементов: элемент может присутствовать во множестве только в одном экземпляре, при извлечении выбирается заданный элемент множества и удаляется из множества. Операции Операции могут вызываться только объектом «множество» (тип TSet), указатель на который передаётся в них по умолчанию. При описании операций этот объект в разделе «Вход» не указывается. Таблица 1. Описание операций на ADT TSet.
Наименование Операции |
Описание |
Конструктор |
|
Начальные значения: |
Нет. |
Процесс: |
Создаёт пустое множество элементов типа T. |
|
|
Опустошить |
|
Вход: |
Нет. |
Предусловия: |
Нет. |
Процесс: |
Удаляет из множества все элементы. |
Выход: |
Нет. |
Постусловия: |
Множество - пусто. |
|
|
Добавить |
|
Вход: |
d – элемент типа Т. |
Предусловия: |
Нет. |
Процесс: |
Добавляет d во множество, если в нем нет такого элемента. |
Выход: |
Нет. |
Постусловия: |
Множество содержит элемент d. |
|
|
Удалить |
|
Вход: |
d – элемент типа Т. |
Предусловия: |
Нет. |
Процесс: |
Удаляет элемент d из множества, если d принадлежит множеству. |
Выход: |
Нет. |
Постусловия: |
Множество не содержит элемент d. |
|
|
Пусто |
|
Вход: |
Нет. |
Предусловия: |
Нет. |
Процесс: |
Определяет, содержит ли множество элементы. Возвращает значение True, если множество не пусто, False – в противном случае. |
Выход: |
Булевское значение. |
Постусловия: |
Нет. |
|
|
Принадлежит |
|
Вход: |
d – элемент типа Т. |
Предусловия: |
Нет. |
Процесс: |
Определяет, принадлежит ли элемент d множеству. Возвращает True, если d принадлежит множеству, False - в противном случае. |
Выход: |
Булевское значение. |
Постусловия: |
Нет. |
|
|
Объединить |
|
Вход: |
Множество q. |
Предусловия: |
Нет |
Процесс: |
Создаёт множество, полученное в результате объединения множества с множеством q. |
Выход: |
Множество. |
Постусловия: |
Нет. |
|
|
Вычесть |
|
Вход: |
Множество q. |
Предусловия: |
Нет. |
Процесс: |
Создаёт множество, полученное в результате вычитания из множества множество q. |
Выход: |
Множество. |
Постусловия: |
Нет. |
|
|
Умножить |
|
Вход: |
Множество q. |
Предусловия: |
Нет. |
Процесс: |
Создаёт множество, являющееся пересечением множества с множеством q. |
Выход: |
Множество. |
Постусловия: |
Нет. |
|
|
Элементов |
|
Вход: |
Нет. |
Предусловия: |
Нет. |
Процесс: |
Подсчитывает и возвращает количество элементов во множестве, если множество пустое - ноль |
Выход: |
Целое - количество элементов во множестве. |
Постусловия: |
Нет. |
|
|
Элемент |
|
Вход: |
j - номер элемента множества. |
Предусловия: |
Нет. |
Процесс: |
Обеспечивает доступ к элементу множества для чтения по индексу j так, что если изменять j от 1 до количества элементов во множестве, то можно просмотреть все элементы множества. |
Выход: |
Элемент множества типа Т. |
Постусловия: |
Множество не модифицируется |
end TSet
Рекомендации к выполнению
Тип данных реализовать, используя классы C++Builder и шаблон.
Реализуйте множество, используя класс TSet, параметризуя его с помощью шаблона. Описание реализации в виде диаграммы классов UML и описание класса TSet представлено ниже:
//-----------------файл UMain.cpp------------------------------------ #include <vcl.h> #pragma hdrstop #include <stdarg.h> #include "USet.h" //---------------------------------------------------------------------------
#pragma argsused //--------------------------------------------------------------------------- int main(int argc, char* argv[]) { int i = 0; TSet<int>* A = new TSet<int>(); TSet<int>* B = new TSet<int>(); (*A)<< 1;//{1} *B << 1; *B << 2;//{1, 2,} TSet<int>* C = (*A) + (*B);//{1, 2,} cout << "{1, 2,}: " << *C << endl; TSet<int>* D = (*A) - (*B);//{} cout << "{}: " << *D << endl; TSet<int>* E = (*B) - (*A);//{2,} cout << "{2,}: " << *E << endl; TSet<int>* G = (*B) * (*A);//{1,} cout << "{1,}: " << *G << endl; for(int i = 0; i < 5; i++) *A << i + 1; cout << "{1,2,3,4,5}: " << *A << endl; cin >> i; return 0; } //------------------------------------------------------------------- //--------файл USet.cpp---------------------------------------------- #include <vcl.h> #include <math.h> #include <iostream.h>
#ifndef USetH #define USetH //------------------------------------------------------------------- #endif //------------------------------------------------------------------- template<class T> class TSet : public TList
{ bool InSetInd(T a, int& j) const; String GetSet(void) const; int GetMembers(void) const {return Count;}; T GetItem(int i) const {return*( static_cast<T*>(Items[i]));}; public:
TSet();//Конструктор
TSet(const TSet<T>& P);//Копирующий конструктор virtual __fastcall ~TSet(void);//Деструктор void AddItem(T a);//Добавить элемент в множество void RemItem(T a);//Удалить элемент из множества bool IsEmpty(void); //Множество пусто bool InSet(T a) const; void Empty(void); TSet<T>* operator + (const TSet<T>& P);//Сложение множеств TSet<T>* operator - (const TSet<T>& P);//Вычитание множеств TSet<T>* operator * (const TSet<T>& P);//Умножение множеств TSet<T>& operator << (const T& m); T operator [] (int i);//Одночлен по индексу bool operator == (const TSet<T>& P);//Сравнение двух множеств friend ostream& operator << (ostream & , const TSet<T>& S); __property String Set = {read = GetSet};//Чтение множества в формате строки __property T Member[int index] = {read = GetItem}; __property int Members = {read = GetMembers}; }; //------------------------------------------------------------------- template<class T> bool TSet<T>::InSetInd(T a, int& j) const //проверяет присутствие элемента а во множестве { int i; bool R = False; for (int i = 0; i < Count;i++) if (Member[i]== a) { R = True; j = i; break; } return R; } //------------------------------------------------------------------- template <class T> ostream& operator << (ostream& stream, TSet<T>& S) { stream << "{"; if(!S.IsEmpty()) {
for(int i = 0; i < S.Members; i++) cout << S.Member[i] << ", "; } return stream << "}"; }
Для обработки объектов с помощью множества TSet, пользователю необходимо будет вместо идентификатора T подставить тип его объектов.
Для реализации множества опишите класс (тип TSet), наследующий от класса Tlist.
Типы данных реализуйте в отдельном модуле USET.
Порядок выполнения
Реализуйте заданную абстракцию данных по обоим вариантам в режиме консольного приложения. Для первого варианта:
Создайте консольное приложение и сохраните его под именем PSet.
Добавьте к консольному приложению модуль и сохраните его под именем USet.
В модуле USet опишите класс TSet.
Опишите в головной программе (в файле UMain.cpp) тип T объектов пользователя.
Разработайте тестовый набор данных для тестирования операций, заданных на множестве. Тестовый набор поместите в таблицу следующего вида:
Таблица 2. Тестовый набор.
Тестовый набор для тестирования операции Сложить множества целых чисел |
||||
Номер теста |
Исходные данные |
Ожидаемый результат |
||
Вход |
Множество |
Возвращаемое значение |
Множество |
|
1 |
() |
() |
() |
() |
2 |
(0) |
() |
(0) |
() |
3 |
(1) |
(0) |
(1 0) |
(0) |
4 |
(1 0) |
(1 0) |
(1 0) |
(1 0) |
5 |
(1 2 3) |
(3 4 5) |
(1 2 3 4 5) |
(3 4 5) |
Оттестируйте разработанную абстракцию данных в режиме консольного приложения.
Контрольные вопросы
В чём особенности виртуальных методов?
В чём особенности абстрактных методов?
В чём особенности описания классовых методов?
Как пользоваться указателями на методы?
Что такое делегирование?
Как вы использовали делегирование при реализации множества?
Что необходимо описать пользователю для работы с реализованными вами множествами?