1.项目需求

1.1比赛规则

C++演讲比赛项目_ios

1.2程序功能

C++演讲比赛项目_创建项目_02

1.3程序效果图

C++演讲比赛项目_c语言_03

2.项目创建

创建项目步骤如下:

  • 创建新项目
  • 添加文件

2.1创建项目

打开vs2017后,点击创建新项目,创建新的C++项目

如图:

C++演讲比赛项目_创建项目_04

3.创建管理类

C++演讲比赛项目_c++_05

3.1创建文件

C++演讲比赛项目_ios_06

4.菜单功能

  • 功能描述:与用户的沟通界面

4.1添加成员函数

C++演讲比赛项目_p2p_07

4.2菜单功能实现

在管理类SpeechManager.cpp中实现show_Menu()函数

//菜单提示

void SpeechManager::show_Menu()

{

cout << "****************************************" << endl;

cout << "**************欢迎参加演讲比赛**********" << endl;

cout << "***************1.开始演讲比赛**********" << endl;

cout << "***************2.查找往届记录***********" << endl;

cout << "***************3.清空比赛记录***********" << endl;

cout << "***************0.退出比赛程序***********" << endl;

cout << "****************************************" << endl;

cout << endl;

}

4.3运行效果图

C++演讲比赛项目_c语言_08

5.退出功能

功能描述:实现退出程序

5.1提供功能接口

在main函数中提供分支选择,提供每个功能接口

代码:

//退出系统

void SpeechManager::exitSystem()

{

cout << "欢迎下次使用" << endl;

system("pause");

exit(0);

}

6.演讲比赛功能

6.1功能分析

比赛流程分析:

C++演讲比赛项目_c语言_09

6.2创建选手类

  • 选手类中的属性包含:选手姓名、分数
  • 头文件中创建speaker.h文件,并添加代码
#pragma once

#include <iostream>

using namespace std;

class Speaker

{

public:

string m_Name; //姓名

double m_Score[2]; //分数 最高有两轮得分

};

6.3比赛

6.3.1成员属性添加

  • 在speechManager.h中添加属性

6.3.4开始比赛成员函数添加


完整代码:

speechManger.cpp

#include "speechManger.h"

//构造函数

SpeechManager::SpeechManager() {

//初始化容器和属性

this->initSpeech();

//创建12名选手

this->createSpeaker();

//加载往届记录

this->loadRecord();

}

//菜单功能

void SpeechManager::show_Menu() {

cout << "******************************************" << endl;

cout << "************ 欢迎参加演讲比赛 ************" << endl;

cout << "*********** 1.开始演讲比赛 ************" << endl;

cout << "*********** 2.查看往届记录 ************" << endl;

cout << "*********** 3.清空比赛记录 ************" << endl;

cout << "*********** 0.退出比赛程序 ************" << endl;

cout << "******************************************" << endl;

cout << endl;

}

//开始比赛 比赛整个流程控制函数

void SpeechManager::startSpeech() {

//第一轮比赛开始

//1.抽签

this->speechDraw();

//2.比赛

this->speechContest();

//3.显示晋级结果

this->showScore();

//第二轮比赛开始

this->m_Index++;

//1.抽签

this->speechDraw();

//2.比赛

this->speechContest();

//3.显示最终结果

this->showScore();

//4.保存分数到文件中

this->saveRecord();

//重置比赛,获取记录

//初始化容器和属性

this->initSpeech();

//创建12名选手

this->createSpeaker();

//加载往届记录

this->loadRecord();

cout << "本届比赛已完毕!" << endl;

system("pause");

system("cls");

}

//抽签

void SpeechManager::speechDraw() {

cout << "第 << " << this->m_Index << " >> 轮比赛选手正在抽签" << endl;

cout << "--------------------------" << endl;

cout << "抽签顺序如下:" << endl;

if (this->m_Index == 1) {

//第一轮比赛

random_shuffle(v1.begin(), v1.end());

for (vector<int>::iterator it = v1.begin(); it != v1.end(); it++) {

cout << *it << " ";

}

cout << endl;

}

else {

//第二轮比赛

random_shuffle(v2.begin(), v2.end());

for (vector<int>::iterator it = v2.begin(); it != v2.end(); it++) {

cout << *it << " ";

}

cout << endl;

}

cout << "--------------------------" << endl;

system("pause");

cout << endl;

}

//比赛

