БлогNot. Структура для геометрической фигуры...

Структура для геометрической фигуры...

Как пример реализации задачи по теме "Структуры". Включает также перечисление со "строковой" интерпретацией для него, указатель на функцию objFilter, позволяющий в перспективе "подключать" к массиву записей разные фильтры ("тесты"). Пример чисто учебный и для консоли, Visual Studio 2015.

Описать структурный тип "геометрическая фигура" с полями данных "тип фигуры" (например, отрезок, прямоугольник, эллипс), "координаты" (точки на плоскости с координатами (x1,y1) и (x2,y2)).
Тест: найти все фигуры, располагающиеся в первой координатной четверти.

#define _CRT_SECURE_NO_WARNINGS
#include <iostream> 
#include <string> 
using namespace std;

enum objType { LINE, RECTANGLE, ELLIPSE };
struct point { double x, y; };
struct obj {
 objType type;
 string name;
 struct point p1, p2;
};

void getObjectPoints(obj& o) {
 cout << "Type x and y coordinates for point 1"
  << (o.name.size() ? "" : " of " + o.name) << ":";
 cin >> o.p1.x >> o.p1.y;
 cout << "Type 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=" << 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 cnt = 2;
 obj figures[cnt] = {
  { LINE, "", { 0, 0 }, {2, 2} },
  { (objType)-1, "", { 0, 0 }, {0, 0} }
 };
 obj* rect = &figures[1];
 rect->type = RECTANGLE; rect->name = "A";
 getObjectPoints(*rect);
 objFilter filter; //указатель на функцию
 filter = &filter1; //поставил на нужный в данный момент фильтр
 for (int i = 0; i < cnt; i++) //выполняем тест из задания
  if (filter(&figures[i])) putObject(figures[i]);
 return 0;
}
/*
 Проблема - компилятор выводит 0,1,2, а не LINE, RECTANGLE, ELLIPSE
 Но ёё можно решить написанием отдельной функции
*/

16.11.2016, 21:19 [3314 просмотров]


теги: c++ учебное studio

К этой статье пока нет комментариев, Ваш будет первым