#include <iostream>#include <string> #include <conio.h> #include <sstream> #include <fstream> #include <map> #include <deque> #include <time.h> using namespace std; struct stu_node { string id; string name; int punishment; }; map<string, stu_node> data; map<string, stu_node>::iterator iter; deque<string> id; void XMB() { cout << "****************点名系统****************" << endl; cout << "1.录入同学信息(会把以前数据全部删掉,格式:学号 姓名 累计惩罚(如无可不写))。" << endl; cout << "2.新增同学信息。" << endl; cout << "3.必修课点名。" << endl; cout << "4.选修课点名。" << endl; cout << "5.查看全部同学的累计惩罚。" << endl; cout << "6.查看某位同学的累计惩罚。" << endl; cout << "7.保存数据。" << endl; cout << "8.退出。" << endl; cout << "请输入你的选择: "; } bool getData(string filename) { ifstream inf(filename); if(inf == NULL) { return false; } streambuf *strm_buf = cin.rdbuf(); cin.rdbuf(inf.rdbuf()); data.clear(); string line, str; stu_node tmp; while(getline(cin , line)) { istringstream stream(line); if(stream >> str) { tmp.id = str; }else { continue; } if(stream >> str) { tmp.name = str; }else { continue; } if(stream >> str) { tmp.punishment = atoi(str.c_str()); } else { tmp.punishment = 0; } data.insert(make_pair(tmp.id, tmp)); id.push_back(tmp.id); } cin.rdbuf(strm_buf); return true; } bool saveData(string str) { ofstream outf(str.c_str()); if(outf == NULL) { return false; } streambuf *strm_buf = cout.rdbuf(); cout.rdbuf(outf.rdbuf()); for(iter = data.begin(); iter != data.end(); iter++) { cout << iter->second.id << " " << iter->second.name << " " << iter->second.punishment << endl; } cout.rdbuf(strm_buf); return true; } int main() { char choice = ' '; bool ok = true; string str; stu_node tmp; int count; int num; srand((unsigned)time(NULL)); getData("data.txt"); while(ok) { system("cls"); XMB(); fflush(stdin); choice = getch(); cin.clear(); cout << choice << endl << endl << endl; switch(choice) { case '1': cout << "请输入文件名: "; cin >> str; if(getData(str)) cout << "信息录入成功。" << endl; else cout << "信息录入失败。" << endl; break; case '2': cout << "请输入学号:"; cin >> str; if((iter = data.find(str)) != data.end()) { cout << "此同学已经存在,信息如下:" << endl; cout << "学号\t\t姓名\t累计惩罚" << endl; cout << iter->second.id << "\t" << iter->second.name << "\t" << iter->second.punishment << endl; }else { tmp.id = str; cout << "请输入姓名:"; cin >> str; tmp.name = str; tmp.punishment = 0; data.insert(make_pair(tmp.id, tmp)); id.push_back(tmp.id); cout << "录入成功." << endl; } break; case '3': cout << "现在开始进行必修课点名。输入y/Y代表已到,否则算缺席。" << endl; count = data.size() * 0.3 + 1; while(count) { num = rand() % count; str = id.at(num); iter = data.find(str); id.erase(id.begin() + num); id.push_back(str); cout << iter->first << " " << iter->second.name << " 在么?(y/n): "; fflush(stdin); choice = getch(); cout << choice << endl; if(!(choice == 'y' || choice == 'Y')) iter->second.punishment += 2; count--; } break; case '4': cout << "现在开始进行选修课点名。输入y/Y代表已到,否则算缺席。" << endl; count = data.size() * 0.3 + 1; while(count) { num = rand() % count; str = id.at(num); iter = data.find(str); id.erase(id.begin() + num); id.push_back(str); cout << iter->first << " " << iter->second.name << " 在么?(y/n): "; fflush(stdin); choice = getch(); cout << choice << endl; if(!(choice == 'y' || choice == 'Y')) iter->second.punishment += 2; count--; } break; case '5': cout << "各同学信息如下:" << endl; cout << "学号\t\t姓名\t累计惩罚" << endl; for(iter = data.begin(); iter != data.end(); iter++) { cout << iter->second.id << "\t" << iter->second.name << "\t" << iter->second.punishment << endl; } break; case '6': cout << "请输入学号: "; cin >> str; if((iter = data.find(str)) != data.end()) { cout << "此同学信息如下:" << endl; cout << "学号\t\t姓名\t累计惩罚" << endl; cout << iter->second.id << "\t" << iter->second.name << "\t" << iter->second.punishment << endl; }else { cout << "此同学信息不存在。" << endl; } break; case '7': cout << "请输入文件名: "; cin >> str; if(saveData(str)) cout << "保存成功。" << endl; else cout << "保存失败。" << endl; break; case '8': ok = false; break; default: cout << "输入错误。" << endl; } system("pause"); } saveData("data.txt"); return 0; }
点名系统
最新推荐文章于 2020-06-27 08:58:37 发布