【C++中级项目】演讲比赛流程管理系统

简介: 【C++中级项目】演讲比赛流程管理系统

该代码是此项目的初步实现,仍然存在很多不妥之处,欢迎各位读者提供自己的改进意见!

我会结合大家的已经对项目进行改进,做出更好的项目!

  1. 引言

演讲比赛作为一种常见的学术或社交活动,对于管理和组织流程有着严格的要求。为了提高演讲比赛的效率和准确性,我们设计了一个基于C++的演讲比赛流程管理系统。该系统能够实现参赛者报名、随机抽题、计时和评分等功能,简化了比赛流程并提高了管理效率。

  1. 背景和需求分析

在传统的演讲比赛中,存在以下问题:

  • 报名和抽题过程繁琐,工作量大。
  • 计时和评分需要人工实时操作,有时容易出错。
  • 数据统计和比赛结果生成耗时。

因此,我们的演讲比赛流程管理系统有以下主要需求:

  • 参赛者能够通过系统进行报名和查询个人信息。
  • 系统能够实现随机抽题、计时和评分等功能。
  • 管理员能够对比赛流程进行管理和结果统计。
  1. 系统设计

基于以上需求,我们设计了如下系统模块:

  • 参赛者模块:负责参赛者的报名和个人信息管理,包括注册、登录和查看个人成绩等功能。
  • 比赛模块:负责比赛流程的管理,包括抽题、计时、评分和显示成绩等功能。
  • 管理模块:负责管理员登录和对比赛流程进行管理和结果统计。
  1. 系统实现

我们使用C++语言进行系统开发,主要采用以下技术和方法:

  • 面向对象编程思想:使用类和对象进行模块封装和功能实现。
  • 随机数生成:通过C++的随机数库实现抽题功能。
  • 文件读写操作:使用文件存储参赛者和成绩信息,实现数据的持久化。
  • 用户界面设计:通过C++的图形库或命令行界面,实现用户友好的交互操作。
  1. 实验结果与分析

经过实际测试,我们的演讲比赛流程管理系统成功地实现了参赛者的报名、抽题、计时、评分和成绩展示等功能。系统操作简便,界面友好,大大提高了比赛流程的效率和准确性。通过结果统计功能,管理员能够方便地获取比赛数据和生成相关报告,便于管理和决策。

首先,程序会加载上次的比赛数据,还可以选择开始演讲比赛,查看往届记录或者清空比赛记录

比赛开始后,先抽签,决定演讲顺序并分组

然后每6人一组进行演讲,得到的分数由评委给出并计算平均分

第一轮的晋级选手再次抽签后得到下一轮的比赛选手

第二轮比赛后,取前三名为获胜者

在往届记录中可以查看

6. 总结与展望

本次开发了一个基于C++的演讲比赛流程管理系统,提高了比赛流程的管理效率和准确性。然而,系统仍然可以进一步改进,比如增加更多的功能模块,提供更多的统计和分析功能等。后续也希望读者提出宝贵的意见,我会进一步改进系统的用户界面,增加更多的功能模块,提高系统的稳定性和可扩展性。

总之,基于C++的演讲比赛流程管理系统是一项具有实际意义和应用前景的工作。通过不断优化和改进,该系统将在实际比赛中发挥更大的作用,提高比赛效率和管理水平。

项目代码

speechmanager.h

#pragma once
#include<iostream>
#include<string>
#include<vector>
#include<map>
#include<deque>
#include<algorithm>
#include<functional>
#include<numeric>
#include<fstream>
#include"speaker.h"
using namespace std;
#define FILENAME "speech.csv"
//比较大小
//class Compare {
//public:
//  bool operator()(double a, double b) {
//    return a < b;
//  }
//};
class SpeechManager {
public:
  //成员属性  
  vector<int> v1;     //保存第一轮比赛选手编号
  vector<int> v2;     //保存第二轮比赛选手编号
  vector<int> vVectory; //保存前三名选手编号
  map<int, Speaker> mSpeaker; //保存编号和选手的对应关系
  map<int, vector<string>> mRecord; //存放往届记录的map
  bool isFileEmpty;   //判断文件是否为空
  SpeechManager();
  //菜单
  void showMenu();
  //初始化属性
  void initSpeech();
  //创建选手
  void createSpeaker();
  //开始比赛
  void startSpeech();
  //抽签
  void speechDraw();
  //比赛
  void speechContest();
  //显示得分
  void showScore();
  //保存文件
  void saveScore();
  //读取记录
  void loadRecord();  
  //显示记录
  void showRecord();
  //清空记录
  void clearRecord();
  ~SpeechManager();
private:
  int roundIndex;
};

speechmanager.cpp

