

// hält ein einzelnes Angebot
class Angebot {

    public Angebot( double preis, int verfuegbarkeit ) {
        fpreis          = preis;
        fverfuegbarkeit = verfuegbarkeit;
    }

    // liefert Preis zurück
    public double preis() {
        return fpreis;
    }
    // liefert Verfuegbarkeit zurück
    public int verfuegbarkeit() {
        return fverfuegbarkeit;
    }
    public int DecVerfuegbarkeit() {
        if (fverfuegbarkeit > 0)
            fverfuegbarkeit--;
        return fverfuegbarkeit;
    }

    // hält den Preis
    private double fpreis;
    // hält Verfügbarkeit
    private int fverfuegbarkeit;
}


// hält eine Liste von Angeboten, sozusagen einen "Ordner"
class Angebote {

		// Konstruktor mit Anzahl der moeglichen Elemente
		public Angebote(int Anzahl) {
            fAngebote = new Angebot[ Anzahl ];
            for (int i=0; i<Anzahl; i++) {
                fAngebote[ i ] = new Angebot( 0, 0 );
            }
		}

        // Liefert das billigste verfuegbare Angebot
        public double bestesAngebot() {
            double BestSoFar = -1;

            int i = 0;

            while ((i < fCount) && (BestSoFar == -1)) {
                if (fAngebote[ i ].verfuegbarkeit() > 0) {
                    BestSoFar = fAngebote[ i ].preis();
                    fAngebote[ i ].DecVerfuegbarkeit();
                }
                i++;
            }

            return BestSoFar;
		}

		// Fuegt ein neues Angebot ein, das in Anzahl Stueck verfuegbar ist
		public void einfuegen(double Preis, int Anzahl)
		{

		    // kann noch eingefügt werden?
		    if (fCount < fAngebote.length) {

		        // wo muß eingefügt werden?
		        int i = fListPosition( Preis );

		        // die Listenelemente nach hinten verschieben
		        if (fCount > 0) {
  		            for (int j=fCount; j>i; j--) {
		                fAngebote[ j ] = fAngebote [ j-1 ];
		            }
		        }

		        // einfügen
		        fAngebote[ i ] = new Angebot( Preis, Anzahl );
		        fCount++;

		    }
		      else
		    {
		        // hier Fehlerbehandlung hin...
		    }


		}

		// liefert die Anzahl der belegten Einträge im Ordner
		public int Count() {
		    return fCount;
		}

		/* private symbole */

		// hält die Amzahl der Angebote, die im Ordner belegt sind
		private int fCount;

        // hält die Angebote
		private Angebot[] fAngebote;

		// sucht die Position eines beliebigen Preises in der Liste
		private int fListPosition( double preis ) {
		    if (fCount > 0) {
  		        return fListPosition( preis, 0, fCount-1 );
  		    }
  		      else
  		    {
  		        return 0;
  		    }
		}
		private int fListPosition( double preis, int iMin, int iMax ) {
            if (iMin+1 < iMax) {
                int position;

                int middle = (iMin + iMax) / 2;

                position = -1;

                if (preis < fAngebote[ middle ].preis()) {
                    position = fListPosition( preis, iMin, middle-1 );
                }
                  else
                {
                    if (preis > fAngebote[ middle ].preis()) {
                        position = fListPosition( preis, middle+1, iMax );
                    }
                }

                return position;

            }
              else
            {
                if (preis <= fAngebote[ iMin ].preis()) {
                    return iMin;
                }
                  else
                {
                    return iMin+1;
                }
            }
		}


}

/*
 * Die Rahmen Klasse instanziiert Angebots-Ordner wie sie beschrieben
 * wurden und fuegt einige Testdaten ein.
 */

class Rahmen {
	static public void main(String argv[]) {
		Angebote Ordner1 = new Angebote(11);
		Angebote Ordner2 = new Angebote(8);

		// Infos schreiben
		System.out.println("\nBinaeres Suchen, Fabian Wleklinski, 08.12.1998");
  		java.util.Date date = new java.util.Date();
		System.out.println("\n"+date.toString());
		System.out.println();

		Ordner1.einfuegen(12.5, 2);
		Ordner1.einfuegen(11.3, 2);
		Ordner1.einfuegen(11.8, 1);
		Ordner1.einfuegen(10.4, 1);
		Ordner1.einfuegen(13.8, 7);

		System.out.println("Jetzt sollte hier 10.4 stehen!: " + Ordner1.bestesAngebot());
		System.out.println("Jetzt sollte hier 11.3 stehen!: " + Ordner1.bestesAngebot());
		System.out.println("Jetzt sollte hier 11.3 stehen!: " + Ordner1.bestesAngebot());
		System.out.println("Jetzt sollte hier 11.8 stehen!: " + Ordner1.bestesAngebot());
		}
 }

