按等级和字母顺序排序学生c ++

时间:2015-11-03 14:37:16

标签: c++ sorting

我需要制作程序,可以按成绩和字母顺序对学生进行排序。有人能告诉我,这是解决这个问题的最佳和最简单的方法

 #include <iostream>
using namespace std;

class Student {
private:
    string name;
    int grades;
    int score;
public:
    string Name() { return name;  }
    int Score() { return score; }
    char Grades() { return grades;  }

    void setName(string n) {
        name = n;
    }

    void setScore(int score) {
        score = s;
    }

    void setGrades(char g) {
        grades = g; 
    }

};Student


void sortByScor(int n, Student data[]);
void sortByAlphabet (int n, Student data[]);



void main() {

    Student s[20];
    int max = 0;
    int size = 0;
    char cek = 'y';
    while (cek == 'y') {

        system("cls");
        cout << "Enter number of student: ";
        cin >> size;
        for (int i = 0; i < size; i++)
        {
            cout << "student" << i+1 << "name: ";
            cin >> s[i].Name;
            cout << "Grades of student" << i + 1 << "score:";
            cin >> s[i].Grades;
            if (s[i].Score >= 90) s[i].Grades = 'A';
            else
                if (s[i].Score >= 80) s[i].Grades = 'B';
                else
                    if (s[i].Score >= 70) s[i].Grades = 'C';
                    else
                        if (s[i].Score >= 60) s[i].Grades = 'D';
                        else
                            s[i].Grades = 'F';
            if (max < s[i].Score) max = s[i].Score;
        }
        cout << endl;
        for (int i = 0;i < size;i++) {
            cout << i + 1 << "student" << endl;
            cout << "name of student:" << s[i].Name << endl;
            cout << "score of student" << s[i].Score << endl;
            cout << "grade of student" << s[i].Grades << endl;
        }
        cout << endl << "highest grade: " << endl;
        for (int i = 0;i < size;i++) {

            if (s[i].Grades == max)
                cout << s[i].Name << endl;
        }
        sortByAlphabet(size, s);
        sortByScor(size, s);
        cout << endl;
        for (int i = 0;i < size; i++) {

            cout << s[i].Name << endl;
        }
    }

}

void sortByAlphabet(int n, Student data[]) {


}

void sortByScore(int n, Student data[]) {

    int i, j, min;
    Student tmp;

    for (int i = 0; i <= n; j++) {
        if (data[j].Name < data[min].Name)
            min = j;
    }
    tmp = data[i];
    data[i] = data[min];
    data[min] = tmp;



    system("Pause");



} 

4 个答案:

答案 0 :(得分:1)

<algorithm>std::sort

void sortByScore(int n, Student data[])
{
    std::sort(data, data + n, [](const Student& lhs, const Student& rhs)
    {
        return lhs.Score() < rhs.Score();
    });
}

void sortByAlphabet (int n, Student data[])
{
    std::sort(data, data + n, [](const Student& lhs, const Student& rhs)
    {
        return lhs.Name() < rhs.Name();
    });
}

答案 1 :(得分:0)

  

解决此问题的最佳和最简单的方法

最好和最简单的方法是为您的学生operator<定义class

operator<

的示例
bool operator< (const Student& left, const Student& right){ 
    if(left.Grades() == right.Grades()){
        if(left.Name() == right.Name()){
             return false;
        }
        return left.Name() < right.Name();
    }
    return left.Grades() < right.Grades();
}

然后使用标准std::sort函数。当您使用sort函数时,将使用学生类的operator<定义。

std::sort(s, s + size);

编辑:如果您想要两个单独的函数按GradeName排序。您可以定义两个不同的比较函数并将它们传递给std::sort(如Jarod42答案中所述)

答案 2 :(得分:0)

您正在寻找编写排序算法或使用内置于c ++中的约定。以下是使用学生姓名进行冒泡排序排序算法的示例。我建议阅读排序算法以更好地理解这个和其他算法

void sortByAlphabet(int n, Student data[])
{
    bool swapped = true;
    while (swapped)
    {
        swapped = false;
        for (int i = 0; i < n - 1; i++)
        {
            if (data[i + 1].Name() < list[i].Name())
            {
                swap(list[i + 1], list[i]);
                swapped = true;
            }
        }
    }
}

答案 3 :(得分:-1)

要按顺序对学生进行排序,只需拥有struct

即可
struct student {
    char *name;
    int  grades;
    int  score;
};

现在,获取一个student的数组:

const int NSTUDENT = 8;
student classroom[NSTUDENT];

将该数组传递给qsort<stdlib.h>)。

qsort(classroom,                // pointer to first element of array
      NSTUDENT,                 // length of array
      sizeof *classroom,        // size of one element
      cmp);                     // a pointer to the comparison function

注意cmp:这是一个指向比较两个student对象的函数的指针:

int cmp(const void *a, const void *b)
{
    student *p = (student *) a;
    student *q = (student *) b;

    // now compare p and q. Return -1 if p < q, 0 if p == q, and 1 if p > q   
}

但这种方式并不是那么好,因为char *通常不如std::string安全,尽管在正确和谨慎使用时效率更高。此外,由于这是C ++,最好利用C ++的功能:

C ++解决方案

重载operator<,然后将数组传递给std::sort

std::sort(classroom, classroom + NSTUDENT);

bool student::operator<(const student &a, const student &b)
{
    // return true if a < b, or false if otherwise
}