Forum: Compiler & IDEs 8 Variablen miteinander vergleichen


von Sascha (Gast)


Lesenswert?

Hallihallo,
ich habe gerade das Problem 8 Variablen zu vergleichen. Es darf kein 
Wert zweimal vorkommen. Muss ich wirklich jede mit jeder einzeln 
vergleichen oder gibts da ne einfachere Möglichkeit?
MfG
Sascha

von Karl H. (kbuchegg)


Lesenswert?

Bei 8 wird wohl jede mit jeder am schnellsten gehen.
sind 23 Vergleiche und das ist schwer zu unterbieten.

Bei wesentlich mehr Werten würde schneller gehen:
Daten sortieren
Wenn es gleiche gibt, dann stehen sie dann hintereinander.

von Karl H. (kbuchegg)


Lesenswert?

Karl heinz Buchegger schrieb:
> Bei 8 wird wohl jede mit jeder am schnellsten gehen.
> sind 23 Vergleiche und das ist schwer zu unterbieten.

Nur damit wir uns richtig verstehen: Selbstverständlich in 2 
geschachtelten Schleifen.
Nicht dass du jetzt alle 23 Vergleiche händisch ausprogrammierst.

von Sascha (Gast)


Lesenswert?

Danke für die schnelle Antwort. Das mit den Schleifen geht mir noch 
nicht ganz auf aber ich werd mich mal dransetzen.
MfG
Sascha

von Sascha (Gast)


Lesenswert?

Ich komme irgendwie auf 28 Vergleiche.
Gruß Sascha

von Karl H. (kbuchegg)


Lesenswert?

Sascha schrieb:
> Ich komme irgendwie auf 28 Vergleiche.

Sicher?

Das müssten   ( n * ( n - 1 ) ) / 2 sein. Jeder mit jedem (und 
klarerweise nicht mit sich selbt)

    8 * 7 / 2

Oh Shit. Kopfrechnen. Die Hälfte von 56 ist 28 und nicht 23

Merci vielmals.

von Sascha (Gast)


Lesenswert?

Vergleiche Wert 1 mit 2,3,4,5,6,7,8  (7 Vergleiche)
                2 mit 3,4,5,6,7,8    (6 gesamt 13)
                3 mit 4,5,6,7,8      (5 gesamt 18)
                4 mit 5,6,7,8        (4 gesamt 22)
                5 mit 6,7,8          (3 gesamt 25)
                6 mit 7,8            (2 gesamt 27)
                7 mit 8              (1 gesamt 28)

von Karl H. (kbuchegg)


Lesenswert?

Sascha schrieb:
> Danke für die schnelle Antwort. Das mit den Schleifen geht mir noch
> nicht ganz auf aber ich werd mich mal dransetzen.
> MfG
> Sascha

der 0-te wird mit verglichen mit  1, 2, 3, 4, 5, 6, 7

 0    1, 2, 3, 4, 5, 6, 7
 1    2, 3, 4, 5, 6, 7
 2    3, 4, 5, 6, 7
 3    4, 5, 6, 7
 5    6, 7
 6    7

Jeder mit jedem. Einfach alle von 0 bis zum vorletzten durchgehen und 
mit allen vergleichen, die einen größeren Index haben. Machst du ja auch 
nicht anders: Du hast 8 Karten in der Hand, du nimmst die erste und 
vergleichst sie mit den restlichen 7. Dann legst du die erste beiseite 
und nimmst die nächste. Die vergleichst du mit den verblenden 6 usw. 
usw.

  Doppelte = FALSE;

  for( i = 0; i < 7; ++i )
    for( j = i + 1; j < 8; ++j ) {
      if( wert[i] == wert[j] ) {
        Doppelte = TRUE;
      }
    }
  }

  if( Doppelte ) {
    ...
  }

Bonuspunkte gibts noch für einen vorzeitigen Ausstieg bei Erkennen eines 
Doppels.

von avr (Gast)


Lesenswert?

Karl heinz Buchegger schrieb:
> Doppelte = FALSE;
>
>
>
>   for( i = 0; i < 7; ++i )
>
>     for( j = i + 1; j < 8; ++j ) {
>
>       if( wert[i] == wert[j] ) {
>
>         Doppelte = TRUE;
          goto raus;
>
>       }
>
>     }
>
>   }
>
>
raus:
>
>   if( Doppelte ) {
>
>     ...
>
>   }

Hab den Ausstieg eingefügt ;)

Wo sind meine Bonuspunkte?

avr

von Jiro (Gast)


Lesenswert?

Steinigt ihn er hat goto geschrieben :P

von Sascha (Gast)


Lesenswert?

So ähnlich sehen meine Schleifen jetzt auch aus. Vielen Dank nochmal für 
die Ausführungen. Habs jetzt ;-)
MfG
Sascha

Doppelte = FALSE;

  for( i = 0; i < 7; ++i )
    for( j = i + 1; j < 8; ++j ) {
      if( wert[i] == wert[j] )
          {
           Doppelte = TRUE;
           j=8;                   // Ausstieg innere Schleife
           i=7;                   // Ausstieg äußere Schleife
          }
    }
  }

  if( Doppelte ) {
    ...
  }

Vieleicht nicht elegant aber durchaus funktional.

von Tom (Gast)


Lesenswert?

Karlheinz, diesmal bist du zu weit gegangen! Die fertige Lösung kam echt 
zu schnell. A bissl nachdenken hätter der OP schon noch können.

von Karl H. (kbuchegg)


Lesenswert?

avr schrieb:

> Wo sind meine Bonuspunkte?

Der Kandidat hat 90 von 100 Bonuspunkten :-)

von Karl H. (kbuchegg)


Lesenswert?

Tom schrieb:
> Karlheinz, diesmal bist du zu weit gegangen! Die fertige Lösung kam echt
> zu schnell. A bissl nachdenken hätter der OP schon noch können.

Das hat er mit seiner Variante des vorzeitigen Ausstiegs wieder gut 
gemacht :-)

von Tom (Gast)


Lesenswert?

Ja, kein Goto, schon gut :)

von Mark .. (mork)


Lesenswert?

Es gibt auch so etwas wie return ...

von entity (Gast)


Lesenswert?

oder, falls es C# ist: break;

von Tom (Gast)


Lesenswert?

Das Forum heißt: GCC und nicht GC# ;)

von Mark .. (mork)


Lesenswert?

entity schrieb:
> oder, falls es C# ist: break;

Macht das break in C# nicht dasselbe wie in C(++), also die direkt 
umschließende Schleife verlassen? Dann würde in diesem Fall eben die 
darüberliegende Schleife weiter ausgeführt werden, was nicht Sinn der 
Sache ist. Deshalb auch das goto von "avr".

MfG Mark

von Rolf M. (rmagnus)


Lesenswert?

Sascha schrieb:
> for( i = 0; i < 7; ++i )
>     for( j = i + 1; j < 8; ++j ) {
>       if( wert[i] == wert[j] )
>           {
>            Doppelte = TRUE;
>            j=8;                   // Ausstieg innere Schleife
>            i=7;                   // Ausstieg äußere Schleife
>           }
>     }
>   }

Also da ist aber goto mit Sicherheit eleganter.


Mark .. schrieb:
> entity schrieb:
>> oder, falls es C# ist: break;
>
> Macht das break in C# nicht dasselbe wie in C(++), also die direkt
> umschließende Schleife verlassen?

Ich weiß nicht, wie's bei C# ist, aber es gibt zumindest Sprachen, wo 
man dem break noch die Anzahl an Schachtelungsebenen, die verlassen 
werden sollen, angeben kann.

von entity (Gast)


Lesenswert?

Stimmt, break in C# beendet nur die umschließende Schleife. Abgesehen 
davon finde hier ein return am schönsten.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Sascha schrieb:
> Hallihallo,
> ich habe gerade das Problem 8 Variablen zu vergleichen. Es darf kein
> Wert zweimal vorkommen. Muss ich wirklich jede mit jeder einzeln
> vergleichen oder gibts da ne einfachere Möglichkeit?

Es gibt noch die Möglichkeit, zu zählen, wie oft die Werte vorkommen. Da 
weder was über die Typen der Werte noch über deren Wertebereich noch 
über die Plattform auf der das läuft, gesagt ist, kann auch nicht gesagt 
werden, ob das praktikabler/eleganter ist als zu vergleichen/sortieren.

Da mit == verglichen wird sind's offenbar keine double/float-Werte.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.