2017-04-07 6 views
1

文字列配列をソート。は、私は以下の構造に与えられたプログラムを書くためにしようとしているアルファベットC++

void sortByName(aCompetition & c){} 

注:私は、whileループ、および声明(S)場合、ループだけのために使用してこれをやりたいが、次のように関数の宣言は次のようになります。 2つの文字列を比較するには、ASCII値を比較するしかありません。私はどのようにそれを行うかわからないので、任意の入力が大いに感謝されます。ありがとう!

+0

のstd :: stringはよりレスと大なりの比較をサポートしています。私はstd :: sortを使用しますが、単純なバブルソートを使用することができるものに制限されていれば、そのアルゴリズムを簡単に見つけることができます。 –

+0

aCompetitionは本当に構造体であるべきですか?それは配列を保持していると考えていますか? – Krythic

+0

私には完全に正常です。競技には選手が含まれます。 –

答えて

0

。 ASCII値のため

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

は、ASCII値を比較します。大文字は小文字よりも低い値なので、プレーヤー名にtolower()を使うことをお勧めします。

最初の桁が第二に移動し、等しい場合:(。これを行う方法の1つ) を

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

これを行う簡単な解決策は、値をセットとして保存することです。これはC++でデータを保存するためのかなり標準的な方法であり、英数字で自動的にソートするという利点があります。効果的に出力するには、イテレータの周りを頭で囲む必要があります。また、あなたのヘッダファイルに#include <set>が必要になります

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

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; 
} 

ここからは、出力にこれを使用することができます名前:

は、この実行を考えてみましょう。

0

並べ替えは、標準ライブラリ、タイプがoperator<の場合、またはコンパレータが指定されている場合は他のタイプによって行われます。字句比較を実行するstring::operator<のものを構築することができます。

#include <algorithm> 
void sortByName(aCompetition& c) { 
    sort(&c.player[0], &c.player[c.numPlayers], 
      [](const aPlayer& a, const aPlayer& b) {return a.name < b.name;}); 
} 

C++ 11ラムダがない場合は、ファンクタを使用します。

私はあなたを助けるためにあなたにいくつかのポインタを与えるつもりだ(とそうでない場合は、自分でこれを行うことがちょうど答えを見てより多くのお手伝いを致します)、これは宿題のためであると仮定すると、
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()); 
} 
関連する問題