2014-10-02 4 views
1

에서 최소 값을 찾을 수 있습니다.내가 두 배열이 배열

if (playerNames[index] == "End" || playerNames[index] == "end") { 
    int lowestValue = playerSums[0]; 
    for (i = 1; i < sizeof(playerSums)/sizeof(playerSums[0]); i++) { 
     if (playerSums[i] < lowestValue || lowestValue != 0) 
      lowestValue = playerSums[i]; 
    } 
    cout << index[playerNames] << " had the lowest values and got the sum "; 
    cout << lowestValue << endl; 
} 

은 어떻게 찾아 예를 만 3 플레이어 재생하는 경우 배열 playerSums에서 가장 작은 값을 표시 마십시오의 즉 불과 3 요소 : 여기

는 지금까지 시도했습니다 무엇 배열이 채워지고 나머지 요소는 0과 같습니다.

가장 작은 값을 가진 플레이어의 이름을 표시하려면 색인이 필요합니다. 당신이 index 할 마지막 값의 인덱스가있는 경우 있도록

+2

현재 코드가 잘못되었음을 설명하십시오. 당신이 그것에있는 동안, 내부''if 진술 뒤에 논리를 설명하십시오 :) –

+0

본 적이 있습니까 http://stackoverflow.com/questions/23871658/cs-min-element-not-working-for-array? – matsjoyce

+4

'std :: vector'는 삶을 훨씬 더 쉽게 만듭니다. –

답변

3

를 작동하는지 알려주세요. 예를

#include <algorithm> 

int *min = std::min_element(playerSums, playerSums + 3); 

std::cout << playerNames[min - playerSums] 
      << " had the lowest values and got the sum " << *min 
      << std::endl; 

당신이 알고리즘과 비슷한 자신의 함수를 작성할 수있는 알고리즘을 사용하는 <iterator>

#include <algorithm> 
#include <iterator> 

int *min = std::min_element(std::begin(playerSums), std::end(playerSums)); 

std::cout << playerNames[ std::distance(playerSums, min)] 
      << " had the lowest values and got the sum " << *min 
      << std::endl; 

대신 헤더에 선언 된 표준 기능 std::begin, std::endstd::distance를 사용하여 작성 될 수있는 동일하십시오. 그러면 제로인 배열의 요소를 이동해야하는 경우, 예를 들어

size_t min_sum(int playerSums[], size_t n) 
{ 
    size_t min = 0; 

    for (size_t i = 1; i < n; i++) 
    { 
     if (playerSums[min] < playerSums[i]) min = i; 
    } 

    return min; 
} 

size_t min = min_sum(playerSums, sizeof(playerSums)/sizeof(*playerSums) ); 

std::cout << playerNames[min] 
      << " had the lowest values and got the sum " << playerSums[min] 
      << std::endl; 

함수가

size_t min_sum(int playerSums[], size_t n) 
{ 
    size_t min = 0; 

    while (min < n && playerSums[i] == 0) ++min; 

    for (size_t i = min; i < n; i++) 
    { 
     if (playerSums[min] < playerSums[i]) min = i; 
    } 

    return min; 
} 

size_t min = min_sum(playerSums, sizeof(playerSums)/sizeof(*playerSums) ); 

if (min != sizeof(playerSums)/sizeof(*playerSums)) 
{ 
    std::cout << playerNames[min] 
       << " had the lowest values and got the sum " << playerSums[min] 
       << std::endl; 
} 
2

당신은, 그래서 그냥 변수 (예를 들어, index)에 해당 인덱스를 저장, 해당 변수의 값을 변경할 때 lowestValue에 할당되는 요소의 인덱스를 알고 할당 됨.

2

먼저 for 루프 조건을 조정하십시오. 내가 전에 정의한 것인지 잘 모르겠다. 두 번째로 정지 조건 i < sizeof (palyerSums)이면 충분합니다. 또한 가장 낮은 playerSums의 인덱스를 배열에 저장하면됩니다. if 조건에도 너무 많은 것이 있습니다. lowestValue가 0이 아닌 경우에는 항상 해당 값을 변경합니다. 즉, lowestValue가 정확히 0이 아니면 않는 것 같습니다.

