2013-10-01 37 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>>来存储名称和年龄。然后,您可以使用内置的排序功能对列表进行排序(如果需要保留原始内容,也可以轻松制作它的副本)。