2014-01-11 38 views
0

大家好我通過使用數組創建了一個通訊錄!...在這裏,我得到了排序字符串類型數組的問題....當我想對聯繫人進行排序時它將只對第一個名稱進行排序移動第二個名字和電話麻木.....等等。我沒有清楚的想法移動整行排序在地址簿! ...我的意思是同時移動[名字,姓氏,電話號碼,電子郵件]到下一行!...這是我的代碼!請幫我這個! [Sorting Arrays]

void sortRecords() { 

ofstream Cfile; 
Cfile.open("addressbook.txt", ios::in); 

string temp; 
for (int i=0; i<line()-1; ++i) 
{ 
    for (int j=0; j<line()-1-i; j++) 
    { 
     while (first_name[j]>first_name[j+1]) 
     { 
      temp= first_name[j+1]; 
      first_name[j+1]=first_name[j]; 
      first_name[j]=temp; 
     } 
    } 
} 
for (int p=0; p<line();p++) 
{ 

    Cfile<<first_name[p]<<setw(10)<<sur_name[p]<<setw(10)<<phone_number[p]<<setw(10)<<email[p]<<endl; 
} 
Cfile.close(); 
} 

回答

0

的有效的方法來做到這一點是用「間接指針」的第二(數值)陣列 - 這說「在i最初的項目現在是j」。那麼你只需交換這些指數;但是當你完成後,你可以通過運行一次這個索引數組並創建一個元素副本來生成排序後的數組。當你排列「一堆東西」時,這通常是一個很好的方法。

或者,您只需將所有項目移動到新位置;你會想寫一個「交換」功能來保持你的代碼清晰可辨...

當你想在數組中保存一堆相關的項目時,通常聲明一個結構是一個好主意。在你的情況,這種結構可能是這樣的:

typedef struct { 
    char first_name[32]; 
    char last_name[32]; 
    char phone_number[16]; 
} entry; 

然後你就可以宣佈你的電話本爲

entry phoneBook[100]; 

這將創造100個電話簿條目足夠的空間。

最後,當你經過條目列表,你可以修改你的冒泡排序是這樣的(假設條目爲n =號):

for (int i=0; i < n - 1; i++) 
{ 
    for (int j = i; j < n; j++) 
    { 
    if (strcmpi(entries[j].first_name, entries[j+1].first_name) > 0) 
    { 
     swap(entries, j, j+1); 
    } 
    } 
} 

最後,你將有一個swap功能像這樣:

void swap(entry* e, int i, int j) { 
// swap all elements of e[i] and e[j] 
    entry temp; 
    strcpy(temp.first_name, e[i].first_name); 
    strcpy(temp.last_name, e[i].last_name); 
    strcpy(temp.phone_number, e[i].phone_number; 
    strcpy(e[i].first_name, e[j].first_name); 
    strcpy(e[i].last_name, e[j].last_name); 
    strcpy(e[i].phone_number, e[j].phone_number; 
    strcpy(e[j].first_name, temp.first_name); 
    strcpy(e[j].last_name, temp.last_name); 
    strcpy(e[j].phone_number, temp.phone_number; 
}