Разработка классов для работы с геометрическими фигурами

Использование объектно-ориентированного подхода программирования и алгоритмического языка C++ для реализации программы обработки класса "Треугольник". Поля, открытые и закрытые члены класса. Описание виртуальной функции Разработка графического интерфейса.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 22.02.2019
Размер файла 330,4 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

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

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РФ

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

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

Кафедра «Компьютерные технологии

КУРСОВАЯ РАБОТА

по дисциплине: «Объектно-ориентированные языки и системы программирования»

на тему: «Разработка классов для работы с геометрическими фигурами»

Выполнила: ст. гр. 14ВГ1 Мартышкина Н.А.

Пенза 2015

Содержание

  • Введение
  • 1. Постановка задачи
  • 2. Описание класса

2.1 Открытые и закрытые члены класса

  • 2.2 Поля класса
    • 2.3 Объявление класса
  • 3. Описание методов класса
    • 3.1 Конструкторы
    • 3.2 Виртуальные функции
  • 4. Описание работы программы
  • Заключение
  • Список литературы
  • Приложение

Введение

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

Этими принципами являются:

· инкапсуляция;

· полиморфизм;

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

Инкапсуляция - объединение в единое целое данных и алгоритмов обработки этих данных. В рамках ООП данные называются переменными или полями объекта, а алгоритмы - функциями или методами объекта.

Наследование - свойство объектов порождать своих потомков. Объект-потомок автоматически наследует от родителей все поля и методы, может дополнять объекты новыми полями и заменять (перекрывать) методы родителя или дополнять их.

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

Бьярн Страуструп оценил этот подход и на его основе разработал язык, получивший название «Си с классами». Вскоре язык Си с классами превратился в отдельный язык С++ (Си плюс плюс), который был представлен общественности в 1983 г.

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

Ранее, в структурном программировании, приходилось работать с ограниченным набором типов данных, которые ограничивали уровень абстракции и были не очень удобны для представления объектов реального мира.

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

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

Для достижения поставленной цели предполагается выполнить следующие задачи:

· реализовать описание класса;

· реализовать методы класса;

· разработать программу.

1. Постановка задачи

Создать класс треугольник, члены класса - длины 3-х сторон. Предусмотреть в классе конструктор, методы проверки существования треугольника, вычисления и вывода сведений о фигуре - длины сторон, углы, периметр, площадь. Создать производный класс - равносторонний треугольник, перегрузить в классе проверку, является ли треугольник равносторонним и метод вывода сведений о фигуре. Написать программу, демонстрирующую работу с классом: дано K треугольников и L равносторонних треугольников, найти среднюю площадь для K треугольников и наибольший равносторонний треугольник. Разработать графический интерфейс.

2. Описание класса

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

class <имя>{

[ private: ]

<описание скрытых элементов>

public:

<описание доступных элементов>

protected:

<описание защищенных элементов >

}; // Описание заканчивается точкой с запятой

2.1 Открытые и закрытые члены класса

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

· открытые, также называемые публичными, (public). Их вызов осуществляется с помощью оператора . («точка»);

· закрытые, или приватные(private), доступ, к которым возможен только с помощью открытых методов;

· защищенные (protected) методы, являются промежуточными между private и public. Их мы рассмотрим в уроке про наследование.

По умолчанию функции и данные, объявленные внутри класса, считаются закрытыми и доступны лишь функциям - членам этого класса. Спецификатор public открывает доступ к функциям и данным класса из других частей программы. Спецификатор доступа protected необходим только при наследовании классов. Зона влияния спецификатора доступа простирается до следующего спецификатора или до конца объявления файла.

Функции, объявленные внутри класса, называются функциями-членами. Они имеют доступ ко всем элементам своего класса, включая закрытые члены. Переменные, объявленные внутри класса, называются переменными-членами, данными-членами или полями. Класс - это фактически новый тип данных. Для создания переменной типа класс служит оператор: name_class name;

Здесь name_class - имя класса, name - имя переменной. В дальнейшем переменную типа class будем называть объект или экземпляр класса. Объявление переменной типа class (в нашем примере переменная name типа name_class) называется созданием объекта.

После описания переменной можно обращаться к членам и методам класса. Это делается аналогично обращению к полям структуры с помощью оператора . (точка). В дальнейшем переменную типа class будем называть «объект» или «экземпляр класса». Объявление переменной типа class(в нашем примере переменная name типа name_class) называется созданием (инициализацией) объекта (экземпляра класса).

2.2 Поля класса

Как правило, все данные-члены объявляют закрытыми. Это обеспечивает инкапсуляцию данных. Однако существуют ситуации, в которых некоторые переменные следует объявлять открытыми. Например, если некоторая переменная используется очень часто, открытый доступ выполняется намного быстрее.

Поля класса:

· могут иметь любой тип, кроме типа этого же класса (но могут быть указателями или ссылками на этот класс);

· могут быть описаны с модификатором const, при этом они инициализируются только один раз (с помощью конструктора) и не могут изменяться;

· могут быть описаны с модификатором static, но не как auto, extern и register.

2.3 Объявление класса

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

