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; }
}
// ----------------------------------------------------------