2013-12-08 3 views
0

입력 한 이름의 오름차순으로 나이를 정렬 한 다음 그에 따라 목록을 표시하고 싶습니다. 나는 그 (것)들을 분류하는 것을 처리하고 그러나 나는 그들의 나이에 정확하게 이름을 표시하는 것을 보일 수 없다.입력 한 이름의 '나이'를 정렬 한 다음 결과를 표시합니다.

여기 내 코드입니다 : -

#include <iostream> 
using namespace std; 

int main() 
{ 
    char name [5][25]; 
    int age [5]; 
    int i; 

    for (i=0 ; i<5 ; i++) 
    { 
     cout << "Enter name " << i+1 << " : "; 
     cin >> name [i]; 
     cout << "Enter age  : "; 
     cin >> age [i]; 
     cout << endl; 
    } 

    cout << "\n********** Your entered data **********\n\n"; 

    cout << "\tName" << "\t\t" << "Age\n\n"; 

    for (i=0 ; i<5 ; i++) 
    { 
     cout << "\t" << name [i] << "\t\t" << age [i]; 
     cout << endl; 
    } 

    int hold; 

    for (i=0 ; i<5 ; i++) 
    { 
     for (int j=0 ; j<5 ; j++) 
     { 
      if (age [j] > age [j+1]) 
      { 
       hold = age [j]; 
       age [j] = age [j+1]; 
       age [j+1] = hold; 
      } 
     } 
    } 

    cout << "\n\n******* Sorted data (w.r.t age) *******\n\n"; 

    cout << "\tName" << "\t\t" << "Age\n\n"; 

    for (i=0 ; i<5 ; i++) 
    { 
     cout << "\t" << name [i] << "\t\t" << age [i]; 
     cout << endl; 
    } 

    return 0; 
} 

문제는 지난 for 루프입니다. 누구든지이 논리를 구현하는 데 도움이 될 수 있습니까?

+2

그리고 마지막 'for' 루프의 문제점은 무엇입니까? 그것은 나에게 잘 보인다. 아마도 당신의 문제는 다른 곳에있을 것입니다. 힌트 : 나이를 바꾸면 해당 이름으로 무엇을해야합니까? –

+1

@JoeZ 네, 맞습니다. 'for' 루프를 바꾸는 것이 문제입니다. :-) –

답변

1

스왑 논리를 변경하십시오. 이름과 나이를 교환하십시오.

char holdstr[25]; ///Temporary string to swap. 

if (age [j] > age [j+1] || (age[j] == age[j+1]) 
{ 
    //Swap the age and name both. 
    hold = age [j]; 
    strcpy(holdstr, name[j]); 

    age [j] = age [j+1]; 
    strcpy(name[j], name[j+1]); 

    age [j+1] = hold; 
    strcpy(name[j+1], holdstr); 
} 

로직을 쉽게 변경할 수 있도록 함수 내부에 조건을 넣어야합니다.

1

배열을 정렬 할 때 (age) 연령과 이름 간의 연결은 목록으로 표시됩니다. 정렬하기 전에 동일한 인덱스에 저장된 이름과 해당 연령.

  1. 또한 정렬하는 동안이 나이를 교환하는 두 개의 이름을 바꿀 :

    은 당신이 할 수있는 문제, 예를 들어, 이러한 방식의 경우 하나를 해결하려면.
  2. 이름을 나타내는 포인터 또는 인덱스가있는 보조 배열을 사용하고 (문자를 교환하지 않고 첫 번째 방법과 비슷하게) 나이 외에 스왑합니다. 인쇄 할 때이 보조 아이디어를 통해 관련 이름을 찾을 수 있습니다.
  3. 배열에 이름과 나이를 저장하고 이러한 쌍을 스왑하지만 정렬 순서를 결정하는 데 age 부분 만 사용하십시오.
1

또한 해당 이름을 나이로 바꿉니다.

또 하나의 제안으로, 이와 같은 연결된 데이터가있을 때마다 상대적 데이터를 그룹으로 유지하는 것이 바람직하기 때문에 구조를 사용하는 것이 좋습니다.

또한 스왑하면 모든 데이터가 스왑되므로 이러한 유형의 문제가 발생하지 않습니다.

1

일반적으로 연령은 1에서 120까지 다양하기 때문에이를 우리의 장점으로 사용할 수 있습니다. 매핑 기술을 사용하여 나이를 배열 인덱스에 매핑합니다. 데이터 세트가 확장되면 정렬 속도가 빨라집니다. 필자는 5 명을 대상으로이 작업을 시연했지만 링크 된 목록을 연결하여 대규모 데이터 세트에서 쉽게 작동하도록 수정할 수 있습니다.

#include<cstring> 
#include <iostream> 
using namespace std; 

int main() 
{ 
char name [5][25]; 
int age [5]; 
int i; 

char ary[120][25]; // The array used to map. 

for(int i=0;i<120;i++) 
strcpy(ary[i],"");  //initialize to "" 

for (i=0 ; i<5 ; i++) 
{ 
    cout << "Enter name " << i+1 << " : "; 
    cin >> name [i]; 
    cout << "Enter age  : "; 
    cin >> age [i]; 
    cout << endl; 
} 

cout << "\n********** Your entered data **********\n\n"; 

cout << "\tName" << "\t\t" << "Age\n\n"; 

for (i=0 ; i<5 ; i++) 
{ 
    cout << "\t" << name [i] << "\t\t" << age [i]; 
    cout << endl; 
} 

//The sorting , hashing actually 
for (i=0 ; i<5 ; i++) 
{ 
    strcpy(ary[age[i]],name[i]); 
} 

cout << "\n\n******* Sorted data (w.r.t age) *******\n\n"; 

cout << "\tName" << "\t\t" << "Age\n\n"; 

for (i=0 ; i<120 ; i++) 
{ 
    if(strcmp(ary[i],"")) 
    cout<<ary[i]<<" "<<i<<"\n"; // The index will be equal to age 
} 

return 0; 
} 
+0

같은 나이의 사람이 두 명 이상이라면? – Sinkingpoint

+0

필자는 링크 된 목록 구조를 사용하여 인덱스에서 루트를 언급했습니다. –

관련 문제