2013-10-01 68 views
0

我一直在試圖找到一種方法來排序指針數組(指向字符串),然後顯示無排序列表和排序列表,但沒有mater我嘗試第二個打印的列表總是與原始的非排序列表相同。你可以提供任何幫助將不勝感激(我很抱歉,如果我的代碼是一個爛攤子我是新來的學生)幫助排序指向一個字符串aray在c + +指針陣列

這是我的主要(lab5.cpp)

#include <cstdlib> 
#include <iostream> 
#include "student.h" 
#include <string> 
using namespace std; 

int main(int argc, char *argv[]) 
{ 
    student stu; 
    stu.list(); 
    system("PAUSE"); 
    return EXIT_SUCCESS; 
} 

這是我的頭(student.h)

#include <string> 
class student 
{ 
public: 
    student(); 
    void setnameage(); 
    int getage(int); 
    std::string getname(int); 
    void sort(); 
    void list(); 

private: 
    std::string name[50]; 
    std::string nameL[50]; 
    int age[50]; 
    std::string * Pname ; 
    int * Page; 
    int amount; 
}; 

這是我的目標(student.cpp)

#include <iostream> 
#include <iomanip> 
#include "student.h" 
#include <string> 

using namespace std; 
//constructor 
student::student() 
{ 
    int i = 0; 
    amount = 0; 
    Pname = name; 
    Page = age; 
    while (i != 50) 
    { 
     age[i] = 0; 
     name[i] = "A"; 
     i = i +1 ; 
    } 
    std::cout << "Enter number of students(max 50) \n" << ">"; 
    std::cin >> amount; 
} 

//sets the neame and the age 
void student::setnameage() 
{ 
    int i = 0; 
    while (i != amount) 
    { 
     std::cout << "Enter name " << i+1 <<" (last, first):"; 
     std::cin >> name[i] >> nameL[i]; 
     std::cout << "enter age"; 
     std::cin >> age[i]; 
     i++; 
    } 
} 

//get age 
int student::getage(int i) 
{ 
    return age[i]; 
} 

//get name 
std::string student::getname(int i) 
{ 
    return name[i]; 
} 

//sorts the aray of pointers 
void student::sort() 
{ 
    std::string tempL; 
    int tempN; 
    i = 0 
    for (int i = 1; i <= amount-1; i++) 
    { 
     for(int j=i+1; j <= amount; j++) 
     { 
      if(Pname[i].compare(Pname[j]) > 0) 
      { 
       tempN = Page[i]; 
       Page[i] = Page[j]; 
       Page[j] = tempN; 
       // tempL = Pname[i]; 
       Pname[i].swap(Pname[j]); 
       //Pname[j] = tempL; 
      } 
     } 
    } 
} 

//displayes the final results   
void student::list() 
{ 
    setnameage(); 
    int i = 0; 
    std::cout << "original list\n-------------"; 
    while(i != amount) 
    { 
     std::cout<< "\n" << getname(i) << ">" << getage(i); 
     i++; 
    } 
    sort(); 
    i = 0; 
    std::cout << "\nAlphabetized list\n-------------"; 
    while(i != amount) 
    { 
     std::cout<< "\n" << Pname[i] << ">" << Page[i]; 
     i++; 
    } 
} 
+3

請更正製表格和一般格式。這將使閱讀你的代碼更容易,也許你會得到更多的幫助。 – SJuan76

+0

你正嘗試按'Pname'排序,但你永遠不會將'Pname'賦值爲有效值。 –

回答

0

首先我要說你的程序有很多的設計問題,但要回答你的實際問題:

問題是你沒有一個50個指針的數組,你只有一個指向數組的開始的指針。在你的排序功能中,你有這條線來交換字符串指針:

Pname[i].swap(Pname[j]); 

但是這不交換指針,它交換原始字符串。因此,不是以最初的字符串數組結束,而是重新排列指向這些字符串的數組,最後得到一組重新排序的字符串。

您應該將std::string* pName;更改爲std::string* pName[50];。在程序開始時,初始化數組以指向字符串。

for (int i = 0; i < 50; i++) pName[i] = &name[i]; 

然後在你的排序功能,你應該使用std::swap()交換指針本身:

std::swap(pName[i], pName[j]); 

最後,由於pName[i]現在是一個指針,只要你真正想訪問你不得不取消引用字符串指針。例如,

if(Pname[i].compare(Pname[j]) > 0) 

成爲

if(Pname[i]->compare(*Pname[j]) > 0) 

與分揀時代的方法存在同樣的問題。

一個更好的設計爲您的程序將使用std::list<std::pair<std::string, int>>來存儲名稱和年齡。然後,您可以使用內置的排序功能對列表進行排序(如果需要保留原始內容,也可以輕鬆製作它的副本)。