Wie behalten Variablen den Wert, den sie in einer anderen Methode erhalten haben?

JavaMeetsBlueJ

Bekanntes Mitglied
Hallo, ich habe folgendes Problem.
Ich habe in meinem Programm 3 Metoden mit jeweils geschachtelten for-Schleifen und eine Methode, die die Werte der Variablen kontrolliert, die in den Methoden verändert wurden. Das Problem ist, dass die Werte aber immer den Wert aus der Initialisierung haben, wenn ich sie in der letzten Methode aufrufe.

So haben die variablen isZeile, isSpalte und isKaestchen immer den Wert true, obwohl sie in anderen Methoden den Wert false erhalten haben... . Die letzte Methode liefert immer "Das Sudoku wurde erfolgreich gelöst". Wie kann man es schaffen, dass die Variablen ihren Wert auch in dieser MEthode behalten?
Hier der komplette Code:

Java:
/**
 * Lösungsmechanismen, um ein Sudoku zu prüfen.
 * 

 * @version 1.0; 04.03.2012
 */

public class Kontrollstrukturen
{
    public static void main (String[] args)
    {
        int koordinate[][] = {
                {1,2,3,4,5,6,7,8,9},
                {1,2,3,4,5,6,7,8,9},
                {1,2,3,4,5,6,7,8,9},
                {1,2,3,4,5,6,7,8,9},
                {1,2,3,4,5,6,7,8,9},
                {1,2,3,4,5,6,7,8,9},
                {1,2,3,4,5,6,7,8,9},
                {1,2,3,4,5,6,7,8,9}, 
                {1,2,3,4,5,6,7,8,9} };

        int kaestchen[][] = new int[9][9];
        int spalte = 0;
        int zeile = 0;
        int element = 0;
        int count = 0;
        int count2 = 0;
        int i = 0;
        int spaltenanfang = 0;
        int spaltenende = 2;
        int zeilenanfang = 0;
        int zeilenende = 2;
        boolean isZeile = true ; // 1 gilt als Definition von wahr
        boolean isSpalte = true ;
        boolean isKaestchen = true ;

      
         //leseEingaben(zeile,spalte, element,koordinate);
         //pruefe_doppeltesVorkommen_in_Zeile(zeile,spalte, element,koordinate,isZeile);
         pruefe_doppeltesVorkommen_in_Spalte( zeile, spalte, element, koordinate, isSpalte);
       // pruefe_doppeltesVorkommen_in_dreimaldrei_Kaestchen(zeile, spalte, koordinate, kaestchen, count, count2, i, spaltenende,spaltenanfang,zeilenende, zeilenanfang, element, isKaestchen);
        pruefe_Ergebnisse(isZeile, isSpalte,isKaestchen);
    }

    public static void leseEingaben(int zeile, int spalte, int element, int koordinate[][])

    {
        for(zeile = 0; zeile <= 8; zeile++)
        {
            for (spalte = 0; spalte <= 8; spalte++)
            {
                System.out.print(koordinate[zeile][spalte] + " ");
            }
            System.out.println("");
            spalte = 0;
        }
    }
    // hier könnte noch eine Bedingeung rein, damit nur Zahlen von 1 bis 9 eine richtige Eingabe sind

    public static void pruefe_doppeltesVorkommen_in_Zeile(int zeile, int spalte, int element, int koordinate[][], boolean isZeile)
    {
        zeile = 0;
        element = 0;

        for(zeile = 0; zeile <= 8; zeile++)
        {
            for (element = 0; element <= 8; element++)
            {
                for(spalte = 0; spalte <= 8; spalte++)
                {
                    if(koordinate[zeile][element] == koordinate[zeile][spalte] && spalte != element)
                    {

                        isZeile = false;
                        break;
                    }

                    if(koordinate[zeile][element] != koordinate[zeile][spalte])
                    {
                        System.out.println("Zahl in Zeile " + (zeile + 1) + " und Spalte " + (spalte + 1) + " ist ungleich der Zahl in Spalte " + (element + 1));
                    }
                }
            }
        }
    }

    public static void pruefe_doppeltesVorkommen_in_Spalte(int zeile, int spalte, int element, int koordinate[][], boolean isSpalte)
    {
        zeile = 0;
        spalte = 0;
        element = 0;

        for(spalte = 0; spalte <= 8; spalte++)
        {
            for(element = 0; element <= 8; element++) 
            {
                for(zeile = 0; zeile <= 8; zeile++)
                {
                    if(koordinate[zeile][spalte] == koordinate[element][spalte] &&  zeile != element   )
                    {
                        isSpalte = false;
                        //System.out.println(isSpalte);
                       // break;
                       //System.out.println(koordinate[zeile][spalte] + " ist gleich " + koordinate[element][spalte]);
                       break;
                       

                    }

                    if(koordinate[zeile][spalte] != koordinate[element][spalte])
                    {
                        System.out.println("Die Zahl in Spalte " + (spalte+1) + "und Zeile" + (zeile+1) + "ist UNGLEICH der Zahl in Zeile" + (element+1)); 
                    }
                }
            }
        }
    }

    public static void pruefe_doppeltesVorkommen_in_dreimaldrei_Kaestchen(int zeile, int spalte, int koordinate[][], int kaestchen[][], int count, int count2, int i, int spaltenanfang,int spaltenende, int zeilenanfang, int zeilenende, int element,boolean isKaestchen)
    {
        zeile = 0;
        spalte = 0;

        count = 0;
        count2 = 0;
        i = 0;
        spaltenanfang = 0;
        spaltenende = 2;
        zeilenanfang = 0;
        zeilenende = 2;

        // Hier muss so schnell wie möglich ein vernünftiger Algorithmus hinne!!!
        for(count = 0; count <= 8; count++)

        {
            for(zeile = 0; zeile <= 2; zeile++)
            { 

                for(spalte = spaltenanfang; spalte <= spaltenende; spalte++) 
                {

                    kaestchen[count2][i] = koordinate[zeile][spalte];

                    System.out.print(kaestchen[count][i]);
                    i++;

                }

            } 
            count2++;
            i = 0;
            if(spaltenende <= 8)
            {spaltenanfang += 3;
                spaltenende += 3;
                if(spaltenende > 8)
                {
                    zeilenanfang += 3;
                    spaltenanfang = 0;
                    spaltenende = 2;
                }
            }

        }

        for(count = 0; count <= 8; count++)
        {
            for(element = 0; element <= 8; element++) 
            {
                for(count2 = 0; count2 <= 8; count2++)
                {
                    if(kaestchen[count][element] == kaestchen[count][count2] && element != count2)
                    {

                        isKaestchen = false;
                        break;

                    }

                    
                }
             
            }  
        }
    }

    public static void pruefe_Ergebnisse(boolean isZeile, boolean isSpalte, boolean isKaestchen)
    {
        if(isZeile == false || isSpalte == false|| isKaestchen == false)
        {
            System.out.println("Das Sudoku enthält einen Fehler");
        }
        //System.out.println(isSpalte);
        else
        {
           System.out.println("Das Sudoku wurde erfolgreich gelöst");
        }
    }

    
}

lg
 