int lowestValue = playerSums[0]; 
int resultIndex = 0; 
for(int i = 1; i < sizeof(playerSums)/sizeof(playerSums[0]); i++) { 
    if(playerSums[i] < lowestValue) { 
    lowestValue = playerSums[i]; 
    resultIndex = i; 
    } 
} 
cout << playerNames[resultIndex] << "blabla" << lowestValue; // instead of lowestValue you could also do playerSums[resultIndex] ofcourse. 

는 당신은 요소 witn의 최소 금액을 찾을 헤더 <algorithm>에 선언 된 표준 알고리즘 std::min_element을 사용할 수 있습니다

+0

배열의 크기! = 배열의 길이 – P0W

+0

나는 C++에 익숙하지 않다.하지만 나눗셈에서는 의미가있다. – Juru

3

같이하면 lowestValue 가장 낮은 값을 저장하는 동일한 방식으로 보일 것이라고 보관 변수의 색인, 예를 들어 lowestValueIndex 또한, 경우 외부를 제거하고 루프의 내부 이동 :

if(playerNames[i] == "End" || playerNames[i] == "end") 
    break; 

이 방법, 당신은 재생 전용 플레이어가 처리됩니다 있는지 확인합니다. 또한 가장 낮은 값이 더 이상 0인지 확인하지 않아도됩니다.

std::vector<std::string> playerNames; 
std::vector<int> playerSums; 

for (int i = 1; i < playerSums.size(); ++i) 
{ 
    if (playerSums[i] < lowestValue) 
    { 
      lowestValue = playerSums[i]; 
      lowestValueIndex = i; 
    } 
} 
cout << index[playerNames] << " had the lowest values and got the sum " 
    << lowestValue << endl; 
3

가장 간단한 솔루션을 사용하는 것입니다 평소처럼 (A vector 같은)이 단순화로 성장할 수있는 표준 배열을 사용, 그냥 참고로

int lowestValue = playerSums[0]; 
int lowestValueIndex = 0; 
for (int i = 1; i < sizeof(playerSums)/sizeof(playerSums[0]); ++i) 
{ 
    if(playerNames[i] == "End" || playerNames[i] == "end") 
     break; 
    if (playerSums[i] < lowestValue) 
    { 
      lowestValue = playerSums[i]; 
      lowestValueIndex = i; 
    } 
} 
cout << index[playerNames] << " had the lowest values and got the sum " 
    << lowestValue << endl; 

: 그래서 코드는 모양을 예 : 표준 라이브러리 당신은 단지 당신이 뭔가를 할 수있는 배열의 처음 3 개 요소를 반복하려면

int lowestValue = *it; 

:

auto it = std::min_element(std::begin(playerSums), std::end(playerSums)); 
std::size_t index = std::distance(std::begin(playerSums), it); 

이제 반복자 it를 역 참조하여 최소 값을 얻을 수 있습니다 대신 :

auto first = std::begin(playerSums); 
auto it = std::min_element(first, std::next(first, 3)); 
std::size_t index = std::distance(first, it); 

참고 :는를 선호 일반 포인터 연산 대신에. playerSums + 3)보다 일반적이므로 모든 반복기 유형에서 작동합니다.

+0

"역 참조"it "은'* it'을 쓰는 것을 의미합니다. – GingerPlusPlus

+0

@GingerPlusPlus 예, * 역 참조 연산자 *'*'를 사용하십시오. – Snps

+2

질문을 읽는 방식으로 배열은 최대 9 명의 플레이어에 할당되지만 게임을하는 사람보다 적은 수의 플레이어가있을 수 있습니다. 사용되지 않는 배열 엔트리가 0으로 채워진다 고 가정하면, 사용되지 않는 엔트리를 무시하는 최소값을 어떻게 찾습니까? –