From 7851f2c38de8e8830378cc026870b434a0ad84f2 Mon Sep 17 00:00:00 2001 From: zyx <1029606625@qq.com> Date: Mon, 4 Jul 2022 15:59:30 +0800 Subject: [PATCH] 2022-07-04 16:00 --- Course.cpp | 6 +- Grade.cpp | 7 +- Menu.cpp | 557 +++++++++++++++++++++++++++++++++++++++++----------- Menu.h | 18 ++ Student.cpp | 9 +- main.cpp | 23 +-- 6 files changed, 471 insertions(+), 149 deletions(-) diff --git a/Course.cpp b/Course.cpp index 0555f2e..1cfa42f 100644 --- a/Course.cpp +++ b/Course.cpp @@ -18,11 +18,7 @@ public: void setName(string name) { this->name = name; } string toString() { - string toStr = "Course{"; - toStr += "id='" + id + '\'' + - ", name='" + name + '\'' + - '}'; - return toStr; + return id + "\t" + name; } private: string id;//课程号 diff --git a/Grade.cpp b/Grade.cpp index f614302..dab3424 100644 --- a/Grade.cpp +++ b/Grade.cpp @@ -22,12 +22,7 @@ public: void setGrade(string grade) { this->grade = grade; } string toString() { - string toStr = "Grade{"; - toStr += "stuId='" + stuId + '\'' + - ", courseId='" + courseId + '\'' + - ", grade='" + grade + '\'' + - '}'; - return toStr; + return stuId + "\t" + courseId + "\t" + grade; } private: string stuId; diff --git a/Menu.cpp b/Menu.cpp index 9558828..e5a596c 100644 --- a/Menu.cpp +++ b/Menu.cpp @@ -1,81 +1,91 @@ -#include #include"Menu.h" -#include"MenuUtils.h" -#include"StudentDAO.h" -#include"GradeDAO.h" -#include"CourseDAO.h" -using namespace std; void mainMenu(_ConnectionPtr connection) { - system("cls"); - printf("1.显示所有学生\n"); - printf("2.增加学生\n"); - printf("3.删除学生\n"); - printf("4.修改学生\n"); - printf("5.从文件导入学生信息\n"); - printf("6.导出学生信息到文件\n"); - printf("7.学生成绩管理\n"); - printf("8.课程管理\n"); - printf("0.退出\n"); + while (true) { + try { + system("cls"); + printf("1.显示所有学生\n"); + printf("2.增加学生\n"); + printf("3.删除学生\n"); + printf("4.修改学生\n"); + printf("5.从文件导入学生信息\n"); + printf("6.导出学生信息到文件\n"); + printf("7.学生成绩管理\n"); + printf("8.课程管理\n"); + printf("9.高级功能\n"); + printf("0.退出\n"); - int opt = -1; - checkOptInput(opt, 0, 8); + int opt = -1; + checkOptInput(opt, 0, 9); - switch (opt){ - case 1: - showAllStudent(connection); - break; - case 2: - insertStudent(connection); - break; - case 3: - deleteStudent(connection); - break; - case 4: - changeStudent(connection); - break; - case 5: - importData(connection); - break; - case 6: - exportData(connection); - break; - case 7: - studentGradeMenu(connection); - break; - case 8: - courseMenu(connection); - break; - default: - exit(EXIT_SUCCESS); + switch (opt) { + case 1: + showAllStudent(connection); + break; + case 2: + insertStudent(connection); + break; + case 3: + deleteStudent(connection); + break; + case 4: + changeStudent(connection); + break; + case 5: + importData(connection); + break; + case 6: + exportData(connection); + break; + case 7: + studentGradeMenu(connection); + break; + case 8: + courseMenu(connection); + break; + case 9: + advancedFunction(connection); + break; + default: + exit(EXIT_SUCCESS); + } + printf("\n"); + system("pause"); + } + catch (_com_error& err) { + wprintf(L"操作失败!\n"); + wprintf(L"The application throws the error: %s\n", (wchar_t*)err.ErrorMessage()); + wprintf(L"Description = %s\n", (wchar_t*)err.Description()); + system("pause"); + } } - printf("\n"); } void studentGradeMenu(_ConnectionPtr connection) { while (true) { - system("cls"); - printf("1.输入学生成绩\n"); - printf("2.获取学生平均成绩\n"); - printf("3.获取学生总成绩\n"); - printf("4.获取班级平均分\n"); - printf("5.获取班级最高分\n"); - printf("6.获取班级最低分\n"); - printf("7.获取班级成绩\n"); - printf("8.二级拓展菜单\n"); - printf("0.返回上一级\n"); + try { + system("cls"); + printf("1.输入学生成绩\n"); + printf("2.获取学生平均成绩\n"); + printf("3.获取学生总成绩\n"); + printf("4.获取班级平均分\n"); + printf("5.获取班级最高分\n"); + printf("6.获取班级最低分\n"); + printf("7.获取班级成绩\n"); + printf("8.二级拓展菜单\n"); + printf("0.返回上一级\n"); - int opt = -1; - checkOptInput(opt, 0, 8); + int opt = -1; + checkOptInput(opt, 0, 8); - printf("\n"); + printf("\n"); - string stuId, courseId; - string stuClass, courseName; - double grade = -1; - int size; - vector *v; - switch (opt) { + string stuId, courseId; + string stuClass, courseName; + double grade = -1; + int size; + vector* v; + switch (opt) { case 1://输入学生成绩 printf("请输入学号:"); cin >> stuId; @@ -105,21 +115,21 @@ void studentGradeMenu(_ConnectionPtr connection) { cin >> stuClass; printf("请输入课程名:"); cin >> courseName; - cout << stuClass << "班级" << courseName << "课程的平均分为:" << getClassAvgGrade(connection, stuClass, courseName) << "\n"; + cout << stuClass << " 班级 " << courseName << " 课程的平均分为:" << getClassAvgGrade(connection, stuClass, courseName) << "\n"; break; case 5://获取班级最高分 printf("请输入班级:"); cin >> stuClass; printf("请输入课程名:"); cin >> courseName; - cout << stuClass << "班级" << courseName << "课程的最高分为:" << getClassMaxGrade(connection, stuClass, courseName) << "\n"; + cout << stuClass << " 班级 " << courseName << " 课程的最高分为:" << getClassMaxGrade(connection, stuClass, courseName) << "\n"; break; case 6://获取班级最低分 printf("请输入班级:"); cin >> stuClass; printf("请输入课程名:"); cin >> courseName; - cout << stuClass << "班级" << courseName << "课程的最低分为:" << getClassMinGrade(connection, stuClass, courseName) << "\n"; + cout << stuClass << " 班级 " << courseName << " 课程的最低分为:" << getClassMinGrade(connection, stuClass, courseName) << "\n"; break; case 7://获取班级成绩 printf("请输入班级:"); @@ -132,7 +142,7 @@ void studentGradeMenu(_ConnectionPtr connection) { size = v->size(); cout << "学号\t" << "课程名\t" << "成绩\n"; for (int i = 0; i < size; i++) { - cout << (*v)[i].getStuId() << "\t" << getCourseById(connection, (*v)[i].getCourseId())->getName() << "\t" << (*v)[i].getGradeStr() << "\n"; + cout << (*v)[i].toString() << "\n"; } break; case 8://二级拓展菜单 @@ -140,37 +150,45 @@ void studentGradeMenu(_ConnectionPtr connection) { break; default://返回上一级 return; + } + system("pause"); + } + catch (_com_error& err) { + wprintf(L"操作失败!\n"); + wprintf(L"The application throws the error: %s\n", (wchar_t*)err.ErrorMessage()); + wprintf(L"Description = %s\n", (wchar_t*)err.Description()); + system("pause"); } - system("pause"); } } void studentGradeExternMenu(_ConnectionPtr connection) { while (true) { - system("cls"); - printf("1.删除某学生某科成绩\n"); - printf("2.删除某学生成绩\n"); - printf("3.删除某科成绩\n"); - printf("4.更改某学生某科成绩\n"); - printf("5.查询某学生某科成绩\n"); - printf("6.查询某学生成绩\n"); - printf("7.查询某科成绩\n"); - printf("8.查询所有成绩\n"); - printf("0.返回上一级\n"); + try { + system("cls"); + printf("1.删除某学生某科成绩\n"); + printf("2.删除某学生成绩\n"); + printf("3.删除某科成绩\n"); + printf("4.更改某学生某科成绩\n"); + printf("5.查询某学生某科成绩\n"); + printf("6.查询某学生成绩\n"); + printf("7.查询某科成绩\n"); + printf("8.查询所有成绩\n"); + printf("0.返回上一级\n"); - int opt = -1; - checkOptInput(opt, 0, 8); + int opt = -1; + checkOptInput(opt, 0, 8); - printf("\n"); + printf("\n"); - string stuId, courseId; - string stuClass, courseName; - double grade = -1; - int size; - vector *v; - Grade* gra; - Course* course; - switch (opt) { + string stuId, courseId; + string stuClass, courseName; + double grade = -1; + int size; + vector* v; + Grade* gra; + Course* course; + switch (opt) { case 1://删除某学生某科成绩 printf("请输入学号:"); cin >> stuId; @@ -236,7 +254,7 @@ void studentGradeExternMenu(_ConnectionPtr connection) { break; } cout << "学号\t" << "课程名\t" << "成绩\n"; - cout << (*gra).getStuId() << "\t" << getCourseById(connection, (*gra).getCourseId())->getName() << "\t" << (*gra).getGradeStr() << "\n"; + cout << (*gra).toString() << "\n"; break; case 6://查询某学生成绩 printf("请输入学号:"); @@ -249,7 +267,7 @@ void studentGradeExternMenu(_ConnectionPtr connection) { size = v->size(); cout << "学号\t" << "课程名\t" << "成绩\n"; for (int i = 0; i < size; i++) { - cout << (*v)[i].getStuId() << "\t" << getCourseById(connection, (*v)[i].getCourseId())->getName() << "\t" << (*v)[i].getGradeStr() << "\n"; + cout << (*v)[i].toString() << "\n"; } break; case 7://查询某科成绩 @@ -268,7 +286,7 @@ void studentGradeExternMenu(_ConnectionPtr connection) { size = v->size(); cout << "学号\t" << "课程名\t" << "成绩\n"; for (int i = 0; i < size; i++) { - cout << (*v)[i].getStuId() << "\t" << getCourseById(connection, (*v)[i].getCourseId())->getName() << "\t" << (*v)[i].getGradeStr() << "\n"; + cout << (*v)[i].toString() << "\n"; } break; case 8://查询所有成绩 @@ -280,39 +298,47 @@ void studentGradeExternMenu(_ConnectionPtr connection) { size = v->size(); cout << "学号\t" << "课程名\t" << "成绩\n"; for (int i = 0; i < size; i++) { - cout << (*v)[i].getStuId() << "\t" << getCourseById(connection, (*v)[i].getCourseId())->getName() << "\t" << (*v)[i].getGradeStr() << "\n"; + cout << (*v)[i].toString() << "\n"; } break; default://返回上一级 return; + } + system("pause"); + } + catch (_com_error& err) { + wprintf(L"操作失败!\n"); + wprintf(L"The application throws the error: %s\n", (wchar_t*)err.ErrorMessage()); + wprintf(L"Description = %s\n", (wchar_t*)err.Description()); + system("pause"); } - system("pause"); } } void courseMenu(_ConnectionPtr connection) { while (true) { - system("cls"); - printf("1.添加课程\n"); - printf("2.删除课程\n"); - printf("3.更改课程\n"); - printf("4.查询所有课程\n"); - printf("0.返回上一级\n"); - int opt = -1; - checkOptInput(opt, 0, 8); + try { + system("cls"); + printf("1.添加课程\n"); + printf("2.删除课程\n"); + printf("3.更改课程\n"); + printf("4.查询所有课程\n"); + printf("0.返回上一级\n"); + int opt = -1; + checkOptInput(opt, 0, 4); - printf("\n"); + printf("\n"); - int size; - string courseId, courseName; - vector* v; - switch (opt) { + int size; + string courseId, courseName; + vector* v; + switch (opt) { case 1://添加课程 printf("请输入课程号:"); cin >> courseId; printf("请输入课程名:"); cin >> courseName; - addCourse(connection,*new Course(courseId, courseName)); + addCourse(connection, *new Course(courseId, courseName)); printf("添加成功!\n"); break; case 2://删除课程 @@ -326,7 +352,7 @@ void courseMenu(_ConnectionPtr connection) { cin >> courseId; printf("请输入课程名:"); cin >> courseName; - updateCourseName(connection, courseId,courseName); + updateCourseName(connection, courseId, courseName); printf("更新成功!\n"); break; case 4://查询所有课程 @@ -338,21 +364,79 @@ void courseMenu(_ConnectionPtr connection) { size = v->size(); cout << "课程号\t" << "课程名\n"; for (int i = 0; i < size; i++) { - cout << (*v)[i].getId() << "\t" << (*v)[i].getName() << "\n"; + cout << (*v)[i].toString() << "\n"; } break; default://返回上一级 return; + } + system("pause"); + } + catch (_com_error& err) { + wprintf(L"操作失败!\n"); + wprintf(L"The application throws the error: %s\n", (wchar_t*)err.ErrorMessage()); + wprintf(L"Description = %s\n", (wchar_t*)err.Description()); + system("pause"); } - system("pause"); } } +void advancedFunction(_ConnectionPtr connection) { + system("cls"); + _RecordsetPtr record(_uuidof(Recordset)); + string sql; + + cin.clear(); + while (cin.get() != '\n'); + while (true) { + try { + wprintf(L"sql>"); + //获取sql命令及种类 + getline(cin, sql); + while (sql == "" || sql[sql.size() - 1] != ';') { + wprintf(L" >"); + string tmp; + getline(cin, tmp); + sql += " " + tmp; + } + string comType = ""; + getSqlType(sql, comType); + //执行sql命令 + if (comType == "select") {//查询 + record = connection->Execute(sql.c_str(), NULL, (long)0); + for (long i = 0; i < record->Fields->Count; i++) + wprintf(L"%s\t", (wchar_t*)record->Fields->GetItem(i)->Name); + printf("\n"); + wprintf(L"%s", (wchar_t*)record->GetString(adClipString, long(-1), "\t", "\n", "Null")); + //showRecordInfo(record); + }else if (comType == "exit" || comType == "exit;") { + system("pause"); + break; + }else { + connection->Execute(sql.c_str(), NULL, (long)0); + } + printf("\n"); + } + catch (_com_error& err) { + wprintf(L"\nThe application throws the error: %s\n", (wchar_t*)err.ErrorMessage()); + wprintf(L"Description = %s\n\n", (wchar_t*)err.Description()); + } + } +} + + + void showAllStudent(_ConnectionPtr connection) { - vector vs = *getAllStudent(connection); - int size = vs.size(); + vector* vs = getAllStudent(connection); + if (vs == NULL) { + printf("学生信息为空!\n"); + return; + } + + int size = vs->size(); + printf("学号\t姓名\t性别\t班级\t状态\n"); for (int i = 0; i < size; i++) { - cout << vs[i].toString() << "\n"; + cout << (*vs)[i].toString() << "\n"; } } @@ -423,9 +507,248 @@ void changeStudent(_ConnectionPtr connection) { } void exportData(_ConnectionPtr connection) { + while (true) { + try { + system("cls"); + printf("1.导出学生信息\n"); + printf("2.导出课程信息\n"); + printf("3.导出成绩信息\n"); + printf("4.导出所有信息\n"); + printf("0.返回上一级\n"); + int opt = -1; + checkOptInput(opt, 0, 4); + printf("\n"); + + switch (opt) { + case 1://导出学生信息 + exportStudentData(connection); + break; + case 2://导出课程信息 + exportCourseData(connection); + break; + case 3://导出成绩信息 + exportGradeData(connection); + break; + case 4://导出所有信息 + exportAllData(connection); + break; + default://返回上一级 + return; + } + system("pause"); + } + catch (_com_error& err) { + wprintf(L"操作失败!\n"); + wprintf(L"The application throws the error: %s\n", (wchar_t*)err.ErrorMessage()); + wprintf(L"Description = %s\n", (wchar_t*)err.Description()); + system("pause"); + } + } } -void importData(_ConnectionPtr connection) { +void exportStudentData(_ConnectionPtr connection) { + ofstream outFile("student.txt", ios::out); + if (!outFile.is_open()) { + printf("导出student.txt文件失败!\n"); + return; + } + int size; + vector* vs; + vs = getAllStudent(connection); + if (vs == NULL) { + printf("学生信息为空!\n"); + outFile.close(); + return; + } + outFile << "学号\t姓名\t性别\t班级\t状态\n"; + size = vs->size(); + for (int i = 0; i < size; i++) { + outFile << (*vs)[i].toString() << "\n"; + } + printf("成功导出student.txt文件!\n"); + outFile.close(); +} + +void exportCourseData(_ConnectionPtr connection) { + ofstream outFile("course.txt", ios::out); + if (!outFile.is_open()) { + printf("导出course.txt文件失败!\n"); + return; + } + + int size; + vector* vc; + vc = getAllCourse(connection); + if (vc == NULL) { + printf("课程信息为空!\n"); + outFile.close(); + return; + } + outFile << "课程号\t课程名\n"; + size = vc->size(); + for (int i = 0; i < size; i++) { + outFile << (*vc)[i].toString() << "\n"; + } + printf("成功导出course.txt文件!\n"); + outFile.close(); +} + +void exportGradeData(_ConnectionPtr connection) { + ofstream outFile("grade.txt", ios::out); + if (!outFile.is_open()) { + printf("导出grade.txt文件失败!\n"); + return; + } + + int size; + vector* vg; + vg = getAllGrade(connection); + if (vg == NULL) { + printf("成绩信息为空!\n"); + outFile.close(); + return; + } + outFile << "学号\t课程号\t成绩\n"; + size = vg->size(); + for (int i = 0; i < size; i++) { + outFile << (*vg)[i].toString() << "\n"; + } + printf("成功导出grade.txt文件!\n"); + outFile.close(); +} + +void exportAllData(_ConnectionPtr connection) { + exportStudentData(connection); + exportCourseData(connection); + exportGradeData(connection); +} + + + +void importData(_ConnectionPtr connection) { + while (true) { + try { + system("cls"); + printf("1.导入学生信息\n"); + printf("2.导入课程信息\n"); + printf("3.导入成绩信息\n"); + printf("4.导入所有信息\n"); + printf("0.返回上一级\n"); + int opt = -1; + checkOptInput(opt, 0, 4); + + printf("\n"); + + switch (opt) { + case 1://导入学生信息 + importStudentData(connection); + break; + case 2://导入课程信息 + importCourseData(connection); + break; + case 3://导入成绩信息 + importGradeData(connection); + break; + case 4://导入所有信息 + importAllData(connection); + break; + default://返回上一级 + return; + } + system("pause"); + } + catch (_com_error& err) { + wprintf(L"操作失败!\n"); + wprintf(L"The application throws the error: %s\n", (wchar_t*)err.ErrorMessage()); + wprintf(L"Description = %s\n", (wchar_t*)err.Description()); + system("pause"); + } + } +} + +void importStudentData(_ConnectionPtr connection) { + ifstream inFile("student.txt", ios::in); + if (!inFile.is_open()) { + printf("读取student.txt文件失败!\n"); + return; + } + + string title[5]; + inFile >> title[0] >> title[1] >> title[2] >> title[3] >> title[4]; + if (!(title[0] == "学号" && title[1] == "姓名" && title[2] == "性别" && title[3] == "班级" && title[4] == "状态")) { + printf("文件格式异常,读取失败!\n"); + return; + } + + Student* student = new Student(); + while (!inFile.eof()) { + inFile >> title[0] >> title[1] >> title[2] >> title[3] >> title[4]; + student->setId(title[0]); + student->setName(title[1]); + student->setSex(title[2]); + student->setStuClass(title[3]); + student->setStatus(title[4]); + addStudent(connection, *student); + } + printf("成功导入student.txt文件!\n"); + inFile.close(); +} + +void importCourseData(_ConnectionPtr connection) { + ifstream inFile("course.txt", ios::in); + if (!inFile.is_open()) { + printf("读取course.txt文件失败!\n"); + return; + } + + string title[2]; + inFile >> title[0] >> title[1]; + if (!(title[0] == "课程号" && title[1] == "课程名")) { + printf("文件格式异常,读取失败!\n"); + return; + } + + Course* course = new Course(); + while (!inFile.eof()) { + inFile >> title[0] >> title[1]; + course->setId(title[0]); + course->setName(title[1]); + addCourse(connection, *course); + } + printf("成功导入course.txt文件!\n"); + inFile.close(); +} + +void importGradeData(_ConnectionPtr connection) { + ifstream inFile("grade.txt", ios::in); + if (!inFile.is_open()) { + printf("读取grade.txt文件失败!\n"); + return; + } + + string title[3]; + inFile >> title[0] >> title[1] >> title[2]; + if (!(title[0] == "学号" && title[1] == "课程号" && title[2] == "成绩")) { + printf("文件格式异常,读取失败!\n"); + return; + } + + Grade* grade = new Grade(); + while (!inFile.eof()) { + inFile >> title[0] >> title[1] >> title[2]; + grade->setStuId(title[0]); + grade->setCourseId(title[1]); + grade->setGrade(title[2]); + addGrade(connection, *grade); + } + printf("成功导入grade.txt文件!\n"); + inFile.close(); +} + +void importAllData(_ConnectionPtr connection) { + importStudentData(connection); + importCourseData(connection); + importGradeData(connection); } \ No newline at end of file diff --git a/Menu.h b/Menu.h index f105922..52cc3a2 100644 --- a/Menu.h +++ b/Menu.h @@ -3,15 +3,24 @@ #import "c:\\Program Files\\Common Files\\System\\ado\\msado15.dll" no_namespace rename("EOF", "EndOfFile") +#include +#include #include #include"Student.cpp" #include"Course.cpp" #include"Grade.cpp" +#include"DBCUtils.h" +#include"MenuUtils.h" +#include"StudentDAO.h" +#include"GradeDAO.h" +#include"CourseDAO.h" +using namespace std; void mainMenu(_ConnectionPtr connection); void studentGradeMenu(_ConnectionPtr connection); void studentGradeExternMenu(_ConnectionPtr connection); void courseMenu(_ConnectionPtr connection); +void advancedFunction(_ConnectionPtr connection); void showAllStudent(_ConnectionPtr connection); void insertStudent(_ConnectionPtr connection); @@ -19,6 +28,15 @@ void deleteStudent(_ConnectionPtr connection); void changeStudent(_ConnectionPtr connection); void exportData(_ConnectionPtr connection); +void exportStudentData(_ConnectionPtr connection); +void exportCourseData(_ConnectionPtr connection); +void exportGradeData(_ConnectionPtr connection); +void exportAllData(_ConnectionPtr connection); + void importData(_ConnectionPtr connection); +void importStudentData(_ConnectionPtr connection); +void importCourseData(_ConnectionPtr connection); +void importGradeData(_ConnectionPtr connection); +void importAllData(_ConnectionPtr connection); #endif // !MENU_H \ No newline at end of file diff --git a/Student.cpp b/Student.cpp index 651f358..0809648 100644 --- a/Student.cpp +++ b/Student.cpp @@ -26,14 +26,7 @@ public: void setStatus(string status) { this->status = status; } string toString() { - string toStr = "Student{"; - toStr += "id='" + id + '\'' + - ", name='" + name + '\'' + - ", sex='" + sex + '\'' + - ", stuClass='" + stuClass + '\'' + - ", status='" + status + '\'' + - '}'; - return toStr; + return id + "\t" + name + "\t" + sex + "\t" + stuClass + "\t" + status; } private: string id;//学号 diff --git a/main.cpp b/main.cpp index dc2cd45..2215f15 100644 --- a/main.cpp +++ b/main.cpp @@ -10,27 +10,24 @@ #include "Menu.h" using namespace std; -//高级功能 直接输入sql语句 int main() { setlocale(LC_ALL, "chs"); CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); string pwd; + while (true) { + try { + wprintf(L"Enter password:"); + getline(cin, pwd); - wprintf(L"Enter password:"); - getline(cin, pwd); - - _ConnectionPtr pconnect(_uuidof(Connection)); - - if (getConnection(pwd, pconnect)) { - while (true) { - try { + _ConnectionPtr pconnect(_uuidof(Connection)); + if (getConnection(pwd, pconnect)) { mainMenu(pconnect); } - catch (_com_error& err) { - wprintf(L"The application throws the error: %s\n", (wchar_t*)err.ErrorMessage()); - wprintf(L"Description = %s\n", (wchar_t*)err.Description()); - } + } + catch (_com_error& err) { + wprintf(L"The application throws the error: %s\n", (wchar_t*)err.ErrorMessage()); + wprintf(L"Description = %s\n", (wchar_t*)err.Description()); } } CoUninitialize();