Registrierung Kalender Mitgliederliste Teammitglieder Suche Häufig gestellte Fragen Zur Startseite

Informatiker Board » Themengebiete » Praktische Informatik » Array TEst » Hallo Gast [Anmelden|Registrieren]
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen
Zum Ende der Seite springen Array TEst
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
neuling96
unregistriert
Array TEst Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Beim Spiel Sudoku muss ein Gitter nach bestimmten Regeln mit Ziffern gefüllt werden.
Der Parameter
int[] zeile der untenstehenden Methode
gueltigeZeile
ist ein Array der Länge 9, wobei
jedes Element eine Ziffer zwischen 1 und 9 (jeweils unterschiedlich) ist. Implementieren Sie diese Methode so, dass sie
true zurückgibt, genau dann wenn jede dieser Ziffe
rn genau einmal in zeile vor

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
class Sudoku {
public static boolean gueltigeZeile(int[] zeile) {
loop1:
 for (i=0,i<9,i++){
  boolean A= true;
 for(y=0,y<9,y++){
 If(!(i==y) {
 If( zeile[i]==zeile[y])
  boolean A= false;
    break loop1
       }
  }
}
11.12.2014 15:12
Karlito Karlito ist männlich
Kaiser


Dabei seit: 11.04.2011
Beiträge: 1.461

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Hallo neuling96,

  1. Du machst unnötig viele Vergleiche. Angenommen i ist 1 (das zweite Element), dann musst Du doch nicht noch mal prüfen, ob es sich von y=0 unterscheided... Wenn Du den Start der zweiten schleife geschickt wählst, brauchst du auch nicht prüfen, ob i!=y.
  2. A müsste den richtigen Wert haben. Es ist jedoch so, dass Du A auch noch zurückgeben musst...


Gruß,

Karlito
11.12.2014 16:42 Karlito ist offline E-Mail an Karlito senden Beiträge von Karlito suchen Nehmen Sie Karlito in Ihre Freundesliste auf
neuling96
unregistriert
RE: Array TEst Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

hallo,
ich verusche deine Vorschläge umzusetzen:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
class Sudoku {
public static boolean gueltigeZeile(int[] zeile) {
loop1:
 for (i=0,i<9,i++){
  boolean A= true;
 for(y=9;y>0,y--){
 If( zeile[i]==zeile[y])
  boolean A= false;
    break loop1
       }
  } 
 If boolean A= true{
  return gueltige Zeile;
  }else{
 return ungueltige Zeile;
   }
 }
11.12.2014 16:50
Karlito Karlito ist männlich
Kaiser


Dabei seit: 11.04.2011
Beiträge: 1.461

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Hallöchen,

mal ein paar Tipps:
Fange erstmal gaaaanz einfach an. Das mache ich auch so, wenn ich eine neue Programmierspache lerne. D.h. entwickle dein Programm Schritt für Schritt und schaue bei jedem Schritt, dass dein Programm macht was du willst. Sehr wichtig dabei: lerne wie ein Debugger funktioniert um dein Programm bei jedem Schritt zu beobachten. Wenn Du keinen Debugger benutzen kannst oder zusätzlich dazu kannst du Ausgaben Programmieren. Der erste Schritt wäre also erst einmal ein lauffähiges Programm. Beispiel dein Sudoku-Programm:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
public class Sudoku {
    public static void main(String[] args) {
        int[] beispiel1 = {1,1,2,3}; //falsche länge
        int[] beispiel2 = {1,1,2,3,5,6,8,1,2}; //doppelte...
        int[] beispiel3 = {1,2,3,4,5,6,7,8,9}; //gültig

        System.out.println(gueltigeZeile(beispiel1));
        System.out.println(gueltigeZeile(beispiel2));
        System.out.println(gueltigeZeile(beispiel3));
    }

    static boolean gueltigeZeile(int[] zeile)
    {
        boolean erg = false; //Ergebnisvariable
        return erg;
    }
}


Danach kannst Du das Programm weiter entwickeln und bei jedem Schritt testen, ob es das Richtige macht.
Bsp:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
public class Sudoku {
    public static void main(String[] args) {
        int[] beispiel1 = {1,1,2,3}; //falsche länge
        int[] beispiel2 = {1,1,2,3,5,6,8,1,2}; //doppelte...
        int[] beispiel3 = {1,2,3,4,5,6,7,8,9}; //gültig

        System.out.println(gueltigeZeile(beispiel1)); // führt zu fehler, weil zu kurz
        System.out.println(gueltigeZeile(beispiel2));
        System.out.println(gueltigeZeile(beispiel3));
    }

    static boolean gueltigeZeile(int[] zeile)
    {
        boolean erg = true; //Ergebnisvariable


        loop1: for(int i=0; i<9; i++)
        {
            for(int y=0; y<9; y++)
            {
                if(i==y)
                {
                    continue;
                }
                else
                {
                    if(zeile[i]==zeile[y])
                    {
                        erg = false;
                    }
                }
            }
        }
        return erg;
    }
}


Die Fehlerfreie Variante (hoffe ich zumindest Augenzwinkern )
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
public class Sudoku {
    public static void main(String[] args) {
        int[] beispiel1 = {1,1,2,3}; //falsche länge
        int[] beispiel2 = {1,1,2,3,5,6,8,1,2}; //doppelte...
        int[] beispiel3 = {1,2,3,4,5,6,7,8,9}; //gültig

        System.out.println(gueltigeZeile(beispiel1)); // führt zu fehler, weil zu kurz
        System.out.println(gueltigeZeile(beispiel2));
        System.out.println(gueltigeZeile(beispiel3));
    }

    static boolean gueltigeZeile(int[] zeile)
    {
        boolean erg = true; //Ergebnisvariable

        if(zeile.length != 9)
        {
            erg = false;
        }

        loop1: for(int i=0; erg==true&&i<9; i++)
        {
            for(int y=0; y<9; y++)
            {
                if(i==y)
                {
                    continue;
                }
                else
                {
                    if(zeile[i]==zeile[y])
                    {
                        erg = false;
                    }
                }
            }
        }
        return erg;
    }
}


Und dann die Optimierung (keine doppelten Vergleiche)
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
public class Sudoku {
    public static void main(String[] args) {
        int[] beispiel1 = {1,1,2,3}; //falsche länge
        int[] beispiel2 = {1,1,2,3,5,6,8,1,2}; //doppelte...
        int[] beispiel3 = {1,2,3,4,5,6,7,8,9}; //gültig

        System.out.println(gueltigeZeile(beispiel1)); // führt zu fehler, weil zu kurz
        System.out.println(gueltigeZeile(beispiel2));
        System.out.println(gueltigeZeile(beispiel3));
    }

    static boolean gueltigeZeile(int[] zeile)
    {
        boolean erg = true; //Ergebnisvariable

        if(zeile.length != 9)
        {
            erg = false;
        }

        loop1: for(int i=0; erg==true&&i<9; i++) //erg&&i<9 würde hier eigentlich reichen...
        {
            for(int y=i+1; y<9; y++)
            {
                if(i==y)
                {
                    continue;
                }
                else
                {
                    if(zeile[i]==zeile[y])
                    {
                        erg = false;
                        break loop1;
                    }
                }
            }
        }
        return erg;
    }
}


Übrigens: je mehr Testfälle, desto besser und am Besten Du machst dir vorher Gedanken, in welchen Fällen dein Algorithmus fehlschlagen könnte.

Gruß,

Karlito
11.12.2014 22:57 Karlito ist offline E-Mail an Karlito senden Beiträge von Karlito suchen Nehmen Sie Karlito in Ihre Freundesliste auf
neuling96
unregistriert
Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Vielen Dank für deinen tollen Beitrag smile
Beim diesem Code spukt der Compiler keinen Fehler aus
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
class Sudoku {
   
public static boolean gueltigeZeile(int[] zeile) {
  boolean A= true;

loop1: for (int i=0;i<9;i++)
 {
    for(int y=9;y>0;y--)
     {
       if( zeile[i]==zeile[y])
           {
               A= false;
                    break loop1;
       }
      } 
    }      if  (A == true)
             {
                  return A;
          }      else  {
                     return false;
        }
    } 

 } 



allerdings wenn ich den code erweitere


code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
class Sudoku {
   
public static boolean gueltigeZeile(int[] zeile) {
  boolean A= true;

loop1: for (int i=0;i<9;i++)
 {
    for(int y=9;y>0;y--)
     {
       if( zeile[i]==zeile[y])
           {
               A= false;
                    break loop1;
       }
      } 
    }      if  (A == true)
             {
                  return A;
          }      else  {
                     return false;
        }
    } 

 }
public static void main(String[] args) {
        int[] beispiel1 = {1,1,2,3}; //falsche länge
        int[] beispiel2 = {1,1,2,3,5,6,8,1,2}; //doppelte...
        int[] beispiel3 = {1,2,3,4,5,6,7,8,9}; //gültig

        System.out.println(gueltigeZeile(beispiel1)); // führt zu fehler, weil zu kurz
        System.out.println(gueltigeZeile(beispiel2));
        System.out.println(gueltigeZeile(beispiel3));
    } 



funktionert gar nichts!

Was mache ich falsch?
12.12.2014 00:54
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

  • Die main ist außerhalb der Klasse
  • Du hast den Schutz entfernt, dass bei einer Länge != 9 die Schleife nicht betreten wird
  • Arrays fangen in Java bei Index 0 an, mit y = 9 als Schleifenanfang hast du schon verloren
  • Du prüfst, ob zeile[3]==zeile[3] (für die 3 beliebige andere Zahl einsetzen). Karlito musste das nicht tun, weil er das schon durch die Schleifenzähler verhindert hat. In diesem Schritt wird immer ein false zurückgegeben

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
		if  (A == true)
		{
			return A;
		}
		else
		{
			return false;
		}

hier tut es auch ein return A;. Das ist kürzer und leichter verständlich.

Und noch eine andere Möglichkeit, an das Problem heranzugehen:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
public static boolean gueltigeZeile(int[] zeile)
{
	if (zeile.length != 9) return false;
	boolean[] found = new boolean[zeile.length];
	for (int i = 0; i < zeile.length; i++) {
		if (zeile[i] < 1 || zeile[i] > zeile.length || found[zeile[i] - 1]) {
			return false;
		}
		found[zeile[i] - 1] = true;
	}
	return true;
}

Es wird in einem zweiten Array gespeichert, ob eine Zahl schon vorkam.
Vorteil: jede Zahl des zu prüfenden Array muss nur einmal gelesen werden (bei deinem Code wächst die Zahl der Vergleiche quadratisch zur Länge)
Nachteil: es wird zusätzlicher Speicher benötigt, um sich zu merken, welche Zahlen schon gefunden wurden.

__________________
Syntax Highlighting fürs Board (Link)
12.12.2014 07:56 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
neuling96
unregistriert
Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

vielen dank, jetzt gehts
12.12.2014 18:00
Baumstruktur | Brettstruktur
Gehe zu:
Informatiker Board » Themengebiete » Praktische Informatik » Array TEst