点名系统

本文介绍了一个点名系统,用于录入、管理同学信息,包括必修课和选修课点名,以及查看和保存数据。系统支持录入、新增、查看、点名和保存操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#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; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值