class triangle

{

public:

double side_a, side_b, side_c;

triangle ();

triangle (double a, double b, double c);

virtual void check (double &k);

virtual void output (double &A, double &B, double &C, double &P, double &S);

};

Класс описан следующим образом. В секции public объявлены три переменные типа double являющимися длинами сторон треугольника; функции-члены для работы с полями класса, а именно: два конструктора; функции: проверки существования треугольника и определения длин сторон, углов, периметра и площади треугольника.

3. Описание методов класса

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

В приведенном классе содержатся определения методов, среди которых два конструктора. Если тело метода определено внутри класса, то он является встроенным. Как правило, встроенными делают короткие методы. Если внутри класса записано только объявление (заголовок) метода, сам метод должен быть определен в другом месте программы с помощью оператора доступа к области видимости: triangle::triangle();

Методы можно перегружать (это одно из проявлений полиморфизма), а также объявлять либо константными, либо статическими (но не одновременно).

3.1 Конструкторы

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

· Конструктор не возвращает значение, даже типа void. Нельзя получить указатель на конструктор.

· Класс может иметь несколько конструкторов с разными параметрами для разных видов инициализации (при этом используется механизм перегрузки).

· Конструктор, вызываемый без параметров, называется конструктором по умолчанию.

· Параметры конструктора могут иметь любой тип, кроме этого же класса. Можно задавать значения параметров по умолчанию. Их может содержать только один из конструкторов.

· Если программист не указал ни одного конструктора, компилятор создает его автоматически. Такой конструктор вызывает конструкторы по умолчанию для полей класса и конструкторы по умолчанию базовых классов (см. раздел "Простое наследование"). В случае, когда класс содержит константы или ссылки, при попытке создания объекта класса будет выдана ошибка, поскольку их необходимо инициализировать конкретными значениями, а конструктор по умолчанию этого делать не умеет.

· Конструкторы не наследуются.

· Конструкторы нельзя описывать с модификаторами const, virtual и static.

· Конструкторы глобальных объектов вызываются до вызова функции main. Локальные объекты создаются, как только становится активной область их действия. Конструктор запускается и при создании временного объекта (например, при передаче объекта из функции).

· Конструктор вызывается, если в программе встретилась какая-либо из синтаксических конструкций:

имя_класса имя_объекта [(список параметров)];

// Список параметров не должен быть пустым

имя_класса (список параметров);

// Создается объект без имени (список может быть пустым)

имя_класса имя_объекта = выражение;

// Создается объект без имени и копируется

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

Конструкторы часто вызываются неявно для создания временных объектов. Обычно это происходит в следующих случаях:

· при инициализации;

· при выполнении операции присваивания;

· для задания значений параметров по умолчанию;

· при создании динамических объектов;

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

Первый конструктор в нашем классе является конструктором по умолчанию, который присваивает переменным side_a и side_b значение 0. Если мы создаем новый объект класса и не инициализируем его поля, то вызывается конструктор по умолчанию и инициализирует переменные значением 0.

triangle::triangle ()

{

side_a=0.0; side_b=0.0; side_c=0.0;

}

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

triangle::triangle (double a, double b, double c)

{

side_a=a; side_b=b; side_c=c;

}

Если программист не указал ни одного конструктора копирования, компилятор создает его автоматически. Такой конструктор выполняет поэлементное копирование полей. Если класс содержит указатели или ссылки, это, скорее всего, будет неправильным, поскольку и копия, и оригинал будут указывать на одну и ту же область памяти.

3.2 Виртуальные функции

С++ поддерживает два вида полиморфизма:

· Статический - достигается за счет перегрузки функций и операторов;

· Динамический - достигается за счет наследования виртуальных функций;

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

Для объявления виртуальной функции вначале ставят служебное слово «virtual» в базовом классе. Фактически виртуальная функция реализует принцип «один интерфейс - несколько методов», который лежит в основе полиморфизма.

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

При обычном вызове виртуальные функции ничем не отличаются от остальных функций класса. Особые свойства проявляются при их вызове с помощью указателей.

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

В качестве примера ниже приведено описание функции, являющейся виртуальной в классе triangle: virtual void output (double &A, double &B, double &C, double &P, double &S){};

программирование класс виртуальный интерфейс

4. Описание работы программы

Для начала работы с программой необходимо запустить «k_2.exe». После этого перед пользователем появляется следующее окно (см. Рис 1).

Рис 1 - окно «Курсовая»

Программа решает следующие задачи:

1. Вычисление сведений о треугольнике;

2. Определение средней площади для нескольких треугольников;

3. Вычисление сведений о равностороннем треугольнике;

4. Нахождение наибольшего равностороннего треугольника.

Рассмотрим подробнее решение каждой из этих задач.

1. Вычисления сведений о треугольнике.

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

Перед нажатием на кнопку пользователю необходимо ввести данные (см. Рис 3), по которым и будет выполнятся вычисление.

После нажатия на кнопку «Решить», если вы не заполнили все или хотя бы одно поле в области «Ввод данных» (см. Рис 3), откроется окно «Ошибка» (см. Рис 4). Нажав кнопку «ОК», вы сможете повторить ввод данных.

