#pragma warning(disable:4996) #include"Exam.h" using namespace std; Exam::Exam(Examsave* insave) { this->save = *insave; studentnum = insave->studentnum; strcpy(name, insave->name); strcpy(filename, insave->filename); ifstream ibin(filename, ios::in, ios::binary); Item tmp; for (int i = 0; i < studentnum; i++) { ibin.read((char*)&tmp, sizeof(Item)); items.push_back(tmp); } ibin.close(); if (items.size() > 0) { sort(items.begin(), items.end()); reverse(items.begin(), items.end()); } } Exam::Exam(char inname[]) { strcpy(name, inname); studentnum = 0; ifstream tmp(inname, ios::in, ios::binary); if (tmp.good()) { string nname; nname += inname; for (auto i = 1; i < 100; i++) { nname += to_string(i); ifstream tmp(nname, ios::in, ios::binary); if (!tmp.good()) { break; } } strcpy(filename, nname.c_str()); } else { strcpy(filename, inname); } } void Exam::addItem(long long int studentNo, double score[9]) { rmvItem(studentNo); Item tmp(studentNo, score); items.push_back(tmp); sort(items.begin(), items.end()); reverse(items.begin(), items.end()); studentnum++; } void Exam::addItem(const Item& item) { rmvItem(item.getStuNo()); items.push_back(item); sort(items.begin(), items.end()); reverse(items.begin(), items.end()); studentnum++; } void Exam::saveAll(ofstream& examsout) { strcpy(save.filename, filename); strcpy(save.name, name); studentnum = items.size(); save.studentnum = studentnum; ofstream obin(filename, ios::out, ios::binary); Item tmp; for (auto i = items.begin(); i < items.end(); i++) { tmp = *i; obin.write((char*)&tmp, sizeof(Item)); } obin.close(); examsout.write((char*)&this->save, sizeof(Examsave)); } void Exam::dspHeader() { cout << setw(20) << "Ãû³Æ" << setw(15) << "ѧÉúÊý" << endl; } void Exam::dsp() const { cout << setw(20) << name << setw(15) << studentnum << endl; } void Exam::dspName() const { cout << name; } void Exam::dspName(int w) const { cout << setw(w) << name; } void Exam::dspItems() const { for (auto i = items.begin(); i < items.end(); i++) { i->dsp(); cout << setw(6) << distance(items.begin(), i) + 1 << endl; } } void Exam::toCsvItems(ofstream& csv) const { for (auto i = items.begin(); i < items.end(); i++) { i->toCsv(csv); csv << distance(items.begin(), i) + 1 << endl; } } bool Exam::itemExists(long long int studentNo) const { for (auto i = items.begin(); i < items.end(); i++) { if (i->getStuNo()== studentNo) { return true; } } return false; } bool Exam::rmvItem(long long int studentNo) { for (auto i = items.begin(); i < items.end(); i++) { if (i->getStuNo() == studentNo) { items.erase(i); studentnum--; return true; } } return false; } void Exam::changeName(char name[]) { strcpy(this->name, name); } const Item* Exam::StudentInquiry(long long int studentNo) const{ for (auto item = items.begin(); item < items.end(); item++) { if (item->getStuNo() == studentNo) { return &(*item); } } return nullptr; } int Exam::getStuRanking(const Item& item) { for (auto i = items.begin(); i < items.end(); i++) { if (i->stuNoEqual(item)) { return distance(items.begin(), i) + 1; } } return -1; } void Exam::rm() const { remove(filename); }