	CoSkel

	Authors of the skeleton: 
		Grzegorz Skowron
		Miłosz Zdybał

Jak używać?

1. Argumenty linii poleceń:
	1.1. Dostęp do argumentów linii poleceń odbywa się za pośrednictwem objektu klasy CSArgumentParser. Do jego konstruktora
		należy przekazać tablicę args będącą argumentem funcji main.
	1.2. Po utworzeniu objektu parsera, należy zarejestrować możliwe argumenty wywołania. Funkcja rejestrująca CSRegisterArgument
		przyjmuje nazwę rejestrowanego argumentu (jako String) oraz dwie wartości logiczne - czy argument posiada wartość
		(jeżeli nie, jest traktowany jako przełącznik) oraz czy jest wymagany (jeżeli tak, próba uruchomienia programu
		bez tego argumentu zakończy się niepowodzeniem).
	1.3. Po zarejestrowaniu argumentow należy wykonac funkcję CSparseArguments() - odpowiada ona za sprawdzenie poprawności argumentów
		wywołania programu oraz rozmieszczenie ich w odpowiednich kontenerach.
	1.4. Dostęp do argumentów odbywa się również na pośrednictwem objektu parsera, jedną z funkcji (każda przyjmuje jeden argument - 
		String będący nazwą argumentu to zwrócenia):
		- CSgetStringArgument (zwraca String)
		- CSgetIntArgument (zwraca Integer)
		- CSgetDoubleArgument (zwraca Double)
		- CSgetFloatArgument (zwraca Float)
		- CSgetComplexArgument (zwraca CSComplex)
		
2. Plik(i) z konfiguracją:
	2.1. Dostęp do konfiguracji odbywa się za pośrednictwem objektu klasy CSConfig. Posiada on dwa konstruktory:
		- bezargumentowy
		- przyjmujący nazwę pliku z konfiguracją
	2.2. Plik konfiguracyjny powinien zawierać linie z parami parametr=wartość. Linie rozpoczynające się od znaku # są ignorowane.
	2.3. Dostęp do parametru odbywa się za pośrednictwem funkcji get przyjmującej jako argument nazwę parametru.
	2.4. Zarówno nazwa jak i wartość parametru są Stringami.
	2.5. Funkcja read przyjmująca nazwę pliku pozwala na wczytanie parametrów z pliku konfiguracyjnego.
	2.6. Funkcja set przymująca dwa Stringi (parametr, wartość) umożliwia ustawienie/zmianę wartości parametru.

3. Typy danych:
	3.1. CSComplex - typ zespolony
		3.1.1. Konstruktory:
			- (double Re, double Im) - przyjmujący wartości rzeczywistą i urojoną
			- (String toParse) - parsujący wartość zespoloną ze Stringu. Obsługiwane formaty (a, b - double):
				* a
				* bi
				* a+bi
				* bi+a
		3.1.2. Dostęp do wartości:
			- getRe() - zwraca część rzeczywistą (double)
			- getIm() - zwraca część urojoną (double)
			- getPair() - zwraca double[] z wartością rzeczywistą i urojoną
			- toString() - zwraca String w formacie a+bi
	3.2. CSVectorX - wektor danych, gdzie zamiast X występuje I, F, D, C (odpowiednio int, float, double, CSComplex)
		3.2.1. Konstruktory:
			- () - bezargumentowy
			- (int size) - rezerwujący pamięc na size elementów
			- (ArrayList<Integer> array) - inicjalizujący się podanym wektorem wartości
			- (String filename) - wczytujący dane z pliku
		3.2.2. Dodawanie danych:
			- add(Integer i) - dodaje i do wektora
			- add(ArrayList<X>) - dodaje wektor
			- readFromFile(String filename) - wczytuje wektor z pliku filename
			- readPartFromFile(String filename, int from, it to) - wczytuje z pliku tylko wartości o indexach od from to to
		3.2.3. Dostęp do danych:
			- get(int index) - zwraca wartość z pod danego indexu
			- getArrayList() - zwraca cały wektor jako ArrayList<X>
			- gerArray() - zwraca cały wektor jako X[]
		3.2.4. Inne funkcje:
			- size() - zwraca rozmiar wektora
			- save(String filename) - zapisuje wektor do pliku filename
	3.3. CSMatrixX - wektor danych, gdzie zamiast X występuje I, F, D, C (odpowiednio int, float, double, CSComplex)
		3.3.1. Konstruktory:
			- () - bezargumentowy
			- (ArrayList<CSVectorX> array) - inicjalizujący się podaną macierzą wartości
			- (String filename) - wczytujący dane z pliku
		3.3.2. Dodawanie danych:
			- add(Integer i) - dodaje i do wektora
			- add(ArrayList<Intger>) - dodaje wektor
			- readFromFile(String filename) - wczytuje wektor z pliku filename
			- readPartFromFile(String filename, int startRow, it endRow, int startCol, int endCol) - wczytuje z pliku tylko
				 wartości z wybranego "obszaru" macierzy
		3.3.3. Dostęp do danych:
			- getElement(int row, int col) - zwraca wartość z pola macierzy
			- getMatrix() - zwraca całą macierz jako ArrayList<CSVectorX>
			- gerRow() - zwraca wiersz jako CSVectorX
		3.3.4. Inne funkcje:
			- save(String filename) - zapisuje wektor do pliku filename
			
4. Korzystanie:
	Tutaj Użytkownik ma pełną swobodę. Funkcje obliczeniowe mogą znajdować się w klasie CoSkel, dowolnej zewnętrznej klasie lub nawet
	bezpośrednio w ciele funkcji main. Przed, po lub w czasie obliczeń mogą być wykorzystane dowolne elementy szkieletu CoSkel.
	Do poprawnej kompilacji wymagane są:
	- dla parsera argumentów wejściowych: CSArgument.java, CSArgumentParser.java, ParseArgumentException.java,
		RequiredArgumentException.java, UnregosteredArgumentException.java, UseArgumentException.java
	- dla obsługi konfiguracji: CSConfig.java
	- dla obsługi wektorów: CSVectorX.java (gdzie X odpowiada odpowiedniemu typowi danych)
	- dla obsługi macierzy: CSMatrixX.java, CSVectorX.java (gdzie X odpowiada odpowiedniemu typowi danych)
	Każdy z plików może być modyfikowany celem dostosowania do konkretnych wymagań (np. zmiana obsługi wyjątków)
