Binäres Suchen

Derenei

Aktives Mitglied
Habe ein Problem mit meinem Programm. Ich war gestern krank als wir dieses Programm in der Schule gemacht haben. Jetzt habe ich das Binäre Suchen versucht zu Programmieren. Mein Programm funktioniert aber nur teilweise. Wenn ich eine Zahl suche die sich mehr in der Mitte des Arrays befindet funktioniert es auch wenn ich aber eine Zahl am Anfang oder am Ende des Arrays nehme kommt immer ein
OutofBoundsException. Könnte sich jemand mein Programm ansehen ich komme einfach nicht weiter.
Danke für eure Hilfe.
Hier der Quellcode:

Java:
public class Binäres_Suchen
{
    public static void main (String[]args)
    {
        Out.println ("Binärer Zahlen Sucher.");
        int []a = new int [12];
        int max = 30;
        for (int i = 0; i < a.length; i++)
        {
            max = (int) (Math.random ()*30+1);
            a[i] = max;
        }
        Out.println ();
        int s1 = 0;
        int s2 = 0;
        while(s1 < a.length)//In dieser Schleife werden die Zahlen im Array auf Gleichheit überprüft.
        {
            for (s2 = 0; s2 < a.length; s2++)
            {
                if (s1 != s2)
                {
                    if(a[s2] == a[s1])
                    {
                        max = (int) (Math.random ()*30+1);
                        a[s2] = max;
                    }
                }
                else
                {
                    //tu nichts
                }
            }
            s2 = 0;
            s1++;
        }
        s1 = 0;
        s2 = 1;
        int s3;
        int t1 = 0;
        int t2 = 0;
        while(s1 < a.length)//Hier werden sie nach der Größe geordnet.
        {
            for (s3 = s2; s3 < a.length; s3++)
            {
                if (a[s3] < a[s1])
                {
                    t1 = a[s1];
                    t2 = a[s3];
                    a[s1] = t2;
                    a[s3] = t1;
                }
            }
            s3 = 0;
            s2++;
            s1++;
        }
        for (int i = 0; i < a.length; i++)
        {
            Out.print (a[i]+" ");
        }
        find (a);
    }
    
    public static void find (int []a)
    {
        int zSearch = 0;
        do
        {
            Out.print ("Nach welcher Zahl möchten Sie in der Zahlenreihe suchen?: ");
            zSearch = In.readInt ();
            if (zSearch < 1 || zSearch > 30)
            {
                zSearch = 0;
                Out.println ("!!!Geben Sie nur Zahlen zwische 1 und 30 ein!!!");
            }
        }while(zSearch < 1 || zSearch > 30);
        
        int high = a.length-1;
        int m = 0;
        int low = 0;
        int u = 0;
        while (low <= high)
        {
            m = (low+high) /2;
            if (a[m] == zSearch)
            {
                Out.print ("Ihre Zahl wurde gefunden.");
                u = 1;
                break;
            }
            if (zSearch < a[m])
            {
              high = high+(m-1);
            }
            if (zSearch > a[m])
            {
              low = low+(m+1);
            }
        }
        if (u == 0)
        {
            Out.print ("Ihre Zahl wurde nicht gefunden.");
        }
    }
}
 
Ich habe es jetzt noch nicht getestet, du musst aber jedenfalls in der inneren for-Schleife [c]a.length[/c] durch [c]a[s1].length[/c] ersetzen, sonst greifst du ja nur auf die länge des äußeren Array zu.

Weiterhin steht bei jeder Exception dabei, von wo sie geworfen wird (Dateiname + Zeilennummer); das hilft bei der Fehlersuche.
 
Sorry, ich merke gerade, dass meine erste Antwort Blödsinn war. Ich war gedanklich bei einem anderen Problem. Ich schau’s mir nochmal richtig an!
 
Okay:

Die Exception wird in Zeile 85 geworfen. [c]m[/c] wird zu groß; größer als die Arraygröße.

Hilft dir diese Information weiter?
 
Ein kleiner Tipp: Deine Methoden machen zu viel auf einmal. Jede Methode sollte eine eindeutige, möglichst gut testbare Aufgabe haben. Den Nutzer etwas fragen ist eine Aufgabe, eine binäre Suche ist eine Aufgabe u.s.w. Damit wird es viel einfacher, Fehler zu finden.
 
Danke für eure Hilfe. Habe mich im Internet noch einmal genau informiert. Ich habe in meiner Schleife ein paar Fehler gemacht. Um die Mitte m zu berechnen habe ich geschriben (low+high)/2 habe es dann auf low+(high-low)/2 ändern müssen und bei den Bedingungen in der Schleife habe ich ändern müssen:

if (zSearch < a[m])
{
high = high+(m-1);
}

und habe es dann auf geändert.:

if (zSearch < a[m])
{
high = m-1;
}

if (zSearch > a[m])
{
low = m+1;
}
Danke noch einmal. Werde mich in Zukunft erst im Internet informieren bevor ich etwas in das Java Forum poste.😉
 
hallo zusammen,ich verzweifle an diesem code bei groovy/Java:warum funktioniert er nicht?er soll x=3 aus der liste finden

Integer[] b=[1,3,5,7,11]
int n=b.size()
int l=0
int r=n-1

int x=3
while(r>=l){
m=Math.floor((l+r)/2)
if(b[m]==x){
return m
}
if(x<b[m]){
r=m-1
}
else{
l=m+1
}
return -1
}
 
hallo zusammen,ich verzweifle an diesem code bei groovy/Java:warum funktioniert er nicht?er soll x=3 aus der liste finden

Fangen wir doch mal damit an, dass das, was du hier postest, überhaupt kein gültiger Java-Code ist.


Und: Für eigene neue Fragen erstelle bitte ein neues Thema. Außerdem solltest du deinen Code in Java-Tags setzen, damit man ihn besser lesen kann.
 

Zurück
Oben