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