Aufgabe: Koordinaten im Koordinatensystem ausgeben

Lestas89

Bekanntes Mitglied
Hallo :) Bin gerade an folgender Aufgabe dran (Siehe Bild)

Ich soll die einzelnen Koordinaten des aufgespannten Rechtecks wiedergeben.
Ich hab es wie folgt versucht:

Java:
import javax.swing.JOptionPane;

class Koordinatensystem{
    public static void main(String [] args){
       
        String ausgabe = "";
        String ersteEingabe = JOptionPane.showInputDialog("Geben Sie eine Zahl n im Koordinatensystem ein:");
        String zweiteEingabe = JOptionPane.showInputDialog("Geben Sie eine zweite Zahl m im Koordinatensystem ein:");
       
        int n = Integer.parseInt(ersteEingabe);
        int m = Integer.parseInt(zweiteEingabe);
       
        for(int i = 0; i <= n; i++){
            for(int j = 0; j <= m; j++){
                ausgabe += " \t " + " ("+i+","+j+") \t";
            }
        }
        JOptionPane.showMessageDialog(null, ausgabe);
   
    }
}

Ich bekomme zwar die richtigen Werte raus, allerdings nicht in der Reihenfolge wie in der Aufgabenstellung im Beispiel angegeben ist. Was mach ich falsch?
 

Anhänge

  • Koordinatensystem.jpg
    Koordinatensystem.jpg
    79 KB · Aufrufe: 49

Joose

Top Contributor
Falsch machst du gar nicht. Die Reihenfolge deiner Ausgabe ist nicht unbedingt wichtig (meiner Meinung nach), solange du die richtigen 6 Punkte bekommst ;)

Das Problem warum deine Ausgabe anders auschaut: Dei Reihenfolge deiner Schleifen.
 

Lestas89

Bekanntes Mitglied
Hallo Joose,

danke für deine schnelle Antwort. Wie müsste ich die Schleife verändern um auf das gleiche Ergebnis wie im Beispiel zu kommen?
 

Joose

Top Contributor
Wie müsste ich die Schleife verändern um auf das gleiche Ergebnis wie im Beispiel zu kommen?
Hab ich doch schon geschrieben.
Dei Reihenfolge deiner Schleifen.

Würden die beiden Schleifen hintereinander laufen, müsstest du einfach nur die eine nach der anderen schreiben.
Sind die beiden Schleifen verschachtelt, dann muss die innere stattdessen eben die äußere sein ;)

Schon ist die Reihenfolge der Schleifen geändert.
 

Joose

Top Contributor
Dann muss ich doch eigentlich nur m und n miteinander vertauschen oder?

Nein eben nicht. Die Schleifen beinhalten ja auch Zählervariablen (i bzw. j) diese bleiben ja sonst unverändert.
Also entweder die kompletten Schleifenköpfe vertauschen oder wie du es probiert hast nur m und n vertauschen, dann musst du in der Ausgabe aber auch i und j vertauschen
 

Lestas89

Bekanntes Mitglied
Mit der while Schleife hab ich es so probiert. Aber es kommt einfach keine Ausgabe:

Java:
int j = 0;
        int i = 0;
      
        while(j <= m){
        j = 0;
        j++;
      
        while(i <= n){
        i = 0;
        i++;
      
        ausgabe += " \t " + " ("+i+","+j+") \t";
      
        }
      
        }
        JOptionPane.showMessageDialog(null, ausgabe);

Wo liegt mein Fehler?
 

Lestas89

Bekanntes Mitglied
Kann mir jemand nochmal helfen:

Diese Schleife hier gibt nicht das gleiche aus wie die for-Schleife die ich oben programmiert habe mithilfe von Joose.

Wo liegt mein Fehler?
Java:
int j = 0;
        int i = 0;
       
        while(j <= m){
       
        j++;
       
        while(i <= n){
       
        i++;
       
        ausgabe += " \t " + " ("+i+","+j+") \t";
       
        }
       
        }
        JOptionPane.showMessageDialog(null, ausgabe);
    }
 

Lestas89

Bekanntes Mitglied
Hallo VfL_Freak. Den Fehler mit der Endlosschleife habe ich bereits behoben. Es funktioniert trotzdem nicht so wie es sollte. Ich bekomme nur 2 Klammern ausgegeben:

Java:
int j = 0;
int i = 0;

while(j <= m) {
   j++;
   while(i <= n){
     i++;
     ausgabe += " \t " + " ("+i+","+j+") \t";
   }
}
JOptionPane.showMessageDialog(null, ausgabe);
}
 
Zuletzt bearbeitet von einem Moderator:

Lestas89

Bekanntes Mitglied
Kannst du mir trotzdem weiterhelfen? Ich möchte das gleiche Ergebnis wie in der for-Schleife bekommen. Es funktioniert aber leider nicht.
 

VfL_Freak

Top Contributor
Hast Du dir denn mal überlegt, WIE und WANN sich i und j in beiden Varianten ändern?

Im ersten Fall bekommst Du sechs Ergebnisse, im anderen nur zwei!
Woran mag das liegen?

Gruß Klaus
 

Joose

Top Contributor
Kannst du mir trotzdem weiterhelfen? ... Es funktioniert aber leider nicht.
Funktioniert nicht ist keine Fehlerbeschreibung. Du solltest genauer beschreiben: Welche Ausgabe erwartest du dir? Welche bekommst du stattdessen? Fliegt eine Exception, wenn ja Fehlermeldung + StackTrace posten.

Mache einen Schreibtischtest für diese beiden Schleifen, dann sollte dir klarer was passiert bzw. und wo ein Fehler ist.
 

Lestas89

Bekanntes Mitglied
Habe ich die Inkrementierung an die falsche Stelle gepackt? Wenn ich die nach ausgabe mache würde ich mehr Ergebnisse bekommen aber immer noch nicht 6. Ich komm nicht darauf.
 

Lestas89

Bekanntes Mitglied
Ich habe die Inkrementierung nun nach der ausgabe gepackt aber es funktioniert trotzdem noch nicht wie die for Schleife:

Java:
int j = 0;
int i = 0;

while(j <= m) {
   while( i <= n) {
     ausgabe += " \t " + " ("+i+","+j+") \t";
     i++;
   }
   j++;
}
JOptionPane.showMessageDialog(null, ausgabe);
 

VfL_Freak

Top Contributor
Führe mal folgenden Code aus und schau Dir das Ergebnis an, vielleicht wird es denn klarer:
Java:
        String ausgabe = "";
        int n = 1;
        int m = 2;
       
        for( int i = 0; i <= n; i++ )
        {
                for( int j = 0; j <= m; j++ )
                {
                    ausgabe += "(" + i + "," + j + ")\t";
                }
            }
        System.out.println( ausgabe );
        // ============================
            int j = 0;
            int i = 0;
            while( j <= m )
            {
          
                while( i <= n )
                {
                i++;
                System.out.println( " (" + i + ", " + j + ")" );
                }
               
                j++;
               
            }
            System.out.println( "DANACH: (" + i + ", " + j + ")" );
 

Lestas89

Bekanntes Mitglied
Hallo Meniskusschaden,

ich versuch das nachzuverfolgen aber ich komme wirklich immer noch nicht darauf. Wie müsste ich den Code denn verändern?
 

Meniskusschaden

Top Contributor
Ich würde den Schreibtischtest machen. Alle Variablennamen untereinander auf ein Blatt Papier schreiben und dann das Programm Zeile für Zeile durchgehen und für die Variable den entsprechenden Wert notieren. Wenn eine Variable sich mehrmals ändert, den alten Wert durchstreichen und den neuen daneben schreiben. Dann siehst du was passiert.
 

Lestas89

Bekanntes Mitglied
Das hab ich gerade gemacht und kann meinen Fehler immer noch nicht nachvollziehen.
Ich geh das hier einmal durch:

bei Eingabe n = 1 und m = 2 steht dort folgendes:

while( 0 <=2){
while( 0 <=1){

ausgabe += (i,j)
i++
}
j++
}

Die äußere Schleife müsste eigentlich 3 Durchgänge machen und die innere Schleife bis 1 hoch inkrementieren und das passiert ja nicht. Da liegt mein Verständnisproblem.
 

Meniskusschaden

Top Contributor
Code:
n=1
m=2
i=0
j=0

i=0, j=0   while_j 0<=2?
i=0, j=0   while_i 0<=1?
i=0, j=0   ausgabe (0, 0)
i=0, j=0   i++  
i=1, j=0   while_i 1<=1?
i=1, j=0   ausgabe (1, 0)
i=1, j=0   i++
i=2, j=0   while_i 2<=1?
i=2, j=0   j++
i=2, j=1   while_j 1<=2?
i=2, j=1   while_i 2<=1?        
i=2, j=1   j++
i=2, j=2   while_j 2<=2?
i=2, j=2   while_i 2<=1?
i=2, j=2   j++
i=2, j=3   while_j 3<=2
Das geht wirklich viel besser auf dem Papier.
 

Lestas89

Bekanntes Mitglied
Hallo Meniskusschaden,

ich danke für deine Antwort und Hilfe aber mittlerweile versteh ich garnichts mehr und bin nur noch durcheinander.

Ich glaube ich habe folgendes Problem:

Ich dachte, dass verschachtelte while Schleifen sich wie verschachtelte for Schleifen verhalten, doch das ist - wie mir gerade auffällt - mitnichten der Fall.

Wie sieht die Äquivalenz zwischen verschachtelten for und while Schleifen aus?
Ich denke das würde mir bei meinem Problem sehr behilflich sein.
 

VfL_Freak

Top Contributor
um mal gaaanz langsam anzufangen:
Java:
for( int i = 3; i < 10; i++ )
{
  // irgendwas
}
// ----------------------------
int j = 3;
while( j < 10 )
{
   j++;
   // irgendwas
}

gruß Klaus
 

Meniskusschaden

Top Contributor
Die äußere Schleife müsste eigentlich 3 Durchgänge machen und die innere Schleife bis 1 hoch inkrementieren und das passiert ja nicht. Da liegt mein Verständnisproblem.
Ich kann nur wiederholen: mach den Schreibtischtest. Und zwar für alle Iterationen. "Müßte eigentlich" bringt nichts, for-while-Äquivalenz auch nicht. Du mußt dir den tatsächlichen Durchlauf ansehen. Sonst bleibt es nur Theorie.
 

Joose

Top Contributor
ich danke für deine Antwort und Hilfe aber mittlerweile versteh ich garnichts mehr und bin nur noch durcheinander.

Es wurde doch schön aufgeschrieben. Wo würde denn deiner Meinung nach noch die Ausgaben fehlen? Warum glaubst sind keine dort?

Ich dachte, dass verschachtelte while Schleifen sich wie verschachtelte for Schleifen verhalten, doch das ist - wie mir gerade auffällt - mitnichten der Fall.
Man kann jede while-Schleife in eine for-Schleife umschreiben und umgekehrt. Sprich es wäre vollkommen egal was man verwendet.
Ein gutes einfaches Beispiel dazu hat dir @VfL_Freak gezeigt. (einzig das "//irgendwas" vor "j++" gehört ;))
 

Lestas89

Bekanntes Mitglied
Danke für die zahlreichen Antworten.

@ VfL_Freak: Soweit bin ich schon gekommen. Das versteh ich. Wie würde der Code nun mit einer verschachtelten for-Schleife aussehen?

@ Joose: Sorry, aber das mit dem Schreibtischtest versteh ich nun wirklich nicht :D Ich hab es gerade versucht und wusste nicht wie ich den richtig durchführen soll
 
Zuletzt bearbeitet:

VfL_Freak

Top Contributor
Moinsen,
das mit dem Schreibtischtest versteh ich nun wirklich nicht
Du sollst Dich an Deinen Schreibtisch (alternativ von mir aus auch: Couchtisch :D) setzen und wie oben mehrfach beschrieben mit Zettel und Bleistift die Variablenwerte in den einzelnen Schleifendurchläufen notieren, um die Funktionsweise nachzuvollziehen!

In etwa also das, was folgender Code machen würde:
Java:
for( int i = 3; i < 10; i++ )
{
    System.out.println( "Wert von i:" + i );
}

Gruß Klaus
 

Lestas89

Bekanntes Mitglied
Hallo VfL_Freak,

ich habe das nun gemacht mit den unterschiedlichen Durchläufen für n= 1 und m=2 :

j: 0
i: 0
i: 1
j: 1
j: 2

dann ist die Schleife zu Ende. Ich kann das aber wie oben beschrieben nicht richtig nachvollziehen. Ich wäre dir dankbar, wenn du mir die äquivalente while-Schleife zu verschachtelten for-Schleifen zeigen könntest.
 

Lestas89

Bekanntes Mitglied
Den Schreibtischtest, oben hab ich die Variablen angegeben nach den Durchläufen :)
Ich bin dir auch dankbar, dass du einen guten Lerneffekt erzielen möchtest bei mir :D aber ich komme wirklich nicht mehr weiter.
 

Lestas89

Bekanntes Mitglied
Welchen Code meinst du ? Mein Code ist doch falsch. Ich tu mich wirklich schwer, tut mir leid :(

Java:
        int j = 0;
        int i = 0;

        while(j <= m) {
           
            while( i <= n) {
           
            ausgabe += " \t " + " ("+i+","+j+") \t";
            i++;
            }
            j++;
           
            }
        JOptionPane.showMessageDialog(null, ausgabe);
 

Joose

Top Contributor
Beim Schreibtischtest solltest du nicht nur die Variablen i und j beachten, auch die Bedingungen der Schleifen und den String ausgabe.
Dabei wird dir auch auffallen warum die Bedingung der inneren Schleife nicht mehr zutrifft und du nicht mehr Ausgaben bekommst als 2.
 

Lestas89

Bekanntes Mitglied
Okay Joose, jetzt hab ich das mal genau so gemacht und ich verstehe immer noch nicht wo mein Fehler liegt. So dachte ich, wären die einzelnen Aufrufe:

für n =1 und m = 2

int i = 0;
int j = 0;



while(0 <= 2){
while( 0 <= 1){

ausgabe + = (0,0)
i++
}
j++
}

Nächster Durchgang:

while(0 <= 2){
while( 1 <= 1){

ausgabe + = (1,0)
i++
}
j++
}

Nun ist die Schleife zu Ende und das versteh ich eben nicht. Da bräuchte ich Hilfe!
 

Joose

Top Contributor
Die innere Schleife ist zu Ende das passt ja, die äußere läuft ja nochmal durch/weiter.
Sprich beim nächsten Durchlauf der äußeren Schleife soll die innere Schleife ja auch wieder durchlaufen werden oder?
 

Lestas89

Bekanntes Mitglied
Richtig Joose, die innere sollte nochmal durchlaufen aber genau das passiert ja nicht. Die nächsten Aufrufe auf meinem Blatt waren:

while(1 <= 2){
while( 0 <= 1){

ausgabe + = (0,1)
i++
}
j++
}

Nächster Durchgang:

while(1 <= 2){
while( 1 <= 1){

ausgabe + = (1,1)
i++
}
j++
}

Aber genau die Durchläufe kommen ja nicht mehr vor. Wieso?
 

Joose

Top Contributor
Aber das versteh ich nicht, dort muss doch drinstehen .... while(1 <= 2)

Ja das ist die Bedingung der äußeren Schleifen beim 2.Durchlauf. Natürlich trifft diese Bedingung zu.
Die Schleife wird betreten und die Bedingung der inneren Schleife wird geprüft. Was passiert nun? Wie schaut diese Bedingung aus? Wird die innere Schleife betreten?

Ich verweise nochmal auf den Schreibtischtest von @Meniskusschaden
Code:
n=1
m=2
i=0
j=0

i=0, j=0   while_j 0<=2?
i=0, j=0   while_i 0<=1?
i=0, j=0   ausgabe (0, 0)
i=0, j=0   i++
i=1, j=0   while_i 1<=1?
i=1, j=0   ausgabe (1, 0)
i=1, j=0   i++
i=2, j=0   while_i 2<=1?
i=2, j=0   j++
i=2, j=1   while_j 1<=2?
i=2, j=1   while_i 2<=1?      
i=2, j=1   j++
i=2, j=2   while_j 2<=2?
i=2, j=2   while_i 2<=1?
i=2, j=2   j++
i=2, j=3   while_j 3<=2
Hier wird dir schön gezeigt welchen Wert i und j haben, sowie die Bedingungen der Schleifen. Zusätzlich noch die Ausgaben und wann i bzw. j erhöht werden.
 

Lestas89

Bekanntes Mitglied
Ich verstehe das nicht, den Schreibtischtest hab ich ja gemacht und es sollte eigentlich hinhauen. Mir fehlt nur das "Konstrukt" wie die Schleife aussehen soll. Kannst du mir vllt noch mehr auf die Sprünge helfen?
 

Joose

Top Contributor
Ich verstehe das nicht, den Schreibtischtest hab ich ja gemacht und es sollte eigentlich hinhauen.
Dann hast du es nicht richtig gemacht -> dann würde dir auffallen das die Bedingung der inneren Schleife nicht mehr zutrifft nach 2 Ausgaben.

Ich hab die Zeilen nun noch kommentiert, da sie anscheinend nicht verständlich genug sind. Vielleicht fällt dir damit der Fehler auf!
Java:
....
i=2, j=0   while_i 2<=1?    <--- die Bedingung der inneren Schleife trifft nicht mehr zu, Schleife nicht betreten
i=2, j=0   j++              <--- Zähler j erhöhen
i=2, j=1   while_j 1<=2?    <--- die Bedingung der äußeren Schleife trifft zu, Schleife betreten
i=2, j=1   while_i 2<=1?    <--- die Bedingung der inneren Schleife tritt nicht zu, Schleife nicht betreten
i=2, j=1   j++              <--- Zähler j erhöhen
i=2, j=2   while_j 2<=2?    <--- die Bedingung der äußeren Schleife trifft zu, Schleife betreten
i=2, j=2   while_i 2<=1?    <--- die Bedingung der inneren Schleife tritt nicht zu, Schleife nicht betreten
....
 

Neue Themen


Oben