Vergleich und Nicht vorkommende Zahlen speichern



  • Hallo!
    Kann mir einer bei meinem Problem bitte helfen?
    Ich will Zahlenwerte, die nicht in einem Array vorkommen, in ein anderes Array speichern.

    Die zwei Zahlen (3 und 0) sind in dem iA-Array vorhanden.
    Nun möchte ich, dass die übrigen drei Zahlen ( 1, 2, und 4) in einem anderen iT-Array gespeichert werden.

    Das Problem ist, dass die Schleifen alle Varianten durchlaufen und somit sieben Zahlen in das iT-Array geschrieben wird. ( 0, 1, 1, 2, 2, 3, 4, 4 )

    int iA [2] = {3,0};
    int * iT;
    iT = new int [100];

    int anzUngleichNr = 0;

    for ( int i = 0; i < 5; i++ )
    {
    for( int k = 0; k < 2; k++ )
    {
    if ( i != iA[k] )
    {
    iT[anzUngleichNr] = i;
    anzUngleichNr++;
    }
    }
    }

    Wie schafft man es, dass nur die übrigen Zahlen und nur einmal gespeichert werden?


  • Mod

    Jura schrieb:

    Wie schafft man es, dass nur die übrigen Zahlen und nur einmal gespeichert werden?

    Indem du eben nur einmal speicherst? Du hast doch selber erkannt, dass es da dran liegt, dass du die Zahl jedes Mal speicherst, wenn du sie an irgendeiner bestimmten Stelle nicht antriffst, anstatt nur, wenn sie an keiner einzigen Stelle auftritt. Geh das ganze Feld durch und merk dir dabei, ob du die gesuchte Zahl angetroffen hast oder eben nicht. Anhand des Ergebnisses entscheidest du dann danach, ob die Zahl gespeichert werden soll oder nicht.

    Weiterhin:
    -Es ist ziemlich unsinnig, new mit einer festen Anzahl von Elementen zu benutzen.
    -Es ist ziemlich unsinnig, new zu benutzen. Nimm std::vector.



  • Sry, aber ich stehe schon seit Tagen irgendwie aufm Schlauch.
    Ich komme einfach nicht auf die Beningung für keiner einzigen Stelle.

    Zu deinem Hinweis:
    Es ist ziemlich unsinnig, new zu benutzen. Nimm std::vector.

    Dank dir für den Tipp, aber ich will das Projekt erstmal ohne Vektoren schreiben.



  • Jura schrieb:

    Dank dir für den Tipp, aber ich will das Projekt erstmal ohne Vektoren schreiben.

    Nimm malloc und realloc und du wirst sehen wie ein Programm mal so richtig crasht.



  • Definiere eine Funktion, die prüft, ob ein Wert in einem Array gefunden wird. Rufe sie für beide auf, und wenn keine fündig wird, füge den Wert dem 2. Array hinzu.

    mfg Martin



  • if(( std::find(array.begin(), array.end(), Wert ) == array.end())
     push_back
    

  • Mod

    Ich habe hier mal gründlich aufgeräumt. Nehmt nicht von jede Aussage ohne 10 Seiten Disclaimer an, dass der Autor irgendwie dumm oder ahnungslos wäre. Einen totalen Anfänger nicht mit 10 Seiten technischer Details und unnötiger Relativierungen zu beglücken nennt sich Didaktik. Und das ist im Großen und Ganzen eine gute Sache.



  • SeppJ schrieb:

    Ich habe hier mal gründlich aufgeräumt.

    Ja, räum mal auf.
    Ich werde dann im Januar weiter meine dämlichen Kommentare posten.
    Bis dann - Frohe Weihnachten für Alle.



  • mgaeckler schrieb:

    Definiere eine Funktion, die prüft, ob ein Wert in einem Array gefunden wird. Rufe sie für beide auf, und wenn keine fündig wird, füge den Wert dem 2. Array hinzu.

    mfg Martin

    Dank dir Martin.
    Du hast mich auf den richtigen Gedanken gebracht.

    Das Problem ist nun gelöst und das Programm funktioniet richtig.

    .
    .
    .
    int Hilfswert = 0;
    for( int i = 0; i < anzahlPunkteALT; i++ )
    {
      if( ErmittlungTransIndices( * & iA, anzGleichNr, Hilfswert ) == false )
      {
        iT[anzUngleichNr] = i;
        anzUngleichNr++;
      }
      Hilfswert++;
    }
    .
    .
    .
    
    bool ErmittlungTransIndices( int * & iA, int anzGleichNr, int Hilfswert )
    {
      for( int i = 0; i < anzGleichNr; i++ )
      {
        if( Hilfswert == iA[i] ) return true;
      }
      return false;
    }
    

    Nun kann ich mein Projekt weiter programmieren. 👍



  • Zwei Tipps noch:

    bool ErmittlungTransIndices( int * & iA, int anzGleichNr, int Hilfswert )
    {
     ...
    }
    

    1. Funktionen, die bool zurückgeben, können (v.a. in Projekten, in denen eh alles englisch läuft) einen Namen erhalten, der mit "is", "has" oder so beginnt (auf deutsch dann eben "ist" oder "hat").

    2. Benenne Deine Funktion richtig! Was macht sie wirklich? "Ermittelt" sie tatsächlich "Trans-Indizes"?? Was soll das sein?
    Nein, sie schaut einfach, ob ein Wert in einem Array vorhanden ist. Das sollte auch der Name sein. In welchem Kontext sie das tut, bestimmt dann der jeweilige Aufrufer. Könnte ja sein, dass du zu einem völlig anderen Zweck an anderer Stelle wissen musst, ob ein Wert im Array enthalten ist. Dann wäre dein ursprünglicher Name doppelt falsch.

    Beides zusammen ergibt dann z.B.: "isValueInArray" oder, um näher an der allgemeinen Terminologie zu bleiben: "isFoundInArray".

    Dann liest sich nämlich deine if-Abfrage wie folgt auf deutsch (das "== false" kann ebenfalls entfallen, wobei man das Ganze negieren muss, damit der Name stimmt):

    if( ! istImArrayEnthalten( * & iA, anzGleichNr, Hilfswert ) )
      {
        iT[anzUngleichNr] = i;
        anzUngleichNr++;
      }
    

Log in to reply