2014-01-09 4 views
1

Я хочу, чтобы сортировать массив с использованием структуры (мой первый раз с использованием структуры). Эта структура получает FirstName и идентификационный номер некоторых студентов, и проблема в том, что вместо отображения FirstName он показывает другие FirstNames (я использую DEV C++)сортировка структуры в C++

#include<iostream> 
#include<fstream> 
#include<conio.h> 
#include <sstream> 
using namespace std; 
struct Student 
{ 
    long long int ID; 
    string FirstName,LastName; 
} mystudent[100]; 
void PrintInformation(Student sEmployee[100],int b) 
{ 
    for(int i=0;i<b;i++) 
    { 
      cout << "First Name: " << sEmployee[i].FirstName<< endl; 
      cout << "ID: " << sEmployee[i].ID<< endl; 
      } 
} 
void Sort (Student mine); 
int main() 
{ 
    int n, c, d, temp; 
    cout << "Enter element: "; 
    cin>>n; 
    for(int i=0;i<n;i++) 
    { 
    cout << "Enter FirstName "<<i+1<<": "; 
    cin>>mystudent[i].FirstName; 
    } 
    for(int i=0;i<n;i++) 
    { 
    cout << "Enter ID "<<mystudent[i].FirstName<<": "; 
    cin>>mystudent[i].ID; 
    } 
    for (int i = 1 ; i <= n - 1; i++) 
    { 
    d = i; 
    while (d > 0 && mystudent[i].ID < mystudent[i-1].ID) 
    { 
     temp   = mystudent[i].ID; 
     mystudent[i].ID = mystudent[i-1].ID; 
     mystudent[i-1].ID = temp; 
     mystudent[i-1].FirstName=mystudent[i].FirstName; 
     d--; 
    } 
    } 
    cout<<"Sorted list in ascending order:\n"; 

    PrintInformation(mystudent,n); 
    getch(); 
    return 0; 
} 
+0

Если это для реального кода производства, я бы порекомендовал [используя зЬй :: то в массиве] (http://stackoverflow.com/questions/15669900/using-sort-in-stl-to- sort-a-array) и [предоставление строгого ограничения для оператора для вашего класса Student] (http://stackoverflow.com/questions/9336579/overloading-comparison-operators-to-work-with-stl-sort-in- c) также может иметь смысл и пользовательская операторская функция вместо оператора с меньшим значением. –

+0

Я использовал код ниже ** woolstar **, чтобы заменить имена Firstnames, но теперь он не сортируется правильно. – user2589043

+0

спасибо всем, что моя проблема решена. – user2589043

ответ

2

Этот код:

temp   = mystudent[i].ID; 
    mystudent[i].ID = mystudent[i-1].ID; 
    mystudent[i-1].ID = temp; 
    mystudent[i-1].FirstName=mystudent[i].FirstName; 

обменивает ID, но копирует FirstName. Хуже того, он ничего не делает с LastName.

Попробуйте вместо этого:

struct Student tempstudent = mystudent[i] ; 
mystudent[i]= mystudent[i-1] ; 
mystudent[i-1]= tempstudent ; 

Или еще лучше, использовать STL.

#include <utility> 

std::swap(mystudent[i], mystudent[i-1]) ; 

Примечание, swap в <algorithm>, если вы предварительно C++ 11.

-2

Ваш код заменяет только поле структуры ID. Вы назначаете (копируете) поле FirstName и ничего не делаете с LastName. struct s может быть назначен непосредственно друг с другом с помощью оператора =:

struct Student temp = mystudent[i] ; 
mystudent[i]= mystudent[i-1] ; 
mystudent[i-1]= temp ; 
+2

Серьезно? Если вы собираетесь скопировать мой ответ, по крайней мере введите его снова, а не копировать и вставлять. – woolstar

2

Обеспечить operator< и использовать std::sort, и полагаться на копию по умолчанию конструктора по поступает правильно. Если вам нужно сортировать более чем одним способом, вы можете предоставить объект-компаратор для алгоритма сортировки вместо предоставления operator<.

... 

struct Student { 
    long long int ID; 
    string FirstName,LastName; 
} mystudent[100]; 

bool operator<(const Student& s1, const Student& s2) { 
    return s1.ID < s2.ID; 
} 

... 

int main() { 
    ... 
    std::sort(mystudent,mystudent+100) 
    cout<<"Sorted list in ascending order:\n"; 
    PrintInformation(mystudent,n); 
    getch(); 
    return 0; 
} 

Если ваш компилятор поддерживает C++ 11 можно попеременно использовать лямбда-выражения инлайн для сортировки, и опустить operator<.

... 

struct Student { 
    long long int ID; 
    string FirstName,LastName; 
} mystudent[100]; 

... 

int main() 
{ 
    ... 
    std::sort(mystudent, mystudent+100, 
    [](mystudent const & a, mystudent const &b){return a.ID < b.ID;}); 

    cout<<"Sorted list in ascending order:\n";  
    PrintInformation(mystudent,n); 
    getch(); 
    return 0; 
} 
Смежные вопросы