#include #include #include #include #include #include class Courses { private: std::map c; //课程名字到编号的映射,编号从0开始 std::vector names; //课程编号到名字的映射 public: int getNum() { return c.size(); } //课程总数 int addCourse(std::string name) //返回新ID { int temp = c.size(); c[name] = temp; names.push_back(name); return temp; } int findCourseId(std::string name) //课程名字寻找课程ID,找不到返回-1 { if (c.find(name) != c.end()) return c[name]; else return -1; } std::string queryName(int id) //询问课程名称 { if (id < 0 || id >= c.size()) return std::string(""); return names[id]; } void display() //输出表头 { printf("\t"); for (auto i : names) printf("%s\t", i.c_str()); printf("总分\t平均分\t排名\n"); } } courses; class Student { private: std::string name; std::map score; double totScore = 0; public: bool operator<(const Student &x) const { //输出时候除以课程总数就行了courses.getNum() return totScore > x.totScore; } friend class Students; }; class Students { private: std::map mp; //名字到下标的映射 std::vector s; //下标到名字的映射 public: int getNum(){return s.size();} int findName(std::string name) { std::map::iterator it = mp.find(name); if (it == mp.end()) return 0; return it->second; } void addStudent(std::string name) //录入学生成绩 { Student temp; temp.name = name; int totCourse = courses.getNum(); for(int i=0;i>ss; temp.score[i]=ss; temp.totScore+=ss; } s.push_back(temp); mp[name] = mp.size(); return; //成功 } double queScore(std::string name,int courseId) { std::map::iterator it = mp.find(name); if (it == mp.end()) return -1.0; int sid=it->second; return s[sid].score[courseId]; } bool changeScore(std::string name, int courseId, double newscore) //返回是否成功 { std::map::iterator it = mp.find(name); if (it == mp.end()) return false; int sid = it->second; int temp = s[sid].score[courseId]; s[sid].score[courseId] = newscore; s[sid].totScore += newscore - temp; return true; } void displayStudent(std::string name) //输出一个学生的成绩,不输出表头 { int sid = mp[name]; displayStudent(sid); } void displayStudent(int sid) //输出一个学生的成绩,不输出表头 { std::cout< '9') { if (ch == '-') w = -1; ch = getchar(); } while (ch >= '0' && ch <= '9') s = s * 10 + ch - '0', ch = getchar(); x = s * w; } int temp; public: void run() { printf("启动中"); for (int i = 1; i <= 5; i++) system("sleep 0.1"), printf("."); system("cls"); printf("欢迎使用成绩管理系统!\n请输入科目数量:\n"); read(temp); puts("请输入每个科目的名称,用回车键分隔"); for(int i=0;i>name; courses.addCourse(name); } puts("请输入学生数量"); read(temp); puts("开始录入成绩"); for(int i=1;i<=temp;i++) { std::string name; puts("输入姓名:"); std::cin>>name; students.addStudent(name); puts("添加成功"); } students.sort(); while (1) { puts("添加学生请输入1\n修改学生成绩请输入2\n查询某学生成绩请输入3\n按排名输出成绩单请输入4"); int type = 0; read(type); //提高容错性 if (type == 1) { std::string name; puts("输入姓名:"); std::cin>>name; students.addStudent(name); puts("添加成功"); students.sort(); system("sleep 2"); system("cls"); continue; } if (type == 2) { std::string name; puts("姓名:"); std::cin >> name; if(!students.findName(name)) { puts("查无此人"); system("sleep 2"); system("cls"); continue; } puts("要修改的科目名称:"); std::string cour; int courid; while (1) { std::cin>>cour; if(cour==std::string("@$#")) goto cao; courid = courses.findCourseId(cour); if(courid==-1) { puts("查无此科目,请重新输入。返回上层请输入@$#"); } else break; } std::cout<< "原先成绩为" << students.queScore(name, courid)<<",请输入新的成绩:" << std::endl; double newsc; std::cin>>newsc; students.changeScore(name,courid,newsc); puts("修改成功"); students.sort(); system("sleep 2"); cao: system("cls"); continue; } if(type==3) { std::string name; puts("输入姓名:"); std::cin>>name; courses.display(); students.displayStudent(name); continue; } if(type==4) { courses.display(); for(int i=0,sz=students.getNum();i