3 While Schleife zu einer

Gast #4382137
Lesenswert?
• ▲
▼
Hallo

Ich habe folgenden Code geschrieben für die Schule. Nun meint mein 
Lehrer, ich soll diese drei While-Schleifen zu einer zusammenfassen. Ich 
habe schon alles mögliche probiert, leider hat nichts funktioniert... 
Habe bereits versucht das ganze mit OR Abfragen in der Schleife und mit 
If-Else Konditionen in der Schleife hinzukriegen, leider vergebens. 
Vielleicht kann mir ja einer von euch einen Tipp geben?

Lieben dank
MfG
1
 
2
while(left <= leftEnd && right <= rightEnd)
3
            if(a[left].compareTo(a[right]) <= 0)
4
                tmp[k++] = a[left++];
5
            else
6
                tmp[k++] = a[right++];
7

8
        while(left <= leftEnd)    
9
            tmp[k++] = a[left++];
10

11
        while(right <= rightEnd) 
12
            tmp[k++] = a[right++];
#4382147
Lesenswert?
• ▲
▼
Tipp 1:
Gewöhn Dir bitte an, die eigentliche Aufgabenstellung zu benennen. In 
diesem Fall also, was der Code den Du geschrieben hast überhaupt 
bewerkstelligen soll.

Tipp 2:
Gewöhn Dir bitte an, geschweifte Klammern zu verwenden wenn Du in C 
programmierst.


So wie der Code dasteht, werden die drei Schleifen nacheinander 
abgearbeitet. Ich nehme an das ist nicht das, was tatsächlich gemacht 
werden soll?
Gast #4382155
Lesenswert?
• ▲
▼
Mark B. schrieb:
> Gewöhn Dir bitte an, geschweifte Klammern zu verwenden.

Dann noch ein Versuch für den Herrn:
1
while(left <= leftEnd && right <= rightEnd) {
2
     if(a[left].compareTo(a[right]) <= 0)
3
          tmp[k++] = a[left++];
4
     else
5
          tmp[k++] = a[right++];
6
}
7

8
while(left <= leftEnd) {   
9
     tmp[k++] = a[left++];
10
}
11

12
while(right <= rightEnd) {
13
     tmp[k++] = a[right++];
14
}

Mark B. schrieb:
> Gewöhn Dir bitte an, die eigentliche Aufgabenstellung zu benennen.

Aufgabenstellung: Ein Array mit diversen Zeichen ihrer Grösse nach 
Sortieren. Das Programm funktioniert bereits, ich muss nur noch diese 
drei Schleifen bearbeiten da meine Lehrperson damit nicht zufrieden ist.

Mark B. schrieb:
> So wie der Code dasteht, werden die drei Schleifen nacheinander
> abgearbeitet. Ich nehme an das ist nicht das, was tatsächlich gemacht
> werden soll?

Jain. Das einzige was der Lehrer dazu meinte: Pack die Bedingungen der 
zweiten und der dritten Schleife in die erste, Verknüpf sie und schau 
dass dein Code mit nur einer Schleife auskommt. (Wieso auch immer...)

TM F. schrieb:
> ???

Leider nein.

Gruss
Gast #4382176
Lesenswert?
• ▲
▼
> Vielleicht kann mir ja einer von euch einen Tipp geben?

Tipp 1: Damit alle Elemente behandelt werden, darf deine Schleife nicht 
abbrechen sobald eine Grenze erreicht ist sondern erst, wenn beide 
Grenzen erreicht werden.

Tipp 2: Nun kann es innerhalb der Schleife vorkommen, dass eine Grenze 
bereits erreicht ist.  Das musst du abfangen und entsprechend behandeln.

Bonustipp: Die Änderungen sind minimal - du brauchst keine "zusätzliche" 
Zeile Kode.
Moderator #4382179
Lesenswert?
• ▲
▼
Das soll wohl ein Merge-Sort werden.

