NickAndNick

Массив структур students. Сортировка.

Dec 27th, 2012
173
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <iostream>
  2. #include <iomanip>
  3. #include <string>
  4.  
  5. using namespace std;
  6.  
  7. struct student {
  8. public:
  9.     student() : fullname(L"-"), group(L"-"), point(0) { };
  10.     student(wstring _fullname, wstring _group, double _point) : fullname(_fullname), group(_group), point(_point) { };
  11.     student(const student &);
  12.     ~student();
  13.  
  14.     void input();
  15.     void output()const;
  16.     student operator =(const student &);
  17.     friend bool operator==(const student &, const student &);
  18.     friend bool operator!=(const student &, const student &);
  19.     void check_double(const wstring);
  20.  
  21.     wstring fullname;
  22.     wstring group;
  23.     double point;    
  24. };
  25.  
  26. void ru();
  27. void uswap(student &, student &);
  28. void quick_sort(student *, const size_t, const size_t);
  29.  
  30. int main() {
  31.     ru();
  32.     student ivanov = student(L"Иванов Игорь Филиппович", L"115а", 4.12);
  33.     student petrov = student(L"Петров Аркадий Егорович", L"114в", 4.27);
  34.     student sidorova = student(L"Сидорова Наталья Петровна", L"119г", 4.81);
  35.  
  36.     if (ivanov == petrov) wcout << L"Иванов и Петров совпадают\n";
  37.     if (petrov != sidorova) wcout << L"Петров и Сидорова не совпадают\n";
  38.  
  39.     const size_t size = 6;
  40.     student students[size];
  41.     students[0] = ivanov;
  42.     students[1] = petrov;
  43.     students[2] = sidorova;
  44.     for (size_t n = 3; n < size; n++) students[n].input();
  45.    
  46.     wcout << L"\n\t\t\tИсходный список студентов:\n\n";
  47.     for (size_t n = 0; n < size; n++) students[n].output();
  48.  
  49.     quick_sort(students, 0, size - 1);
  50.     wcout << L"\n\t\t Отсортированный список студентов:\n\n";
  51.     for (size_t n = 0; n < size; n++) students[n].output();
  52.  
  53.     wcout << L"\n\t\t\t Вывод пустого объекта:\n\n";
  54.     student unknown;
  55.     unknown.output();
  56.  
  57.     cin.get();
  58.     return 0;
  59. }
  60.  
  61. student::~student() {
  62.     group = fullname = L"";
  63.     point = 0;
  64. }
  65.  
  66. student::student(const student & _student) {
  67.     this->fullname = _student.fullname;
  68.     this->group = _student.group;
  69.     this->point = _student.point;
  70. }
  71.  
  72. student student::operator=(const student & _student) {
  73.     this->fullname = _student.fullname;
  74.     this->group = _student.group;
  75.     this->point = _student.point;
  76.     return *this;
  77. }
  78.  
  79. bool operator==(const student & _left, const student & _rigth) {
  80.     bool flag;
  81.     if (_left.fullname == _rigth.fullname && _left.group == _rigth.group && _left.point == _rigth.point) flag = true;
  82.     else flag = false;
  83.     return flag;
  84. }
  85.  
  86. bool operator!=(const student & _left, const student & _rigth) {
  87.     return !(_left == _rigth);
  88. }
  89.  
  90. void student::input() {
  91.     wcout << L"Введите ФИО студента: "; getline(wcin, fullname);
  92.     wcout << L"Введите группу:       "; getline(wcin, group);
  93.     check_double(L"Введите средний балл: ");    
  94.     system("cls");
  95. }
  96. void student::output()const {
  97.     wchar_t v = L' ';
  98.     streamsize accuracy = 2, fio = 48, grp = 8, pnt = 6;
  99.     wcout << v << left  << setw(fio) << fullname
  100.           << right << setw(grp) << group
  101.           << right << setw(pnt) << fixed << setprecision(accuracy) << point << endl;
  102. }
  103.  
  104. void student::check_double(const wstring _msg) {
  105.     do {        
  106.         wcout << _msg; cin >> point;
  107.         if (cin.good() && point >= 0 && point <= 5) break;
  108.         else {
  109.             cin.clear();
  110.             cin.ignore(80,'\n');
  111.             wcout << L"\aВы ошиблись!\n";
  112.         }
  113.     } while (true);
  114.     fflush(stdin);
  115. }
  116.  
  117. void quick_sort(student * _students, const size_t _beg, const size_t _end) {
  118.     int n = (int)_beg, m = (int)_end;
  119.     student mid;
  120.     mid.fullname = _students[(_beg + _end) >> 1].fullname;
  121.  
  122.     do {
  123.         while (_students[n].fullname  < mid.fullname  && n < (int)_end) ++n;
  124.         while (_students[m].fullname  > mid.fullname  && m > (int)_beg) --m;
  125.  
  126.         if (n <= m) {
  127.             if (n < m) uswap(_students[n], _students[m]);
  128.             ++n;
  129.             --m;
  130.         }
  131.     } while (n <= m);
  132.  
  133.     if ((int)_beg < m) quick_sort(_students, _beg, m);
  134.     if (n < (int)_end) quick_sort(_students, n, _end);
  135. }
  136.  
  137. void uswap(student & _a, student & _b) {
  138.     student temp = _a;
  139.     _a = _b;
  140.     _b = temp;
  141. }
  142.  
  143. void ru() {
  144.     wcout.imbue(locale("rus_rus.866"));
  145.     wcin.imbue(locale("rus_rus.866"));
  146. }
RAW Paste Data