Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Создание и использование абстрактного типа Circle



Тип Vect предназначен для хранения вектора (массива) целых чисел. В более общем случае элементами вектора могут быть также объекты абстрактных типов, например, комплексные числа, точки на плоскости, различные геометрические фигуры. Рассмотрим в качестве примера абстрактный тип Circle (окружность), объекты которого содержат координаты центра окружности и ее радиус (рис. 5, 6, 7). Кроме конструкторов и методов, здесь в интерфейс абстрактного типа введено свойство Radius, которое предоставляет удобный и контролируемый доступ пользователей типа к закрытому полю r объектов класса Circle. Например, метод put свойства запрещает запись в поле r отрицательных значений.

Наиболее полная информация о создании и использовании свойств на языке Visual С++ представлена в документации MSDN. Для обращения к ней необходимо выбрать опцию Contents в меню Help (или нажать кнопку Contents), установить в окне Contents фильтр Visual C++, а затем выбрать следующую последовательность опций: Development Tools and Languages -> Visual Studio -> Visual C++ -> Reference -> C/C++ Language Reference -> Lexical Conventions -> C++ Keywords -> property. В окне просмотра документации целесообразно установить фильтр для языка программирования: Language Filter -> C++.

 

#include < iostream>

class Circle{

private:

int x, y; // центр

int r; // радиус (доступ через свойство Radius)

public:

Circle (); // конструктор по умолчанию

Circle (int x1, int y1, int r1);

Circle(const Circle& t); // конструктор копии

Circle resize(int r1);

Circle operator*( int r1);

Circle move(int x1, int y1);

double square() const;

bool operator==(const Circle& t) const;

Circle operator=(const Circle& t);

void ToString();

void putprop(int j) // операция обновления свойства Radius

{ if(j> =0) r = j; }

int getprop()

{ return r; } // операция чтения значения свойства

__declspec(property(get = getprop, put = putprop)) int Radius;

};

Рис.5. Описание класса Circle

 

#include " Circle.h"

using namespace std;

Circle:: Circle () // конструктор по умолчанию

{ x=0; y=0; r=1; }

Circle:: Circle (int x1, int y1, int r1)

{ x=x1; y=y1; r=r1; }

Circle:: Circle(const Circle& t) // конструктор копии

{ x=t.x; y=t.y; r=t.r; }

Circle Circle:: resize(int r1)

{ r=r1; return (*this); }

Circle Circle:: operator*(int k)

{ r*=k; return (*this); }

Circle Circle:: move(int x1, int y1)

{ x=x1; y=y1; return (*this); }

double Circle:: square()const

{ return 3.14*r*r; }

bool Circle:: operator==(const Circle& t) const

{

if(square()==t.square()) return true;

else return false;

}

Circle Circle:: operator=(const Circle& t)

{ x=t.x; y=t.y; r=t.r; return (*this); }

void Circle:: ToString()

{

cout< < " [(" < < x< < ", " < < y< < " ), " < < r< < " ]" < < endl;

}

 

Рис.6. Файл Circle.cpp

 

 

#include " Circle.h"

using namespace std;

void main()

{

Circle c1(10, 10, 50), c2;

c1.move(30, 20);

c1.resize(10);

cout< < " c1=";

c1.ToString();

c2=c1*5;

cout< < " c2=";

c2.ToString();

c2.resize(50);

if ((c1==c2)) cout< < " Egual" < < endl;

cout< < c2.Radius< < endl; // операция чтения

c2.Radius=100; // операция записи

cout< < c2.Radius< < endl;

}

 

Рис.7. Программа Circleprog.cpp

 

ОБОРУДОВАНИЕ

Персональный компьютер: процессо­р с частотой 1, 6ГГц или выше, 1024 МБ ОЗУ, жесткий диск со скоростью 5400 об/мин, видеоадаптер с поддержкой DirectX 9 и с разрешением 1280 х 1024 (или более высоким), операционная система Windows 7, интегрированные среды разработки приложений Visual Studio 2010 и Visual Studio Team System 2008 с комплектами документации MSDN, каталог Tprog\Lab3, содержащий файл Labtprog3.doc (методи­ческие указания к данной лаборатор­ной работе) и исходные файлы Refer.cpp, Vect.h, Vect.cpp, Vectprog.cpp, Circle.h, Circle.cpp, Circleprog.cpp, не менее 200 Mб свободной памяти на логическом диске, со­держащем каталог Tprog\Lab3.

 

