/* Beispiel: Klassen (Attribute, Methoden, Konstruktor, Destruktor)
   Filename: main.cpp
   Author: Lahmer
   Title: Klassen
   Description: In diesem Beispiel lernen Sie das Konzept von Klassen kennen. Es wird eine Klasse Kreis angelegt, welche Attribute (z.B.: Radius,..), Methoden (z.B.: getFlaeche(),.. ) bzw. Konstruktoren und einen Destruktor beinhaltet.
   Last Change: 15.02.2018
*/
 
 
#include <iostream>
#include <conio.h>
#include <string.h>
 
using namespace std;
 
#define PI 3.141
 
 
class Kreis {
 
	private: 								//Zugriffsrecht private -> sieht man nur innerhalb der Klasse
		float radius;						//privates Attribut
 
	public: 								//Zugriffsrecht public -> sieht man auch außerhalb der Klasse
		string beschreibung;				//öffentliches Attribut
		string einheit;
 
 
		/*** Konstruktoren (gleicher Name wie Klasse & kein Rückgabewert) sind spezielle Methoden ***/
		Kreis() 						// der Default-Konstruktor (wird standardmäßig ausgeführt)
		{
			radius=1.0;
			einheit="cm";
		}                     
 
		Kreis(float r, string e)               	// weiterer Konstruktor mit Parameter und Defaultwert
    	{
    		radius=r;
    		einheit=e;
		}
 
		/*** Methoden einer KLasse ***/
		float getRadius()					//Inline-Methode (Deklaration + Definition) getRadius -> gibt den privaten Radius zurück
		{
			return radius;
		}
		float setRadius(float r)			//Inline-Methode (Deklaration + Definition) setRadius -> setzt den privaten Radius auf r
		{
			radius=r;
		}
 
		float getUmfang()					//Inline-Methode (Deklaration + Definition) getUmfang berechnet den Umfang und gibt diesen zurück
		{
			return 2*radius*PI;
		}
 
		float getFlaeche();					//Methodendeklaration getFlaeche berechnet die Fläche und gibt diese zurück		
};
 
float Kreis::getFlaeche()					//Methodendefinition der Methode getFlaeche von der Klasse Kreis 
{
	return 2*radius*radius;
}
 
//Funktionsdefinition
int kreisvergleich(Kreis a, Kreis b)
{
	float kreis1, kreis2;
	kreis1=a.getRadius();
	kreis2=b.getRadius();
	if(a.einheit=="cm")
	{
		kreis1=a.getRadius()/100;
	}
	if(b.einheit=="cm")
	{
		kreis2=b.getRadius()/100;
	}
 
	if(kreis1>kreis2)
	{
		return 1;
	}
	if(kreis1<kreis2)
	{
		return -1;
	}
	if(kreis1==kreis2)
	{
		return 0;
	}
}
 
 
 
//Hauptprogramm
int main()
{
	Kreis k1;					//Objekt  
	Kreis k2(2.0, "m");
 
	//Zugriff auf das öffentliches Attribut beschreibung
	k1.beschreibung="Kreis initialisiert mit Standardkonstruktor!";
	k2.beschreibung="Kreis initialisiert mit Konstruktor mit Radius als Parameter";
 
	cout << "KREIS 1:" << endl; 
	//Zugriff auf die öffentliche Methode getRadius und das öffentliche Attribut einheit von k1
	cout << "Radius: \t" << k1.getRadius() << k1.einheit << endl;
	//Zugriff auf die öffentliche Methode getFlaeche und das öffentliche Attribut einheit von k1
	cout << "Flaeche: \t" << k1.getFlaeche() << k1.einheit << "^2" << endl;
	//Zugriff auf die öffentliche Methode getUmfang und das öffentliche Attribut einheit von k1
	cout << "Umfang: \t" << k1.getUmfang() << k1.einheit  << endl;
 
	cout << endl;
 
	cout << "KREIS 2:" << endl; 
	//Zugriff auf die öffentliche Methode getRadius und das öffentliche Attribut einheit von k2
	cout << "Radius: \t" << k2.getRadius() << k2.einheit  << endl;
	//Zugriff auf die öffentliche Methode getFlaeche und das öffentliche Attribut einheit von k2
	cout << "Flaeche: \t" << k2.getFlaeche() << k2.einheit  << "^2" << endl;
	//Zugriff auf die öffentliche Methode getUmfang und das öffentliche Attribut einheit von k2
	cout << "Umfang: \t" << k2.getUmfang() << k2.einheit  << endl;
 
	float r=0.0;
	cout << endl;
	cout << "Setzen des Radius von Kreis 1:";
	cin >> r;
	k1.setRadius(r);
 
	r=0.0;
	cout << endl;
	cout << "Setzen des Radius von Kreis 2:";
	cin >> r;
	k2.setRadius(r);
 
	cout << endl;
 
	cout << "KREIS 1:" << endl; 
	//Zugriff auf die öffentliche Methode getRadius und das öffentliche Attribut einheit von k1
	cout << "Radius: \t" << k1.getRadius() << k1.einheit << endl;
	//Zugriff auf die öffentliche Methode getFlaeche und das öffentliche Attribut einheit von k1
	cout << "Flaeche: \t" << k1.getFlaeche() << k1.einheit << "^2"<< endl;
	//Zugriff auf die öffentliche Methode getUmfang und das öffentliche Attribut einheit von k1
	cout << "Umfang: \t" << k1.getUmfang() << k1.einheit  << endl;
 
	cout << endl;
 
	cout << "KREIS 2:" << endl; 
	//Zugriff auf die öffentliche Methode getRadius und das öffentliche Attribut einheit von k2
	cout << "Radius: \t" << k2.getRadius() << k2.einheit  << endl;
	//Zugriff auf die öffentliche Methode getFlaeche und das öffentliche Attribut einheit von k2
	cout << "Flaeche: \t" << k2.getFlaeche() << k2.einheit << "^2" << endl;
	//Zugriff auf die öffentliche Methode getUmfang und das öffentliche Attribut einheit von k2
	cout << "Umfang: \t" << k2.getUmfang() << k2.einheit  << endl;
 
	cout << "Welcher Kreis ist groesser?" << endl;
	if(kreisvergleich(k1,k2)==1)
	{
		cout << "Der Kreis k1 ist groesser!" << endl;
	}
	if(kreisvergleich(k1, k2)==-1)
	{
		cout << "Der Kreis k2 ist groesser!" << endl;
	}
	if(kreisvergleich(k1, k2)==0)
	{
		cout << "Die beiden Kreise sind gleich gross" << endl;
	}
 
    return 0;
}