#include "speechmanager.h"
SpeechManager::SpeechManager() {
  initSpeech();   //初始化容器属性
  createSpeaker();  //创建12名选手
  loadRecord();   //加载文件信息
}
void SpeechManager::showMenu() {
  cout << "***********************************************************************" << endl;
  cout << "************************  演讲比赛管理系统  v1.0  *********************" << endl;
  cout << "****************************  1.开始演讲比赛  *************************" << endl;
  cout << "****************************  2.查看往届记录  *************************" << endl;
  cout << "****************************  3.清空比赛记录  *************************" << endl;
  cout << "****************************  0.退出管理系统  *************************" << endl;
  cout << "***********************************************************************" << endl << endl;
  cout << "                               请输入选择[ ]\b\b";
}
void SpeechManager::initSpeech() {
  this->v1.clear();
  this->v2.clear();
  this->vVectory.clear();
  this->mSpeaker.clear();
  this->mRecord.clear();
  this->roundIndex = 1;
}
void SpeechManager::createSpeaker() {
  string nameSeed = "ABCDEFGHIJKL";
  for (int i = 0; i < nameSeed.size(); i++) {
    string name = "选手";
    name += nameSeed[i];
    //创建具体选手
    Speaker sp;
    sp.speakerName = name;
    sp.speakerScore[0] = sp.speakerScore[1] = 0;
    this->v1.push_back(i + 10001);
    this->mSpeaker.insert(make_pair(i + 10001, sp));
  }
}
void SpeechManager::startSpeech() {
  //1.第一轮开始比赛
  //1.抽签
  this->speechDraw();
  //2.比赛
  this->speechContest();
  //3.显示晋级结果
  this->showScore();
  //第二轮比赛
  this->roundIndex++;
  //1.抽签
  this->speechDraw();
  //2.比赛
  this->speechContest();
  //3.显示最终结果
  this->showScore();
  //4.保存到文件中
  this->saveScore();
  cout << "本届比赛结束!" << endl;
  //重置
  initSpeech();   //初始化容器属性
  createSpeaker();  //创建12名选手
  loadRecord();
  this->roundIndex = 1;
  this->v2.clear();
  this->vVectory.clear();
  system("pause");
}
void SpeechManager::speechDraw(){
  cout << "第" << this->roundIndex << "轮比赛选手正在抽签" << endl;
  cout << "------------------" << endl;
  cout << "抽签后演讲顺序如下:" << endl;
  //打乱顺序
  if (this->roundIndex == 1) {
    //第一轮
    random_shuffle(v1.begin(), v1.end());
    for (vector<int>::iterator it = v1.begin(); it != v1.end(); it++)
      cout << *it << " ";
  } else {
    //第二轮
    random_shuffle(v2.begin(), v2.end());
    for (vector<int>::iterator it = v2.begin(); it != v2.end(); it++)
      cout << *it << " ";
  }
  cout << endl;
  cout << "------------------" << endl << endl;
  system("pause");
  cout << endl;
}
void SpeechManager::speechContest() {
  cout << "------------第 " << this->roundIndex << " 轮比赛正式开始------------" << endl;
  //准备临时容器,存小组成绩,mutimap可以存放重复值
  multimap<double, int, greater<double>> groupScore;
  int num = 0; //记录人员个数
  vector<int> vContest;
  if (this->roundIndex == 1) vContest = v1;
  else vContest = v2;
  //遍历所有选手进行比赛
  for (vector<int>::iterator it = vContest.begin(); it != vContest.end(); it++) {
    //对每个选手,10个评委打分
    deque<double> d;
    for (int i = 0; i < 10; i++) {
      double score = (rand() % 401 + 600) / 10.f; //600-1000
      //cout << score << " ";
      d.push_back(score);
    }
    //对评委的打分进行排序
    //sort(d.begin(), d.end(), Compare());  //第三个参数是一个谓词
    sort(d.begin(), d.end(), greater<double>());  //这里使用的是内建函数,需要引用头文件function
    d.pop_front();  //去除最高分
    d.pop_back(); //去除最低分
    double sum = accumulate(d.begin(), d.end(), 0.f); //累加得到总分
    //cout << sum << endl << endl;
    double avg = sum / (double)d.size();    //平均分
    //将平均分放到map容器中
    this->mSpeaker[*it].speakerScore[this->roundIndex - 1] = avg;
    //将打分数据放到临时小组容器中
    groupScore.insert(make_pair(avg, *it)); //key是得分,value是选手编号
    num++;
    //每6人取出前三名
    if (num % 6 == 0) {
      cout << "第 " << num / 6 << " 小组比赛名次:" << endl;
      for (multimap<double, int, greater<double>>::iterator it1 = groupScore.begin(); it1 != groupScore.end(); it1++) {
        cout << "编号:" << it1->second << " 姓名:" << this->mSpeaker[it1->second].speakerName
          << " 分数:" << this->mSpeaker[it1->second].speakerScore[this->roundIndex - 1] << endl;
      }
      //取走前三名
      int cnt = 0;
      for (multimap<double, int, greater<double>>::iterator it2 = groupScore.begin(); it2 != groupScore.end() && cnt < 3; it2++, cnt++) {
        if (this->roundIndex == 1) v2.push_back((*it2).second);
        else vVectory.push_back((*it2).second);
      }
      groupScore.clear();
      cout << endl;
    }
  }
  cout << "------------第" << this->roundIndex << "轮比赛结束------------" << endl;
  system("pause");
  cout << endl;
}
void SpeechManager::showScore() {
  cout << "------------第" << this->roundIndex << "轮晋级选手成绩如下:" << endl;
  vector<int> vTemp;
  if (this->roundIndex == 1) vTemp = v2;
  else vTemp = vVectory;
  //迭代输出信息
  for (vector<int>::iterator it = vTemp.begin(); it != vTemp.end(); it++) {
    cout << "选手编号:" << *it << " 姓名:" << this->mSpeaker[*it].speakerName
      << " 得分:" << this->mSpeaker[*it].speakerScore[this->roundIndex - 1] << endl;
  }
  system("pause");
  cout << endl;
}
void SpeechManager::saveScore() {
  ofstream ofs("speech.csv", ios::out | ios::app);
  //遍历打印每个选手的数据到文件中
  for (vector<int>::iterator it = vVectory.begin(); it != vVectory.end(); it++) {
    ofs << *it << "," << this->mSpeaker[*it].speakerScore[this->roundIndex - 1] << ",";
  }
  ofs << endl;
  cout << "本届比赛已保存" << endl;
}
void SpeechManager::loadRecord() {
  ifstream ifs("speech.csv", ios::in);
  //若文件不存在
  if (!ifs.is_open()) {
    this->isFileEmpty = true;
    cout << "文件不存在" << endl;
    ifs.close();
    return;
  }
  //判断文件是否为空
  char ch;
  ifs >> ch;
  if (ifs.eof()) {
    cout << "文件为空" << endl;
    this->isFileEmpty = true;
    ifs.close();
    return;
  }
  //若文件不为空
  this->isFileEmpty = false;
  ifs.putback(ch);  //将上面读取的字符再放回来
  string data;
  //读取每一行的数据
  int index = 0;    //记录第几届
  while (ifs >> data) {
    vector<string> v; //获取每一届比赛的数据
    //利用字符串的截取
    int pos = -1, start = 0;
    while (true) {
      pos = data.find(",", start);
      if (pos == -1) break;
      string temp = data.substr(start, pos - start);
      v.push_back(temp);
      start = pos + 1;
    }
    //将获取到的这一届的数据放到map中
    this->mRecord.insert(make_pair(index, v));
    v.clear();
    index++;
  }
  ifs.close();
  this->isFileEmpty = false;
  遍历冠军信息
  //for (map<int, vector<string>>::iterator it = mRecord.begin(); it != mRecord.end(); it++) {
  //  cout << it->first + 1 << " 冠军编号:" << it->second[0] << " 分数:" << it->second[1] << endl;
  //}
}
void SpeechManager::showRecord() {
  loadRecord();
  for (map<int, vector<string>>::iterator it = mRecord.begin(); it != mRecord.end(); it++) {
    cout << "第" << it->first + 1 << "届  冠军编号:" << it->second[0] 
      << " 分数:" << it->second[1]
      << " 亚军编号:" << it->second[2] << " 分数:" << it->second[3]
      << " 季军编号:" << it->second[4] << " 分数:" << it->second[5] << endl;
  }
  system("pause");
}
void SpeechManager::clearRecord() {
  cout << "确定清空吗?" << endl;
  cout << "1.确定" << endl;
  cout << "2.返回" << endl;
  int choice;
  cin >> choice;
  if (choice == 1) {
    ofstream ofs(FILENAME, ios::trunc);
    ofs.close();
    initSpeech();   //初始化容器属性
    createSpeaker();  //创建12名选手
    loadRecord();   //加载文件信息
    cout << "清空成功!" << endl;
  }
  system("pause");
}
SpeechManager::~SpeechManager() {
}

