4.4. Клас обробника відрізків
Клас надає засоби інкапсуляції відрізків та високорівневої роботи з ними.
#pragma once
#include "GLSegment.h"
#include "Exceptions.h"
ref class SegmentProcessor
{
public:
SegmentProcessor();
~SegmentProcessor() {};
//робота зі списком відрізків
void AddSegment(GLSegment^ obj);
void RemoveSegment(GLSegment^ obj);
void RemoveSegmentAt(int idx);
//затирає всі дані, не знищуючи об'єкт
void Clear();
//знайти точку перетину між усіма відрізками
GLSegment::CrossAnswer^ CrossAll();
GLSegment^ GetSegment(int idx);
//друкує список відрізків у таблицю
void PrintSegments(System::Windows::Forms::DataGridView^ table);
//друкує список точок у таблицю
void PrintPoints(System::Windows::Forms::DataGridView^ table);
private:
System::Collections::Generic::List<GLSegment^>^ _segment;
};
SegmentProcessor::SegmentProcessor()
{
_segment = gcnew System::Collections::Generic::List<GLSegment^>();
}
void SegmentProcessor::AddSegment(GLSegment^ obj)
{
_segment->Add(obj);
Constants::SEGMENT_COUNT++;
}
void SegmentProcessor::RemoveSegment(GLSegment^ obj)
{
if (_segment->Remove(obj))
Constants::SEGMENT_COUNT--;
}
void SegmentProcessor::RemoveSegmentAt(int idx)
{
if (idx < 0 || idx >= _segment->Count)
return;
_segment->RemoveAt(idx);
Constants::SEGMENT_COUNT--;
}
void SegmentProcessor::Clear()
{
_segment->Clear();
Constants::SEGMENT_COUNT = 0;
}
GLSegment::CrossAnswer^ SegmentProcessor::CrossAll()
{
if (_segment->Count < 2)
throw gcnew MyException::NotEnoughObjectsException(this);
//послідовно шукаємо перетин між кожним відрізком та результатом попереднього перетину
GLSegment::CrossAnswer^ answer = _segment[0]->Cross(_segment[1]);
for(int i = 1; i < _segment->Count; i++)
{
if (answer->Type == GLSegment::CrossAnswer::CrossType::NONE)
return answer;
else if (answer->Type == GLSegment::CrossAnswer::CrossType::POINT)
{
if (!_segment[i]->Contains(answer->Point1))
{
answer->Type = GLSegment::CrossAnswer::CrossType::NONE;
return answer;
}
}
else if (answer->Type == GLSegment::CrossAnswer::CrossType::SEGMENT)
answer = _segment[i]->Cross(gcnew GLSegment(answer->Point1, answer->Point2));
}
return answer;
}
GLSegment^ SegmentProcessor::GetSegment(int idx)
{
if (idx < 0 || idx >= _segment->Count)
throw gcnew System::IndexOutOfRangeException();
return _segment[idx];
}
void SegmentProcessor::PrintSegments(System::Windows::Forms::DataGridView^ table)
{
table->RowCount = _segment->Count;
if (_segment->Count == 0)
return;
for (int i = 0; i < _segment->Count; i++)
table->Rows[i]->Cells[0]->Value = _segment[i]->ToString();
}
void SegmentProcessor::PrintPoints(System::Windows::Forms::DataGridView^ table)
{
table->RowCount = 0;
if (_segment->Count == 0)
return;
bool stopAdding;
for (int i = 0, idx = 0; i < _segment->Count * 2; i++)
{
stopAdding = false;
GLPoint^ pt = _segment[i/2]->Point[i % 2];
for (int j = 0; j < i; j++)
if (pt->Equal(_segment[j / 2]->Point[j % 2]))
{
stopAdding = true;
break;
}
if (stopAdding)
continue;
table->Rows->Add();
table->Rows[table->RowCount - 1]->Cells[0]->Value = Constants::GetLetterIdx(idx++) + pt->ToString();
}
}
4.5. Класи винятків
Забезпечують виявлення не стандартних виняткових ситуацій.
#pragma once
namespace MyException
{
ref class BaseException abstract
{
public:
BaseException(Object^ sender)
{
this->Sender = sender;
}
property System::String^ Message
{
virtual System::String^ get() = 0;
}
Object^ Sender;
};
ref class GLInitException : public BaseException
{
public:
GLInitException(Object^ sender) : BaseException(sender) {};
property System::String^ Message
{
virtual System::String^ get() override
{
return gcnew System::String("Не вдалося отримати обробник компонента!");
}
}
};
ref class BusyObjectException : public BaseException
{
public:
BusyObjectException(Object^ sender) : BaseException(sender){};
property System::String^ Message
{
virtual System::String^ get() override
{
return gcnew System::String("Об'єкт не може виконати цю операцію зараз!");
}
}
};
ref class EmptyStreamException : public BaseException
{
public:
EmptyStreamException(Object^ sender) : BaseException(sender) {};
property System::String^ Message
{
virtual System::String^ get() override
{
return gcnew System::String("Потік досяг кінця файла!");
}
}
};
ref class CoruptedLineException : public BaseException
{
public:
CoruptedLineException(Object^ sender) : BaseException(sender) {};
property System::String^ Message
{
virtual System::String^ get() override
{
return gcnew System::String("Рядок пошкоджено!");
}
}
};
ref class ValueOverflowException : public BaseException
{
public:
ValueOverflowException(Object^ sender) : BaseException(sender) { Value = 0; };
ValueOverflowException(Object^ sender, double value) : BaseException(sender) { Value = value; };
property System::String^ Message
{
virtual System::String^ get() override
{
return gcnew System::String("Значення виходить за межі типу!");
}
}
double Value;
};
ref class NotEnoughObjectsException : public BaseException
{
public:
NotEnoughObjectsException(Object^ sender) : BaseException(sender) {};
property System::String^ Message
{
virtual System::String^ get() override
{
return gcnew System::String("У контейнері недостаньо змінних для проведення операції!");
}
}
};
ref class InvalidRectangleException : public BaseException
{
public:
InvalidRectangleException(Object^ sender) : BaseException(sender) {};
property System::String^ Message
{
virtual System::String^ get() override
{
return gcnew System::String("Точки чотирикутника знаходяться на одній прямій!");
}
}
};
... нтуватися на використання підручників [53; 54; 5]. У класах фізико-математичного спрямування доцільно орієнтуватись на використання підручників [53; 54; 5; 1]. РОЗДІЛ 2 ОСОБЛИВОСТІ ВИВЧЕННЯ МАТЕМАТИКИ У ПРОФІЛЬНИХ КЛАСАХ В СУЧАСНИХ УМОВАХ 2.1. ОСНОВНІ ПОЛОЖЕННЯ ПРОФІЛЬНОЇ ДИФЕРЕНЦІАЦІЇ НАВЧАННЯ МАТЕМАТИКИ Математика є універсальною мовою, яка широко застосовується в усіх ...
... здійснювати на ведучому навчальному матеріалі. 6. Формування прийомів розумової діяльності вимагає врахування індивідуально-вікових особливостей учнів. 1.2 Формування уміння порівнювати в процесі навчання математики Порівняння в навчанні – це розумова операція, за допомогою якої встановлюються риси подібності і відмінності між визначеними предметами і явищами. Пізнання будь-якого ...
... враховуючи їх невелику кількість у підручниках, посібниках та майже повну відсутність серед добірок завдань контролюючого характеру. 2.2 Загальні методичні рекомендації вивчення елементів стереометрії у курсі геометрії 9 класу 2.2.1 Формування уявлень і понять про стереометричні фігури та деякі їх властивості Формування понять – складний психологічний процес, який починається з утворення ...
... або світлішим за колір елементів узору. 2.3 Результати дослідницько-експериментальної роботи На підтвердження наведених теоретичних положень ми проводили дослідження особливостей формування відчуття кольору на уроках образотворчого мистецтва у початкових класах. Це дослідження мало практичний характер і проводилося у два етапи. На першому етапі (2006-2007 навч. рік) була визначена сфера і ...
0 комментариев