本文共计2834个字,预计阅读时长11.3分钟。
朋友让做一个 排序器,具体 逻辑是 总计60个人 ,前20人为队长,分别为20个队伍,后40个人随机分配到队伍中,每个队伍为3人
这是具体例子:
#include <iostream>
#include <fstream>
#include <vector>
#include <random>
#include <string>
void 开始摇号()
{
const int numTeams = 20; // 队伍数量
const int membersPerTeam = 3; // 每个队伍的成员数量,包括队长
std::string filename = "name.txt"; // 名字文件的路径
std::vector<std::string> names; // 存储所有名字
std::vector<std::string> captains; // 存储队长的名字
std::vector<std::vector<std::string>> teams(numTeams, std::vector<std::string>(membersPerTeam)); // 存储每个队伍的成员
// 尝试打开文件
std::ifstream file(filename);
if (!file.is_open())
{
std::cerr << "无法打开文件: " << filename << std::endl;
}
std::string name;
while (getline(file, name))
{
if (!name.empty())
{ // 确保跳过空行
names.push_back(name);
}
}
file.close();
// 打印读取的名字数量,用于调试
std::cout << "读取的名字数量: " << names.size() << std::endl;
// 检查名字数量是否足够
if (names.size() < numTeams)
{
std::cerr << "Error: 文件中的名字数量不足。" << std::endl;
}
// 分配队长
for (int i = 0; i < numTeams; ++i)
{
captains.push_back(names[i]);
}
// 剩余的名字作为队员
std::vector<std::string> members;
for (size_t i = numTeams; i < names.size(); ++i)
{
members.push_back(names[i]);
}
// 初始化随机数生成器
std::random_device rd;
std::mt19937 g(rd());
std::shuffle(members.begin(), members.end(), g); // 打乱队员顺序
// 为每个队伍分配队员
for (int i = 0; i < numTeams; ++i)
{
teams[i][0] = captains[i]; // 第0位是队长
teams[i][1] = members[i * 2]; // 第1位是第一个队员
if (i * 2 + 1 < members.size())
{ // 检查是否有足够的队员
teams[i][2] = members[i * 2 + 1]; // 第2位是第二个队员
}
else
{
std::cerr << "Error: 不能为所有队伍分配足够的队员。" << std::endl;
}
}
// 打印结果
for (int i = 0; i < numTeams; ++i)
{
std::cout << "队伍 " << i + 1 << ":";
for (int j = 0; j < membersPerTeam; ++j)
{
std::cout << " " << teams[i][j];
}
std::cout << std::endl;
}
}
int main()
{
bool running = true;
char userChoice;
while (running)
{
std::cout << "请输入 '1' 以开始摇号: ";
std::cin >> userChoice;
if (userChoice == '1')
{
开始摇号();
}
else
{
std::cout << "输入无效,请重新输入。" << std::endl;
}
}
return 0;
}
几个小知识点:
1.用到读取文件,为了方便编辑队员的名字,所以用了读取txt
2.随机数生成器
3.txt用ansi码,这样中文系统下可以读取到正确字符