用stl写一个自动打分比赛的案例

2023-12-09 17:04
文章标签 自动 案例 stl 比赛 打分

本文主要是介绍用stl写一个自动打分比赛的案例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 我们要实现六名选手进行随机平均分为两组,先分别淘汰两组中的最后一名,

再决出第一名。

抽象选手

class player
{
public:string name;int score;
};

一个选手有名字和分数

首先我们需要vector容器保存选手的编号,便于后续的操作。

再用map容器保存选手的信息和编号。

// 保存选手编号,方便操作vector<int> v;vector<int> v1;vector<int>v2;// 保存选手信息map<int, player> players;

接下来由我们创建选手

void createplayers(vector<int>& v, map<int, player>& players)
{for (int i = 0; i < 6; i++){int id;//编号//创建一个选手player p;cin >> p.name;id = i + 1;v.push_back(id);p.score = 0;players.insert(make_pair(id, p));}
}

 通过上述函数可以实现创建选手,把id送进v中,把id 和选手信息存进players中。

然后就可以开始第一轮比赛

 我们先通过random_shuffle函数对v中的id进行打乱

void radomByGroups(vector<int>& v)
{random_shuffle(v.begin(),v.end());
}

一开始v中的id为1 2 3 4 5 6 通过random_shuffle函数实现随机

那么比赛中随机打分怎么实现呢,我们可以使用deque容器来求平均分

deque<int> s;for (int i = 0; i < 10; i++){int sco = rand() % 50 + 50;s.push_back(sco);}
sort(s.begin(), s.end());s.pop_back();s.pop_front();int sumscore = accumulate(s.begin(), s.end(), 0);int aver = sumscore / s.size();

我们去掉最高分和最低分再去求平均值

for (vector<int>::iterator it = v.begin(); it != v.end(); it++){// 打分deque<int> s;for (int i = 0; i < 10; i++){int sco = rand() % 50 + 50;s.push_back(sco);}sort(s.begin(), s.end());s.pop_back();s.pop_front();int sumscore = accumulate(s.begin(), s.end(), 0);int aver = sumscore / s.size();players[*it].score = aver;

 这样一来可以把平均分存入players的score中

接下来我们还要实现去掉两组的最后一名,我们可以使用multimap容器,键值存分数,实值存编号,再让multimap容器对键值从大到小排序

multimap<int, int, greater<>> m; // 键值放分数,实值放编号
m.insert(make_pair(aver, *it));

再把aver,编号存入容器中,接下来就可以实现淘汰最后一名了。

if (m.size() == 3){int cnt = 0;for (multimap<int, int, greater<>>::iterator sit = m.begin(); cnt < 2 && sit != m.end(); sit++, cnt++){// 淘汰最后一个v1.push_back(sit->second);}m.clear();}

以下是比赛的完整代码

void competition(vector<int>& v, map<int, player>& players, vector<int>& v1)
{multimap<int, int, greater<>> m; // 键值放分数,实值放编号for (vector<int>::iterator it = v.begin(); it != v.end(); it++){// 打分deque<int> s;for (int i = 0; i < 10; i++){int sco = rand() % 50 + 50;s.push_back(sco);}sort(s.begin(), s.end());s.pop_back();s.pop_front();int sumscore = accumulate(s.begin(), s.end(), 0);int aver = sumscore / s.size();players[*it].score = aver;m.insert(make_pair(aver, *it));if (m.size() == 3){int cnt = 0;for (multimap<int, int, greater<>>::iterator sit = m.begin(); cnt < 2 && sit != m.end(); sit++, cnt++){// 淘汰最后一个v1.push_back(sit->second);}m.clear();}}
}

接下来决出第一名,操作与上述基本一致

void competition2(vector<int>& v1, map<int, player>& players, vector<int>& v2)
{multimap<int, int, greater<>>m;for (auto it = v1.begin(); it != v1.end(); it++){deque<int>q;for (int i = 0; i < 10; i++){int score = rand() % 50 + 50;q.push_back(score);}q.pop_back();q.pop_front();int sumscore = accumulate(q.begin(), q.end(), 0);int aver = sumscore / q.size();players[*it].score = aver;m.insert(make_pair(aver, *it));if (m.size() == 4){int cnt = 0;for (auto it = m.begin(); it != m.end() && cnt < 1; it++, cnt++){v2.push_back(it->second);}}}
}

打印选手信息的函数

void printplayeres(vector<int>& v, map<int, player>& players)
{for (vector<int>::iterator it = v.begin(); it != v.end(); it++){cout << "name: " << players[*it].name << " score: " << players[*it].score << endl;}
}

测试 

void test()
{// 保存选手编号,方便操作vector<int> v;vector<int> v1;vector<int>v2;// 保存选手信息map<int, player> players;createplayers(v, players);printplayeres(v, players);  // 打印比赛前的选手信息cout << "---------------" << endl;radomByGroups(v);  // 随机分组competition(v, players, v1);//printplayeres(v1, players);  // 打印比赛后的选手信息printplayeres(v1, players);  // 打印比赛后的选手信息cout << "---------------" << endl;cout << "final winner:" << endl;competition2(v1, players, v2);printplayeres(v2, players);
}

结果

a b c d e f
name: a score: 0
name: b score: 0
name: c score: 0
name: d score: 0
name: e score: 0
name: f score: 0
---------------
name: b score: 79
name: d score: 77
name: f score: 81
name: c score: 74
---------------
final winner:
name: b score: 83

以上就是实现的案例

这篇关于用stl写一个自动打分比赛的案例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/474463

相关文章

Python脚本实现自动删除C盘临时文件夹

《Python脚本实现自动删除C盘临时文件夹》在日常使用电脑的过程中,临时文件夹往往会积累大量的无用数据,占用宝贵的磁盘空间,下面我们就来看看Python如何通过脚本实现自动删除C盘临时文件夹吧... 目录一、准备工作二、python脚本编写三、脚本解析四、运行脚本五、案例演示六、注意事项七、总结在日常使用

Golang操作DuckDB实战案例分享

《Golang操作DuckDB实战案例分享》DuckDB是一个嵌入式SQL数据库引擎,它与众所周知的SQLite非常相似,但它是为olap风格的工作负载设计的,DuckDB支持各种数据类型和SQL特性... 目录DuckDB的主要优点环境准备初始化表和数据查询单行或多行错误处理和事务完整代码最后总结Duck

SpringBoot项目启动后自动加载系统配置的多种实现方式

《SpringBoot项目启动后自动加载系统配置的多种实现方式》:本文主要介绍SpringBoot项目启动后自动加载系统配置的多种实现方式,并通过代码示例讲解的非常详细,对大家的学习或工作有一定的... 目录1. 使用 CommandLineRunner实现方式:2. 使用 ApplicationRunne

MySQL不使用子查询的原因及优化案例

《MySQL不使用子查询的原因及优化案例》对于mysql,不推荐使用子查询,效率太差,执行子查询时,MYSQL需要创建临时表,查询完毕后再删除这些临时表,所以,子查询的速度会受到一定的影响,本文给大家... 目录不推荐使用子查询和JOIN的原因解决方案优化案例案例1:查询所有有库存的商品信息案例2:使用EX

Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单

《Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单》:本文主要介绍Springboot的ThreadPoolTaskScheduler线... 目录ThreadPoolTaskScheduler线程池实现15分钟不操作自动取消订单概要1,创建订单后

python实现自动登录12306自动抢票功能

《python实现自动登录12306自动抢票功能》随着互联网技术的发展,越来越多的人选择通过网络平台购票,特别是在中国,12306作为官方火车票预订平台,承担了巨大的访问量,对于热门线路或者节假日出行... 目录一、遇到的问题?二、改进三、进阶–展望总结一、遇到的问题?1.url-正确的表头:就是首先ur

Spring使用@Retryable实现自动重试机制

《Spring使用@Retryable实现自动重试机制》在微服务架构中,服务之间的调用可能会因为一些暂时性的错误而失败,例如网络波动、数据库连接超时或第三方服务不可用等,在本文中,我们将介绍如何在Sp... 目录引言1. 什么是 @Retryable?2. 如何在 Spring 中使用 @Retryable

使用 Python 和 LabelMe 实现图片验证码的自动标注功能

《使用Python和LabelMe实现图片验证码的自动标注功能》文章介绍了如何使用Python和LabelMe自动标注图片验证码,主要步骤包括图像预处理、OCR识别和生成标注文件,通过结合Pa... 目录使用 python 和 LabelMe 实现图片验证码的自动标注环境准备必备工具安装依赖实现自动标注核心

QT实现TCP客户端自动连接

《QT实现TCP客户端自动连接》这篇文章主要为大家详细介绍了QT中一个TCP客户端自动连接的测试模型,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录版本 1:没有取消按钮 测试效果测试代码版本 2:有取消按钮测试效果测试代码版本 1:没有取消按钮 测试效果缺陷:无法手动停

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD