2017-04-07 3 views
1

Ich versuche, ein Programm zu schreiben, das die folgenden Strukturen gegeben:Sortierung eines String-Array von A bis C++

struct aPlayer { 
    string name; // name of player 
    int wins;  // number of wins player has 
}; 

struct aCompetition { 
    string name;     // name of the match 
    int  numPlayers;   // number of players in the club 
    aPlayer player[10];   // list of players in this club 
}; 

Von dort Ich möchte eine Funktion schreiben, die die Spieler nach Namen alphabetisch sortiert werden. Die Funktionsdeklaration würde wie folgt aussehen:

void sortByName(aCompetition & c){} 

Hinweis: Das möchte ich für Loops nur tun, während Schleifen und if-Anweisung (en). Die einzige Möglichkeit, die zwei Strings zu vergleichen, wäre, ihre ASCII-Werte zu vergleichen. Ich bin nicht sicher, wie man das macht, also wird jede Eingabe sehr geschätzt. Vielen Dank!

+0

std :: string unterstützt weniger als und Größer-als-Vergleiche. Ich würde std :: sort verwenden, aber wenn Sie darauf beschränkt sind, was Sie verwenden können, wäre eine einfache Blasensortierung in Ordnung, und Sie können diesen Algorithmus leicht finden. –

+0

Sollte eine Competition wirklich eine Struktur sein? Wenn man bedenkt, dass es ein Array enthält? – Krythic

+0

Scheint völlig normal für mich. Ein Wettbewerb enthält Spieler. –

Antwort

0

Angenommen, dies für die Hausaufgaben ist (und wenn es nicht, dies selbst zu tun werden Sie viel mehr helfen, als nur die Antwort sehen,) Ich werde einfach Sie geben ein paar Hinweise um Ihnen zu helfen .

vergleichen ASCII-Werte:

aPlayer player1, player2; 
player1.name = "bill"; 
player2.name = "john"; 
if (player1.name[0] < player2.name[0]) 
{ 
    // True, in this case, because b is less than j on the ascii table. 
} 

http://www.asciitable.com für die ASCII-Werte. Ich empfehle tolower() für die Spielernamen, weil Großbuchstaben niedrigere Werte als Kleinbuchstaben sind.

Wenn die erste Ziffer gleich ist, gehen Sie zum zweiten: (. Ein Weg, dies zu tun)

aPlayer player1, player2; 
player1.name = "alfred"; 
player2.name = "alvin"; 

// Find which name is shorter using .length() like player2.name.length() 

// Loop through this next part for all aPlayers in aCompetition 
for (int i = 0; i < shorterName.length(); i++) 
{ 
    // Compare ascii values as I showed above. 
    // If one is larger than the other, swap them. 
} 
0

Eine einfache Lösung dafür ist das Speichern der Werte als eine Menge. Dies ist eine Standardmethode zum Speichern von Daten in C++ und hat den Vorteil, dass sie automatisch alphanumerisch sortiert wird. Sie müssen Ihren Kopf jedoch um Iteratoren wickeln, um sie effektiv auszugeben.

Betrachten Sie diese Ausführung:

std::set sortByNames(aCompetition & c, int numPlayers) 
{ 
    std::set<std::string> sortedNames; 

    for(int i = 0; i < numPlayers; i++) 
    { 
     std::string name; 
     //std::cout << i << ". "; 
     name = player[i]; 

     sortedNames.insert(name); 
    } 
    return sortedNames; 
} 

Von hier aus können Sie diesen Namen verwenden Ausgabe:

myNames = sortByNames(aCompetition, 10); 
std::for_each(myNames.begin(), myNames.end(), &print); 

Sie werden auch ein #include <set> in Ihrem Header-Datei benötigen.

0

Sortierung wird von der Standard-Bibliothek zur Verfügung gestellt, bei Typen mit operator<, oder anderen Typen, wenn dieser Komparator angegeben wird. Sie können eine von string::operator< erstellen, die einen lexikalischen Vergleich durchführt.

Wenn Sie nicht C++ 11 Lambdas haben, dann würden Sie einen Funktor verwenden.

struct compareAPlayerByName { 
    boolean operator()(const aPlayer& a, const aPlayer& b) { 
     return a.name < b.name; 
    } 
}; 
void sortByName(aCompetition& c) { 
    sort(&c.player[0], &c.player[c.numPlayers], compareAPlayerByName()); 
} 
Verwandte Themen