import eprog.*;

// Autor: Martha@Kaltenecker
// Matr.Nr.: 0125193
// Beispiel: 1
// Beispielnummer: 1104

// Beschreibung:
// Die Seitenlängen eines Dreiecks werden eingelesen. 
// Das Programm soll überprüfen, ob es sich um ein rechtwinkeliges Dreieck handelt 
// bzw. eine fehlende Seitenlänge auf ein rechtwinkeliges Dreieck ergänzen und den 
// Flächeninhalt ausgeben. 

  
	 public class drei extends EprogIO
    {
      public static void main(String [] args)
        {
	    
	    boolean fehlerKZ=false;       // Zur Überprüfung ob alle Eingaben richtig sind.
	    double aKathete=0.0;	      // Gibt Kathete a an.
	    double bKathete=0.0;	      // Gibt Kathete b. an.
	    double cHypothenuse=0.0;	  // Gibt Hypothenuse c an.
	    double AFlaeche=0.0;	      // Gibt Fläche A eines rechtwinkeligen Dreiecks an. 
	    double Variable=0.0;		  // Definiert eine Variable
	    							
	    try							  // Eingabe falscher Datentypen abfangen (Kathete a).
		{			
		    aKathete=readDouble();    // Kathete a von der Tastatur/file lesen.
		}
	    catch(EprogException e)		  
		{
		    fehlerKZ=true;
		}

	    try							  // Eingabe falscher Datentypen abfangen (Kathete b).
		{			
		    bKathete=readDouble();	  // Kathete b von der Tastatur/file lesen.
		}
	    catch(EprogException e)		  
		{
		    fehlerKZ=true;
		}

	    try							  // Eingabe falscher Datentypen abfangen (Hypothenuse c)).
		{			
		   cHypothenuse=readDouble(); // Hypothenuse c von der Tastatur/file lesen.
		}			
	    catch(EprogException e)
		{
		    fehlerKZ=true;
		}

	    if (fehlerKZ)				  // Enthält der Eingabedatensatz einen ungültigen Datentyp, 
                                      
		{
		    println("?");			  // so soll einmal das Zeichen "?", gefolgt von einem Zeilenvorschub,ausgegeben werden.
		}
		
		// Überprüfung, ob die drei eingelesenen Seiten ein rechtwinkliges Dreieck ergeben. 
 	else if ( (cHypothenuse > 0.0) && (aKathete > 0.0) && (bKathete > 0.0) )  // Wenn alle drei Seiten des Dreiecks größer 0 sind, dann soll mit Hilfe des

		{
Variable=
Math.abs(((cHypothenuse*cHypothenuse)-(aKathete*aKathete)-(bKathete*bKathete))/(2*aKathete*bKathete));	// Cosinussatzes überprüft werden ob es sich um ein rechtwinkeliges Dreieck handelt, 
		 

	 if	 
		 ( Variable>=0.3 )			  // wobei eine Toleranz von 0.3 erlaubt ist.

			{
			 println( "KEIN RECHTER WINKEL" ); // Wenn dies nicht der Fall ist, so soll "KEIN RECHTER WINKEL" ausgegeben 
		    }
		
	    else	
			{
			  AFlaeche=(aKathete*bKathete)/2;	//Wenn es der Fall ist soll die Fläche berechnet,
			    printFixed( AFlaeche );			//und ausgegeben werden.
				 
			}
		}
			
    //Überprüfung ob der Inhalt der Datentypen korrekt ist.
    
	else  if ( ((cHypothenuse == 0.0) && (aKathete == 0.0)) ||      // Wenn die Hypothenuse c und die Kathete a als Null erfasst wurden 				ODER
		       ((cHypothenuse == 0.0) && (bKathete == 0.0)) || 	    // wenn die Hypothenuse c und die Kathete b als Null erfasst wurden 				ODER
		       ((aKathete == 0.0) && (bKathete == 0.0)) ||		    // wenn die Kathtete a    und die Kathete b als Null erfasst wurden 				ODER
		       (aKathete < 0.0) ||								    // wenn die Kathete a kleiner als Null ist 					    	  				ODER
		       (bKathete < 0.0) ||								    // wenn die Kathete b kleiner als Null ist 						       				ODER
		       (cHypothenuse < 0.0)||							    // wenn die Hyothenuse c kleiner als Null ist 						     			ODER
		       (cHypothenuse <= aKathete) && (cHypothenuse > 0.0)|| // wenn die Kathete a größer /gleich der Hypothenuse c ist UND die Hypothenuse c größer als Null ist ODER		 						 
		       (cHypothenuse <= bKathete) && (cHypothenuse > 0.0) )	// wenn die Kathete b größer /gleich der Hypothenuse c ist UND die Hypothenuse c größer als Null     		              	
       
		{
		    println("FALSCHE EINGABE");							   //... dann soll "Falsche Eingabe" ausgegeben werden.
		}			   						
												
		

	else if (cHypothenuse ==0.0)												//Wenn nur die Hypothenuse c mit Null erfasst wurde, soll
		
		{
		    cHypothenuse=Math.sqrt((aKathete*aKathete)+(bKathete*bKathete));	//die Hypothenuse c errechnet werden und 
		    AFlaeche=(aKathete*bKathete)/2;										//die Fläche.
		    printFixed( cHypothenuse);											//Dann soll die fehlende Hypothenuse c  
		    print( " ");														//und der Flächeninhalt,beide Werte gerundet, ausgegeben werden.
		    printFixedln( AFlaeche); 										    
		}
		
	else if (aKathete ==0.0)													//Wenn nur die Kathete a mit Null erfasst wurde, soll
		
		{
		    aKathete=Math.sqrt((cHypothenuse*cHypothenuse)-(bKathete*bKathete));//die Kathete a errechnet werden und 
		    AFlaeche=(aKathete*bKathete)/2;										//die Fläche.
		    printFixed( aKathete);												//Dann soll die fehlende Kathete a 
		    print( " ");														//und der Flächeninhalt, beide Werte gerundet, ausgegeben werden.
	 	    printFixedln( AFlaeche); 											
		}																		 
	    
	else if (bKathete ==0.0)													//Wenn nur die Kathete b mit Null erfasst wurde, soll
		
		{
		    bKathete=Math.sqrt((cHypothenuse*cHypothenuse)-(aKathete*aKathete));//die Kathete b errechnet werden und  
		    AFlaeche=(aKathete*bKathete)/2;										//die Fläche.									 
		    													   				//Dann soll die fehlende Kathete b 
            printFixed( bKathete);	
			print( " ");											            //und der Flächeninhalt, beide Werte gerundet, ausgegeben werden.
		    printFixedln( AFlaeche); 											
		}

			
	   }																		
   }