speaker.h

#pragma once
#include<iostream>
#include<string>
using namespace std;
class Speaker {
public:
  string speakerName;   //选手姓名
  double speakerScore[2]; //选手成绩
  Speaker();
  ~Speaker();
private:
};

main.cpp

#include<iostream>
#include<time.h>
#include"speechmanager.h"
using namespace std;
int main() {
  srand((unsigned int)time(NULL));
  int choice = 0;   //存储用户的选择项
  SpeechManager sm;
  //for (map<int, Speaker>::iterator it = sm.mSpeaker.begin(); it != sm.mSpeaker.end(); it++) {
  //  cout << "选手编号:" << it->first << "姓名:" << it->second.speakerName << "分数" << it->second.speakerScore[0] << endl;
  //}
  while (1) {
    sm.showMenu();
    cin >> choice;  //接收用户的选择
    switch (choice) {
    case 0:     //退出系统
      cout << "欢迎下次使用!" << endl;
      system("pause");
      exit(0);
      break;
    case 1:     //开始演讲比赛
      sm.startSpeech();
      break;
    case 2:     //查看往届记录
      sm.showRecord();
      break;
    case 3:     //清空比赛记录
      sm.clearRecord();
      break;
    default:
      break;
    }
    system("cls");
  }
  return 0;
}
相关文章
|
4月前
|
算法 C语言 C++
C++语言学习指南:从新手到高手,一文带你领略系统编程的巅峰技艺!
【8月更文挑战第22天】C++由Bjarne Stroustrup于1985年创立,凭借卓越性能与灵活性,在系统编程、游戏开发等领域占据重要地位。它继承了C语言的高效性,并引入面向对象编程,使代码更模块化易管理。C++支持基本语法如变量声明与控制结构;通过`iostream`库实现输入输出;利用类与对象实现面向对象编程;提供模板增强代码复用性;具备异常处理机制确保程序健壮性;C++11引入现代化特性简化编程;标准模板库(STL)支持高效编程;多线程支持利用多核优势。虽然学习曲线陡峭,但掌握后可开启高性能编程大门。随着新标准如C++20的发展,C++持续演进,提供更多开发可能性。
86 0
WK
|
1月前
|
机器学习/深度学习 人工智能 算法
那C++适合开发哪些项目
C++ 是一种功能强大、应用广泛的编程语言,适合开发多种类型的项目。它在游戏开发、操作系统、嵌入式系统、科学计算、金融、图形图像处理、数据库管理、网络通信、人工智能、虚拟现实、航空航天等领域都有广泛应用。C++ 以其高性能、内存管理和跨平台兼容性等优势,成为众多开发者的选择。
WK
70 1
|
2月前
|
Ubuntu Linux 编译器
Linux/Ubuntu下使用VS Code配置C/C++项目环境调用OpenCV
通过以上步骤,您已经成功在Ubuntu系统下的VS Code中配置了C/C++项目环境,并能够调用OpenCV库进行开发。请确保每一步都按照您的系统实际情况进行适当调整。
433 3
|
2月前
|
程序员 C++
C++编程:While与For循环的流程控制全解析
总结而言,`while`循环和 `for`循环各有千秋,它们在C++编程中扮演着重要的角色。选择哪一种循环结构应根据具体的应用场景、循环逻辑的复杂性以及个人的编程风格偏好来决定。理解这些循环结构的内在机制和它们之间的差异,对于编写高效、易于维护的代码至关重要。
64 1
|
3月前
|
C++
【C++案例】一个项目掌握C++基础-通讯录管理系统
这篇文章通过一个通讯录管理系统的C++项目案例,详细介绍了如何使用C++实现添加、显示、删除、查找、修改和清空联系人等功能。
52 3
|
3月前
|
C++
【C++基础】程序流程结构详解
这篇文章详细介绍了C++中程序流程的三种基本结构:顺序结构、选择结构和循环结构,包括if语句、三目运算符、switch语句、while循环、do…while循环、for循环以及跳转语句break、continue和goto的使用和示例。
61 2
|
4月前
|
Rust 安全 C++
系统编程的未来之战:Rust能否撼动C++的王座?
【8月更文挑战第31天】Rust与C++:现代系统编程的新选择。C++长期主导系统编程,但内存安全问题频发。Rust以安全性为核心,通过所有权和生命周期概念避免内存泄漏和野指针等问题。Rust在编译时确保内存安全,简化并发编程,其生态系统虽不及C++成熟,但发展迅速,为现代系统编程提供了新选择。未来有望看到更多Rust驱动的系统级应用。
69 1
|
4月前
|
存储 算法 数据可视化
【C++】C++旅游管理系统(源码+论文)【独一无二】
【C++】C++旅游管理系统(源码+论文)【独一无二】
|
4月前
|
搜索推荐 数据处理 文件存储
【C++】C++ 培训报名系统 (源码+论文)【独一无二】
【C++】C++ 培训报名系统 (源码+论文)【独一无二】
|
4月前
|
存储 数据可视化 C++
【C++】C++-机房收费管理系统(源码+注释)【独一无二】
【C++】C++-机房收费管理系统(源码+注释)【独一无二】