Warunek istnienia trójkąta jest spełniony, gdy najdłuższy odcinek jest krótszy od sumy dwóch pozostałych. Zakładając że i to najkrótsze odcinki, musi zajść nierówność:

Jeżeli nie chcemy wyznaczać najkrótszych odcinków, możemy ułożyć układ trzech nierówności:

Powyższy układ jest łatwiejszy do zaimplementowania. Nie musimy przejmować się kolejnością wprowadzanych długości bądź ich sortowaniem.

Funkcja realizująca sprawdzanie warunku istnienia trójkąta w języku C++:

1
2
3
4
5
bool czyTrojkatIstnieje(double a, double b, double c) {
	return (a + b > c) && 
		   (a + c > b) && 
		   (b + c > a);
}


Klasyfikacja trójkątów ze względu na długości boków

różnoboczny - trójkąt o trzech bokach różnej długości

równoramienny - trójkąt o dwóch bokach (ramionach) tej samej długości

równoboczny - trójkąt o trzech bokach tej samej długości


Klasyfikacja trójkątów ze względu na miary kątów

ostrokątny - trójkąt o trzech kątach ostrych

prostokątny - trójkąt z jednym kątem prostym

rozwartokątny - trójkąt z jednym kątem rozwartym

Wychodząc z twierdzenia cosinusów, możemy ustalić rodzaj trójkąta na podstawie długości jego boków:


Sprawdzanie rodzaju trójkąta - kod C++

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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#include <iostream>
#include <algorithm>
using namespace std;

enum KlasyfikacjaBoki {
	roznoboczny,
	rownoramienny,
	rownoboczny
};

enum KlasyfikacjaKaty {
	ostrokatny,
	prostokatny,
	rozwartokatny
};

class Trojkat {
	double m_a, m_b, m_c;

	KlasyfikacjaBoki klasyfikujBoki();
	KlasyfikacjaKaty klasyfikujKaty();

	public:
		// Konstruktor przyjmujący długości boków trójkąta
		Trojkat(double a, double b, double c);

		// Metoda wyświetlająca informacje o trójkącie
		void info();
};

Trojkat::Trojkat(double a, double b, double c) : m_a(a), m_b(b), m_c(c) {
	// Sortowanie długości boków rosnąco
	if(m_a > m_b) swap(m_a, m_b);
	if(m_a > m_c) swap(m_a, m_c);
	if(m_b > m_c) swap(m_b, m_c);

	// Wyświetl informacje o trójkącie
	info();
}

KlasyfikacjaBoki Trojkat::klasyfikujBoki() {
	// Jeżeli trójkąt ma wszystkie boki rózne to jest różnoboczny
	if(m_a != m_b && m_a != m_c && m_b != m_c) return roznoboczny;

	// Jeżli trójkąt ma parę takich samych boków (a i b lub b i c)
	if(m_a == m_b || m_b == m_c) {

		// Jeżeli trójkąt ma rózne boki a i c to jest równoramienny,
		// wówczas ramiona są parą boków a i b lub b i c
		if(m_a != m_c) return rownoramienny;

		// W przeciwnym wypadku jest równoboczny (a == b == c)
		else return rownoboczny;
	}
}

KlasyfikacjaKaty Trojkat::klasyfikujKaty() {
	const double sumaKwadratow = m_a * m_a + m_b * m_b;
	const double kwadratC = m_c * m_c;

	// Zależności wynikające z twierdzenia cosinusów:

	// Jeżeli suma kwadratów a i b jest większa od kwadratu c to jest ostrokątny
	if(sumaKwadratow > kwadratC) return ostrokatny;

	// Jeżeli suma kwadratów a i b jest równa kwadratowi c to jest prostokątny
	if(sumaKwadratow == kwadratC) return prostokatny;

	// W przeciwnym wypadku jest rozwartokątny
	else return rozwartokatny;
}

void Trojkat::info() {
	cout << "Trójkąt o bokach "
		 << m_a << ", "
		 << m_b << ", "
		 << m_c << " ";

	// Jeżeli trójkąt nie istnieje, wypisz odpowiedni tekst
	if(m_a + m_b <= m_c) {
		cout << "nie istnieje" << endl;
		return;
	}

	// W przeciwnym wypadku określ rodzaj trójkąta

	// W zależności od zwróconej wartości przez metody klasyfikuj*
	// wyświetl odpowiedni tekst
	switch(klasyfikujBoki()) {
		case roznoboczny:
			cout << "różnoboczny";
			break;
		case rownoramienny:
			cout << "równoramienny";
			break;
		case rownoboczny:
			cout << "równoboczny";
			break;
	}

	cout << " i ";

	switch(klasyfikujKaty()) {
		case ostrokatny:
			cout << "ostrokątny";
			break;
		case prostokatny:
			cout << "prostokątny";
			break;
		case rozwartokatny:
			cout << "rozwartokątny";
			break;
	}

	cout << endl;
}

int main() {
	// Sprawdzamy poprawność algorytmu dla różnych trójkątów
	Trojkat(7, 3.5, 3.5);
	Trojkat(4, 5, 6);
	Trojkat(5, 3, 4);
	Trojkat(12, 8, 5);
	Trojkat(12, 16, 12);
	Trojkat(4, 4, 6);
	Trojkat(3, 3, 3);
}

Wyjście programu

Trójkąt o bokach 3.5, 3.5, 7 nie istnieje
Trójkąt o bokach 4, 5, 6 jest różnoboczny i ostrokątny
Trójkąt o bokach 3, 4, 5 jest różnoboczny i prostokątny
Trójkąt o bokach 5, 8, 12 jest różnoboczny i rozwartokątny
Trójkąt o bokach 12, 12, 16 jest równoramienny i ostrokątny
Trójkąt o bokach 4, 4, 6 jest równoramienny i rozwartokątny
Trójkąt o bokach 3, 3, 3 jest równoboczny i ostrokątny