mikrocontroller.net

Forum: Compiler & IDEs 8 Variablen miteinander vergleichen


Autor: Sascha (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sascha (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sascha (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich komme irgendwie auf 28 Vergleiche.
Gruß Sascha

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sascha (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: avr (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jiro (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Steinigt ihn er hat goto geschrieben :P

Autor: Sascha (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
avr schrieb:

> Wo sind meine Bonuspunkte?

Der Kandidat hat 90 von 100 Bonuspunkten :-)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, kein Goto, schon gut :)

Autor: Mark .. (mork)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es gibt auch so etwas wie return ...

Autor: entity (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oder, falls es C# ist: break;

Autor: Tom (Gast)
Datum:

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

Autor: Mark .. (mork)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rolf Magnus (rmagnus)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: entity (Gast)
Datum:

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

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.