按字母顺序排序名称

时间:2013-12-08 18:33:47

标签: c++ arrays sorting ascii alphabetical

我正在尝试按字母顺序对名称进行排序 例如,如果用户输入名称和GPA:

Names          GPA
Peter          2.8
Robert         5.6
David          7.8

输出应为: -

Names          GPA
David          7.8
Peter          2.8
Robert         5.6

到目前为止,这是我的程序( INCOMPLETE ): -

#include <iostream>
using namespace std;

int main()
{
    char name [5][25];
    float gpa [5];
    int i;

    for (i=0 ; i<5 ; i++)
    {
        cout << "Enter name " << i+1 << "  :   ";
        cin >> name [i];
        cout << "Enter GPA     :   ";
        cin >> gpa [i];
        cout << endl;
    }

    cout << "\n********** Your entered data **********\n\n";

    cout << "\tName" << "\t\t" << "GPA\n\n";

    for (i=0 ; i<5 ; i++)
    {
        cout << "\t" << name [i] << "\t\t" << gpa [i];
        cout << endl;
    }

    for (i=0 ; i<5 ; i++)
    {
        for (int j=0 ; j<1 ; j++)
        {
            cout << (int) name [i][j] << endl;



        }
    }

    cout << "\n\n******* Sorted data (w.r.t name) *******\n\n";

    cout << "\tName" << "\t\t" << "GPA\n\n";

    for (i=0 ; i<5 ; i++)
    {
        cout << "\t" << name [i] << "\t\t" << gpa [i];
        cout << endl;
    }

    cout << endl;

    return 0;
}

请记住,只应按字母顺序对名称进行排序。我在中间for循环中取了输入名称的第一个字符的ASCII值,但是: - 1-'s'的ASCII码与'S'不同(这对我来说是个问题) 2-我似乎无法创建一个逻辑来比较名字的第一个字母的ASCII值,然后相应地对它们进行排序。然后将名称与已排序的字母列表相关联并显示结果。此外,GPA应与名称相关联。

任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:3)

如果使用std::toupper将名称的字符转换为大写,那么您应该能够使用&lt;来比较字符串。操作

编辑:如果您不想使用std::sort: - )

答案 1 :(得分:3)

这是使用std :: sort的答案。我改变了一些类似C的方法,使用std :: sort实际上迫使我去做。比较函数(compareStudents)需要对象,所以我必须创建结构。 Vector虽然可以继续使用数组,但使用的数据也是如此,但这通常是不受欢迎的。

#include <iostream>
#include <algorithm>
#include <vector>
#include <string>

using namespace std;

struct Student {
    string name;
    float gpa;

    Student(string name, float gpa) {
        this->name = name;
        this->gpa = gpa;
    }
};

bool compareStudents(Student a, Student b) {
    return a.name.compare(b.name) < 0;
}

int main() {
    const int studentCount = 2;
    vector<Student> studentVector;
    int i;

    for (i = 0 ; i < studentCount ; i++) {
        cout << "Enter name " << i + 1 << "  :   ";
        string name;
        cin >> name;
        cout << "Enter GPA     :   ";
        float gpa;
        cin >> gpa;
        cout << endl;

        studentVector.push_back(Student(name, gpa));
    }

    cout << "\n********** Your entered data **********\n\n";

    cout << "\tName" << "\t\t" << "GPA\n\n";

    vector<Student>::iterator it = studentVector.begin();
    for (; it != studentVector.end(); ++it) {
        Student student = *it;
        cout << "\t" << student.name << "\t\t" << student.gpa;
        cout << endl;
    }

    sort(studentVector.begin(), studentVector.end(), compareStudents);

    cout << "\n\n******* Sorted data (w.r.t name) *******\n\n";

    cout << "\tName" << "\t\t" << "GPA\n\n";

    it = studentVector.begin();
    for (; it != studentVector.end(); ++it) {
        Student student = *it;
        cout << "\t" << student.name << "\t\t" << student.gpa;
        cout << endl;
    }

    cout << endl;

    return 0;
}

答案 2 :(得分:0)

    #include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
class stu
{
char name[40];
int cgpa;
public:
void assign()
{cin>>name;
cin>>cgpa;
}
void display()
{cout<<name<<endl<<cgpa<<endl;
}
friend void align(stu *s,int v);
};
void align(stu *s,int v)
{for(int j=0;j<v-1;j++)
{for(int i=0;i<v-j-1;i++)
{//buble sort
if(strcmp((s+i)->name,(s+i+1)->name)>0)
{char l[40];
strcpy(l,(s+i)->name);
strcpy((s+i)->name,(s+i+1)->name);
strcpy((s+i+1)->name,l);
//swapping cgpa
int t=(s+i)->cgpa;
(s+i)->cgpa=(s+i+1)->cgpa;
(s+i+1)->cgpa=t;
}
}}}

int main()
{stu s[10];int i;
for(i=0;i<5;i++)
s[i].assign();
align(s,5);
cout<<endl<<endl;
for(i=0;i<5;i++)
s[i].display();
}