2013-12-08 64 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. 在數組中存儲一對名稱和年齡並交換這些對,但僅使用年齡部分來確定排序順序。
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

我已經提到過,使用鏈接列表結構,將其根目錄放在索引處。 –

相關問題