Структура для геометрической фигуры...
Как пример реализации задачи по теме "Структуры". Включает также перечисление со "строковой" интерпретацией для него, указатель на функцию objFilter
, позволяющий в перспективе "подключать" к массиву записей разные фильтры ("тесты"). Пример чисто учебный и для консоли, Visual Studio 2015.
Описать структурный тип "геометрическая фигура" с полями данных "тип фигуры" (например, отрезок, прямоугольник, эллипс), "координаты" (точки на плоскости с координатами (x1,y1) и (x2,y2)).
Тест: найти все фигуры, располагающиеся в первой координатной четверти.
#define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> using namespace std; const int cntTypes = 3; enum objType { UNKNOWN = -1, LINE, RECTANGLE, ELLIPSE }; string getObjType (objType type) { string objTypenames[cntTypes] = { "LINE", "RECTANGLE", "ELLIPSE" }; return (type<0 || type>cntTypes-1 ? "UNKNOWN" : objTypenames[type]); } struct point { double x, y; }; //вспомогательный тип "точка" struct obj { //основной структурный тип "объект" objType type; string name; struct point p1, p2; }; void getObject(obj &o) { cout << "Print type for object (0-" << (cntTypes-1) << "): "; int type; cin >> type; if (type<0 || type>cntTypes-1) type=-1; o.type = (objType)type; cout << "Print a name for object: "; cin >> o.name; cout << "Print x and y coordinates for point 1" << (o.name.size() ? "" : " of " + o.name) << ": "; cin >> o.p1.x >> o.p1.y; cout << "Print x and y coordinates for point 2" << (o.name.size() ? "" : " of " + o.name) << ": "; cin >> o.p2.x >> o.p2.y; } void putObject(obj &o) { cout << endl << "Type=" << getObjType(o.type) << ", Name=" << o.name << ", Point1=(" << o.p1.x << "," << o.p1.y << ")" << ", Point2=(" << o.p2.x << "," << o.p2.y << ")"; } typedef bool(*objFilter)(obj *); //Указатель на функции типа bool имя (obj *) bool filter1(obj *o) { //Конкретная функция фильтрации записей return o->p1.x > 0 && o->p1.y > 0 && o->p2.x > 0 && o->p2.y > 0; } int main() { const int cntObjects = 2; obj figures[cntObjects] = { { LINE, "", { 0, 0 }, {2,2} }, { (objType)-1, "", { 0, 0 }, {0,0} } }; obj *rect = &figures[1]; //со вторым объектом работаем через указатель getObject (*rect); objFilter filter; //указатель на функцию filter = &filter1; //поставили на нужный в данный момент фильтр for (int i = 0; i < cntObjects; i++) if (filter(&figures[i])) putObject(figures[i]); cin.get(); cin.get(); cin.sync(); return 0; }
16.11.2016, 21:19; рейтинг: 2806