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

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

Как пример реализации задачи по теме "Структуры". Включает также перечисление со "строковой" интерпретацией для него, указатель на функцию 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;
}

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

16.11.2016, 21:19; рейтинг: 2405

  свежие записипоиск по блогукомментариистатистикао "вирусах" в архивах .zip

Наверх Яндекс.Метрика
© PerS
вход