Сортировка вектора структур и векторных частей в других функциях? - PullRequest
1 голос
/ 01 ноября 2011

У меня есть vector из structs.Мне нужно отсортировать вектор в алфавитном порядке по фамилии студента в каждом struct в векторе students.Это возможно?Каждый учащийся в struct имеет следующую информацию:

struct Student
{
    string lastName;
    string firstName;
    string stdNumber;
    double assgn1;//doubles are what I want to add in another function.
    double assign2;
    double assign3;
    double assign4;
    double midTerm;
    double finalGrade;

bool operator<(Student const &other) const { 
    return lastName < other.lastName;
}
};

. Здесь мой students вектор создан и заполнен:

int getFileInfo()
{
int failed=0;
ifstream fin;
string fileName;
vector<Student> students;// A place to store the list of students
Student s;                  // A place to store data of one student
cout<<"Please enter the filename of the student grades (ex. filename_1.txt)."<<endl;
do{
    if(failed>=1)
    cout<<"Please enter a correct filename."<<endl;
    cin>>fileName;
    fin.open(fileName.c_str());// Open the file
    failed++;
}while(!fin.good());
     while (fin >> s.firstName >> s.lastName >> s.stdNumber){
     cout<<"Reading "<<s.firstName<<" "<<s.lastName<<" "<<s.stdNumber<<endl;
     students.push_back(s); 
}
     vector<Student>::iterator loop = students.begin();
     vector<Student>::iterator end  = students.end();
     fin.close();   

     return 0;
}

Поэтому я хочу отсортировать struct по фамилии, а затем сможете манипулировать каждым “Student” struct` в векторе в ДРУГОЙ ФУНКЦИИ.Можно ли это сделать?

Я хочу иметь возможность добавлять double частей к каждому ученику в векторе, который у меня есть в другой функции.Затем я хочу иметь возможность распечатать всю информацию о каждом студенте.Я могу распечатать информацию о каждом ученике, если я делаю это в функции, в которой находится вектор students, но мне нужно напечатать в другой функции, void gradeInput().Я буду cin>> каждый double класс для каждого студента, по одному студенту за раз.Я думал, что это будет выглядеть примерно так:

void gradeInput()
{
For(each student)// I don’t know what to do to in this for loop to loop through 
//each student. I want to make it so everywhere “stud” is change to the 
//next student after one loop iteration.

 //I made a default `Student` called ‘stud’ to show this example..
    cout<<"Student "<<stud.firstName<<" "<<stud.lastName<<" "<<stud.stdNumber<<":";
    cout<<"Please, enter a grade (between 0.0 and 100.0) for ... "<<endl;
    cout<<"Assignment 1:";
    cin>>stud.assgn1;
    cout<<endl;
    cout<<"Assignment 2:";
    cin>>stud.assign2;
    cout<<endl;
    cout<<"Assignment 3:";
    cin>>stud.assign3;
    cout<<endl;
    cout<<"Assignment 4: ";
    cin>>stud.assign4;
    cout<<endl;
    cout<<"MidTerm: ";
    cin>>stud.midTerm;
    cout<<endl;
    cout<<"Final Exam: ";
    cin>>stud.finalGrade;
    cout<<endl;

return;
}

Надеюсь, это имеет смысл, и я могу получить некоторую помощь!Моя учительница мало помогает мне, так как она не отвечает на электронные письма, и у нее 45 минут рабочего времени, так что все вы, дружелюбные люди, - большой плюс!Спасибо!
PS Извините за плохое форматирование кода, я все еще пытаюсь выяснить ввод кода сайта.

1 Ответ

0 голосов
/ 01 ноября 2011

Получить сортировку для работы довольно легко - просто определите operator< для этого типа:

class student {
    // ...

    bool operator<(student const &other) const { 
        return last_name < other.last_name;
    }
};

Обратите внимание, что вы можете (например) использовать имя студента в качестве дополнительного поля сортировки, которое будет использоваться только в том случае, если / если фамилии идентичны.

Что касается чтения данных для учащегося, обычно вы хотите сделать это в функции с именем operator>>, например:

std::istream &operator>>(std::istream &is, student &s) { 
    is >> student.last_name;
    is >> student.first_name;
    // read other fields;
    return is;
}

Если это вообще разумно, я бы не стал делать запись интерактивной, как у вас. Хотя это часто встречается в студенческих заданиях, это делает программу практически непригодной для использования. Распечатка информации обычно выполняется с помощью operator<<, который по сути является зеркальным отображением operator>> (т. Е. Записывает вместо чтения, но должен записывать поля в том же порядке, в формате, который может прочитать operator>>). ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...