Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Elemente eines Arrays zählen, die verschieden sind

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
30.01.2008, 11:43 Uhr
~user453
Gast


hallo,

ich versuche gerade einen algorithmus in c++ zu schreiben, der mir die anzahl unterschiedlicher werte aus einem int-array zurückgibt. leider komme ich da immer auf werte, die größer sind, als das ergebnis sein kann, also stimmt irgendwas mit der logik nicht. was mache ich falsch?


C++:
int Roulette::differentInRotation()
{
    int differentValues = 0;
    int tmp1 = 0;
    int tmp2 = 0;

    for( int i=0; i < ARRAY_SIZE; i++)
    {
        for( int j=0; j < ARRAY_SIZE; j++ )
        {
            if( rotation[i] == rotation[j] )
            {
                differentValues++;
            }
        }
    }

    return differentValues;
}



kann mir jemand sagen, was ich falsch mache bzw. wo mein denkfehler liegt?
zur info: ARRAY_SIZE ist 37. es muss also ein wert kleiner als 37 als ergebnis rauskommen...

danke und greetz
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
30.01.2008, 11:47 Uhr
~user453
Gast


nachtrag: ich muss noch dazu sagen, dass die beiden tmp-variablen noch nicht gebraucht wurden und eigentlich aus dem quellcode entfernt werden könnten, ist mir beim kopieren eben vergessen gegangen

außerdem sollte ich noch dazu sagen, dass mein array eine feste größe von 37 hat und der wertebereich, mit dem es gefüllt wurde, ebenfalls zwischen 0 bis 37 liegt (ist so eine roulette aufgabe)...

danke!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
30.01.2008, 11:51 Uhr
ao

(Operator)



Zitat:
ARRAY_SIZE ist 37

Roulette?

Du lässt zwei Schleifen von 0 bis 36 laufen, d.h. du vergleichst jedes Paar doppelt. Wenn (rotation[3] == rotation[6]) wahr ist, dann ist wenig später auch (rotation[6] == rotation[3]) erfüllt, jede Übereinstimmung wird also zweimal gezählt.

Besser: die innere Schleife von j = 0 bis j <= i laufenlassen.

Dieser Post wurde am 30.01.2008 um 11:54 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
30.01.2008, 11:56 Uhr
ao

(Operator)



Zitat von ~user453:
... die anzahl unterschiedlicher werte ...

Ach so: Soweit ich das sehe, zählt dein Code nicht die Unterschiede, sondern die Übereinstimmungen. Oder steh ich grad aufm Schlauch?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
30.01.2008, 12:00 Uhr
~user453
Gast


genau. ich habe schon so viele varianten durch, das ich bisher irgendwie alles gezäht habe, was man zählen kann, aber nicht die unterschiedlichen werte im array...

hast du ne idee, wie ich das beheben kann?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
30.01.2008, 12:04 Uhr
~user453
Gast


hab eben noch was vergessen: wenn das programm ja korrekt zählen würde, welche zahlen gleich sind, könnte ich ja mittels einfacher mathematik herausfinden, welche zahlen unterschiedlich sind (sprich: unterschiedliche zahlen = alle zahlen - gleiche zahlen).

aber auch das bekomme ich nicht korrekt hin
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
30.01.2008, 13:08 Uhr
ao

(Operator)



Zitat von ~user453:
hast du ne idee, wie ich das beheben kann?

Ja, siehe Posting 002.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
30.01.2008, 14:02 Uhr
~user453
Gast


das habe ich versucht, aber es führt auch nicht zum gewünschten ergebnis. das endergebnis stimmt nicht mit den tatsächlichen werten überein

das wurmt mich, so schwer kann das doch von der logik her nicht sein, dass man die unterschiedlichen werte irgendwie als anzahl heraus bekommt...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
30.01.2008, 14:50 Uhr
~user453
Gast


ich bin nun auf eine lösung gestoßen, aber die ist mir etwas unklar. die variable "numberAppeared" müsste doch immer true werden, da in dem array "appearedNumber" ja eigentlich keine werte drin stehen bzw. 0er. (ich sehe nicht, dass es initialisiert wurde).

ich habe den code getestet und er liefert die korrekte anzahl, aber wie kann das sein? die letzte if-schleife läuft doch nur ein einziges mal ab, wenn ich die methode differentInRotation aufrufe?!


C++:
int Roulette::differentInRotation()
{
    int differentNumbers = 0;
    int appearedNumbers[37];
    bool numberAppeared;

    for (int i = 0; i < ARRAY_SIZE; i++)
    {
        numberAppeared = false;

        // Look whether the current number was counted already
        for (int j = 0; j < differentNumbers; j++)
        {
            if (rotation[i] == appearedNumbers[j])
            {
                numberAppeared = true;
                break;
            }
        }

        // If the number did not appear, remember it and increase the cout of different numbers
        if (!numberAppeared)
        {
            appearedNumbers[differentNumbers] = rotation[i];
            differentNumbers++;
        }
    }


    return differentNumbers;
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
30.01.2008, 15:29 Uhr
ao

(Operator)


Na ja, der Code speichert alle Zahlen, die er schon hatte, in dem Array "appearedNumbers" und zählt gleichzeitig die Anzahl mit. Der Algorithmus stimmt

Verwendest du zum Testen einen Einzelschritt-Debugger? Solltest du machen.

Ansonsten könntest du das einfacher mti einer std::list<int> erledigen:
Alle 37 Elemente der Reihe nach in die Liste pushen, dann sort, unique und size aufrufen - das Ergebnis ist die Anzahl der verschiedenen Elemente.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: