用c++ 写一个代码以班级为单位进行选题,题目信息以文件形式存放, 包括:编号、题目、任务要求、完成时间 功能要求: 1学生信息包括:学号、姓名、班级; 2输入学号,随机抽取题目,限定每个题目只能被一个学生选中 3选题结果以文件形式存放,可以随时进行查询操作。
时间: 2024-02-22 19:57:24 浏览: 83
好的,下面是一个简单的 C++ 代码,实现了你提出的功能要求:
```c++
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <ctime>
#include <cstdlib>
using namespace std;
// 题目信息结构体
struct Topic {
int id; // 编号
string title; // 题目
string requirement; // 任务要求
int time; // 完成时间(天)
};
// 学生信息结构体
struct Student {
string id; // 学号
string name; // 姓名
string classId; // 班级
int topicId; // 选题编号
};
// 读取题目信息文件,构建题目信息向量
vector<Topic> readTopics(string filename) {
ifstream fin(filename);
vector<Topic> topics;
Topic t;
while (fin >> t.id >> t.title >> t.requirement >> t.time) {
topics.push_back(t);
}
fin.close();
return topics;
}
// 保存选题结果到文件中
void saveSelection(const vector<Student>& students, string filename) {
ofstream fout(filename);
for (const auto& s : students) {
fout << s.id << " " << s.name << " " << s.classId << " " << s.topicId << endl;
}
fout.close();
}
// 读取选题结果文件,构建学生信息向量
vector<Student> readSelection(string filename) {
ifstream fin(filename);
vector<Student> students;
Student s;
while (fin >> s.id >> s.name >> s.classId >> s.topicId) {
students.push_back(s);
}
fin.close();
return students;
}
// 随机选择一个未被选过的题目
int selectTopic(const vector<Topic>& topics, const vector<Student>& students) {
vector<int> availableIds;
for (const auto& t : topics) {
bool taken = false;
for (const auto& s : students) {
if (s.topicId == t.id) {
taken = true;
break;
}
}
if (!taken) {
availableIds.push_back(t.id);
}
}
if (availableIds.empty()) {
return -1; // 没有可选题目了
}
int idx = rand() % availableIds.size();
return availableIds[idx];
}
int main() {
srand(time(nullptr)); // 初始化随机数生成器
string topicsFile = "topics.txt";
string selectionFile = "selection.txt";
vector<Topic> topics = readTopics(topicsFile);
vector<Student> students = readSelection(selectionFile);
cout << "请输入学号:";
string id;
cin >> id;
// 查找学生信息
bool found = false;
Student s;
for (const auto& student : students) {
if (student.id == id) {
found = true;
s = student;
break;
}
}
if (!found) {
// 新学生,创建记录
cout << "请输入姓名:";
string name;
cin >> name;
cout << "请输入班级:";
string classId;
cin >> classId;
int topicId = selectTopic(topics, students);
if (topicId == -1) {
cout << "非常抱歉,没有可供选择的题目了!" << endl;
return 0;
}
s = {id, name, classId, topicId};
students.push_back(s);
cout << "恭喜你,选题成功!" << endl;
} else {
// 已有记录,查询选题情况
cout << "你已经选了以下题目:" << endl;
for (const auto& t : topics) {
if (t.id == s.topicId) {
cout << t.title << endl;
break;
}
}
}
// 保存选题结果
saveSelection(students, selectionFile);
return 0;
}
```
这个代码包含了以下函数:
1. `readTopics`:读取题目信息文件,返回题目信息向量。
2. `saveSelection`:将选题结果保存到文件中。
3. `readSelection`:读取选题结果文件,返回学生信息向量。
4. `selectTopic`:从未被选过的题目中随机选择一个,返回题目编号。
5. `main`:程序入口函数,实现了整个选题流程。
代码中使用了结构体来封装题目信息和学生信息,使用向量来存储题目和学生信息,使用文件来持久化选题结果。在 `main` 函数中,先读取题目和选题结果文件,然后提示用户输入学号,查找学生信息。如果没有找到学生信息,则说明这是一个新学生,需要输入姓名和班级信息,然后随机选择一个未被选过的题目,并将选题结果保存到文件中。如果已有学生信息,则查询该学生的选题情况。
需要注意的是,这个代码还有很多可以改进的地方,例如错误处理、输入验证、界面设计等等,这里只是提供一个简单的示例,供参考。
阅读全文