hello world
This commit is contained in:
commit
52dd9b6adf
|
@ -0,0 +1,134 @@
|
||||||
|
#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);
|
||||||
|
}
|
|
@ -0,0 +1,47 @@
|
||||||
|
#pragma once
|
||||||
|
#include<algorithm>
|
||||||
|
#include<fstream>
|
||||||
|
#include<iomanip>
|
||||||
|
#include<iostream>
|
||||||
|
#include<string>
|
||||||
|
#include<vector>
|
||||||
|
#include"Item.h"
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
struct Examsave {
|
||||||
|
int studentnum;
|
||||||
|
char name[100];
|
||||||
|
char filename[100];
|
||||||
|
};
|
||||||
|
class Exam {
|
||||||
|
|
||||||
|
public:
|
||||||
|
Exam(Examsave* insave);
|
||||||
|
Exam(char inname[]);
|
||||||
|
|
||||||
|
void saveAll(ofstream& examsout);
|
||||||
|
void addItem(long long int studentNo, double score[9]);
|
||||||
|
void addItem(const Item& item);
|
||||||
|
bool rmvItem(long long int studentNo);
|
||||||
|
static void dspHeader();
|
||||||
|
void dsp() const;
|
||||||
|
void dspName() const;
|
||||||
|
void dspName(int w) const;
|
||||||
|
void dspItems() const;
|
||||||
|
void toCsvItems(ofstream& csv) const;
|
||||||
|
bool itemExists(long long int studentNo) const;
|
||||||
|
void changeName(char name[]);
|
||||||
|
const Item* StudentInquiry(long long int studentNo) const;
|
||||||
|
int getStuRanking(const Item& item);
|
||||||
|
void rm() const;
|
||||||
|
|
||||||
|
virtual ~Exam(){};
|
||||||
|
private:
|
||||||
|
vector<Item> items;
|
||||||
|
struct Examsave save;
|
||||||
|
int studentnum;
|
||||||
|
char name[100];
|
||||||
|
char filename[100];
|
||||||
|
|
||||||
|
|
||||||
|
};
|
|
@ -0,0 +1,122 @@
|
||||||
|
#include"Item.h"
|
||||||
|
#include"Student.h"
|
||||||
|
#include"Manager.h"
|
||||||
|
using namespace std;
|
||||||
|
extern Manager mainManager;
|
||||||
|
Item::Item(long long int studentNo, double inscore[]) {
|
||||||
|
sum = 0;
|
||||||
|
for (int i = 0; i < 9; i++) {
|
||||||
|
score[i] = inscore[i];
|
||||||
|
sum = sum + score[i];
|
||||||
|
}
|
||||||
|
this->studentNo = studentNo;
|
||||||
|
}
|
||||||
|
Item::Item() {
|
||||||
|
studentNo = -1;
|
||||||
|
}
|
||||||
|
bool Item::operator<(const Item& i) const {
|
||||||
|
if (this->sum < i.sum) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else if (this->sum > i.sum) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else if (this->studentNo < i.sum) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
bool Item::operator>(const Item& i) const {
|
||||||
|
if (this->sum < i.sum) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else if (this->sum > i.sum) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else if (this->studentNo < i.sum) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
long long int Item::getStuNo() const {
|
||||||
|
return studentNo;
|
||||||
|
}
|
||||||
|
bool Item::stuNoEqual(const Item& i) const {
|
||||||
|
if (this->studentNo == i.studentNo) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void Item::dspHeader() {
|
||||||
|
Student::dspHeader();
|
||||||
|
cout << setw(5) << "数学" << setw(5) << "语文" << setw(5) << "英语" << setw(5) << "物理" << setw(5) << "化学" << setw(5) << "生物" << setw(5) << "历史" << setw(5) << "政治" << setw(5) << "地理" << setw(6) << "总分";
|
||||||
|
}
|
||||||
|
void Item::dspHeader(int w) {
|
||||||
|
cout << setw(5) << "数学" << setw(5) << "语文" << setw(5) << "英语" << setw(5) << "物理" << setw(5) << "化学" << setw(5) << "生物" << setw(5) << "历史" << setw(5) << "政治" << setw(5) << "地理" << setw(6) << "总分";
|
||||||
|
}
|
||||||
|
void Item::dsp() const {
|
||||||
|
Student* stup = mainManager.searchByNo(this->studentNo);
|
||||||
|
Student stu;
|
||||||
|
if (stup == nullptr) {
|
||||||
|
stu = Student(this->studentNo);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
stu = *stup;
|
||||||
|
}
|
||||||
|
|
||||||
|
stu.dsp();
|
||||||
|
cout << setw(5) << score[0] << setw(5) << score[1] << setw(5) << score[2] << setw(5) << score[3] << setw(5) << score[4] << setw(5) << score[5] << setw(5) << score[6] << setw(5) << score[7] << setw(5) << score[8] << setw(6) << sum;
|
||||||
|
}
|
||||||
|
void Item::dsp(int w) const {
|
||||||
|
cout << setw(5) << score[0] << setw(5) << score[1] << setw(5) << score[2] << setw(5) << score[3] << setw(5) << score[4] << setw(5) << score[5] << setw(5) << score[6] << setw(5) << score[7] << setw(5) << score[8] << setw(6) << sum;
|
||||||
|
}
|
||||||
|
void Item::toCsvHeader(ofstream& csv) {
|
||||||
|
Student::toCsvHeader(csv);
|
||||||
|
csv << "数学," << "语文," << "英语," << "物理," << "化学," << "生物," << "历史," << "政治," << "地理," << "总分,";
|
||||||
|
}
|
||||||
|
void Item::toCsv(ofstream& csv) const {
|
||||||
|
Student* stup = mainManager.searchByNo(this->studentNo);
|
||||||
|
Student stu;
|
||||||
|
if (stup == nullptr) {
|
||||||
|
stu = Student(this->studentNo);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
stu = *stup;
|
||||||
|
}
|
||||||
|
stu.toCsv(csv);
|
||||||
|
csv << score[0] << "," << score[1] << "," << score[2] << "," << score[3] << "," << score[4] << "," << score[5] << "," << score[6] << "," << score[7] << "," << score[8] << "," << sum << ",";
|
||||||
|
}
|
||||||
|
Item::Item(ifstream& csv, int stuNoColumn,int scoreColumn[]) {
|
||||||
|
string line, tmp;
|
||||||
|
vector<string> tmpvector;
|
||||||
|
sum = 0;
|
||||||
|
if (!getline(csv,line)) {
|
||||||
|
studentNo = -1;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
stringstream linestream(line);
|
||||||
|
while (getline(linestream, tmp, ',')) {
|
||||||
|
tmpvector.push_back(tmp);
|
||||||
|
};
|
||||||
|
try {
|
||||||
|
studentNo = stoi(tmpvector.at(stuNoColumn-1));
|
||||||
|
}
|
||||||
|
catch (const exception& e) {
|
||||||
|
studentNo = 0;
|
||||||
|
}
|
||||||
|
for (auto i = 0; i < 9; i++) {
|
||||||
|
try {
|
||||||
|
score[i] = stoi(tmpvector.at(scoreColumn[i]-1));
|
||||||
|
}
|
||||||
|
catch (const exception& e) {
|
||||||
|
score[i] = 0;
|
||||||
|
}
|
||||||
|
sum += score[i];
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,32 @@
|
||||||
|
#pragma once
|
||||||
|
#include<algorithm>
|
||||||
|
#include<fstream>
|
||||||
|
#include<iomanip>
|
||||||
|
#include<iostream>
|
||||||
|
#include<sstream>
|
||||||
|
#include<string>
|
||||||
|
#include<vector>
|
||||||
|
using namespace std;
|
||||||
|
class Item {
|
||||||
|
public:
|
||||||
|
Item(long long int studentNo, double inscore[]);
|
||||||
|
Item(ifstream& csv, int stuNoColumn, int scoreColumn[]);
|
||||||
|
Item();
|
||||||
|
|
||||||
|
bool operator>(const Item& i) const;
|
||||||
|
bool operator<(const Item& i) const;
|
||||||
|
long long int getStuNo() const;
|
||||||
|
bool stuNoEqual(const Item& i) const;
|
||||||
|
static void dspHeader();
|
||||||
|
static void dspHeader(int w);
|
||||||
|
void dsp() const;
|
||||||
|
void dsp(int w) const;
|
||||||
|
static void toCsvHeader(ofstream& csv);
|
||||||
|
void toCsv(ofstream& csv) const;
|
||||||
|
|
||||||
|
virtual ~Item() {}
|
||||||
|
private:
|
||||||
|
long long int studentNo;
|
||||||
|
double score[9];
|
||||||
|
double sum;
|
||||||
|
};
|
|
@ -0,0 +1,907 @@
|
||||||
|
#include "Manager.h"
|
||||||
|
#include"Exceptions.h"
|
||||||
|
#pragma warning(disable:4996)
|
||||||
|
Manager::Manager() {
|
||||||
|
centeredPrint("##########################################");
|
||||||
|
centeredPrint("## 学生成绩管理系统 ##");
|
||||||
|
centeredPrint("##########################################");
|
||||||
|
cout << endl;
|
||||||
|
centeredPrint("加载中...");
|
||||||
|
|
||||||
|
ifstream numsin("nums.bin", ios::in, ios::binary);
|
||||||
|
if (!numsin.good()) {
|
||||||
|
ExamNum = 0;
|
||||||
|
StudentNum = 0;
|
||||||
|
numsin.close();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
numsin.read((char*)&StudentNum, sizeof(int));
|
||||||
|
numsin.read((char*)&ExamNum, sizeof(int));
|
||||||
|
numsin.close();
|
||||||
|
ifstream studentsin("students.bin", ios::in, ios::binary);
|
||||||
|
Student tmpstu;
|
||||||
|
for (int i = 0; i < StudentNum; i++) {
|
||||||
|
studentsin.read((char*)&tmpstu, sizeof(Student));
|
||||||
|
Students.push_back(tmpstu);
|
||||||
|
}
|
||||||
|
studentsin.close();
|
||||||
|
ifstream examsin("examsaves.bin", ios::in, ios::binary);
|
||||||
|
Examsave tmpexam;
|
||||||
|
for (int i = 0; i < ExamNum; i++) {
|
||||||
|
examsin.read((char*)&tmpexam, sizeof(Examsave));
|
||||||
|
auto sp1 = make_shared<Exam>(&tmpexam);
|
||||||
|
Exams.push_back(sp1);
|
||||||
|
}
|
||||||
|
examsin.close();
|
||||||
|
|
||||||
|
cout << endl;
|
||||||
|
centeredPrint("欢迎使用!");
|
||||||
|
}
|
||||||
|
Manager::~Manager() {
|
||||||
|
centeredPrint("保存中...");
|
||||||
|
ofstream examsout("examsaves.bin", ios::out, ios::binary);
|
||||||
|
for (auto i = Exams.begin(); i < Exams.end(); i++) {
|
||||||
|
(*i)->saveAll(examsout);
|
||||||
|
}
|
||||||
|
ExamNum = Exams.size();
|
||||||
|
examsout.close();
|
||||||
|
ofstream studentsout("students.bin", ios::out, ios::binary);
|
||||||
|
for (auto i = Students.begin(); i < Students.end(); i++) {
|
||||||
|
studentsout.write((char*)&(*i), sizeof(Student));
|
||||||
|
}
|
||||||
|
StudentNum = Students.size();
|
||||||
|
studentsout.close();
|
||||||
|
ofstream numsout("nums.bin", ios::out, ios::binary);
|
||||||
|
numsout.write((char*)&StudentNum, sizeof(int));
|
||||||
|
numsout.write((char*)&ExamNum, sizeof(int));
|
||||||
|
numsout.close();
|
||||||
|
centeredPrint("已保存!");
|
||||||
|
}
|
||||||
|
void Manager::mainLoop() {
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
try {
|
||||||
|
switch (status) {
|
||||||
|
case 0:
|
||||||
|
welcomePage();
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
stuPage();
|
||||||
|
break;
|
||||||
|
case 11:
|
||||||
|
stuDspPage();
|
||||||
|
break;
|
||||||
|
case 12:
|
||||||
|
stuAddPage();
|
||||||
|
break;
|
||||||
|
case 13:
|
||||||
|
stuSearchPage();
|
||||||
|
break;
|
||||||
|
case 14:
|
||||||
|
stuEdtRmvPage();
|
||||||
|
break;
|
||||||
|
case 15:
|
||||||
|
stuExportPage();
|
||||||
|
break;
|
||||||
|
case 16:
|
||||||
|
stuImportPage();
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
examPage();
|
||||||
|
break;
|
||||||
|
case 21:
|
||||||
|
examAddPage();
|
||||||
|
break;
|
||||||
|
case 22:
|
||||||
|
examChoosePage();
|
||||||
|
break;
|
||||||
|
case 23:
|
||||||
|
examSubPage();
|
||||||
|
break;
|
||||||
|
case 231:
|
||||||
|
examViewPage();
|
||||||
|
break;
|
||||||
|
case 232:
|
||||||
|
examExportPage();
|
||||||
|
break;
|
||||||
|
case 233:
|
||||||
|
examAddRowPage();
|
||||||
|
break;
|
||||||
|
case 234:
|
||||||
|
examDelRowPage();
|
||||||
|
break;
|
||||||
|
case 235:
|
||||||
|
examNamePage();
|
||||||
|
break;
|
||||||
|
case 236:
|
||||||
|
examImportPage();
|
||||||
|
break;
|
||||||
|
case 237:
|
||||||
|
examRmvPage();
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
stuPfmPage();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
system("cls");
|
||||||
|
if (status == -1)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
catch (const InputError& e) {
|
||||||
|
system("cls");
|
||||||
|
cerr << e.what() << endl;
|
||||||
|
cin.clear();
|
||||||
|
cin.ignore(1024,'\n');
|
||||||
|
goBack();
|
||||||
|
}
|
||||||
|
catch (const FileError& e) {
|
||||||
|
system("cls");
|
||||||
|
cerr << e.what() << endl;
|
||||||
|
goBack();
|
||||||
|
}
|
||||||
|
catch (const IndexError& e) {
|
||||||
|
system("cls");
|
||||||
|
cerr << e.what() << endl;
|
||||||
|
goBack();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
void Manager::goBack() {
|
||||||
|
status /= 10;
|
||||||
|
}
|
||||||
|
void Manager::centeredPrint(const string& content) {
|
||||||
|
HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
|
||||||
|
CONSOLE_SCREEN_BUFFER_INFO bInfo;
|
||||||
|
GetConsoleScreenBufferInfo(hOutput, &bInfo);
|
||||||
|
int dwSizeX = bInfo.dwSize.X, dwSizeY = bInfo.dwSize.Y;
|
||||||
|
int cursorX = bInfo.dwCursorPosition.X, cursorY = bInfo.dwCursorPosition.Y;
|
||||||
|
int len = content.length();
|
||||||
|
COORD pos;
|
||||||
|
pos.X = (dwSizeX - len) / 2;
|
||||||
|
pos.Y = cursorY;
|
||||||
|
SetConsoleCursorPosition(hOutput, pos);
|
||||||
|
cout << content << endl;
|
||||||
|
}
|
||||||
|
Student* Manager::searchByNo(long long int studentNo) {
|
||||||
|
for (auto i = Students.begin(); i < Students.end(); i++) {
|
||||||
|
if (i->stuNoEqual(studentNo)) {
|
||||||
|
return &(*i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
//status 0
|
||||||
|
void Manager::welcomePage() {
|
||||||
|
char choice = '0';
|
||||||
|
cout << "主菜单" << endl;
|
||||||
|
cout << "请选择" << endl;
|
||||||
|
cout << "1: 学生信息管理" << endl;
|
||||||
|
cout << "2: 考试信息" << endl;
|
||||||
|
cout << "3: 学生成绩查询" << endl;
|
||||||
|
cout << "q: 退出" << endl;
|
||||||
|
cin >> choice;
|
||||||
|
switch (choice) {
|
||||||
|
case '1':
|
||||||
|
status = 1;
|
||||||
|
break;
|
||||||
|
case '2':
|
||||||
|
status = 2;
|
||||||
|
break;
|
||||||
|
case '3':
|
||||||
|
status = 3;
|
||||||
|
break;
|
||||||
|
case 'q':
|
||||||
|
case 'Q':
|
||||||
|
status = -1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//status 1
|
||||||
|
void Manager::stuPage() {
|
||||||
|
char choice = '0';
|
||||||
|
cout << "主菜单-学生" << endl;
|
||||||
|
cout << "请选择" << endl;
|
||||||
|
cout << "1: 全部学生信息" << endl;
|
||||||
|
cout << "2: 添加新学生" << endl;
|
||||||
|
cout << "3: 学生信息搜索" << endl;
|
||||||
|
cout << "4: 编辑/删除已有学生" << endl;
|
||||||
|
cout << "5: 将全部学生信息导出到CSV" << endl;
|
||||||
|
cout << "6: 从CSV导入学生信息" << endl;
|
||||||
|
cout << "b: 返回" << endl;
|
||||||
|
cin >> choice;
|
||||||
|
switch (choice) {
|
||||||
|
case '1':
|
||||||
|
status = 11;
|
||||||
|
break;
|
||||||
|
case '2':
|
||||||
|
status = 12;
|
||||||
|
break;
|
||||||
|
case '3':
|
||||||
|
status = 13;
|
||||||
|
break;
|
||||||
|
case '4':
|
||||||
|
status = 14;
|
||||||
|
break;
|
||||||
|
case '5':
|
||||||
|
status = 15;
|
||||||
|
break;
|
||||||
|
case '6':
|
||||||
|
status = 16;
|
||||||
|
break;
|
||||||
|
case 'b':
|
||||||
|
case 'B':
|
||||||
|
goBack();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//status 11
|
||||||
|
void Manager::stuDspPage() {
|
||||||
|
cout << "主菜单-学生-信息查看" << endl;
|
||||||
|
cout << setw(6) << "编号";
|
||||||
|
Student::dspHeader();
|
||||||
|
cout << endl;
|
||||||
|
int count = 1;
|
||||||
|
for (auto student = Students.begin(); student < Students.end(); student++) {
|
||||||
|
cout << setw(6) << count++;
|
||||||
|
student->dsp();
|
||||||
|
cout << endl;
|
||||||
|
}
|
||||||
|
string tmp;
|
||||||
|
cout << endl << "b: 返回" << endl;
|
||||||
|
cin >> tmp;
|
||||||
|
goBack();
|
||||||
|
}
|
||||||
|
//status 12
|
||||||
|
void Manager::stuAddPage() {
|
||||||
|
char choice = '0';
|
||||||
|
cout << "主菜单-学生-添加" << endl;
|
||||||
|
int year;
|
||||||
|
int selectionNo;
|
||||||
|
int classNo;
|
||||||
|
char name[100];
|
||||||
|
cout << "姓名:" << endl;
|
||||||
|
do {
|
||||||
|
cin.getline(name, 100);
|
||||||
|
} while (name[0] == '\0');
|
||||||
|
cout << "入学年份:" << endl;
|
||||||
|
cin >> year;
|
||||||
|
cout << "选科组合:" << endl;
|
||||||
|
cin >> selectionNo;
|
||||||
|
cout << "班级:" << endl;
|
||||||
|
cin >> classNo;
|
||||||
|
if (!cin.good()) {
|
||||||
|
throw InputError("输入字符非法!");
|
||||||
|
}
|
||||||
|
Students.push_back(Student(year, selectionNo, classNo, name));
|
||||||
|
cout << "已添加!" << endl;
|
||||||
|
string tmp;
|
||||||
|
cout << endl << "b: 返回" << endl;
|
||||||
|
cin >> tmp;
|
||||||
|
goBack();
|
||||||
|
}
|
||||||
|
//status 13
|
||||||
|
void Manager::stuSearchPage() {
|
||||||
|
char choice = '0';
|
||||||
|
cout << "主菜单-学生-搜索" << endl;
|
||||||
|
cout << "请选择:" << endl;
|
||||||
|
cout << "1: 按学号搜索" << endl;
|
||||||
|
cout << "2: 按姓名搜索" << endl;
|
||||||
|
cout << "3: 按班级搜索" << endl;
|
||||||
|
cout << "4: 按选科组合搜索" << endl;
|
||||||
|
cout << "5: 按入学年份搜索" << endl;
|
||||||
|
cout << "b: 返回" << endl;
|
||||||
|
cin >> choice;
|
||||||
|
vector<Student> result;
|
||||||
|
int enrollmentYear;
|
||||||
|
switch (choice) {
|
||||||
|
case '1':
|
||||||
|
long long int inputNo;
|
||||||
|
cout << "请输入学号:";
|
||||||
|
cin >> inputNo;
|
||||||
|
if (!cin.good()) {
|
||||||
|
throw InputError("输入字符非法!");
|
||||||
|
}
|
||||||
|
for (auto stu = Students.begin(); stu < Students.end(); stu++) {
|
||||||
|
if (stu->stuNoEqual(inputNo)) {
|
||||||
|
result.push_back(*stu);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case '2':
|
||||||
|
char inputName[100];
|
||||||
|
cout << "请输入学生姓名:";
|
||||||
|
do {
|
||||||
|
cin.getline(inputName, 100);
|
||||||
|
} while (inputName[0] == '\0');
|
||||||
|
for (auto stu = Students.begin(); stu < Students.end(); stu++) {
|
||||||
|
if (stu->nameEqual(inputName)) {
|
||||||
|
result.push_back(*stu);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case '3':
|
||||||
|
int inputClassNo;
|
||||||
|
cout << "请输入入学年份:";
|
||||||
|
cin >> enrollmentYear;
|
||||||
|
cout << "请输入班级:";
|
||||||
|
cin >> inputClassNo;
|
||||||
|
if (!cin.good()) {
|
||||||
|
throw InputError("输入字符非法!");
|
||||||
|
}
|
||||||
|
for (auto stu = Students.begin(); stu < Students.end(); stu++) {
|
||||||
|
if (stu->clsNoEqual(inputClassNo) && stu->yearEqual(enrollmentYear)) {
|
||||||
|
result.push_back(*stu);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case '4':
|
||||||
|
int inputSelectionNo;
|
||||||
|
cout << "请输入入学年份:";
|
||||||
|
cin >> enrollmentYear;
|
||||||
|
cout << "请输入选科组合:";
|
||||||
|
cin >> inputSelectionNo;
|
||||||
|
if (!cin.good()) {
|
||||||
|
throw InputError("输入字符非法!");
|
||||||
|
}
|
||||||
|
for (auto stu = Students.begin(); stu < Students.end(); stu++) {
|
||||||
|
if (stu->slcNoEqual(inputSelectionNo) && stu->yearEqual(enrollmentYear)) {
|
||||||
|
result.push_back(*stu);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case '5':
|
||||||
|
cout << "请输入入学年份:";
|
||||||
|
cin >> enrollmentYear;
|
||||||
|
if (!cin.good()) {
|
||||||
|
throw InputError("输入字符非法!");
|
||||||
|
}
|
||||||
|
for (auto stu = Students.begin(); stu < Students.end(); stu++) {
|
||||||
|
if (stu->yearEqual(enrollmentYear)) {
|
||||||
|
result.push_back(*stu);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'b':
|
||||||
|
case 'B':
|
||||||
|
goBack();
|
||||||
|
}
|
||||||
|
if (status != 1) {
|
||||||
|
cout << setw(6) << "编号";
|
||||||
|
Student::dspHeader();
|
||||||
|
cout << endl;
|
||||||
|
int count = 1;
|
||||||
|
for (auto student = result.begin(); student < result.end(); student++) {
|
||||||
|
cout << setw(6) << count++;
|
||||||
|
student->dsp();
|
||||||
|
cout << endl;
|
||||||
|
}
|
||||||
|
cout << endl;
|
||||||
|
if (result.size() == 0) {
|
||||||
|
cout << "未找到符合条件的学生" << endl;
|
||||||
|
}
|
||||||
|
cout << "b: 返回" << endl;
|
||||||
|
string tmp;
|
||||||
|
cin >> tmp;
|
||||||
|
goBack();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//status 14
|
||||||
|
void Manager::stuEdtRmvPage() {
|
||||||
|
int inputNo;
|
||||||
|
string tmp;
|
||||||
|
cout << "主菜单-学生-编辑/删除" << endl;
|
||||||
|
cout << "请输入学号:";
|
||||||
|
cin >> inputNo;
|
||||||
|
if (!cin.good()) {
|
||||||
|
throw InputError("输入字符非法!");
|
||||||
|
}
|
||||||
|
auto it = Students.end();
|
||||||
|
for (auto stu = Students.begin(); stu < Students.end(); stu++) {
|
||||||
|
if (stu->stuNoEqual(inputNo)) {
|
||||||
|
it = stu;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (it == Students.end()) {
|
||||||
|
cout << "查无此人" << endl;
|
||||||
|
cout << "b: 返回" << endl;
|
||||||
|
cin >> tmp;
|
||||||
|
goBack();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
char choice;
|
||||||
|
cout << "1: 编辑学生信息" << endl;
|
||||||
|
cout << "2: 删除" << endl;
|
||||||
|
cin >> choice;
|
||||||
|
Student::dspHeader();
|
||||||
|
cout << endl;
|
||||||
|
it->dsp();
|
||||||
|
cout << endl;
|
||||||
|
if (choice == '1') {
|
||||||
|
|
||||||
|
int year;
|
||||||
|
int selectionNo;
|
||||||
|
int classNo;
|
||||||
|
char name[100];
|
||||||
|
cout << "姓名:" << endl;
|
||||||
|
do {
|
||||||
|
cin.getline(name, 100);
|
||||||
|
} while (name[0] == '\0');
|
||||||
|
cout << "入学年份:" << endl;
|
||||||
|
cin >> year;
|
||||||
|
cout << "选科组合:" << endl;
|
||||||
|
cin >> selectionNo;
|
||||||
|
cout << "班级:" << endl;
|
||||||
|
cin >> classNo;
|
||||||
|
if (!cin.good()) {
|
||||||
|
throw InputError("输入字符非法!");
|
||||||
|
}
|
||||||
|
it->setInfo(year, selectionNo, classNo, name);
|
||||||
|
cout << "已修改" << endl;
|
||||||
|
}
|
||||||
|
else if (choice == '2') {
|
||||||
|
cout << "删除上述学生?(Y(是)/N(否))" << endl;
|
||||||
|
char yorn;
|
||||||
|
cin >> yorn;
|
||||||
|
if (yorn == 'y' || yorn == 'Y') {
|
||||||
|
Students.erase(it);
|
||||||
|
}
|
||||||
|
cout << "已删除" << endl;
|
||||||
|
}
|
||||||
|
cout << "b: 返回" << endl;
|
||||||
|
string tmp;
|
||||||
|
cin >> tmp;
|
||||||
|
goBack();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//status 15
|
||||||
|
void::Manager::stuExportPage() {
|
||||||
|
cout << "主菜单-学生-导出" << endl;
|
||||||
|
string csvName;
|
||||||
|
cout << "请输入导出文件名:" << endl;
|
||||||
|
do {
|
||||||
|
getline(cin, csvName);
|
||||||
|
} while (csvName == "");
|
||||||
|
csvName = csvName + ".csv";
|
||||||
|
ofstream csv(csvName);
|
||||||
|
if (!csv.good()) {
|
||||||
|
throw FileError("文件创建失败!");
|
||||||
|
}
|
||||||
|
Student::toCsvHeader(csv);
|
||||||
|
csv << '\n';
|
||||||
|
for (auto student = Students.begin(); student < Students.end(); student++) {
|
||||||
|
student->toCsv(csv);
|
||||||
|
csv << '\n';
|
||||||
|
}
|
||||||
|
string tmp;
|
||||||
|
cout << "导出成功" << endl;
|
||||||
|
cout << "b: 返回" << endl;
|
||||||
|
cin >> tmp;
|
||||||
|
goBack();
|
||||||
|
}
|
||||||
|
//status 16
|
||||||
|
void::Manager::stuImportPage() {
|
||||||
|
string fileName;
|
||||||
|
string tmp;
|
||||||
|
bool eof = false;
|
||||||
|
int firstRow=1;
|
||||||
|
int clsColumn, slcColumn, yearColumn,nameColumn;
|
||||||
|
cout << "主菜单-学生-导入" << endl;
|
||||||
|
cout << "请输入文件名称或路径,注意包含扩展名" << endl;
|
||||||
|
cin >> fileName;
|
||||||
|
if (!cin.good()) {
|
||||||
|
throw InputError("输入字符非法!");
|
||||||
|
}
|
||||||
|
ifstream csvFile(fileName);
|
||||||
|
if (!csvFile.good()) {
|
||||||
|
throw FileError("文件打开失败!");
|
||||||
|
}
|
||||||
|
cout << "请输入有效数据开始的行数: " << endl;
|
||||||
|
cin >> firstRow;
|
||||||
|
cout << "请输入学生姓名所在的列数: " << endl;
|
||||||
|
cin >> nameColumn;
|
||||||
|
cout << "请输入入学年份所在的列数: " << endl;
|
||||||
|
cin >> yearColumn;
|
||||||
|
cout << "请输入班号所在的列数: " << endl;
|
||||||
|
cin >> clsColumn;
|
||||||
|
cout << "请输入选科组合所在的列数: " << endl;
|
||||||
|
cin >> slcColumn;
|
||||||
|
if (!cin.good()) {
|
||||||
|
throw InputError("输入字符非法!");
|
||||||
|
}
|
||||||
|
for (int i = 1; i < firstRow; i++) {
|
||||||
|
getline(csvFile, tmp);
|
||||||
|
}
|
||||||
|
while (!eof) {
|
||||||
|
Student tmpStu(csvFile, yearColumn, clsColumn, slcColumn, nameColumn);
|
||||||
|
if (tmpStu.stuNoEqual(-1)) {
|
||||||
|
eof = true;
|
||||||
|
|
||||||
|
}
|
||||||
|
else if (tmpStu.stuNoEqual(0)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Students.push_back(tmpStu);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
cout << "已导入" << endl;
|
||||||
|
cout << "b: 返回" << endl;
|
||||||
|
cin >> tmp;
|
||||||
|
goBack();
|
||||||
|
}
|
||||||
|
//status 2
|
||||||
|
void Manager::examPage() {
|
||||||
|
char choice = '0';
|
||||||
|
cout << "主菜单-考试" << endl;
|
||||||
|
cout << setw(6) << "编号";
|
||||||
|
Exam::dspHeader();
|
||||||
|
for (auto exam = Exams.begin(); exam < Exams.end(); exam++) {
|
||||||
|
cout << setw(4) << distance(Exams.begin(), exam) + 1;
|
||||||
|
(*exam)->dsp();
|
||||||
|
}
|
||||||
|
cout << endl;
|
||||||
|
cout << "请选择" << endl;
|
||||||
|
cout << "1: 添加考试" << endl;
|
||||||
|
cout << "2: 选择考试" << endl;
|
||||||
|
cout << "b: 返回" << endl;
|
||||||
|
cin >> choice;
|
||||||
|
switch (choice) {
|
||||||
|
case '1':
|
||||||
|
status = 21;
|
||||||
|
break;
|
||||||
|
case '2':
|
||||||
|
status = 22;
|
||||||
|
break;
|
||||||
|
case 'b':
|
||||||
|
case 'B':
|
||||||
|
goBack();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//status 21
|
||||||
|
void Manager::examAddPage() {
|
||||||
|
cout << "主菜单-考试-添加" << endl;
|
||||||
|
cout << "名称:" << endl;
|
||||||
|
char name[100];
|
||||||
|
do {
|
||||||
|
cin.getline(name, 100);
|
||||||
|
} while (name[0] == '\0');
|
||||||
|
auto p = make_shared<Exam>(name);
|
||||||
|
Exams.push_back(p);
|
||||||
|
cout << "添加成功!" << endl;
|
||||||
|
cout << "b: 返回" << endl;
|
||||||
|
string tmp;
|
||||||
|
cin >> tmp;
|
||||||
|
goBack();
|
||||||
|
}
|
||||||
|
//status 22
|
||||||
|
void Manager::examChoosePage() {
|
||||||
|
int examNo;
|
||||||
|
string tmp;
|
||||||
|
cout << "主菜单-考试-选择" << endl;
|
||||||
|
cout << setw(6) << "编号";
|
||||||
|
Exam::dspHeader();
|
||||||
|
for (auto exam = Exams.begin(); exam < Exams.end(); exam++) {
|
||||||
|
cout << setw(6) << distance(Exams.begin(), exam) + 1;
|
||||||
|
(*exam)->dsp();
|
||||||
|
}
|
||||||
|
cout << endl;
|
||||||
|
cout << "编号:" << endl;
|
||||||
|
cin >> examNo;
|
||||||
|
if (!cin.good()) {
|
||||||
|
throw InputError("输入字符非法!");
|
||||||
|
}
|
||||||
|
examNo--;
|
||||||
|
if (examNo >= 0 && examNo < Exams.size()) {
|
||||||
|
currentExam = Exams.begin() + examNo;
|
||||||
|
|
||||||
|
status = 23;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
throw IndexError("编号无效!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//status 23
|
||||||
|
void Manager::examSubPage() {
|
||||||
|
cout << "主菜单-考试-";
|
||||||
|
(*currentExam)->dspName();
|
||||||
|
cout << endl;
|
||||||
|
|
||||||
|
cout << "请选择:" << endl;
|
||||||
|
cout << "1: 查看全部成绩" << endl;
|
||||||
|
cout << "2: 导出为CSV" << endl;
|
||||||
|
cout << "3: 新增成绩" << endl;
|
||||||
|
cout << "4: 删除成绩" << endl;
|
||||||
|
cout << "5: 修改考试名称" << endl;
|
||||||
|
cout << "6: 从CSV导入" << endl;
|
||||||
|
cout << "7: 删除此考试及其所有成绩信息" << endl;
|
||||||
|
cout << "b: 返回" << endl;
|
||||||
|
char choice = '0';
|
||||||
|
cin >> choice;
|
||||||
|
switch (choice) {
|
||||||
|
case '1':
|
||||||
|
status = 231;
|
||||||
|
break;
|
||||||
|
case '2':
|
||||||
|
status = 232;
|
||||||
|
break;
|
||||||
|
case '3':
|
||||||
|
status = 233;
|
||||||
|
break;
|
||||||
|
case '4':
|
||||||
|
status = 234;
|
||||||
|
break;
|
||||||
|
case '5':
|
||||||
|
status = 235;
|
||||||
|
break;
|
||||||
|
case '6':
|
||||||
|
status = 236;
|
||||||
|
break;
|
||||||
|
case '7':
|
||||||
|
status = 237;
|
||||||
|
break;
|
||||||
|
case 'b':
|
||||||
|
case 'B':
|
||||||
|
goBack();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//status 231
|
||||||
|
void Manager::examViewPage() {
|
||||||
|
|
||||||
|
cout << "主菜单-考试-";
|
||||||
|
(*currentExam)->dspName();
|
||||||
|
cout << "-查看" << endl;
|
||||||
|
Item::dspHeader();
|
||||||
|
cout <<setw(6)<< "名次" << endl;
|
||||||
|
(*currentExam)->dspItems();
|
||||||
|
string tmp;
|
||||||
|
cout << endl << "b: 返回" << endl;
|
||||||
|
cin >> tmp;
|
||||||
|
goBack();
|
||||||
|
}
|
||||||
|
//status 232
|
||||||
|
void Manager::examExportPage() {
|
||||||
|
|
||||||
|
string csvName;
|
||||||
|
|
||||||
|
cout << "主菜单-考试-";
|
||||||
|
(*currentExam)->dspName();
|
||||||
|
cout << "-导出" << endl;
|
||||||
|
cout << "请输入导出文件名:" << endl;
|
||||||
|
do {
|
||||||
|
getline(cin, csvName);
|
||||||
|
} while (csvName == "");
|
||||||
|
csvName = csvName + ".csv";
|
||||||
|
ofstream csv(csvName);
|
||||||
|
if (!csv.good()) {
|
||||||
|
throw FileError("文件创建失败!");
|
||||||
|
}
|
||||||
|
Item::toCsvHeader(csv);
|
||||||
|
csv << "名次" << endl;
|
||||||
|
(*currentExam)->toCsvItems(csv);
|
||||||
|
csv.close();
|
||||||
|
cout << "导出完成" << endl;
|
||||||
|
string tmp;
|
||||||
|
cout << endl << "b: 返回" << endl;
|
||||||
|
cin >> tmp;
|
||||||
|
goBack();
|
||||||
|
}
|
||||||
|
//status 233
|
||||||
|
void Manager::examAddRowPage() {
|
||||||
|
long long int studentNo;
|
||||||
|
double score[9];
|
||||||
|
char yorn;
|
||||||
|
|
||||||
|
cout << "主菜单-考试-";
|
||||||
|
(*currentExam)->dspName();
|
||||||
|
cout << "-新增成绩" << endl;
|
||||||
|
|
||||||
|
cout << "学号:" << endl;
|
||||||
|
cin >> studentNo;
|
||||||
|
if (!cin.good()) {
|
||||||
|
throw InputError("输入字符非法!");
|
||||||
|
}
|
||||||
|
if ((*currentExam)->itemExists(studentNo)) {
|
||||||
|
cout << "学号" << studentNo << "的成绩已存在, 是否覆盖? (Y(是)/N(否))" << endl;
|
||||||
|
cin >> yorn;
|
||||||
|
if (yorn != 'Y' && yorn != 'y') {
|
||||||
|
status = 23;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
cout << "数学:" << endl;
|
||||||
|
cin >> score[0];
|
||||||
|
cout << "语文:" << endl;
|
||||||
|
cin >> score[1];
|
||||||
|
cout << "英语:" << endl;
|
||||||
|
cin >> score[2];
|
||||||
|
cout << "物理:" << endl;
|
||||||
|
cin >> score[3];
|
||||||
|
cout << "化学:" << endl;
|
||||||
|
cin >> score[4];
|
||||||
|
cout << "生物:" << endl;
|
||||||
|
cin >> score[5];
|
||||||
|
cout << "历史:" << endl;
|
||||||
|
cin >> score[6];
|
||||||
|
cout << "政治:" << endl;
|
||||||
|
cin >> score[7];
|
||||||
|
cout << "地理:" << endl;
|
||||||
|
cin >> score[8];
|
||||||
|
if (!cin.good()) {
|
||||||
|
throw InputError("输入字符非法!");
|
||||||
|
}
|
||||||
|
(*currentExam)->addItem(studentNo, score);
|
||||||
|
cout << "已添加" << endl;
|
||||||
|
string tmp;
|
||||||
|
cout << endl << "b: 返回" << endl;
|
||||||
|
cin >> tmp;
|
||||||
|
goBack();
|
||||||
|
}
|
||||||
|
//status 234
|
||||||
|
void Manager::examDelRowPage() {
|
||||||
|
char yorn;
|
||||||
|
long long int studentNo;
|
||||||
|
string tmp;
|
||||||
|
|
||||||
|
cout << "主菜单-考试-";
|
||||||
|
(*currentExam)->dspName();
|
||||||
|
cout << "-删除成绩" << endl;
|
||||||
|
|
||||||
|
cout << "学号:" << endl;
|
||||||
|
cin >> studentNo;
|
||||||
|
if (!cin.good()) {
|
||||||
|
throw InputError("输入字符非法!");
|
||||||
|
}
|
||||||
|
cout << "确认删除(Y(是)/N(否))" << endl;
|
||||||
|
cin >> yorn;
|
||||||
|
if (yorn == 'Y' || yorn == 'y') {
|
||||||
|
yorn=(*currentExam)->rmvItem(studentNo);
|
||||||
|
if (yorn) {
|
||||||
|
cout << "已删除" << endl;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
cout << "未找到" << endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
cout << "已取消" << endl;
|
||||||
|
}
|
||||||
|
cout << "b: 返回" << endl;
|
||||||
|
cin >> tmp;
|
||||||
|
goBack();
|
||||||
|
}
|
||||||
|
//status 235
|
||||||
|
void Manager::examNamePage() {
|
||||||
|
string tmp;
|
||||||
|
char name[100];
|
||||||
|
cout << "主菜单-考试-";
|
||||||
|
(*currentExam)->dspName();
|
||||||
|
cout << "-修改名称" << endl;
|
||||||
|
cout << "新名称:" << endl;
|
||||||
|
do {
|
||||||
|
cin.getline(name, 100);
|
||||||
|
} while (name[0] == '\0');
|
||||||
|
(*currentExam)->changeName(name);
|
||||||
|
cout << "已修改" << endl;
|
||||||
|
cout << "b: 返回" << endl;
|
||||||
|
cin >> tmp;
|
||||||
|
goBack();
|
||||||
|
}
|
||||||
|
//status 236
|
||||||
|
void Manager::examImportPage() {
|
||||||
|
string tmp;
|
||||||
|
string fileName;
|
||||||
|
int firstRow;
|
||||||
|
int stuNoColumn;
|
||||||
|
int scoreColumn[9];
|
||||||
|
bool eof=false;
|
||||||
|
char name[100];
|
||||||
|
cout << "主菜单-考试-";
|
||||||
|
(*currentExam)->dspName();
|
||||||
|
cout << "-导入" << endl;
|
||||||
|
cout << "注意,若此考试中已存在相同学号学生的成绩数据,从CSV导入的数据会将其覆盖" << endl;
|
||||||
|
cout << "请输入文件名称或路径,注意包含扩展名" << endl;
|
||||||
|
cin >> fileName;
|
||||||
|
ifstream csvFile(fileName);
|
||||||
|
if (!csvFile.good()) {
|
||||||
|
throw FileError("文件打开失败!");
|
||||||
|
}
|
||||||
|
cout << "请输入有效数据开始的行数: " << endl;
|
||||||
|
cin >> firstRow;
|
||||||
|
cout << "请输入学号所在的列数:" << endl;
|
||||||
|
cin >> stuNoColumn;
|
||||||
|
cout << "请输入数学、语文、英语、物理、化学、生物、历史、政治、地理成绩所在的列数,以空格分隔" << endl;
|
||||||
|
cin >> scoreColumn[0] >> scoreColumn[1] >> scoreColumn[2] >> scoreColumn[3] >> scoreColumn[4] >> scoreColumn[5] >> scoreColumn[6] >> scoreColumn[7] >> scoreColumn[8];
|
||||||
|
if (!cin.good()) {
|
||||||
|
throw InputError("输入字符非法!");
|
||||||
|
}
|
||||||
|
for (int i = 1; i < firstRow; i++) {
|
||||||
|
getline(csvFile, tmp);
|
||||||
|
}
|
||||||
|
while (!eof) {
|
||||||
|
Item tmpItem(csvFile, stuNoColumn, scoreColumn);
|
||||||
|
if (tmpItem.getStuNo()==-1) {
|
||||||
|
eof = true;
|
||||||
|
}
|
||||||
|
else if(tmpItem.getStuNo()==0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
(*currentExam)->addItem(tmpItem);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
cout << "已导入" << endl;
|
||||||
|
cout << "b: 返回" << endl;
|
||||||
|
cin >> tmp;
|
||||||
|
goBack();
|
||||||
|
}
|
||||||
|
//status 237
|
||||||
|
void Manager::examRmvPage() {
|
||||||
|
string tmp;
|
||||||
|
|
||||||
|
cout << "主菜单-考试-";
|
||||||
|
(*currentExam)->dspName();
|
||||||
|
cout << "-删除考试" << endl;
|
||||||
|
cout << "你确定要删除考试\"";
|
||||||
|
(*currentExam)->dspName();
|
||||||
|
cout<< "\"吗" << endl;
|
||||||
|
cout << "输入 \"confirm\" 以确认删除" << endl;
|
||||||
|
cin >> tmp;
|
||||||
|
if (tmp == "confirm") {
|
||||||
|
(*currentExam)->rm();
|
||||||
|
Exams.erase(currentExam);
|
||||||
|
currentExam = Exams.begin();
|
||||||
|
goBack();
|
||||||
|
goBack();
|
||||||
|
cout << "已删除" << endl;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
goBack();
|
||||||
|
cout << "已取消" << endl;
|
||||||
|
}
|
||||||
|
cout << "b: 返回" << endl;
|
||||||
|
cin >> tmp;
|
||||||
|
|
||||||
|
}
|
||||||
|
//status 3
|
||||||
|
void Manager::stuPfmPage() {
|
||||||
|
long long int studentNo;
|
||||||
|
cout << "主菜单-学生成绩查询" << endl;
|
||||||
|
cout << "学号:" << endl;
|
||||||
|
cin >> studentNo;
|
||||||
|
if (!cin.good()) {
|
||||||
|
throw InputError("输入字符非法!");
|
||||||
|
}
|
||||||
|
Student::dspHeader();
|
||||||
|
cout << endl;
|
||||||
|
if (searchByNo(studentNo) == nullptr) {
|
||||||
|
cout << setw(20) << "未找到数据" << endl;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
searchByNo(studentNo)->dsp();
|
||||||
|
}
|
||||||
|
cout << endl << endl;
|
||||||
|
cout << "历次考试成绩:" << endl<<endl;
|
||||||
|
cout << setw(20) << "考试名称";
|
||||||
|
Item::dspHeader(0);
|
||||||
|
cout << setw(6) << "名次" << endl;
|
||||||
|
for (auto exam = Exams.begin(); exam < Exams.end(); exam++) {
|
||||||
|
auto item = (*exam)->StudentInquiry(studentNo);
|
||||||
|
(*exam)->dspName(20);
|
||||||
|
if (item == nullptr) {
|
||||||
|
cout << setw(20) << "未找到数据" << endl;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
item->dsp(0);
|
||||||
|
cout << setw(6)<<(*exam)->getStuRanking(*item)<<endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
string tmp;
|
||||||
|
cout <<endl<< "b: 返回" << endl;
|
||||||
|
cin >> tmp;
|
||||||
|
goBack();
|
||||||
|
}
|
|
@ -0,0 +1,67 @@
|
||||||
|
#pragma once
|
||||||
|
#include<fstream>
|
||||||
|
#include<iomanip>
|
||||||
|
#include<iostream>
|
||||||
|
#include<string>
|
||||||
|
#include<vector>
|
||||||
|
#include<windows.h>
|
||||||
|
#include"Student.h"
|
||||||
|
#include"Exam.h"
|
||||||
|
using namespace std;
|
||||||
|
class Manager {
|
||||||
|
public:
|
||||||
|
Manager();
|
||||||
|
|
||||||
|
void mainLoop();
|
||||||
|
void goBack();
|
||||||
|
void centeredPrint(const string& content);
|
||||||
|
Student* searchByNo(long long int studentNo);
|
||||||
|
//status 0
|
||||||
|
void welcomePage();
|
||||||
|
//status 1
|
||||||
|
void stuPage();
|
||||||
|
//status 11
|
||||||
|
void stuDspPage();
|
||||||
|
//status 12
|
||||||
|
void stuAddPage();
|
||||||
|
//status 13
|
||||||
|
void stuSearchPage();
|
||||||
|
//status 14
|
||||||
|
void stuEdtRmvPage();
|
||||||
|
//status 15
|
||||||
|
void stuExportPage();
|
||||||
|
//status 16
|
||||||
|
void stuImportPage();
|
||||||
|
//status 2
|
||||||
|
void examPage();
|
||||||
|
//status 21
|
||||||
|
void examAddPage();
|
||||||
|
//status 22
|
||||||
|
void examChoosePage();
|
||||||
|
//status 23
|
||||||
|
void examSubPage();
|
||||||
|
//status 231
|
||||||
|
void examViewPage();
|
||||||
|
//status 232
|
||||||
|
void examExportPage();
|
||||||
|
//status 233
|
||||||
|
void examAddRowPage();
|
||||||
|
//status 234
|
||||||
|
void examDelRowPage();
|
||||||
|
//status 235
|
||||||
|
void examNamePage();
|
||||||
|
//status 236
|
||||||
|
void examImportPage();
|
||||||
|
//status 237
|
||||||
|
void examRmvPage();
|
||||||
|
//status 3
|
||||||
|
void stuPfmPage();
|
||||||
|
|
||||||
|
virtual ~Manager();
|
||||||
|
private:
|
||||||
|
int status = 0;
|
||||||
|
int ExamNum = 0, StudentNum = 0;
|
||||||
|
vector<Student> Students;
|
||||||
|
vector<std::shared_ptr<Exam>> Exams;
|
||||||
|
vector<std::shared_ptr<Exam>>::iterator currentExam = Exams.begin();
|
||||||
|
};
|
|
@ -0,0 +1,124 @@
|
||||||
|
#include"Student.h"
|
||||||
|
#include"Manager.h"
|
||||||
|
#pragma warning(disable:4996)
|
||||||
|
using namespace std;
|
||||||
|
extern Manager mainManager;
|
||||||
|
Student::Student(int year, int selectionNo, int classNo, char name[]) :year(year), selectionNo(selectionNo), classNo(classNo), serialNo(serialNo) {
|
||||||
|
strcpy_s(this->name, name);
|
||||||
|
studentNo = infoToNo(year, selectionNo, classNo);
|
||||||
|
serialNo = studentNo % 100;
|
||||||
|
}
|
||||||
|
Student::Student(long long int studentNo) {
|
||||||
|
this->studentNo = studentNo;
|
||||||
|
strcpy(this->name, "查无此人");
|
||||||
|
year = 0;
|
||||||
|
selectionNo = 0;
|
||||||
|
classNo = 0;
|
||||||
|
serialNo = 0;
|
||||||
|
}
|
||||||
|
Student::Student(ifstream& csv, int yearColumn, int clsColumn, int slcColumn,int nameColumn) {
|
||||||
|
string line, tmp;
|
||||||
|
vector<string> tmpvector;
|
||||||
|
if (!getline(csv, line)) {
|
||||||
|
studentNo = -1;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
stringstream linestream(line);
|
||||||
|
while (getline(linestream, tmp, ',')) {
|
||||||
|
tmpvector.push_back(tmp);
|
||||||
|
};
|
||||||
|
try {
|
||||||
|
year = stoi(tmpvector.at(yearColumn - 1));
|
||||||
|
}
|
||||||
|
catch (const exception& e) {
|
||||||
|
year = 0;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
classNo = stoi(tmpvector.at(clsColumn - 1));
|
||||||
|
}
|
||||||
|
catch (const exception& e) {
|
||||||
|
classNo = 0;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
selectionNo = stoi(tmpvector.at(slcColumn - 1));
|
||||||
|
}
|
||||||
|
catch (const exception& e) {
|
||||||
|
selectionNo = 0;
|
||||||
|
}
|
||||||
|
strcpy(this->name, tmpvector.at(nameColumn - 1).c_str());
|
||||||
|
if (year != 0 && classNo != 0 && selectionNo != 0) {
|
||||||
|
studentNo = infoToNo(year, selectionNo, classNo);
|
||||||
|
serialNo = studentNo % 100;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
studentNo = 0;
|
||||||
|
serialNo = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void Student::dspHeader() {
|
||||||
|
cout << setw(10) << "姓名" << setw(12) << "学号" << setw(10) << "入学年份" << setw(5) << "班级" << setw(5) << "选科";
|
||||||
|
}
|
||||||
|
void Student::dsp() const {
|
||||||
|
cout << setw(10) << name << setw(12) << studentNo << setw(10) << year << setw(5) << classNo << setw(5) << selectionNo;
|
||||||
|
}
|
||||||
|
void Student::toCsvHeader(ofstream& csv) {
|
||||||
|
csv<< "姓名,"<< "学号,"<< "入学年份,"<< "班级," << "选科,";
|
||||||
|
}
|
||||||
|
void Student::toCsv (ofstream& csv) const {
|
||||||
|
csv << name << ',' << studentNo << ',' << year << ',' << classNo << ',' << selectionNo << ',';
|
||||||
|
}
|
||||||
|
void Student::setInfo(int year, int selectionNo, int classNo, char name[]) {
|
||||||
|
this->year = year;
|
||||||
|
this->selectionNo = selectionNo;
|
||||||
|
this->classNo = classNo;
|
||||||
|
strcpy(this->name, name);
|
||||||
|
}
|
||||||
|
bool Student::stuNoEqual(long long int studentNo) const {
|
||||||
|
if (this->studentNo == studentNo) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
bool Student::slcNoEqual(int selectionNo) const {
|
||||||
|
if (this->selectionNo == selectionNo) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
bool Student::clsNoEqual(int classNo) const {
|
||||||
|
if (this->classNo == classNo) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
bool Student::nameEqual(char name[]) const {
|
||||||
|
if (strcmp(this->name, name) == 0) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
bool Student::yearEqual(int year) const {
|
||||||
|
if (this->year == year) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
long long int Student::infoToNo(int year, int selectionNo, int classNo) {
|
||||||
|
long long int initNo = year * 1000000 + selectionNo * 10000 + classNo * 100 + 1;
|
||||||
|
for (auto i = initNo; i < initNo + 99; i++) {
|
||||||
|
if (mainManager.searchByNo(i) == nullptr) {
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
|
@ -0,0 +1,36 @@
|
||||||
|
#pragma once
|
||||||
|
#include<fstream>
|
||||||
|
#include<iomanip>
|
||||||
|
#include<iostream>
|
||||||
|
#include<string>
|
||||||
|
#include<vector>
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
class Student {
|
||||||
|
public:
|
||||||
|
Student(int year, int selectionNo, int classNo, char name[]);
|
||||||
|
Student(long long int studentNo);
|
||||||
|
Student(ifstream& csv, int yearColumn, int clsColumn, int slcColumn,int nameColumn);
|
||||||
|
Student(){}
|
||||||
|
|
||||||
|
void setInfo(int year, int selectionNo, int classNo, char name[]);
|
||||||
|
bool stuNoEqual(long long int studentNo) const;
|
||||||
|
bool slcNoEqual(int selectionNo) const;
|
||||||
|
bool clsNoEqual(int classNo) const;
|
||||||
|
bool yearEqual(int year) const;
|
||||||
|
bool nameEqual(char name[]) const;
|
||||||
|
static void dspHeader();
|
||||||
|
void dsp() const;
|
||||||
|
static void toCsvHeader(ofstream& csv);
|
||||||
|
void toCsv(ofstream& csv) const;
|
||||||
|
static long long int infoToNo(int year,int selectionNo, int classNo);
|
||||||
|
|
||||||
|
virtual ~Student(){};
|
||||||
|
private:
|
||||||
|
long long int studentNo;
|
||||||
|
char name[100];
|
||||||
|
int year;
|
||||||
|
int selectionNo;
|
||||||
|
int classNo;
|
||||||
|
int serialNo;
|
||||||
|
};
|
Loading…
Reference in New Issue