0

我一直在尝试找到一种方法来对指针数组(指向字符串)进行排序,然后显示未排序列表和已排序列表,但无论我尝试什么,第二个打印列表始终与原始未排序列表相同列表。您可以提供的任何帮助将不胜感激(如果我的代码一团糟,我很抱歉,我是一名新学生)

这是我的主要(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++;
    }
}
4

1 回答 1

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

于 2013-10-01T20:31:01.670 回答