#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;
}
点名系统
最新推荐文章于 2024-07-08 12:36:03 发布