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

Помощь дата->рейтинг Поиск Почта RSS канал Статистика nickolay.info Домой

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

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

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

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