2017-04-07 16 views
1

정렬.나는 다음과 같은 구조를 부여하는 프로그램을 작성하기 위해 노력하고있어 문자열 배열을 알파벳 C++

void sortByName(aCompetition & c){} 

참고 : 다음과 같이 함수 선언이 될 것이다 나는 루프 동안, 그리고 if 문 (들) 만 루프를 사용하여이 작업을 수행하고 싶습니다. 두 문자열을 비교하기 위해 생각할 수있는 유일한 방법은 ASCII 값을 비교하는 것입니다. 나는 어떻게 그렇게 할 수 있을지 모르겠다 그래서 어떤 입력을 크게 주시면 감사하겠습니다. 감사!

+0

STD : 문자열 지원보다 덜하고보다 큰 비교. 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()를 사용하는 것이 좋습니다. 첫 번째 디지트가 같으면

번째로 이동 : . (이를위한 한 가지 방법)

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