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

  • Вид работы:
    Курсовая работа (т)
  • Предмет:
    Информационное обеспечение, программирование
  • Язык:
    Русский
    ,
    Формат файла:
    MS Word
    2,09 Мб
  • Опубликовано:
    2013-12-19
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

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

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

Брянский государственный технический университет

Учебно-научный технологический институт

Кафедра "Автоматизированные технологические системы"







КУРСОВОЙ ПРОЕКТ

По дисциплине

"Объектно-ориентированное программирование"

 

 

 

Руководитель Матлахов В.П.

Студент Брылев В.В.






Брянск 2013

Аннотация


Разработана программа для вычислений геометрических данных фигуры вида треугольник, а именно треугольник и равносторонний треугольник. Реализован ввод координат фигуры, вычисление длин сторон, углов, периметра, площади, поиск максимальной площади, вывод графического представления треугольника, проверка правильности ввода координат, проверка треугольника на равенство сторон. Для равностороннего треугольника реализован расчет биссектрисы поиск минимального ее значения. Также реализован вывод информации и созданных треугольниках в файл. Программа разработана в Turbo C++ Explorer.

Содержание

Аннотация

Введение

1. Содержательная постановка и описание задачи

2. Атрибуты объекта и представление данных в программе

2.1 Алгоритм ввода и вывода данных

2.2 Описание подпрограммы создания набора данных

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

3.2 Функции классов

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

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

4. Реализация защиты и правильности ввода данных и дополнительных функций

5. Диаграмма UML

5.1 Отношения между классами

5.2 Диаграмма действия

6. Хранение данных

Заключение

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

Приложения

Введение


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

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

1. Содержательная постановка и описание задачи


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

Программа должна искать количество треугольников с минимальной площадью и равносторонний треугольник с наименьшей биссектрисой.

2. Атрибуты объекта и представление данных в программе


2.1 Алгоритм ввода и вывода данных


В программе использованы компоненты:

1)      Label

Компонент"Label" (Рис. 1) - предназначен для вывода текста на поверхность формы. Свойства компонента определяют вид и расположение текста.

Свойства компонента определяют вид и расположение текста.

Name - имя компонента. Используется в программе для доступа к компоненту и его свойствам.

Рис.1. Представление компонента Label в программе.

- отображаемый текст.еft - расстояние от левой границы поля вывода до левой границы формы.

Top - расстояние от верхней границы поля вывода до верхней границы формы.- высота поля вывода.

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

2)      Edit

Компонент "Edit" - представляет собой поле ввода/редактирования строки символов. Основное его свойство Text - текст, находящийся в поле ввода и редактирования. Это свойство имеет строковый тип AnsiString. Это означает, что если пользователь вводит в Edit некоторое число, то необходимо дополнительное преобразование. Кроме функции StrToInt есть обратная к ней IntToStr. Они переводят строку в целое число и целое число в строку соответственно. Кроме этой пары функций имеется пара StrToFloat и FloatToStr, котрые работают с вещественными числами. Основное событие для Edit - это Change. Возникает при изменении свойства Text.

Свойства компонента:- имя компонента. Используется в программе для доступа к компоненту и его свойствам, в частности - для доступа к тексту, введенному в поле редактирования.- т екст, находящийся в поле ввода и редактирования.- высота поля- ширина поля- шрифт, используемый для отображения вводимого текста

В данной программе с помощью Edit реализован ввод значений координат.

программный модуль подпрограмма защита

Рис. 2. Представление компонента Edit в программе.

Button

Компонент Button представляет собой командную кнопку.

Свойства компонента:- и мя компонента. Используется в программе для доступа к компоненту и его свойствам- текст на кнопке- высота кнопки- ширина кнопки- признак доступности кнопки. Если значение свойства равно true, то кнопка доступна. Если значение свойства равно false, то кнопка не доступна, например, в результате щелчка на кнопке событие click не возникает visible Позволяет скрыть кнопку (false) или сделать ее видимой (true)

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

Рис. 3. Представление компонента Button в программе.

3)      Image

Компонент Image представляет собой поле вывода информации на рабочую панель программы.

Рис. 4. Представление компонента Image в программе.

- имя компонента. Используется в программе для доступа к компоненту и его свойствам- высота поля- ширина поля

В данной программе с помощью компонента Image визуально представляется фигура, координаты которой введены в поля Edit1-Edit6.

4)      ComboBox

Компонент " ComboBox" - дает возможность ввести данные в поле редактирования путем набора на клавиатуре или выбором из списка. Для заполнения ComboBox’а используется свойтво Items->Add (Элементы списка - массив строк (нумеруются с нуля)). Также в данной курсовой работе использовалось свойство Itemlndex - Номер элемента, выбранного в списке. Если ни один из элементов списка не был выбран, то значение свойства равно минус 2.