void SpeechManager::speechContest() {

cout << "第 << " << this->m_Index << " >> 轮比赛正式开始 ---------------" << endl;

cout << "--------------------------" << endl;

//准备临时容器 存放 小组成绩

multimap<double, int, greater<double>> groupScore;

int num = 0; //用于记录人员 的个数 6 人一组

vector<int> v_Src;//比赛选手容器

if (this->m_Index == 1) {

v_Src = v1;

}

else {

v_Src = v2;

}

//遍历所有选手进行比赛

for (vector<int>::iterator it = v_Src.begin(); it != v_Src.end(); it++) {

num++;

//评委打分

deque<double> d;

for (int i = 0; i < 10; i++) {

double score = (rand() % 401 + 600) / 10.f; // 随机数出来是600 ~ 1000 除以 10.f 得出最终分数

//cout << score << " ";

d.push_back(score);

}

//cout << endl;

sort(d.begin(), d.end(), greater<double>()); //排序 降序

d.pop_front(); //去除最高分

d.pop_back(); //去除最低分

double sum = accumulate(d.begin(), d.end(), 0.0f); //总分

double avg = sum / (double)d.size(); //平均分

//打印平均分

//cout << "编号: " << " 姓名: " << this->m_Speaker[*it].m_Name << " 平均分: " << avg << endl;

//将平均分放入到 map容器中

this->m_Speaker[*it].m_Score[this->m_Index - 1] = avg;

//将打分的数据 放入到临时小组中

groupScore.insert(make_pair(avg, *it)); //key是得分, value是具体选手编号

//每6人取出前三名

if (num % 6 == 0) {

cout << "第" << num / 6 << "小组比赛名次: " << endl;

for (multimap<double, int, greater<double>>::iterator it = groupScore.begin(); it != groupScore.end(); it++) {

cout << "编号:" << it->second << "姓名:" << this->m_Speaker[it->second].m_Name << "成绩:"

<< this->m_Speaker[it->second].m_Score[this->m_Index - 1] << endl;

}

//取走前三名

int count = 0;

for (multimap<double, int, greater<double>>::iterator it = groupScore.begin(); it != groupScore.end() && count < 3; it++, count++) {

if (this->m_Index == 1) {

v2.push_back((*it).second);

}

else {

vVictory.push_back((*it).second);

}

}

groupScore.clear(); //小组容器清空

cout << endl;

}

}

cout << "---------------------第" << this->m_Index << "轮比赛完毕---------------" << endl;

system("pause");

}

//显示比赛结果

void SpeechManager::showScore() {

cout << "---------------------第" << this->m_Index << "轮晋级选手如下:---------------" << endl;

vector<int> v;

if (this->m_Index == 1) {

v = v2;

}

else {

v = vVictory;

}

for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {

cout << "选手编号:" << *it << "姓名:" << this->m_Speaker[*it].m_Name << "得分:"

<< this->m_Speaker[*it].m_Score[this->m_Index - 1] << endl;

}

cout << endl;

system("pause");

system("cls");

this->show_Menu();

}

//保存记录

void SpeechManager::saveRecord() {

ofstream ofs;

ofs.open("speech.csv", ios::out | ios::app); //用追加的方式写文件

//将每个选手数据,写入到文件中

for (vector<int>::iterator it = vVictory.begin(); it != vVictory.end(); it++) {

ofs << *it << "," << this->m_Speaker[*it].m_Score[1] << ",";

}

ofs << endl;

//关闭

ofs.close();

cout << "记录已保存" << endl;

//有记录了 , 文件不为空

this->fileIsEmpty = false;

}

//读取记录

void SpeechManager::loadRecord() {

ifstream ifs("speech.csv", ios::in); //读文件

if (!ifs.is_open()) {

this->fileIsEmpty = true;

//cout << "文件不存在" << endl;

ifs.close();

return;

}

//文件清空情况

char ch;

ifs >> ch;

if (ifs.eof()) {

//cout << "文件为空" << endl;

this->fileIsEmpty = true;

ifs.close();

return;

}

//文件不为空

this->fileIsEmpty = false;

ifs.putback(ch); //将上面读取的单个字符 放回来

string data;

int index = 0;

while (ifs >> data) {

//cout << data << endl;

vector<string> v; //存放6个string字符串

int pos = -1; //查到","位置的变量

int start = 0;

while (true) {

pos = data.find(",", start);

if (pos == -1) {

//没有找到情况

break;

}

string temp = data.substr(start, pos - start);

//cout << temp << endl;

v.push_back(temp);

start = pos + 1;

}

this->m_Record.insert(make_pair(index, v));

index++;

}

ifs.close();

/*for (map<int, vector<string>>::iterator it = m_Record.begin(); it != m_Record.end(); it++) {

cout << it->first << "冠军编号: " << it->second[0] << " 分数: " << it->second[1] << endl;

}*/

}

//显示往届记录