ЗАДАНИЕ НА РАБОТУ

 

4.1. Ознакомиться с технологией создания и отладки абстрактных (пользовательских) типов на неуправляемом (unmanaged) языке Visual С++ в интегрированной среде разработки приложений Visual Studio 2010 в процессе создания приложений Refer, Vect, Circle.

4.2. Разработать и отладить объектно-ориентированную программу на неуправляемом (unmanaged) языке С++ в интегрированной среде разработки приложений Visual Studio 2010 в соответствии с заданием преподавателя. Примерами заданий могут быть следующие.

1. Разработать классы (h-файлы и cpp-файлы) Complex и Array (массив комплексных чисел), позволяющие использовать их в следующей программе:

Complex x(1.3, 4.2), y(4.0, 8.1), z(y); x.add(y); z.assign(plus(x, y)); print(z);

Array a1(10), a2(10); (a1[0]).assign(y); a2+=a1; a1=a2; a2.print();

Проверить согласованность операций классов Complex и Array, ввести свойства в абстрактные типы. Расширить приведенный фрагмент программы и проверить правильность его выполнения.

2. Разработать классы (h-файлы и cpp-файлы) Point и Array (массив точек), позволяющие использовать их в следующей программе:

Point p1(10, 20), p2(40, 25), p3=p1; p3.assign(p2); mul(p3, 2); print(move(p2, 40, 20));

Array a1(10), a2(10); (a1[0]).assign(p1); (a1[1]).assign(p2); a2.assign(a1); print(a2);

Проверить согласованность операций классов Point и Array, ввести свойства в абстрактные типы. Расширить приведенный фрагмент программы и проверить правильность его выполнения.

3. Разработать классы (h-файлы и cpp-файлы) Complex и Array (массив комплексных чисел), позволяющие использовать их в следующей программе:

Complex x, y(4.0, 8.1), z(5.2, 6.0); x=5*y+z; x.print();

Array a1(10), a2(10); a1[0]=y; a2= -(a1); a1.assign(a2); a1.print();

Проверить согласованность операций классов Complex и Array, ввести свойства в абстрактные типы. Расширить приведенный фрагмент программы и проверить правильность его выполнения.

4. Написать тексты h-файлов и cpp-файлов для классов Point и Rect (прямоугольник). Описание классов:

Класс Элементы данных Интерфейс
Point x, y Конструкторы, функция print, операции +=, =
Rect p (типа Point), dx, dy Конструкторы, функции move, square, equal операции +, +=, < <

Разработать и отладить программу создания и использования объектов классов Point и Rect. Проверить согласованность операций классов Point и Rect, ввести свойства в абстрактные типы.

5. Написать тексты h-файлов и cpp-файлов для классов Complex и Array (массив комплексных чисел). Описание классов:

Класс Элементы данных Интерфейс
Complex re, im Конструкторы, функции assign, add, plus, print
Array pa, size Конструкторы, операции +, +=(friend), =, [], < <

Разработать и отладить программу создания и использования объектов классов Complex и Array. Проверить согласованность операций классов Complex и Array, ввести свойства в абстрактные типы.

 

ПОРЯДОК ВЫПОЛНЕНИЯ РАБОТЫ

 

5.1. Проверить наличие на компьютере необходимого аппаратного оборудования и программного обеспечения, наличие 200 Мб свободной памяти на логическом диске, содержащем каталог Tprog\Lab3, наличие файла Labtprog3.doc и исходных файлов Refer.cpp, Vect.h, Vect.cpp, Vectprog.cpp, Circle.h, Circle.cpp, Circleprog.cpp в каталоге Tprog\Lab3.

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

5.3. Создать в личном каталоге пустой проект неуправляемого консольного приложения, выбирая в IDE-среде в меню File следующую последовательность опций: New-> Project-> Other Language -> Visual C++ -> Win32 -> Win32 Console Application -> Empty Project, а затем добавить в него файл Refer.cpp, предварительно выполнив копирование в каталог проекта исходных файлов приложения. По команде Ctrl+F5 откомпилировать проект и выполнить приложение. Проверить правильность работы приложения.

5.4. Повторить выполнение пункта 5.3 для приложений Vect и Circle. Для смены файлов в проекте необходимо в окне Solution Explorer удалить файлы проекта из разделов Header Files и Source Files (выбирая в контекстном меню Exclude From Project), а затем добавить в эти разделы файлы нового приложения (выбирая в контекстном меню Add -> Existing Item).