Wenn man das unbedingt in eine enzelne Schleife packen muss:

1
for(;;) {
2
  if(left <= leftEnd) {
3
    if(right <= rightEnd) {
4
      if(a[left].compareTo(a[right]) <= 0)
5
        tmp[k++] = a[left++];
6
      else
7
        tmp[k++] = a[right++];
8
    }
9
    else
10
      tmp[k++] = a[left++];
11
  }
12
  else {
13
    if(right <= rightEnd)
14
      tmp[k++] = a[right++];
15
    else
16
      break;
17
  }
18
}

Aber deine bisherige Lösung gefällt mir deutlich besser.
Gast #4382184
Lesenswert?
• ▲
▼
ich würds ja eher so machen:
1
string mh = "hallo Welt";
2
string sorted = string.Concat(from s in mh orderby s select s);


könntest du bitte wenigstens die komplette Funktion schreiben und die 
verwendete Programmiersprache schreiben?

Beides würde diese elende Raterei vereinfachen.
Moderator Persönliche Seite #4382188
Lesenswert?
• ▲
▼
CCoder schrieb:
> Dann noch ein Versuch für den Herrn:while(left <= leftEnd && right <=
> rightEnd) {
>      if(a[left].compareTo(a[right]) <= 0)
>           tmp[k++] = a[left++];
>      else
>           tmp[k++] = a[right++];
> }
>
> while(left <= leftEnd) {
>      tmp[k++] = a[left++];
> }
>
> while(right <= rightEnd) {
>      tmp[k++] = a[right++];
> }

Die obere while-Schleife bricht ab, wenn einer der beiden Variablen left 
bzw. right ans Ende gelaufen sind, die beiden unteren while-Schleifen 
machen nichts anderes, als den verbleibenden Rest noch zu kopieren.

Ziehe beide unteren while-Bedingungen in die obere Schleife als 
if-Statement rein. Dann musst Du aber noch die Bedingung der ersten 
while Schleife ändern: && durch ||, damit die Schleife für beide 
Variablen bis zum Ende durchläuft. Der ursprüngliche Inhalt der ersten 
while-Schleife muss dann aber bedingt (if) durchgeführt werden.

Aber ob das insgesamt dadurch einfacher wird? Ich finde Deine Variante 
lesbarer.
Gast #4382216
Lesenswert?
• ▲
▼
Frank M. schrieb:
> Die obere while-Schleife bricht ab, wenn einer der beiden Variablen left
> bzw. right ans Ende gelaufen sind, die beiden unteren while-Schleifen
> machen nichts anderes, als den verbleibenden Rest noch zu kopieren.
>
> Ziehe beide unteren while-Bedingungen in die obere Schleife als
> if-Statement rein. Dann musst Du aber noch die Bedingung der ersten
> while Schleife ändern: && durch ||, damit die Schleife für beide
> Variablen bis zum Ende durchläuft. Der ursprüngliche Inhalt der ersten
> while-Schleife muss dann aber bedingt (if) durchgeführt werden.
>
> Aber ob das insgesamt dadurch einfacher wird? Ich finde Deine Variante
> lesbarer.

Danke!!! Hat Funktioniert, daran habe ich noch nicht gedacht!

Problem somit gelöst ;)
#4382412
Lesenswert?
• ▲
▼
Yalu X. schrieb:

> Aber deine bisherige Lösung gefällt mir deutlich besser.

Wenn man das ganze in der Reihenfolge anders aufzieht, wird es deutlich 
lesbarer. Ich bezeichne die Arrays einfach einmal als Stapel. So ähnlich 
wie 2 Stapel Spielkarten, die (vorsortiert) zu einem gemeinsamen Stapel 
vereint werden sollen
1
 solange nicht beide Stapel leer sind