void SpeechManager::showRecord() {

if (this->fileIsEmpty) {

cout << "文件不存在,或记录为空!" << endl;

}

else {

for (int i = 0; i < this->m_Record.size(); i++) {

cout << "第" << i + 1 << "界"

<< "冠军编号:" << this->m_Record[i][0] << "得分:" << this->m_Record[i][1] << " "

<< "亚军编号:" << this->m_Record[i][2] << "得分:" << this->m_Record[i][3] << " "

<< "季军编号:" << this->m_Record[i][4] << "得分:" << this->m_Record[i][5] << " " << endl;

}

}

system("pause");

system("cls");

}

//清空记录

void SpeechManager::clearRecord() {

cout << "是否确定清空记录?" << endl;

cout << "1.确定" << endl;

cout << "2.取消" << endl;

int select = 0;

cin >> select;

if (select == 1) {

//确认清空

ofstream ofs("speech.csv", ios::trunc);

ofs.close();

//初始化容器和属性

this->initSpeech();

//创建12名选手

this->createSpeaker();

//加载往届记录

this->loadRecord();

cout << "清空成功!" << endl;

}

system("pause");

system("cls");

}

//退出系统

void SpeechManager::exitSystem() {

cout << "欢迎下次使用!" << endl;

system("pause");

exit(0);

}

//初始化容器和属性

void SpeechManager::initSpeech() {

//容器都置空

this->v1.clear();

this->v2.clear();

this->vVictory.clear();

this->m_Speaker.clear();

//初始化比赛轮数

this->m_Index = 1;

//将记录的容器 也清空

this->m_Record.clear();

}

//创建选手

void SpeechManager::createSpeaker() {

string nameSeed = "ABCDEFGHIJKL";

for (int i = 0; i < nameSeed.size(); i++) {

string name = "选手";

name += nameSeed[i]; //字符串拼接

//创建具体选手

Speaker sp;

sp.m_Name = name;

for (int i = 0; i < 2; i++) {

sp.m_Score[i] = 0;

}

//创建选手编号 并且放入到v1容器中

this->v1.push_back(i + 10001);

//选手编号以及对应的选手放入map容器中

this->m_Speaker.insert(make_pair(i + 10001, sp));

}

}

//析构函数

SpeechManager::~SpeechManager()

{

}



基于STL的演讲流程管理系统.cpp

#include <iostream>

using namespace std;

#include "speechManger.h"

#include <string>

#include <ctime>

int main()

{

//随机数种子

srand((unsigned int)time(NULL));

//创建管理类对象

SpeechManager sm;

//测试12名选手创建

//for (map<int, Speaker>::iterator it = sm.m_Speaker.begin(); it != sm.m_Speaker.end(); it++)

//{

// cout << "选手编号:" << it->first

//<< " 姓名:" << it->second.m_Name

// << " 分数:" << it->second.m_Score[0]<< endl;

//}

int choice = 0; //用于存储用户输入

while (true)

{

sm.show_Menu();

cout << "请输入您的选择: " << endl;

cin >> choice;

switch (choice)

{

case 1: //开始比赛

sm.startSpeech();

break;

case 2: //查看往届比赛记录

sm.showRecord();

break;

case 3: //清空比赛记录

sm.clearRecord();

break;

case 0: //退出系统

sm.exitSystem();

break;

default:

system("cls"); //清屏

break;

}

}

system("pause");

return 0;

}

speechManger.h

#pragma once

#include <iostream>

#include <vector>

#include <map>

#include "speaker.h"

#include <algorithm>

#include <deque>

#include <functional>

#include <numeric>

#include <string>

#include <fstream>

using namespace std;

//设计演讲管理类

class SpeechManager {

public:

//构造函数

SpeechManager();

//开始比赛 比赛整个流程控制函数

void startSpeech();

//抽签

void speechDraw();

//比赛

void speechContest();

//显示比赛结果

void showScore();

//保存记录

void saveRecord();

//读取记录

void loadRecord();

//判断文件是否为空

bool fileIsEmpty;

//存放往届记录的容器

map<int, vector<string>> m_Record;

//显示往届记录

void showRecord();

//清空记录

void clearRecord();

//菜单功能

void show_Menu();

//退出系统

void exitSystem();

//析构函数

~SpeechManager();

//初始化容器和属性

void initSpeech();

//创建12名选手

void createSpeaker();

//成员属性

//保存第一轮比赛选手编号容器

vector<int> v1;

//第一轮晋级选手编号容器

vector<int> v2;

//胜出前三名选手编号容器

vector<int> vVictory;

//存放编号以及对应具体选手容器

map<int, Speaker> m_Speaker;

//存放比赛轮数

int m_Index;

};

speaker.h

#pragma once

#include <iostream>

using namespace std;

class Speaker

{

public:

string m_Name; //姓名

double m_Score[2]; //分数 最高有两轮得分

};