Summary Files Commits Branches @commit @diff @stats
path: root / Year 1 / Object-oriented Programming / Solutions Sem. 01 / exercise01.cpp
blob: 4a6ac1c0ff09237c7be1c12cefbae9bc47041e9b (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#include <iostream> // cin, cout
#include <cmath>    // sqrt

struct Point {
	double x;
	double y;
};

double calcDistance(Point a, Point b) {
	return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
}

Point cinPoint() {
	Point temp;
	std::cin >> temp.x >> temp.y;
	return temp;
}

struct Triangle {
	Point A;
	Point B;
	Point C;

	double Area;
};

double calcArea(Triangle tri) {
	double a = calcDistance(tri.B, tri.C);
	double b = calcDistance(tri.A, tri.C);
	double c = calcDistance(tri.A, tri.B);

	double p = (a + b + c) / 2;
	return sqrt(p*(p-a)*(p-b)*(p-c)); // Heron's formula
}

Triangle createTriangle(Point A, Point B, Point C) {
	return { A, B, C, calcArea({A, B, C}) };
}

Triangle cinTriangle() {
	Point tempA = cinPoint(),
		  tempB = cinPoint(),
		  tempC = cinPoint();
	return createTriangle(tempA, tempB, tempC);
}

void coutTriangle(Triangle tri) {
	std::cout << "(" << tri.Area << ")" << std::endl;
}

int cmpByArea(Triangle tri1, Triangle tri2) {
	return (tri1.Area > tri2.Area) ? 1 : ((tri1.Area < tri2.Area) ? -1 : 0);
}

void sortTriangleArr(Triangle* triangles, int N, int (compare)(Triangle, Triangle)) {
	int indOfSmallest = 0;
	for (int i = 0; i < N - 1; i++, indOfSmallest = i) {
		for (int j = i + 1; j < N; j++) {
			if (compare(triangles[j], triangles[indOfSmallest]) < 0)
				indOfSmallest = j;
		}

		Triangle temp = triangles[i];
		triangles[i] = triangles[indOfSmallest];
		triangles[indOfSmallest] = temp;
	}
}

int main() {
	int N;
	std::cin >> N;

	Triangle* triangles = new Triangle[N];
	for (int i = 0; i < N; i++)
		triangles[i] = cinTriangle();
	
	sortTriangleArr(triangles, N, cmpByArea);

	for (int i = 0; i < N; i++)
		coutTriangle(triangles[i]);

	delete[] triangles;
};