Рис. 5. Представление компонента ComboBox в программе.

Для организации записи и чтения файла данных будут использоваться классы библиотека fstream.

Fstream - создание файлового потока для чтения и для записи данных (двунаправленный обмен).

Типы одного объекта или функции должны быть согласованы во всех их описаниях. Должен быть согласован по типам и входной текст, обрабатываемый транслятором, и связываемые части программы. Есть простой, хотя и несовершенный, способ добиться согласованности описаний в различных файлах - включить во входные файлы, содержащие операторы и определения данных, заголовочные файлы, которые содержат интерфейсную информацию. Средством включения текстов служит макрокоманда #include, которая позволяет собрать в один файл (единицу трансляции) несколько исходных файлов программы. Команда

#include "включаемый-файл"

заменяет строку, в которой она была задана, на содержимое файла включаемый-файл. Естественно, это содержимое должно быть текстом на С++, поскольку его будет читать транслятор. Как правило, операция включения реализуется отдельной программой, называемой препроцессором С++. Она вызывается системой программирования перед собственно трансляцией для обработки таких команд во входном тексте [7, c.99].

Для работы с файлами из своей программы необходимо:

.        Подключить заголовочный файл #include <fstream. h> содержащий описание функций, позволяющих работать с файловыми потоками.

2.      При открытии и очистке файла используются соответствующие функции: ios:: app (Открытие файл в режиме записи данных в конец файла) и ios:: trunc) (очистка файла).

3. Описание подпрограммы формирования структуры классов

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


Классы и объекты в С++ являются основными концепциями объектно-ориентированного программирования - ООП. Объектно-ориентированное программирование - расширение структурного программирования, в котором основными концепциями являются понятия классов и объектов. Основное отличие языка программирования С++ от С состоит в том, что в С нету классов, а следовательно язык С не поддерживает ООП, в отличие от С++.

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

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

1.      Инкапсуляция - это свойство, позволяющее объединить в классе и данные, и методы, работающие с ними и скрыть детали реализации от пользователя.

2.      Наследование - это свойство, позволяющее создать новый класс-потомок на основе уже существующего, при этом все характеристики класса родителя присваиваются классу-потомку.

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

А теперь вернёмся к классам, для начала рассмотрим структуру объявления классов.

1 2 3 4 5 6 7 8 9 10

 // объявление классов в С++ class /*имя класса*/ { private: /* список свойств и методов для использования внутри класса */  public: /* список методов доступных другим функциям и объектам программы */ protected: /*список средств, доступных при наследовании*/ };


Объявление класса начинается с зарезервированного ключевого слова class, после которого пишется имя класса. В фигурных скобочках, строки 3 - 10 объявляется тело класса, причём после закрывающейся скобочки обязательно нужно ставить точку с запятой, строка 10. В теле класса объявляются три метки спецификации доступа, строки 4, 6, 8, после каждой метки нужно обязательно ставить двоеточие. В строке 4 объявлена метка спецификатора доступа private. Все методы и свойства класса, объявленные после спецификатор доступа private будут доступны только внутри класса. В строке 6 объявлен спецификатор доступа public, все методы и свойства класса, объявленные после спецификатора доступа public будут доступны другим функциям и объектам в программе. Пока на этом остановимся, спецификатор доступа protected разбирать сейчас не будем, просто запомните, что он есть. При объявлении класса, не обязательно объявлять три спецификатора доступа, и не обязательно их объявлять в таком порядке. Но лучше сразу определиться с порядком объявления спецификаторов доступа, и стараться его придерживаться.

Пример структуры объявления класса Treug:

Treug // Создание класса Треугольник

{public: // Определение видимых методов и переменных

float Xa, Xb, Xc, Ya, Yb, Yc;AB, BC, CA, alpha, betta, gamma;p, polup, S, t;

// Конструктор класса с параметрами(float Xa1, float Xb1, float Xc1, float Ya1, float Yb1, float Yc1);

// Конструктор создания объекта типа Треугольник без начальных параметров();

~Treug ();proverka ();(); // Метод класса для расчета длин сторон треугольника

float putAB (); float putBC (); float putCA ();

ugol (); // Метод класса для расчета углов треугольника

float putAlpha (); float putBetta (); float putGamma ();

float perimetr (); // Метод класса для расчета периметра треугольникаsquare (); // Метод класса для расчета площади треугольника

// Метод класса для проверки: является ли треугольник равностороннимprint (TImage &img); // Метод класса для отрисовки треугольника

};

 

3.2 Функции классов


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

Пример использования методов и функция:

storona ();putAB ();putBC ();putCA ();

Пример задание метода (функции) в классе:

{Public:

ugol (); // Метод класса для расчета углов треугольника

float putAlpha ();putBetta ();putGamma ();

float perimetr ();

};

Пример описание метода (функции) вне класса:

Treug:: ugol ()

{t=180/M_PI;= (acos ( (pow (BC,2) +pow (CA,2) - pow (AB,2)) / (2*BC*CA))) *t;= (acos ( (pow (AB,2) +pow (CA,2) - pow (BC,2)) / (2*AB*CA))) *t;= (acos ( (pow (AB,2) +pow (BC,2) - pow (CA,2)) / (2*AB*BC))) *t;

};Treug:: putAlpha () {return alpha; }Treug:: putBetta () {return betta; }Treug:: putGamma () {return gamma; }

 

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


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

Пример использования конструкторов в данной программе, использования конструктора Treug, класса Treug, и описание его вне класса:

class Treug

{:

.(float Xa1, float Xb1, float Xc1, float Ya1, float Yb1, float Yc1);

.

};:: Treug (float Xa1, float Xb1, float Xc1, float Ya1, float Yb1, float Yc1)

{=Xa1; Xb=Xb1;=Xc1; Ya=Ya1;=Yb1; Yc=Yc1;

};

 

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


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

Реализация примера наследования в данной программе, класс Treug и его наследник RavnTreug:

class Treug

{public:

float Xa, Xb, Xc, Ya, Yb, Yc;AB, BC, CA, alpha, betta, gamma;p, polup, S, t;(float Xa1, float Xb1, float Xc1, float Ya1, float Yb1, float Yc1); ();

~Treug ();

int proverka ();

storona ();

float putAB ();putBC (); putCA ();

ugol ();putAlpha ();putBetta (); putGamma ();

float perimetr ();

float square ();print (TImage &img);

};

Пример реализации наследования, следующим путём:

class RavnTreug: public Treug

{ float ABravn;

public:

int proverkaRavn ();(float Xa1, float Xb1, float Xc1,float Ya1, float Yb1,float Yc1): Treug (Xa1, Xb1, Xc1, Ya1, Yb1, Yc1) {};

~RavnTreug ();

float bissec ();

};

Наследование является фундаментальной концепцией объектно-ориентированного программирования.

4. Реализация защиты и правильности ввода данных и дополнительных функций


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

.        Условие первое: Все координаты должны быть заполнены.

Реализация решения проблемы:

void __fastcall TForm1:: Edit1Change (TObject *Sender)

{

/*Если Edit1 не заполнен, кнопка Button1 не активна*/

if (Edit1->Text. Length () == 0) {->Enabled=false;

}Button1->Enabled=true;

}

.        Условие первое: В поля ввода Edit можно вводить только числа.

Реализация решения проблемы:

/*Разрешенные символы в Edit1*/

if ( (Key < '0' || Key > '9') && Key! = 8) Key= 0;

.        Условие третье: координаты вершин не могут совпадать, то есть 2 вершины не могут находиться в одной и той же точки.

Реализация решения проблемы:

if ( ( (MAS [i]. Xa==MAS [i]. Xb) && (MAS [i]. Ya==MAS [i]. Yb) ||

(MAS [i]. Xa==MAS [i]. Xc) && (MAS [i]. Ya==MAS [i]. Yc) ||

(MAS [i]. Xb==MAS [i]. Xc) && (MAS [i]. Yb==MAS [i]. Yc)))

{MessageBox (this->Handle, "Вершины треугольника не могут располагаться в 1ой точке",

"Ошибка!", MB_OK | MB_ICONERROR);

}

Для удобства пользователя было реализовано выполнение кода программы, не только при нажатии кнопки, но при нажатии кнопки Enter. Реализация:

void __fastcall TForm1:: EditKeyPress (TObject *Sender, char &Key)__fastcall TForm1:: FormKeyPress (TObject *Sender, char &Key)

{ if ( (Key == VK_RETURN) &&

(Edit1>Text. Length () >0) && (Edit2->Text. Length () > 0)

&& (Edit3->Text. Length () > 0) && (Edit4->Text. Length () > 0)

&& (Edit5->Text. Length () > 0) && (Edit6->Text. Length () > 0))

{Button1->Default = True; }

}

5. Диаграмма UML


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

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

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

·              "+" обозначает атрибут с областью видимости типа общедоступный (public). Атрибут с этой областью видимости доступен или виден из любого другого класса пакета, в котором определена диаграмма;

·              "#" обозначает атрибут с областью видимости типа защищенный (protected). Атрибут с этой областью видимости недоступен или невиден для всех классов, за исключением подклассов данного класса;

·              "-" обозначает атрибут с областью видимости типа закрытый (private). Атрибут с этой областью видимости недоступен или невиден для всех классов без исключения.

Квантор видимости может быть опущен. В этом случае его отсутствие просто означает, что видимость атрибута не указывается. Эта ситуация отличается от принятых по умолчанию соглашений в традиционных языках программирования, когда отсутствие квантора видимости трактуется как public или private. Однако вместо условных графических обозначений можно записывать соответствующее ключевое слово: public, protected, private.

 

5.1 Отношения между классами


Кроме внутреннего устройства или структуры классов на соответствующей диаграмме указываются отношения между классами. При этом совокупность типов таких отношений фиксирована в языке UML и предопределена семантикой этих типов отношений. Базовыми отношениями в языке UML являются:

·              зависимости (dependency relationship);

·              ассоциации (association relationship);

·              обобщения (generalization relationship)

Каждое из этих отношений имеет собственное графическое представление на диаграмме, которое отражает взаимосвязи между объектами соответствующих классов.

Пример взаимосвязи между классами (часть диаграммы из приложения):

Рис. 6. Пример графического представления наследования, и создания треугольников и равносторонних треугольников.

5.2 Диаграмма действия


При моделировании поведения проектируемой системы возникает необходимость не только представить процесс изменения её состояний, но и детализировать особенности алгоритмической и логической операции выполняемой системой реализации. Традиционно для этой цели использовались блок-схема или структурные схемы алгоритмов. В UML для этого используется диаграмма действий.

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

Графически диаграмма деятельности представляется в форме графа деятельности, вершинами которого является состояние действия, а дугами - переходы от одного состояния в действия к другому.

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

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

Пример реализации диаграммы действий в курсовом проекте:

Рис. 7. Диаграмма Действий.

6. Хранение данных


Для хранения данных в процессе работы программы была реализована структура Ttreug. Структуры - это составные типы данных, построенные с использованием других типов. [8, c.408].

Определение структуры для хранения данных о треугольнике:

struct {

float Xa, Xb, Xc, Ya, Yb, Yc;AB;BC;CA;alpha;betta;gamma;perimetr;square;bis;ravn;proverka;

} Ttreug;

Типы данных, хранимых в структуре Ttreug представлены на Рис.8

Рис. 8 Типы данных, хранимых в структуре Ttreug.

Заключение


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

В этом курсовом проекте использовалась структура классов. Был рассмотрен принцип наследования и создания производных классов.

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


1. Объектно-ориентированное программирование в С++. Лафоре Р.

. Гради Буч "Объектно-ориентированный анализ и проектирование" 3.Э. Гамма "Приемы объектно-ориентированного проектирования. Паттерны проектирования"

5. Грейди Буч, Джеймс Рамбо, Айвар Джекобсон. Язык UML. Руководство пользователя = The Unified Modeling Language user guide. - 2-е изд. - М., Питер <http://ru.wikipedia.org/wiki/%D0%9F%D0%B8%D1%82%D0%B5%D1%80_(%D0%B8%D0%B7%D0%B4%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D1%81%D1%82%D0%B2%D0%BE)>, 2004. - 432 с.

6. Иан Грэхем Объектно-ориентированные методы. Принципы и практика = Object-Oriented Methods: Principles & Practice. - 3-е изд. - М.: "Вильямс", 2004. - С.880.

7. Биллиг В.А. Основы программирования на C++. Интернет-университет информационных технологий - ИНТУИТ. ру, 2006

. Дейтел Х., Дейтел П. Как программировать на С++: пер. с англ. - М.: "Издательство Бином", 2003 г. - 1021 с.

Приложения

 

Приложение 1

Листинг программы

// ----------------------------------------------------------

#include <vcl. h>

#include <math. h>

#include <fstream. h>

#pragma hdrstop

#include "Unit1. h"

// ----------------------------------------------------------

#pragma package (smart_init)

#pragma resource "*. dfm"

TForm1 *Form1;struct // Определение структуры для хранения данных о треугольнике

{Xa, Xb, Xc, Ya, Yb, Yc;AB;BC;CA;alpha;betta;gamma;perimetr;square;bis;ravn;proverka;

} Ttreug;Ttreug TMaskadr [50];MAS;

int i;Treug // Создание класса Треугольник

{public: // Определение видимых методов и переменных

float Xa, Xb, Xc, Ya, Yb, Yc;AB, BC, CA, alpha, betta, gamma;p, polup, S, t;

// Конструктор класса с параметрами(float Xa1, float Xb1, float Xc1, float Ya1, float Yb1, float Yc1);

// Конструктор создания объекта типа Треугольник без начальных параметров();

~Treug ();proverka ();(); // Метод класса для расчета длин сторон треугольника

float putAB (); float putBC (); float putCA ();

ugol (); // Метод класса для расчета углов треугольника

float putAlpha (); float putBetta (); float putGamma ();

float perimetr (); // Метод класса для расчета периметра треугольникаsquare (); // Метод класса для расчета площади треугольника

// Метод класса для проверки: является ли треугольник равностороннимprint (TImage &img); // Метод класса для отрисовки треугольника

};

// Описание конструктора:: Treug (float Xa1, float Xb1, float Xc1, float Ya1, float Yb1, float Yc1)

{=Xa1; Xb=Xb1; Xc=Xc1;

Ya=Ya1; Yb=Yb1; Yc=Yc1;

};:: Treug () {} // Перегрузка конструктор без параметров:: ~Treug () {=0; Xb=0; Xc=0;

Ya=0; Yb=0; Yc=0; }:: storona ()

{=sqrt (pow (Xa-Xb,

) +pow (Ya-Yb,

));=sqrt (pow (Xb-Xc,

) +pow (Yb-Yc,

));=sqrt (pow (Xc-Xa,

) +pow (Yc-Ya,

));

};Treug:: putAB () {return AB; }Treug:: putBC () {return BC; }Treug:: putCA () {return CA; }Treug:: proverka ()

{( (AB==BC+CA) || (BC==AB+CA) || (CA==AB+BC)) {return 0; }return 1;

};:: ugol ()

{t=180/M_PI;= (acos ( (pow (BC,2) +pow (CA,2) - pow (AB,2)) / (2*BC*CA))) *t;= (acos ( (pow (AB,2) +pow (CA,2) - pow (BC,2)) / (2*AB*CA))) *t;= (acos ( (pow (AB,2) +pow (BC,2) - pow (CA,2)) / (2*AB*BC))) *t;

};Treug:: putAlpha () {return alpha; }Treug:: putBetta () {return betta; }Treug:: putGamma () {return gamma; }Treug:: square ()

{polup= (AB+BC+CA) /2;=sqrt (polup* (polup-AB) * (polup-BC) * (polup-CA));S;

}Treug:: perimetr ()

{p=AB+BC+CA;p;

};Treug:: print (TImage &img)

{max=Xa;(Ya>Xa) {max=Ya; }( (Xb>Xa) && (Xb>Ya)) {max=Xb; }( (Yb>Xa) && (Yb>Ya) && (Yb>Xb)) {max=Yb; }( (Xc>Xa) && (Xc>Ya) && (Xc>Xb) && (Xc>Yb)) {max=Xc; }( (Yc>Xa) && (Yc>Ya) && (Yc>Xb) && (Yc>Yb) && (Yc>Xc)) {max=Yc; }mashtab=300/max;. Canvas->MoveTo (Xa*mashtab,Ya*mashtab);. Canvas->LineTo (Xb*mashtab,Yb*mashtab);. Canvas->LineTo (Xc*mashtab,Yc*mashtab);. Canvas->LineTo (Xa*mashtab,Ya*mashtab);

};RavnTreug: public Treug // Создание класса RavnTreug

{ float ABravn;bis;: // Определение видимых методов и переменных

int proverkaRavn ();(float Xa1, float Xb1, float Xc1,float Ya1, float Yb1,float Yc1): Treug (Xa1, Xb1, Xc1, Ya1, Yb1, Yc1) {}; // Конструктор класса RavnTreug

~RavnTreug ();bissec (); // метод расчета биссектрисы равностороннего треугольника

};:: ~RavnTreug () {}RavnTreug:: proverkaRavn ()

{ storona ();AB1= (int) AB;BC1= (int) BC;CA1= (int) CA;( (AB1==BC1) && (BC1==CA1)) {return 1; }return 0;

}RavnTreug:: bissec ()

{ storona ();= (putAB () *sqrt (3)) /2;bis;

}countRavn=0;

// ----------------------------------------------------------

__fastcall TForm1:: TForm1 (TComponent* Owner)

: TForm (Owner)

{

}

// ----------------------------------------------------------

void __fastcall TForm1:: Button1Click (TObject *Sender)

{->Height=430;Xa, Xb, Xc, Ya, Yb, Yc;AB, BC, CA, alpha, betta, gamma;

// Открытие файл Treug. txt в режиме записи данных в конец файла

// Чтение значений координат точек А, В, С из Edit'ов

// и добавление их в массив структуры

MAS [i]. Xa=Xa=StrToFloat (Edit1->Text);[i]. Ya=Ya=StrToFloat (Edit2->Text);[i]. Xb=Xb=StrToFloat (Edit3->Text);[i]. Yb=Yb=StrToFloat (Edit4->Text);[i]. Xc=Xc=StrToFloat (Edit5->Text);[i]. Yc=Yc=StrToFloat (Edit6->Text);( ( (MAS [i]. Xa==MAS [i]. Xb) && (MAS [i]. Ya==MAS [i]. Yb) ||

(MAS [i]. Xa==MAS [i]. Xc) && (MAS [i]. Ya==MAS [i]. Yc) ||

(MAS [i]. Xb==MAS [i]. Xc) && (MAS [i]. Yb==MAS [i]. Yc)))

{MessageBox (this->Handle, "Вершины треугольника не могут располагаться в 1ой точке",

"Ошибка!", MB_OK | MB_ICONERROR);

}{tr1 (Xa, Xb, Xc, Ya, Yb, Yc); // Определение объекта типа Treug

tr1. storona (); // Вызов метода расчета длин сторон треугольника

// Закрашивание Canvas->Canvas->Rectangle (0,0,300,300);

tr1. ugol (); // Вызов метода рассчета углов треугольника

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

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

MAS [i]. AB=tr1. putAB ();[i]. BC=tr1. putBC ();[i]. CA=tr1. putCA ();[i]. proverka=tr1. proverka ();

// Вызов методов расчета углов, периметра и площади треугольника

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

MAS [i]. alpha=tr1. putAlpha ();[i]. betta=tr1. putBetta ();[i]. gamma=tr1. putGamma ();[i]. perimetr=tr1. perimetr ();[i]. square=tr1. square ();

// Вызов метода проверки: является ли треугольник равностороннимtr2 (Xa, Xb, Xc, Ya, Yb, Yc); // Определение объекта типа RavnTreug

MAS [i]. ravn=tr2. proverkaRavn ();[i]. bis=0;

/*Проверка*/(MAS [i]. proverka==0) {

MessageBox (this->Handle, "Вы построили прямую", "Ошибка!",

MB_OK | MB_ICONERROR);

}{

/*Если треугольник равносторонний*/(MAS [i]. ravn==1) {++; // Счетчик количества равносторонних треугольников

// Вывод сообщения, что создан равносторонний треугольник(this->Handle, "Вы создали равносторонний треугольник", "УРА!",_OK | MB_ICONINFORMATION);[i]. bis=tr2. bissec (); // Вызов метода расчета биссектрисы

/*Поиск минимальной биссектрисы*/min=0;

int masimin=0, masi=0;=MAS [i]. bis;(masi = 0; masi <= i; masi++) {( (MAS [masi]. bis! =0) && (MAS [masi]. bis<=min)) {=MAS [masi]. bis;=masi; }

}

// Вывод в Label13->Caption="Равносторонний треугольник №"

+IntToStr (masimin+1) +" имеет наименьшую биссектрису равную "

+FloatToStrF (min,ffFixed,10000,3) +" см";

}. print (*Image1); // Вызов метода вывода треугольника на Canvas->Items->Add (i+1); // Добавление номера треугольник в ComboBox1->Items->Add (i+1); // Добавление номера треугольник в ComboBox2

Label2->Caption=

"AB="+FloatToStrF (MAS [i]. AB, ffFixed,10000,3) +" см"

+"\nBC="+FloatToStrF (MAS [i]. BC, ffFixed,10000,3) +" см"

+"\nCA="+FloatToStrF (MAS [i]. CA, ffFixed,10000,3) +" см"

+"\nAlpha="+FloatToStrF (MAS [i]. alpha, ffFixed,10000,3) +"°"

+"\nBetta="+FloatToStrF (MAS [i]. betta, ffFixed,10000,3) +"°"

+"\nGamma="+FloatToStrF (MAS [i]. gamma, ffFixed,10000,3) +"°"

+"\nP="+FloatToStrF (MAS [i]. perimetr, ffFixed,10000,3) +" см"

+"\nS="+FloatToStrF (MAS [i]. square, ffFixed,10000,3) +" см^2";->ItemIndex=i;->ItemIndex=i;++;

// Вывод в Label10->Caption="Создано треугольников: "+IntToStr (i) +"\n"

+"Из них равносторонних: "+IntToStr (countRavn);

/*Вывод сведений о треугольнике в файл Treug. txt*/

book_file<<"Треугольник №"<<i<<": \n"

<<"AB="<<tr1. putAB () <<"см; "<<" "

<<"BC="<<tr1. putBC () <<"см; "<<" "

<<"CA="<<tr1. putCA () <<"см; \n"

<<"alpha="<<tr1. putAlpha () <<"°; "

<<"betta="<<tr1. putBetta () <<"°; "

<<"gamma="<<tr1. putGamma () <<"°; \n"

<<"P="<<tr1. perimetr () <<"см; \n"

<<"S="<<tr1. square () <<"см^2; \n"

<<"Равносторонний треугольник (0-НЕТ; 1-ДА): "<<tr1. proverka () <<"; \n\n";

/* Поиск треугольника с максимальной площадью*/

float maxSquare=0;numMaxSquare=0, numMaxSquare2=0, countfor=0;=MAS [0]. square;(countfor = 0; countfor <= i; countfor++) {(MAS [countfor]. square>maxSquare) {=MAS [countfor]. square;=countfor; }

}

// Вывод в Label14->Caption="Треугольник №"

+IntToStr (numMaxSquare+1) +" имеет наибольшую площадь равную "

+FloatToStrF (maxSquare,ffFixed,10000,3) +" см^2";

ComboBox3->Items->Clear ();(countfor = 0; countfor <= i; countfor++) {( (MAS [countfor]. square==maxSquare) && (countfor! =numMaxSquare)) {

Label16->Caption="Треугольники с такой же площадью: ";

ComboBox3->Items->Add (countfor+1);->ItemIndex=0;

}

}

}. ~Treug ();. ~RavnTreug ();

}

}

// ----------------------------------------------------------__fastcall TForm1:: FormCreate (TObject *Sender)

{book_file ("Treug. txt", ios:: trunc); // очистка файла=0;->Canvas->Rectangle (0,0,300,300);->Caption="Равносторонний треугольник №??? имеет наименьшую биссектрису равную???";

}

// ----------------------------------------------------------

void __fastcall TForm1:: ComboBox1Change (TObject *Sender)

{

/*Вывод данных о треугольнике c номером, выбранном в ComboBox1 в Label2*/

int ii, k=0, j=0;=i;=i;=ComboBox1->ItemIndex;(k = 0; k <= j; k++) {(k==ii) {->Caption=

"AB="+FloatToStrF (MAS [k]. AB, ffFixed,10000,3) +" см"

+"\nBC="+FloatToStrF (MAS [k]. BC, ffFixed,10000,3) +" см"

+"\nCA="+FloatToStrF (MAS [k]. CA, ffFixed,10000,3) +" см"

+"\nAlpha="+FloatToStrF (MAS [k]. alpha, ffFixed,10000,3) +"°"

+"\nBetta="+FloatToStrF (MAS [k]. betta, ffFixed,10000,3) +"°"

+"\nGamma="+FloatToStrF (MAS [k]. gamma, ffFixed,10000,3) +"°"

+"\nP="+FloatToStrF (MAS [k]. perimetr, ffFixed,10000,3) +" см"

+"\nS="+FloatToStrF (MAS [k]. square, ffFixed,10000,3) +" см^2";

}

}

}

// ----------------------------------------------------------

void __fastcall TForm1:: ComboBox2Change (TObject *Sender)

{

/*Отрисовка треугольника c номером, выбранном в ComboBox2 на Canvas*/

int ii, k=0, j=0;=i;=i;=ComboBox2->ItemIndex;->Canvas->Rectangle (0,0,300,300);(k = 0; k <= j; k++) {(k==ii) {tr2 (MAS [k]. Xa, MAS [k]. Xb, MAS [k]. Xc, MAS [k]. Ya, MAS [k]. Yb, MAS [k]. Yc);. storona ();. print (*Image1);

}

}

}

// ----------------------------------------------------------

void __fastcall TForm1:: Edit1KeyPress (TObject *Sender, char &Key)

{

/*Выполнение кода кнопки Button1 при нажатии Enter в Edit1*/

if ( (Key == VK_RETURN) && (Edit1->Text. Length () > 0) && (Edit2->Text. Length () > 0)

&& (Edit3->Text. Length () > 0) && (Edit4->Text. Length () > 0)

&& (Edit5->Text. Length () > 0) && (Edit6->Text. Length () > 0))

{Button1->Default = True; }

/*Разрешенные символы в Edit1*/

if ( (Key < '0' || Key > '9') && Key! = 8) Key= 0;

}

// ----------------------------------------------------------

void __fastcall TForm1:: Edit2KeyPress (TObject *Sender, char &Key)

{

/*Выполнение кода кнопки Button1 при нажатии Enter в Edit2*/

if ( (Key == VK_RETURN) && (Edit1->Text. Length () > 0) && (Edit2->Text. Length () > 0)

&& (Edit3->Text. Length () > 0) && (Edit4->Text. Length () > 0)

&& (Edit5->Text. Length () > 0) && (Edit6->Text. Length () > 0))

{Button1->Default = True; }

/*Разрешенные символы в Edit2*/

if ( (Key < '0' || Key > '9') && Key! = 8) Key= 0;

}

// ----------------------------------------------------------

void __fastcall TForm1:: Edit3KeyPress (TObject *Sender, char &Key)

{

/*Выполнение кода кнопки Button1 при нажатии Enter в Edit3*/

if ( (Key == VK_RETURN) && (Edit1->Text. Length () > 0) && (Edit2->Text. Length () > 0)

&& (Edit3->Text. Length () > 0) && (Edit4->Text. Length () > 0)

&& (Edit5->Text. Length () > 0) && (Edit6->Text. Length () > 0))

{Button1->Default = True; }

/*Разрешенные символы в Edit3*/

if ( (Key < '0' || Key > '9') && Key! = 8) Key= 0;

}

// ----------------------------------------------------------

void __fastcall TForm1:: Edit4KeyPress (TObject *Sender, char &Key)

{

/*Выполнение кода кнопки Button1 при нажатии Enter в Edit4*/

if ( (Key == VK_RETURN) && (Edit1->Text. Length () > 0) && (Edit2->Text. Length () > 0)

&& (Edit3->Text. Length () > 0) && (Edit4->Text. Length () > 0)

&& (Edit5->Text. Length () > 0) && (Edit6->Text. Length () > 0))

{Button1->Default = True; }

/*Разрешенные символы в Edit4*/

if ( (Key < '0' || Key > '9') && Key! = 8) Key= 0;

}

// ----------------------------------------------------------

{

/*Выполнение кода кнопки Button1 при нажатии Enter в Edit5*/

if ( (Key == VK_RETURN) && (Edit1->Text. Length () > 0) && (Edit2->Text. Length () > 0)

&& (Edit3->Text. Length () > 0) && (Edit4->Text. Length () > 0)

&& (Edit5->Text. Length () > 0) && (Edit6->Text. Length () > 0))

{Button1->Default = True; }

/*Разрешенные символы в Edit5*/

if ( (Key < '0' || Key > '9') && Key! = 8) Key= 0;

}

// ----------------------------------------------------------

void __fastcall TForm1:: Edit6KeyPress (TObject *Sender, char &Key)

{

/*Выполнение кода кнопки Button1 при нажатии Enter в Edit6*/

if ( (Key == VK_RETURN) && (Edit1->Text. Length () > 0) && (Edit2->Text. Length () > 0)

&& (Edit3->Text. Length () > 0) && (Edit4->Text. Length () > 0)

&& (Edit5->Text. Length () > 0) && (Edit6->Text. Length () > 0))

{Button1->Default = True; }

/*Разрешенные символы в Edit6*/

if ( (Key < '0' || Key > '9') && Key! = 8) Key= 0;

}

// ----------------------------------------------------------

void __fastcall TForm1:: Edit1Change (TObject *Sender)

{

/*Если Edit1 не заполнен, кнопка Button1 не активна*/

if (Edit1->Text. Length () == 0) {->Enabled=false;

}Button1->Enabled=true;

}

// ----------------------------------------------------------

void __fastcall TForm1:: Edit3Change (TObject *Sender)

{

/*Если Edit3 не заполнен, кнопка Button1 не активна*/

if (Edit3->Text. Length () == 0) {->Enabled=false;

}Button1->Enabled=true;

}

// ----------------------------------------------------------

void __fastcall TForm1:: Edit5Change (TObject *Sender)

{

/*Если Edit5 не заполнен, кнопка Button1 не активна*/

if (Edit5->Text. Length () == 0) {->Enabled=false;

}Button1->Enabled=true;

}

// ----------------------------------------------------------

void __fastcall TForm1:: Edit2Change (TObject *Sender)

{

/*Если Edit2 не заполнен, кнопка Button1 не активна*/

if (Edit2->Text. Length () == 0) {->Enabled=false;

}Button1->Enabled=true;

}

// ----------------------------------------------------------

void __fastcall TForm1:: Edit4Change (TObject *Sender)

{

/*Если Edit4 не заполнен, кнопка Button1 не активна*/

if (Edit4->Text. Length () == 0) {->Enabled=false;

}Button1->Enabled=true;

}

// ----------------------------------------------------------

void __fastcall TForm1:: Edit6Change (TObject *Sender)

{

/*Если Edit6 не заполнен, кнопка Button1 не активна*/

if (Edit6->Text. Length () == 0) {->Enabled=false;

}Button1->Enabled=true;

}

// ----------------------------------------------------------

void __fastcall TForm1:: FormKeyPress (TObject *Sender, char &Key)

{( (Key == VK_RETURN) && (Edit1->Text. Length () > 0) && (Edit2->Text. Length () > 0)

&& (Edit3->Text. Length () > 0) && (Edit4->Text. Length () > 0)

&& (Edit5->Text. Length () > 0) && (Edit6->Text. Length () > 0))

{Button1->Default = True; }

}

// ----------------------------------------------------------

Похожие работы на - Разработка программного модуля для расчета основных геометрических характеристик треугольника

 

Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!