//Autor:        Daniel Gratzl
//MatNr:        0026845
//BspNr:        4032
//Beschreibung: Gesamtkapazitaet eines Kondensatornetzwerkes
//
//


package Kapaz;

import eprog.*;

public class CapazNet extends EprogIO {
	
	/* Klassenvariablen */
	private int     value = 0;     // Gesamtkapazitaet des Netzwerks
	private int     count = 0;     // Anzahl der Kondensatoren
	private boolean err   = false; // bewirkt FALSCHE EINGABE 
	
	/* Konstruktor */
	public CapazNet(String s) { calc(s); }
	
	/* Zugriffsmethoden */
	public int getValue() { return value; }
	public boolean getError() { return err; }
	public int getCount() { return count; }

	/* Berechnung der Gesamtkapazitaet */
	private void calc(String s) {
		String t = null;
		int    i = 0;
		int    j = i+1;

		if (s.charAt(0) != '(') s = "("+s+")";

		for (;j<s.length();) {
			if (s.charAt(j) == '(') {
				i = j;
				j++;
			} else if (s.charAt(j) == ')') {
				try {
					t= s.substring(0,i)+getTerm(s.substring(i+1,j))+s.substring(j+1,s.length());
					s = t;
					if (s.charAt(0) != '(' || s.charAt(s.length()-1) != ')') {
						if ((s.indexOf('/') != -1) || (s.indexOf('+') != -1))  {
							s = "("+s+")";
						}
					}
				}catch(IndexOutOfBoundsException e) {
					err = true; 
					return;
				}catch(NumberFormatException e) {
					err = true;
					return;
				}

				i=0;
				j=i+1;
			} else j++;
		}
		try {
			value = Math.round(Float.valueOf(s).floatValue());	// Math. Runden des Float-Ergebnisses
		}catch(NumberFormatException e) {
			err = true;
			return;
		}
		count++;
	}

	private String getTerm(String s) throws NumberFormatException {
		int   idx = 0;
		int   i   = s.indexOf('+');
		int   j   = s.indexOf('/');
		float erg = 0;
		
		if (-1 != i) {
			for (;i!=-1;) {
				count++;
				erg += 1/Float.valueOf(s.substring(idx,i)).floatValue();
				idx = i+1;
				i   = s.indexOf('+',idx);
			}
			erg += 1/Float.valueOf(s.substring(idx,s.length())).floatValue();
			erg = 1/erg;
			return String.valueOf(erg);
		} else if (-1 != j) {
			for (;j!=-1;) {
				count++;
				erg += Float.valueOf(s.substring(idx,j)).floatValue();
				idx = j+1;
				j   = s.indexOf('/',idx);
			}
			erg += Float.valueOf(s.substring(idx,s.length())).floatValue();
			return String.valueOf(erg);
		}
	
		err = true;
		return "";
	}

}