2
 {
3
   if( linker Stapel ist bereits leer )
4
     nimm vom rechten Stapel
5

6
   else if( rechter Stapel ist bereits leer )
7
     nimm vom linken Stapel
8

9
   else // offenbar sind beide Stapel noch nicht leer
10
     nimm von links oder rechts, basierend auf einem Wertevergleich
11
 }

Sieht man das ganze so an, dann reduzieren sich die Schachtelungen 
deutlich.
Persönliche Seite #4382453
Lesenswert?
• ▲
▼
Du kannst natürlich sowas machen wie
1
while (left <= leftEnd || right <= rightEnd)
2
{
3
    if (right > rightEnd)
4
        tmp[k++] = a[left++];
5
    else if (left > leftEnd)
6
        tmp[k++] = a[right++];
7
    else if (a[left].compareTo(a[right]) <= 0)
8
        tmp[k++] = a[left++];
9
    else
10
        tmp[k++] = a[right++];
11
}

Aber dein ursprünglicher Code ist einfach besser verständlich.  Und 
alles in eine Schleife zu quetschen bringt keinerlei Vorteile (außer 
evtl. von nem Bremser mit zweifelhaften Kriterien Punkte einzusammeln).
#4383799
Lesenswert?
• ▲
▼
Karl H. schrieb:
> Wenn man das ganze in der Reihenfolge anders aufzieht, wird es deutlich
> lesbarer. Ich bezeichne die Arrays einfach einmal als Stapel. So ähnlich
> wie 2 Stapel Spielkarten, die (vorsortiert) zu einem gemeinsamen Stapel
> vereint werden sollen
>
1
>  solange nicht beide Stapel leer sind
2
>  {
3
>    if( linker Stapel ist bereits leer )
4
>      nimm vom rechten Stapel
5
> 
6
>    else if( rechter Stapel ist bereits leer )
7
>      nimm vom linken Stapel
8
> 
9
>    else // offenbar sind beide Stapel noch nicht leer
10
>      nimm von links oder rechts, basierend auf einem Wertevergleich
11
>  }
>
> Sieht man das ganze so an, dann reduzieren sich die Schachtelungen
> deutlich.

Also für mich liest sich das Original so:
1
solange ( beide Stapel nicht leer sind )
2
    nimm von links oder rechts, basierend auf einem Wertevergleich
3

4
solange ( rechten Stapel nicht leer )
5
    nimm vom rechten Stapel
6

7
solange ( linker Stapel nicht leer )
8
    nimm vom linken Stapel

Das halte ich für eine Schachtelungsebene weniger als der geänderte 
Vorschlag. Obendrein werden unnötige Abfragen innerhalb der Schleife 
vermieden. Die einzige Hürde besteht vielleicht darin zu erkennen, dass 
immer mindestens eine der drei Schleifen nicht durchlaufen werden kann, 
aber die sollte mit ein wenig Übung locker zu nehmen sein.

CCoder schrieb:
> Jain. Das einzige was der Lehrer dazu meinte: Pack die Bedingungen der
> zweiten und der dritten Schleife in die erste, Verknüpf sie und schau
> dass dein Code mit nur einer Schleife auskommt. (Wieso auch immer...)

Ich würde meinen Lehrer ja mal fragen, warum er auf nur einer Schleife 
besteht. Ich sehe darin keinen Vorteil aber mindestens zwei Nachteile.
#4383881
Lesenswert?
• ▲
▼
A. H. schrieb:

> Das halte ich für eine Schachtelungsebene weniger als der geänderte
> Vorschlag. Obendrein werden unnötige Abfragen innerhalb der Schleife
> vermieden. Die einzige Hürde besteht vielleicht darin zu erkennen, dass
> immer mindestens eine der drei Schleifen nicht durchlaufen werden kann,
> aber die sollte mit ein wenig Übung locker zu nehmen sein.

Ich bin bei dir. Aber wenn es sein Lehrer so haben will, dann will er so 
haben. Der Kunde ist König :-)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren