C++使用STL容器实现一个打分系统

本文详细介绍了C++标准库中的三种重要容器:string、vector和deque。string容器封装了C风格字符串,提供丰富的成员方法,简化字符串操作。vector容器支持随机访问,高效地在尾部添加或移除元素。deque容器类似于vector,但额外支持从两端插入数据,适用于需要频繁双向操作的场景。

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

1.string容器

C风格字符串(以空字符结尾的字符数组)太过复杂难于掌握,不适合大程序的开发,所以C++标准库定义了一种string类,定义在头文件string。
String和c风格字符串对比:

  1. Char是一个指针,String是一个类, string封装了char,管理这个字符串,是一个char*型的容器。

  2. String封装了很多实用的成员方法, 例如查找find,拷贝copy,删除delete 替换replace,插入insert。

  3. 不用考虑内存释放和越界, string管理char*所分配的内存。每一次string的复制,取值都由string类负责维护,不用担心复制越界和取值越界等。

2.vector容器

vector是将元素置于一个动态数组中加以管理的容器。
vector可以随机存取元素(支持索引值直接存取, 用[]操作符或at()方法)。
vector尾部添加或移除元素非常快速,但是在中部或头部插入元素或移除元素比较费时。

vector采用模板类实现,vector对象的默认构造形式 vector< T > vect

3.deque容器

deque容器是C++标准模版库(STL,Standard Template Library)中的部分内容。deque容器类与vector类似,支持随机访问和快速插入删除,它在容器中某一位置上的操作所花费的是线性时间。与vector不同的是,deque还支持从开始端插入数据:push_front()。

使用deque容器之前必须加上deque头文件:#include < deuqe >;

   deque属于std命名域的内容,因此需要通过命名限定:using std::deque;也可以直接使用全局的命名空间方式:using namespace std;

4.代码实现

//评委打分案例
//创建5个选手(姓名 得分),10个评委对5个选手进行打分
//打分规则:去掉最高分   去掉最低分  取出平均分
//按得分对5个选手进行排名

#include <iostream>
#include <string>
#include <vector>
#include <deque>
//算法头文件,demo需要用到排序算法
#include <algorithm>
using namespace std;
//创建一个选手类
class Player
{
  public:
    Player(string name,int sorce) {
      this->mname=name;
      this->msorce=sorce;
    }
    Player(){}
  public:
  	//使用string 代替c风格字符串
    string mname;
    int msorce;
};
//创建选手
//把选手存放在一个vector容器中,方便管理
void Create_Player(vector<Player>& v) {
  //先定义一个字符串
  string nameseed="ABCDE";
  for(int i=0;i<5;++i) {
    Player p;
    p.mname="选手";
    //选手名字用string类的拼接完成
    p.mname+=nameseed[i];
    p.msorce=0;
    //把选手这个实体存放进 vector中
    v.push_back(p);
  }
}
//一个测试函数,查看算法sort的排序时从小到大还是从大到小
void PrintSorce(int val) {
  cout<<val<<" ";
}
//进行打分
void Set_Sorce(vector<Player>& v) {
  //使用迭代器方式,遍历vector中的选手
  for(vector<Player>::iterator it=v.begin();it!=v.end();++it) {
    //对当前学生进行打分
    //把数据存储在这种双向开口的容器中
    deque<int> dsorce;
    //给选手进行10次打分
    for(int i=0;i<10;++i) {
      //分数从60~~100
      int sorce=rand()%41+60;
      //把得到的分数存进容器
      dsorce.push_back(sorce);
    }
    //使用sort算法对分数进行排序,依然使用迭代器
    sort(dsorce.begin(),dsorce.end());
    //for_each(dsorce.begin(),dsorce.end(),PrintSorce);
    //去除最高分和最低分
    //容器提供的方法
    dsorce.pop_front();
    dsorce.pop_back();
    //求平均分
    int totalsorce=0;
    for(deque<int>::iterator dit=dsorce.begin();dit!=dsorce.end();++dit) {
      totalsorce+=(*dit);
    }
    int avgsorce=totalsorce/dsorce.size();
    //放进去
    (*it).msorce=avgsorce;
  }
}
//排序规则
bool mycompare(const Player& p1,const Player& p2) {
  return p1.msorce>p2.msorce;
}
//得到排名
void Print_Rank(vector<Player>& v) {
  sort(v.begin(),v.end(),mycompare);
  //打印
  for(vector<Player>::iterator it=v.begin();it!=v.end();++it) {
    cout<<"姓名:"<<(*it).mname<<"得分:"<<(*it).msorce<<endl;
  }
}
int main()
{
  //创建这个用来存放选手的容器
  vector<Player> vplist;
  //创建选手
  Create_Player(vplist);
  //打分
  Set_Sorce(vplist);
  //打分以后排序
  Print_Rank(vplist);
  return 0;
}

多选题评分程序,C++编写的多选题评分程序。 一张试卷,满分100分,全部是多项选择题。 每道题分数分配有三种方法: (1)每道题满分相同,具体分数由题目数决定。如试卷有20道题,则每题满分为5分。 (2)每道题满分一定相等,由该题正确答案的选项数与全部题目正确答案的选项数之和的比值决定。如某题正确答案的选项为ACD,其选项数就为3,而全部题目的正确答案的选项数之和为60,那么这道题目的满分为(3/60)*100 = 5分。 (3)每道题满分一定相等,由出题者指定。 每道题的评分方案有三种: (1)多选少选均得分。 (2)少选可得部分分数,而多选得分。如正确答案为AD,那么选A则得该题满分1/2。 (3)选对一个选项得一定分值,选错一个选项扣掉同样的分值,但每道题应出现负分。 假设正确答案为ACD, 如选AD,那么可以得该题满分的2/3; 如选ABD,那么可以得该题满分的1/3;等等。 注:一张试卷的所有题目实行同样的评分方案。 评分步骤: 每次评分时,按照以下步骤进行,以下是数据结构和接口函数的说明: 通过函数GetQuestionNum()获得试卷中的试题数目; 通过GetPaperAndAnswer()获得试卷信息和标准答案; 通过GetMethod()获得评分方案和每题分数分配方法; 按照每题分数分配方法和评分方案计算成绩; 将成绩通过函数OutputResult输出
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值