Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Werte eines korrespondierendes Arrays sortieren

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 <
000
25.09.2017, 11:27 Uhr
TimoSchweizer



Werte C++-Gemeinde,

ich habe ein sicher sehr simple Aufgabenstellung, die mich leider (C++ Anfänger) an meine Grenzen bringt. Ich habe zwei Arrays. Da erste Array enthält KO-Statistiken, das zweite Kraftwerte (das ganze ist für ein Spiel gedacht).

Logischerweise würde es Sinn ergeben, dass eine höhere KO-Statistik auch einen höheren Kraftwert mit sich bringt. Da beide Arrays auf Zufallswerten aufgebaut sind, würde ich gerne die Kraftwerte so sortieren, dass jeweils die höchsten Kraftwerte bei der höchsten Anzahl an KO's erscheinen.

Also dachte ich mir, ich ermittele das Maximum im KO-Array (genauer die Position) und ermittele den Maximalwert im Kraftwert und verschiebe diesen an die Stelle der ermittelten Position des KO-Arrays. Dann müssten die Werte ja zusammenpassen.
Nach jedem Durchlauf setzte ich das ermittelte Maximum auf 0 um nicht immer dasselbe Maximum abzurufen

Leider spuckt mein Code, seltsame Zahlen aus.
Hier ist mein Ansatz - ich kann auch gerne eine Zeichnung machen, wenn ich mich unklar ausgedrückt habe:


C++:

#include "mainwindow.h"
#include <QApplication>
#include <QDebug>

int main(int argc, char *argv[])
{


    int liste[5]={3,12,1,5,7};
    int liste2[5]={6,1,0,4,12};
    int liste3[5];
    int max= liste[0];
    int max2= liste2[0];
    int pos=0;
    int pos2=0;

    QApplication a(argc, argv);



    for (int i=0; i < 5; ++i)
    {



     if (liste[i] > max) //Maximum der ersten Liste ermitteln
     {
         max=liste[i]; //Wert
         pos=i;       // Position


     }


     if (liste2[i] > max2) //Maximum der zweiten Liste ermitteln
     {
         max2=liste2[i]; //Wert
         pos2=i;        // Position


     }
     liste3[pos]=max2; //Liste drei erhält an korrespondierender Position den jeweiligen Maximalwert
     liste2[i]=0; //Ermitteltes Maximum wird 0 damit ein neues Maximum gefunden werden kann
     liste[i]=0; //Ermitteltes Maximum wird 0 damit ein neues Maximum gefunden werden kann

     }



    for (int i=0; i < 5; ++i)

    {

    qDebug() << liste3[i]; // 3. Liste mit den korrespondierenden Werten

    }







    return a.exec();
}





Viele Dank für Hilfestellungen,
Timo
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
25.09.2017, 17:13 Uhr
Hans
Library Walker
(Operator)


Hi,

was gibt das Programm denn aus, und wie unterscheidet sich das von dem, was Du erwartest?

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
25.09.2017, 18:51 Uhr
TimoSchweizer



liste[5]={3,12,1,5,7};
liste2[5]={6,1,0,4,12};
liste3[5];


Am Ende sollte das Verhältnis so aussehen:

KO Korrespondierende Stärke (Ausgabe) liste3
3 1 (wurde verschoben an Pos 0 (Array startet bei 0)
12 12 (wurde verschoben an Pos 1 (Array startet bei 0)
1 0 (wurde verschoben an Pos 2 (Array startet bei 0)
5 4 (wurde verschoben an Pos 3 (Array startet bei 0)
7 6 (wurde verschoben an Pos 4 (Array startet bei 0)


Meine Ausgabewerte sind:

12
6
-2
irgendwelche sehr große Zahlen


Ich hätte eben gerne, dass die jeweils größte "Stärke-Zahl" mit der jeweils
größten "KO-Zahl" korrespondiert, wobei KO nicht sortiert werden soll nur
Liste 2 die dann zu Liste 3 wird.

Viele Grüße und vielen Dank für jegliche Ideen,
Timo
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
28.09.2017, 17:14 Uhr
Hans
Library Walker
(Operator)


Hi,

nun ja, um eine solche, geänderte Liste zu erhalten, musst Du zwar die Inhalte der einen Liste verschieben, darfst sie aber nicht sofort löschen. Aber genau das tut Dein Programm in der Form, wie es oben steht. Werte in einem Array oder grundsätzlicher: in einer Liste zu verschieben bedeutet aber immer mindestens eine Tauschoperation.

Wenn ich das Problem richtig verstanden habe, dann willst Du die KO-Liste so lassen, wie sie ist, und die Werte aus der Kraftliste an diejenigen anpassen, die an der entsprechenden Stelle der KO-Liste stehen. Dazu brauchst Du zwei Indizes: einen, mit dem Du durch die KO-Liste gehst und den zweiten, um immer wieder die Kraftliste durchzugehen. Wenn Du in der Kraftliste den Wert gefunden hast, der dem in der KO-Liste am nächsten ist, kannst Du diesen an die passende Stelle in Liste 3 schreiben, wobei Du dazu den Index der Kraftliste nimmst. Dann, und erst dann kannst Du den Wert in der Kraftliste (Liste 2) löschen, damit das Programm auch mal zu einem Ende kommt. Denn Du must die Suche jedesmal von vorne anfangen, und sooft wiederholen, bis Du die KO-Liste durchgearbeitet hast. Das geht bei diesem Ansatz tatsächlich nur mit einem Zusatzarray, und dem löschen der bereits verarbeiteten Daten aus der Kraftliste.
Schliesslich ist es am Ende nötig, die Werte aus Liste 3 wieder in das Kraftarray zurück zu kopieren, denn sonst funktioniert die Spielelogik nicht mehr, weil ja alle Werte auf Null stehen.

Das durchsuchen der Kraftliste hat eine gewisse Ähnlichkeit mit dem Insertionsort, deshalb hab ich dessen Wikipediaartikel mal verlinkt.

Dann ist es Sinnvoll, den Listen aussagekräftigere Namen zu geben, wie ich das in den Erklärungen oben schon praktiziert habe: Wenn die Liste 1 also eine KO-Liste sein soll, dann nennt man sie am besten auch so. Das erleichtert es ungemein, das Programm und seine Logik zu verstehen.

Was Dein Programm angeht, so kommt vor Deiner Bearbeitungsschleife bei mir folgendes bei heraus:

Code:
Liste 1:    3,  12,   1,   5,   7,
Liste 2:    6,   1,   0,   4,  12,
Liste 3:   32, 65488, 8388608, 4211214, 1299968,



Nach Deiner Bearbeitungsschleife:

Code:
Liste 1:    0,   0,   0,   0,   0,
Liste 2:    0,   0,   0,   0,   0,
Liste 3:    6,  12, 8388608, 4211214, 1299968,


D.h. Du löschst Daten, die Du gar nicht löschen willst.
Die komischen grossen Zahlen in Liste 3 kommen dadurch zustande, dass der Speicherbereich, der die Werte für Liste 3 beherbergt, nicht initialisiert wurde; d.h. es wurden keine Ausgangswerte definiert, die gelten sollen, wenn der Speicher unbenutzt ist. Sieh Dir dazu mal an, was dieses (Konsolen)Programm ausgibt:

C++:
#include <iostream>

using namespace std;

int main()
{
    int Array[7];

    cout << "Array: ";
    for (int i=0; i < 7; i++)
      { cout << Array[i] << ", "; }
    cout << endl;  
    
    return 0;
}


Wenn ich das Programm mehrmals hintereinander aufrufe, ist zumindest der erste Wert immer anders. Es kann unter einer anderen Windowsversion oder unter Linux oder MacOS aber so sein, dass bei jedem Aufruf völlig andere Werte herauskommen. Das lässt sich nicht vorher sagen.

Und das hier:

Zitat:

... (Array startet bei 0)


gilt in allen C-Dialekten grundsätzlich immer!
Wenn Du ein Array mit 1 starten willst, musst Du es entsprechend programmieren: Immer ein Element mehr definieren, als in dem Array vorkommen soll. Etwa so:

C++:
int Array[11]; // Array für 10 Elemente

Array[0] = 0;  // Sicherheitsmassnahme: nulltes Element auf Null setzen, damit es einen
// definierten Wert hat, falls man doch mal drauf zugreift. Alternativ geht auch -1 (minus eins).

for (int i=1; i<=10; i++)
   // tue irgendwas



P.S.: Da ich kein Qt installiert habe, hab ich die Ausgabe von Deinem Programm auf Konsolenausgabe, also Kommandozeilenfenster abgeändert. Das sieht so aus:

C++:
//////////////////////////////////////////////////////////////////////////////////////////
/*
    #include "mainwindow.h"
    #include <QApplication>
    #include <QDebug>
*/


#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
    int liste[5]={3,12,1,5,7};
    int liste2[5]={6,1,0,4,12};
    int liste3[5];
    int max= liste[0];
    int max2= liste2[0];
    int pos=0;
    int pos2=0;
    
    int i;

//    QApplication a(argc, argv);

// Listen ausgeben...
    cout << "Liste 1: ";
    for (i=0; i < 5; ++i)
      { cout.width(3); cout << liste[i] << ", "; }
    cout << endl << "Liste 2: ";
    for (i=0; i < 5; ++i)
      { cout.width(3); cout << liste2[i] << ", "; }  
    cout << endl << "Liste 3: ";
    for (i=0; i < 5; ++i)
        { cout.width(3); cout << liste3[i] << ", "; }  
    cout << endl;

    for (i=0; i < 5; ++i)
    {
         if (liste[i] > max) //Maximum der ersten Liste ermitteln
         {
             max=liste[i]; //Wert
             pos=i;       // Position
         }

         if (liste2[i] > max2) //Maximum der zweiten Liste ermitteln
         {
             max2=liste2[i]; //Wert
             pos2=i;        // Position
         }
         liste3[pos]=max2; //Liste drei erhält an korrespondierender Position den jeweiligen Maximalwert
         liste2[i]=0; //Ermitteltes Maximum wird 0 damit ein neues Maximum gefunden werden kann
         liste[i]=0; //Ermitteltes Maximum wird 0 damit ein neues Maximum gefunden werden kann
    }

    for (i=0; i < 5; ++i)
    {

        // qDebug() << liste3[i]; // 3. Liste mit den korrespondierenden Werten

    }

    cout << "Liste 1: ";
    for (i=0; i < 5; ++i)
      { cout.width(3); cout << liste[i] << ", "; }
    cout << endl << "Liste 2: ";
    for (i=0; i < 5; ++i)
      { cout.width(3); cout << liste2[i] << ", "; }  
    cout << endl << "Liste 3: ";
    for (i=0; i < 5; ++i)
        { cout.width(3); cout << liste3[i] << ", "; }  
    cout << endl;

    // return a.exec();
    return 0;
}


--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.

Dieser Post wurde am 28.09.2017 um 19:02 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
28.09.2017, 21:20 Uhr
TimoSchweizer



Hallo Hans,

vielen Dank für die Hilfe, ich werde das alles mal sacken lassen und durchspielen.

Viele Grüße,
Timo
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ 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: