2015-11-03 4 views
-3

Мне нужно создать программу, которая может сортировать учеников по классам и по алфавиту. Может кто-нибудь сказать мне, что является лучшим и easyiest способ решить эту проблемуСортировка студентов по классам и алфавиту C++

#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

Есть ли причина, по которой вы не можете использовать зЬй :: СНП пользовательский компаратор? http://en.cppreference.com/w/cpp/algorithm/sort – skypjack

+0

Вы ищете алгоритм сортировки для решения этой проблемы. Одной из простейших функций сортировки, которая будет работать для этого, будет сортировка пузырьков. –

+4

Похоже, вы немного продвинулись вперед. Практикуйте сначала сортировку всего массива целых чисел. – molbdnilo

ответ

0

лучший и easyiest способ решить эту проблему

лучший и простой способ, чтобы определить 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); 

EDIT: Если вы хотите, чтобы два отдельные функции сортировки по Grade ИЛИ Name. Вы можете определить две различные функции сравнения и передать их std::sort (как объяснено в Jarod42 ответа)

+0

Он должен сортировать их по счету и по имени, поэтому, возможно, было бы лучше использовать пользовательские функции сравнения и передать их в 'std :: sort'. – skypjack

+0

@skypjack Пользовательский 'operator <' работает также –

+0

Я думаю, что * и * означает наличие двух разных функций сортировки, а не один, основанный на двух параметрах. Это все. – skypjack

-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++ Решение

перегрузки 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 
} 
+1

OP уже правильно использовал 'std :: string', и вы сказали ему прибегнуть к' char * '? Не говоря уже о 'void *', оправах C-стиля и о многом? –

+0

@ChristianHackl Я предложил два решения. Один из них - это путь C, а другой - способ C++, который не включает в себя «void *» и «char *» и C-Style. Я предоставил решение C, потому что это сделает этот ответ также применимым, если кто-то программирует на C, а не на C++. – stackptr

+0

С помощью той же линии рассуждений вы можете публиковать альтернативы для Pascal, COBOL, Java, Visual Basic и Befunge, на всякий случай, если кто-то программирует на этих языках. –

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; 
      } 
     } 
    } 
} 
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(); 
    }); 
} 
Смежные вопросы