/*
 * Poniższy kod stanowi jedynie przykłąd wykorzystania ciągów znakowych oraz list.
 * Najprostsza implementacja badania warunku trójkąta. Należy sprawdzić inne metody badania
 * warunków trójkąta.
 *
 * Implementację należy rozszerzyć na zbiory odcików trójkąta i/lub algorytm mówiący,
 * z których odcinków można zbudować trójkąt (obecnie jest sztywny wymiar listy = 3).
 *
 * Dobrym pomysłem byłoby pobieranie danych jako parametrów wejściowych (argv)
 *
 */
#include <iostream>
#include <list>
#include <sstream>

using namespace std;

int main(int argc, char *argv[])
{
	//tworzenie listy std::list (standardowa)
	list<float> tsections;
	//tworzenie ciągu znakowego
	string sIn;
	cout << "Podaj wspolrzedne: ";
	//poniższa funkcja pozwala na pobranie całej wartości znakowej
	//wpisanej przez użytkownika (standardowo cin >> czyta znaki do pierwszego
	//pojawienia się \0, czyli pierwszej spacji)
	getline(cin, sIn);
	
	string tmp;
	
	//pętla pozwalająca przemieścić się po zawartości sIn znak po znaku
	//wykorzystany został iterator - typ pozwalający na przmieszczanie się
	//element wstecz bądź w przód (nigdy o inną wartość);
	for (string::iterator sIt = sIn.begin(); sIt != sIn.end(); ++sIt) {
		//strumień znakowy powalający na tworzenie łańcucha znakowego (string)
		//ponadto powala on na szybką (dla progrmiasty) konwersję typów znakowych
		//na liczbowe i liczbowych na znakowe (wykorzystuje typ bajtowy)
		stringstream ss;
		//wrzucenie WARTOŚCI ITERATORA do strumienia znakowego
		ss << *sIt;
		//jeżeli aktualna wartość, na którą wskazuje iterator nie jest spacją
		if (*sIt != ' ') {
			//dodają tę wartość (ze strumienia) do zmiennej tymczasowej
			tmp.append(ss.str());
		}
		        else {
					//jeżeli byłą spacja znaczy, że posiadamy już pełną liczbę
					//wrzucamy ją do strumienia (ze zmiennej tmp)
					ss << tmp;
					//tworzymy zmienną pomocniczą fTmp
					float fTmp = .0f;
					//zawartość strumienia przerzucamy do fTmp; od tego momentu
					//wartość znakowa zamienia się w wartość liczbową
					ss >> fTmp;
					//umieszczamy tak pozyskaną wartość liczbową do naszej listy
					tsections.push_back(fTmp);
					//czyścimy zawartość zmiennej tymczasowej
					tmp = "";
				}
	}
	    //ten warunek potrzebny jest by przerzucić ostatnią podaną liczbę do listy
	        //bez niego 3 wartość odcinka nie byłaby obecna na liście (nie ma po niej spacji)
	            //WARUNEK: jeżeli zmienna tmp nie jest pusta
	                //RÓWNOWAŻNIK: if(tmp.empty() == false) lub if(tmp.empty() != true)
	                    if (!tmp.empty()) {
							stringstream ss;
							ss << tmp;
							float fTmp = .0f;
							ss >> fTmp;
							tsections.push_back(fTmp);
							tmp = "";
						}
						    //jeżeli rozmiar listy jest różny od 3 to znaczy, że podający popełnił błąd
						        if (tsections.size() != 3)
									cout << "Nie podales odcinkow dla trojkata!" << endl;
								//w przeciwnym wypadku sprawdzimy warunek istnienia trójkąta
								else {
									//tworzymy zmienną iterator naszej listy, która będzie wskazywać na
									//początek listy wartości (liczbowych, nie tekstowych!)
									//przyjmujemy, że pierwsza wartość jest największa!
									list<float>::iterator lPos = tsections.begin();
									//tworzymy zmienną sumującą nam dwie długości pozostałych odcinków
									float sum = .0f;
									//poniższa pętla ma za zadanie sprawdzić, czy na liście nie ma
									//większej wartości od tej, którą przyjęliśmy za największą
									for (list<float>::iterator fIt = tsections.begin(); fIt != tsections.end(); fIt++) {
										//jeżeli aktualnie przepatrywana wartość jest większa od
										//obecnie wskazywanej
										if (*fIt > *lPos) {
											//przypisujemy wartość iteratora jako największego
											lPos = fIt;
										}
									}
									        //w tej pętli sumujemy pozostałe wierzchołki
									                for (list<float>::iterator fIt = tsections.begin(); fIt != tsections.end(); fIt++) {
														if (fIt != lPos)
															sum += *fIt;
													}
													        //jeżeli suma jest większa od wartości najdłużego odcinka
													                //warunek jest spełniony
													                        if (sum > *lPos)
																				cout << endl << "Warunek trojkata spelniony!" << endl;
																			//jeżeli nie - wystosowujemy odpowiedni komunikat
																			else
																				cout << endl << "Z odcinkow nie da sie zbudowac trojkata!" << endl;
								}
								    return 0;
}