5.5. Разработать и отладить объектно-ориентированную программу на неуправляемом (unmanaged) языке С++ в интегрированной среде разработки приложений MS Visual Studio.NET 2005 в соответствии с заданием преподавателя. Если при отладке возникают проблемы с устранением ошибок в программе, необходимо выделить ошибку в окне Error List и нажать клавишу F1. В появившемся окне документации MSDN будет приведены примеры исправления ошибки.

 

ОФОРМЛЕНИЕ ОТЧЕТА

 

Отчет должен содержать:

· цель работы и индивидуальное задание;

· тексты исходных файлов, содержащие описание и реализацию классов, используемых в лабораторной работе;

· файлы *.h и *.cpp, содержащие описание и реализацию классов в соответствии с заданием преподавателя;

· текст тестовой программы и результаты работы программы;

· краткая информация о перегрузке операций в абстрактном типе.

 

КОНТРОЛЬНЫЕ ВОПРОСЫ

 

7.1. Чем обусловлено введение дружественных функций в языке С++?

7.2. Чем отличается реализация дружественной функции от функции-элемента класса?

7.3. Можно ли для абстрактного типа данных использовать сим­вол операции, не используемый для обозначения стандартных операций языка С++?

7.4. Что дает использование ссылок при реализации функций?

7.5. Что означают слова lvalue и rvalue, появляющиеся иногда в сообщениях компилятора об ошибках?

7.6. Чем отличается инициализация от присваивания?

7.7. Какие операторные функции не могут быть дружественными функциями?

7.8. Как компилятор различает случаи использования стандарт­ного и перегруженного операторов []?

7.9. Всегда ли выполняется определение обоих методов (get и put) при объявлении свойства?

7.10. Будет ли ошибка, если при создании нового типа данных не будет перегружен оператор присваивания?

 

БИБЛИОГРАФИЧЕСКИЙ СПИСОК

 

1. Подбельский, В.В. Язык Си+: учеб.пособие для вузов / В.В.Подбельский.— 5-е изд. — М.: Финансы и статистика, 2007 (2001, 2002, 2003, 2004, 2005, 2006).— 560с.: ил.

2. Павловская, Т.А. C/C++: Программирование на языке высокого уровня: учебник для вузов / Т.А.Павловская.— М.[и др.]: Питер, 2007 (2002, 2003, 2004, 2005, 2006).— 461с.: ил.3. Гарнаев А.Ю. Самоучитель Visual Studio.Net 2003. – СПб.: БХВ-Петербург, 2003. – 688 с.

3. Шилдт, Г. C+: базовый курс / Г.Шилдт; пер.с англ.и ред.Н.М.Ручко.— 3-е изд. — М.[и др.]: Вильямс, 2007 (2005).— 624с.: ил.5. Уоткинз Д., Хаммонд М., Эйбрамз Б. Программирование на платформе.NET. – М.: Издательский дом " Вильямс", 2003. – 368 с.

4. MSDN 2010. Электронная документация Microsoft для разработчиков программного обеспечения. – 500000 с.

 


ЛАБОРАТОРНАЯ РАБОТА N 4

Создание контейнерных объектов в программах на языке С++

 

ЦЕЛЬ И ЗАДАЧИ РАБОТЫ

 

Ознакомление с основными способами доступа к элементам объ­ектов контейнерного типа и отслеживания скрытого представления сложных структур данных посредством создания и использования итераторов.

 

ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ

 

Контейнерные классы - это классы, объекты которых состоят из множества элементов. Например, массивы и списки обычно представ­ляются в объектно-ориентированных программах в виде объектов кон­тейнерных классов. Рассмотренные ранее классы stack, String и Vect являются контейнерными классами. Простейший способ доступа к элементам объекта контейнерного типа - это использование перегру­женной операторной функции индексации. Однако данный способ имеет ряд недостатков. Во-первых, индексацию невозможно использовать для объектов-списков. Во-вторых, при использовании индексации на пользователя контейнерного типа возлагается необходимость органи­зации последовательного доступа ко всем элементам контейнерного объекта. Для класса Vect организация последовательного доступа к элементам объекта может быть реализована посредством оператора for, например:

Vect a=b; for(i=0; i< size; ++i)

sum+=a[i];

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


Поделиться:



Популярное:

Последнее изменение этой страницы: 2016-05-03; Просмотров: 917; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.032 с.)
Главная | Случайная страница | Обратная связь