我需要制作程序,可以按成绩和字母顺序对学生进行排序。有人能告诉我,这是解决这个问题的最佳和最简单的方法
#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");
}
答案 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);
编辑:如果您想要两个单独的函数按Grade
或Name
排序。您可以定义两个不同的比较函数并将它们传递给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
}