Рис 2 - область «Вычисление сведений о треугольнике»

Рис 3 - область «Ввод данных»

Рис 4 - окно «Ошибка»

Вычисление может быть не выполнено и в том случае, если по введенным данным нельзя построить треугольник (т. е. треугольник с заданными сторонами не существует). Программа и в этом случает откроет окно «Ошибка» (см. Рис 5). И после нажатия на кнопку «ОК», вы сможете повторить ввод данных.

Рис 5 - окно «Ошибка»

Если ввод данных произведен правильно, пользователь увидит результаты решения в области «Вычисление сведений о треугольнике».

2. Определение средней площади для нескольких треугольников.

Для решения данной задачи следует обратится к соответствующей области в окне «Курсовая» (см. Рис 6). В этом случае пользователь вводит данные в области «Ввод данных» (см. Рис 3) несколько раз (количество раз определят сам пользователь), после чего каждый раз нажимает на кнопку «Внести данные» (см. Рис 6). Когда все параметры для желаемого количества треугольников введены, нажав на кнопку «Решить», вы увидите результат вычислений данной задачи.

Рис 6 - область «Определение средней площади для нескольких треугольников»

После нажатия на кнопку «Внести данные» может открыться одно из окон «Ошибка» (см. Рис 4 или Рис 5), причины открытия соответствуют тем, которые описаны в задаче 1.

3. Вычисление сведений о равностороннем треугольнике.

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

Рис 7 - область «Вычисление сведений о равностороннем треугольнике»

В ходе решения данной задачи пользователь может столкнутся с новой ошибкой, нажав на кнопку «Решить». Если по введенным данным нельзя будет построить равносторонний треугольник, то откроется окно «Ошибка» (см. Рис 8). После нажатия на кнопку «ОК», вы сможете повторить ввод данных.

Рис 8 - окно «Ошибка»

4. Нахождение наибольшего равностороннего треугольника.

Для реализации последней задачи, вы также найдете соответствующую область (см. Рис 9) в окне «Курсовая». Вычисление производится аналогично решению 2 задачи. И как в задаче 3, вы можете столкнутся с окном «Ошибка» (см. Рис 8).

Рис 9 - область «Нахождение наибольшего равностороннего треугольника»

В программе предусмотрена кнопка «Очистить все», после нажатии на которую, окно «Курсовая» принимает свой первоначальный вид (см. Рис 1).

Заключение

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

· поверка существования треугольника;

· проверка: равносторонний треугольник или нет;

· вычисление углов треугольника;

· вычисление периметра треугольника;

· вычисление площади треугольника;

· нахождение наибольшего равностороннего треугольника;

· нахождение средней площади;

· вывода на экран вычисляемых результатов;

Таким образом, все задачи, поставленные в курсовой работе, выполнены.

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

1. Стивен, П. Язык программирования C++. Лекции и упражнения, 6-е изд. - М.: ООО "И.Д. Вильяме", 2012. - 1248 с.

2. Страуструп, Б. Язык программирования C++: Пер. с англ, - 3-е спец. изд. - М.: Бином, 2003. - 1104 с.

3. Павловская, Т.А. C/C++. Программирование на языке высокого уровня. - СПб.: Питер, 2003.

4. Павловская, Т.А., Щупак, Ю. А. C++. Объектно-ориентированное программирование: Практикум. - СПб.: Питер, 2006. - 265 с: ил.

Приложение

Листинг файла «k_2.h»

class triangle

{

public:

double side_a, side_b, side_c;

triangle ()

{

side_a=0.0; side_b=0.0; side_c=0.0;

}

triangle (double a, double b, double c)

{

side_a=a; side_b=b; side_c=c;

}

virtualvoid check (double &k)

{

if(((side_a+side_b)>side_c)&&((side_b+side_c)>side_a)&&((side_a+side_c)>side_b))

k=1;

else

k=0;

}

virtual void output (double &A, double &B, double &C, double &P, double &S)

{

double d1, d2;

double p=3.14159265;

d1=((side_b*side_b)+(side_c*side_c)-(side_a*side_a))/(2*side_b*side_c);

d2=((side_a*side_a)+(side_c*side_c)-(side_b*side_b))/(2*side_a*side_c);

A=acos(d1)*180.0/p;

B=acos(d2)*180.0/p;

C=180-A-B;

P=side_a+side_b+side_c;

S=pow((P*0.5*(P*0.5-side_a)*(P*0.5-side_b)*(P*0.5-side_c)),0.5);

}

};

class equilateral_triangle: public triangle

{

public:

equilateral_triangle():triangle(){}

equilateral_triangle(double a, double b, double c):triangle(a,b,c){}

void check(double &k)

{

if((side_a==side_b)&&(side_b==side_c)&&(side_a==side_c))

k=1;

else

k=0;

}

void output (double &A, double &P, double &S)

{

A=60;

P=3*side_a;

S=pow((P*0.5*pow((P*0.5-side_a),3)),0.5);

}

};

Размещено на Allbest.ru


Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.