public class Vektor{

	private double[] vektor;
	
	/*
	*Kontruktor, der einen Vektor der Laenge n (von Null bis n-1) anlegt
	*/ 
	public Vektor(int dim){
		vektor = new double[dim];
	}
	
	/*
	*kopiert den Array
	*/
	public Vektor(double[] x){
		this(x.length);
		for(int i=0;i<x.length;i++)
			vektor[i]=x[i];
	}

	/*
	*gibt die Laenge des Vektors zurueck
	*/
	public int getLength(){
		return vektor.length;
	}

	/*
	*gibt die Laenge des Vektors zurueck
	*/
	public int length(){
		return vektor.length;
	}

	/*
	*Dies schreibt das Element x
	*in die n-te Komponente(0 bis n)
	*wenn n unsinnig, dann bloeder Kommentar
	*/
	public void setElement(double x, int n){
 		if(n<0||n>=vektor.length){ 
			System.out.println("set: der Vektor hat "+(vektor.length)+" Komponenten und nicht "+n);
			return;
		}
		vektor[n]=x;
		return;
	}
	
	/*
	*Dies ueberprueft, ob die Vektoren in ihren Werten uebereinstimmen
	*/
	public boolean equals(Vektor v){
		for(int i=0;i<v.length();i++)
			if(v.vektor[i]!=vektor[i])
				return false;
		return true;
	}

	/*
	*Dies gibt das n-te Element zurueck
	*Meldet sich bei unsachgemaeser Bedienung, wirft aber keine Exception
	*gibt dann 0.0 zurueck
	*/
	public double getElement(int n){
 		if(n<0||n>=vektor.length){ 
			System.out.println("get: der Vektor hat "+(vektor.length)+" Komponenten und nicht "+n);
			return(0.0);
		}
		return vektor[n];
	}

	
	/*
	*Multipliziert ein Skalar x mit diesem Vektor 
	*/
	public Vektor mult(double x){
		for(int i=0; i<vektor.length;i++)
			vektor[i]*=x;
		return this;
	}


	/*
	*gibt das euklidische Skalarprodukt der Vektoren u und v yurueck
	*/
	public static double euklSkalarprodukt(Vektor u, Vektor v){
		double res=0;
		for(int i=0; i<v.getLength(); i++)
			res = res + u.getElement(i)*v.getElement(i);
		return res;
	}

	/*
	*gibt die euklidische Norm des Vektors x zurueck
	*/
	public static double euklNorm(Vektor x){
		return Math.sqrt(euklSkalarprodukt(x,x));
	}

	
	
	/*
	*gibt den euklidischen Abstand zweier Vektoren zurueck
	*/
	public static double distance(Vektor x, Vektor y){
		Vektor tmp = new Vektor(x.vektor.length);
		for(int i=0;i<tmp.vektor.length;i++)
			tmp.vektor[i]=x.vektor[i]-y.vektor[i];
		return euklNorm(tmp);
	}
		


	/*
	* gibt den Vektor als Zeilenvektor in einem String zurueck
	*/
	public String toString(){
		StringBuffer sb = new StringBuffer();
		sb.append("(");
		// alle Elemente in StringBuffer schreiben
		for(int i=0; i<vektor.length;i++){
			sb.append(vektor[i]);
			if(i<(vektor.length-1)) sb.append(",");
		}
		sb.append(" )");
		return sb.toString();
	}	

	public Vektor plus(Vektor b){
		if(vektor.length==b.length()){
			Vektor res = new Vektor(vektor.length);
			for(int i=0;i<vektor.length;i++)
				res.vektor[i]=vektor[i]+b.vektor[i];
			return res;
		}
		return null;
	}
	
}