Das funktioniert so nicht 🙂
In Java gibt es ausschließlich call by value (Zum nachlesen: http://www.java-forum.org/allgemeines/4904-call-value-call-reference.html), das heißt beim Methodenaufruf wird der Wert der Variablen kopiert. Alle Änderungen die du dann innerhalb der Methode an einer Variablen machst sind für den Aufrufer nicht sichtbar.

Du musst da mit Rückgabewerten arbeiten:
Java:
isSpalte = pruefe_doppeltesVorkommen_in_Spalte( zeile, spalte, element, koordinate);
Die Methode gibt dann true oder false zurück.
 
Ich lerne Java seit ca. einer Woche wieder neu und wäre extrem überfordert, den Großteil des Codes zu löschen und durch was anderes zu ersetzen... .

Wenn ich das mache, brauche ich dann nicht ne getter-Methode oder reicht das so wie du es gepostet hast?

lg
 
Also könnte ich einfach bei der letzten Methode vor den if Block
Java:
isSpalte = pruefe_doppeltesVorkommen_in_Spalte( zeile, spalte, element, koordinate);
(dasselbe mit isSpalte und isKaestchen) machen und dann funktionierts?

lg
 
Nein, so einfach ist das natürlich nicht. Die Methoden dann natürlich noch irgendwo mal
Code:
return true;
bzw.
Code:
return false;
stehen haben.
 
Ja, das sollte man vielleicht mal in boolean ändern.
Schau dir vielleicht nochmal nen gutes Java Buch an, da fehlt wohl noch etwas das Verständnis.
 
Ja soo doof bin ich auch nicht 😀

also ich mein das so: wenn ich void in boolean änder, darf doch in den Klammern hinter dem Methodenbezeichner nichts stehen... .

lg

meinst du damit die parameter ? warum sollte man bei einer booleaschen methode keine Parameter haben ?

Java:
public boolean foo(int a, int b) {
  return true;
 
also ich mein das so: wenn ich void in boolean änder, darf doch in den Klammern hinter dem Methodenbezeichner nichts stehen... .
Das wäre mir neu :applaus:

Schau dir wirklich nochmal die Grundlagen an, da fehlt noch nen bissl Verständnis. Hast du nen gutes Buch oder womit lernst du?
 
Ok dann hab ich das falsch verstanden. Ich lerne mit "Einführung in Java mit BlueJ". Also kann ich einen retur-Wert haben und gleichzeitig Parameter an die Methode übergeben?

Wenn das so ist, sollte das ja eigentlich nicht allzu schwer zu korrigieren sein.

Danke für die aufklärung 😉

lg


EDIT:

Also, die Pararameter übergibt man der Methode ja, damit sie damit was anfangen kann, wenn die Variablen in ienem anderen Block initialisiert wurden. Jetzt habe ich deinen Vorschlag mal beherzigt und dabei kommt folgender Code raus. Er gibt mir aber eine Fehlermeldung aus, dass Variable zeile nicht gefunden werden konnte. (Zeile 182)

Java:
public class Test
{
    public static void main (String[] args)
    {
        int koordinate[][] = {
                {1,2,3,4,5,6,7,8,9},
                {1,2,3,4,5,6,7,8,9},
                {1,2,3,4,5,6,7,8,9},
                {1,2,3,4,5,6,7,8,9},
                {1,2,3,4,5,6,7,8,9},
                {1,2,3,4,5,6,7,8,9},
                {1,2,3,4,5,6,7,8,9},
                {1,2,3,4,5,6,7,8,9}, 
                {1,2,3,4,5,6,7,8,9} };

        int kaestchen[][] = new int[9][9];
        int spalte = 0;
        int zeile = 0;
        int element = 0;
        int count = 0;
        int count2 = 0;
        int i = 0;
        int spaltenanfang = 0;
        int spaltenende = 2;
        int zeilenanfang = 0;
        int zeilenende = 2;
        boolean isZeile = true ; // 1 gilt als Definition von wahr
        boolean isSpalte = true ;
        boolean isKaestchen = true ;

      
         //leseEingaben(zeile,spalte, element,koordinate);
         //pruefe_doppeltesVorkommen_in_Zeile(zeile,spalte, element,koordinate,isZeile);
        // pruefe_doppeltesVorkommen_in_Spalte( zeile, spalte, element, koordinate, isSpalte);
        pruefe_doppeltesVorkommen_in_dreimaldrei_Kaestchen(zeile, spalte, koordinate, kaestchen, count, count2, i, 
spaltenende,spaltenanfang,zeilenende, zeilenanfang, element, isKaestchen);
        pruefe_Ergebnisse(isZeile, isSpalte,isKaestchen);
    }

    public static void leseEingaben(int zeile, int spalte, int element, int koordinate[][])

    {
        for(zeile = 0; zeile <= 8; zeile++)
        {
            for (spalte = 0; spalte <= 8; spalte++)
            {
                System.out.print(koordinate[zeile][spalte] + " ");
            }
            System.out.println("");
            spalte = 0;
        }
    }
    // hier könnte noch eine Bedingeung rein, damit nur Zahlen von 1 bis 9 eine richtige Eingabe sind

    public static boolean pruefe_doppeltesVorkommen_in_Zeile(int zeile, int spalte, int element, int koordinate[][], boolean 
isZeile)
    {
        zeile = 0;
        element = 0;

        for(zeile = 0; zeile <= 8; zeile++)
        {
            for (element = 0; element <= 8; element++)
            {
                for(spalte = 0; spalte <= 8; spalte++)
                {
                    if(koordinate[zeile][element] == koordinate[zeile][spalte] && spalte != element)
                    {

                         return isZeile = false;
                        break;
                    }

                    if(koordinate[zeile][element] != koordinate[zeile][spalte])
                    {
                        System.out.println("Zahl in Zeile " + (zeile + 1) + " und Spalte " + (spalte + 1) + " ist ungleich der Zahl in Spalte " + (element + 1));
                    }
                }
            }
        }
    }

    public static boolean pruefe_doppeltesVorkommen_in_Spalte(int zeile, int spalte, int element, int koordinate[][], boolean 
isSpalte)
    {
        zeile = 0;
        spalte = 0;
        element = 0;

        for(spalte = 0; spalte <= 8; spalte++)
        {
            for(element = 0; element <= 8; element++) 
            {
                for(zeile = 0; zeile <= 8; zeile++)
                {
                    if(koordinate[zeile][spalte] == koordinate[element][spalte] &&  zeile != element   )
                    {
                       return isSpalte = false;
                        break;

                    }

                    if(koordinate[zeile][spalte] != koordinate[element][spalte])
                    {
                        System.out.println("Die Zahl in Spalte " + (spalte+1) + "und Zeile" + (zeile+1) + "ist UNGLEICH der Zahl in Zeile" + (element+1)); 
                    }
                }
            }
        }
    }

    public static boolean pruefe_doppeltesVorkommen_in_dreimaldrei_Kaestchen(int zeile, int spalte, int koordinate[][], int kaestchen[][], int count, int count2, int i, int spaltenanfang,int spaltenende, int zeilenanfang, int zeilenende, int element,boolean isKaestchen)
    {
        zeile = 0;
        spalte = 0;

        count = 0;
        count2 = 0;
        i = 0;
        spaltenanfang = 0;
        spaltenende = 2;
        zeilenanfang = 0;
        zeilenende = 2;

        // Hier muss so schnell wie möglich ein vernünftiger Algorithmus hinne!!!
        for(count = 0; count <= 8; count++)

        {
            for(zeile = 0; zeile <= 2; zeile++)
            { 

                for(spalte = spaltenanfang; spalte <= spaltenende; spalte++) 
                {

                    kaestchen[count2][i] = koordinate[zeile][spalte];

                   // System.out.print(kaestchen[count][i]);
                    i++;

                }

            } 
            count2++;
            i = 0;
            if(spaltenende <= 8)
            {spaltenanfang += 3;
                spaltenende += 3;
                if(spaltenende > 8)
                {
                    zeilenanfang += 3;
                    spaltenanfang = 0;
                    spaltenende = 2;
                }
            }

        }

        for(count = 0; count <= 8; count++)
        {
            for(element = 0; element <= 8; element++) 
            {
                for(count2 = 0; count2 <= 8; count2++)
                {
                    if(kaestchen[count][element] == kaestchen[count][count2] && element != count2)
                    {

                      return isKaestchen = false;
                        break;

                    }

                    
                }
             
            }  
        }
    }

    public static void pruefe_Ergebnisse(boolean isZeile, boolean isSpalte, boolean isKaestchen)
    {
        isZeile =  pruefe_doppeltesVorkommen_in_Zeile([COLOR="Red"]zeile[/COLOR], spalte, element, koordinate, isZeile);
        isSpalte = pruefe_doppeltesVorkommen_in_Spalte(zeile, spalte, element, koordinate, isSpalte);
        isKaestchen = pruefe_doppeltesVorkommen_in_dreimaldrei_Kaestchen( zeile,spalte, koordinate, kaestchen, count, count2, i,  spaltenanfang, spaltenende, zeilenanfang, zeilenende, element, isKaestchen);
        
        
        
        if(isZeile == false || isSpalte == false|| isKaestchen == false)
        {
            System.out.println("Das Sudoku enthält einen Fehler");
        }
        else
        {
            System.out.println("Das Sudoku wurde erfolgreich gelöst");
        }
    }

    
}
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben