IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 黑马程序员:C++案例(基于STL实现演讲比赛流程管理系统) -> 正文阅读

[C++知识库]黑马程序员:C++案例(基于STL实现演讲比赛流程管理系统)

1.1、比赛规则

学校举行一场演讲比赛,共有12个人参加,比赛共两轮,第一轮为淘汰赛,第二轮为决赛

每名选手都有对应的编号,如10001~10012

比赛方式:分组比赛,每组6个人

第一轮分为两个小组,整体按照选手编号进行抽签后顺序演讲。

十个评委分别给每个选手打分,去除最高分和最低分,求的平均分为本轮选手的成绩

当小组演讲完后,淘汰组内排名最后的三个选手,前三名晋级,进入下一轮的比赛。

第二轮为决赛,前三名胜出

每轮比赛过后要显示晋级选手的信息

1.2、程序功能

(1)开始演讲比赛:完成整届比赛的流程,每个比赛阶段需要给用户一个提示,用户按任意键后继续下一个阶段

(2)查看往届记录:查看之前比赛前三名结果,每次比赛都会记录到文件中,文件用“分数.csv”保存

(3)清空比赛记录:将.csv文件中的数据清空

(4)退出比赛程序:可以退出当前程序

1.3、程序菜单效果图

2、具体流程解释

主要就是附带选择的四个主要函数

//开始比赛
starManager();
//查看记录
showRecord();
//清空记录
clearRecord();
//退出系统
exitSystem();

2.1、初始化容器

2.1.1、创建成员属性

//成员属性
	//判断文件是否为空的标志
	bool fileIsEmpty;

	//存放往届记录的容器 
	map<int, vector<string>> m_Record;
	//保存第一轮选手编号的容器
	vector<int>v1;

	//第一轮晋级选手编号容器
	vector<int>v2;

	//胜出前三名选手编号容器
	vector<int>vvictory;

	//存放编号以及对应选手容器
	map<int, Speaker>m_Speaker;

	//记录比赛轮数
	int m_Index;

2.1.2、构造函数

//构造函数
SpeechManager::SpeechManager()
{
	//初始化容器和属性
	this->initSpeech();

	//创建12名选手
	this->creatSpeeker();

	//加载往届记录
	this->loadRecord();
}

2.1.3、初始化容器属性


//初始化容器属性
void SpeechManager:: initSpeech()
{
	//容器都置空
	this->v1.clear();
	this->v2.clear();
	this->vvictory.clear();
	this->m_Speaker.clear();
	this->m_Record.clear();
	//初始化比赛轮数
	this->m_Index = 1;
}

2.1.4、创建12名选手


//创建12名选手
void SpeechManager::creatSpeeker()
{
	string nameSeed = "ABCDEFGHIJKL";

	for (int i = 0; i < nameSeed.size(); i++)
	{
		string name = "选手";
		name += nameSeed[i];

		//创建具体选手
		Speaker sp;
		sp.SP_name = name;

		//选手的分数置为0
		for (int j = 0; j < 2; j++)
		{
			sp.SP_score[j] = 0;
		}

		//创建选手编号并放入v1容器中
		this->v1.push_back(i + 10001);

		//选手编号以及对应选手放入map中
		this->m_Speaker.insert(make_pair(i + 10001, sp));

	}
}

其中v1是为了开始比赛,所以将选手的编号放入v1中,m_Speaker中first保存的是选手编号,second保存的是选手姓名以及两届的成绩

2.1.4、加载往届记录

//读取往届记录
void SpeechManager::loadRecord()
{
	ifstream ifs("分数.csv",ios::in);//读文件
	if (!ifs.is_open())//如果打开失败返回0,加上!就是1
	{
		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++)
	//{
	//	//因为第二个值是一个vector容器,所以第一个选手的分数在第二个位置,也就是1下标上
	//	cout << it->first << "编号:" << it->second[0] << "分数:" << it->second[1] << endl;
	//}
}

先判断是否打开文件,然后判断打开的文件里面有没有数据。

设置一个data字符串,用于保存流入的数据,设置一个pos用于保存“,”的下标,用find从start位置开始来找下一个“,”的位置并返回给pos,然后用substr函数来截取每一个“,”之前的信息给一个新建的变量temp,将这个信息放入v容器中,然后开始位置start变成pos的下一位,直到找不到,跳出循环。

其中index表示的是第几届比赛,每一个data就是一行数据,每一行数据就是一届比赛,于是一次读取数据结束后将index,与v容器插入到保存往届记录的map容器m_Record中。

2.2、展示菜单

//展示系统
void SpeechManager::ShowMenue()
{
	cout << "****************************************" << endl;
	cout << "************欢迎参加演讲比赛************" << endl;
	cout << "************1、开始演讲比赛*************" << endl;
	cout << "************2、查看往届记录*************" << endl;
	cout << "************3、清空比赛记录*************" << endl;
	cout << "************0、退出比赛程序*************" << endl;
	cout << "****************************************" << endl;
	cout << endl;
}

2.2、退出比赛程序

较为简单

//退出系统
void SpeechManager::exitSystem()
{
	cout << "欢迎下次使用" << endl;
	system("pause");
	exit(0);
}

2.3、开始演讲比赛


//开始比赛-比赛流程控制
void SpeechManager::starManager()
{
	
	//第一轮开始比赛

	//1、抽签
	this->speechDraw();
	//2、比赛
	this->speechContest();
	//3、显示晋级结果
	this->showScore();
	//第二轮开始比赛
	this->m_Index++;
	//1、抽签6
	this->speechDraw();
	//2、比赛
	this->speechContest();
	//3、显示最终结果
	this->showScore();
	//4、保存分数到文件中
	this->saveRecord();

	//重置比赛,并且获取记录
	//初始化容器和属性
	this->initSpeech();

	//创建12名选手
	this->creatSpeeker();

	//加载往届记录
	this->loadRecord();


	cout << "本届比赛圆满结束!" << endl;
	system("pause");
	system("cls");
}

????????具体流程就是先给十二名选手抽签,然后开始比赛,比完赛之后显示比赛结果,第二轮比赛再重复以上操作,最后保存到分数文件中,当保存完结果之后就将所有用到的容器给初始化,再创建十二名选手的意义是如果要连续比赛的话就重新将12个人重置,文件保存后再读取一次,即可更新查询的内容。

2.3.1、抽签speechDraw();


//抽签
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");
	system("cls");//清屏
	cout << endl;
}

用m_Index来判断是第几轮抽签,用random_shuffle()来给v1与v2容器洗牌,这样就得到了每一轮抽签的结果

2.3.2、比赛speechContest();

//比赛
void SpeechManager::speechContest()
{
	//准备一个临时容器存放小组成绩
	multimap<double,int,greater<double>>groupScore;

	int num = 0;//记录人员个数6人一组
	cout << "------------第" << this->m_Index << "轮比赛正式开始----------" << endl;
	
	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容器中
		deque<double>d;
		for (int i = 0; i < 10; i++)
		{
			double score = (rand() % 401 + 600) / 10.f;//600~1000初始值是600,随机0`400
			//cout << score << " ";
			d.push_back(score);
		}
		//cout << endl;

		//将打的分进行排序
		sort(d.begin(), d.end(), greater<double>());

		//去掉最高分与最低分
		d.pop_back();
		d.pop_front();

		//求平均分
		double sum = accumulate(d.begin(), d.end(), 0.0f);
		double avg = sum / (double)d.size();

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

		//将平均分放到map中
		//将平均分存入之前的编号与成绩的map中m-Speaker
		this->m_Speaker[*it].SP_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].SP_name << "成绩为: " << this->m_Speaker[it->second].SP_score[this->m_Index - 1] << endl;
				
			}
			int count = 0;
			//取走前三名
			//每一轮是六个人比赛,将每一轮的前三个取出,第一轮的取出放入v2中,第二轮放入vvictory中
			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;
	//cout << endl;
	system("pause");
}

准备一个可以保存重复数据的map容器groupScore,第一个属性是分数,第二个属性是选手编号,然后准备一个v_Src来保存当前轮的选手,如果是第一轮就是v1,第二轮就是v2,接下来用一个迭代器来获取v_Src中的每一个成员,也就是每一个选手都单独让裁判打个分。

用一个deque容器d来保存十名裁判所打的分,随机后存入d中,重新排序后pop掉头与尾,求平均分后存入当前轮数的m_Speaker容器中。

2.3.3、显示得分showScore();

//显示得分
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].SP_name << "分数为: " << this->m_Speaker[*it].SP_score[this->m_Index-1] << endl;
	}
	cout << endl;

	v.clear();
	
	system("pause");
	system("cls");

	
	this->ShowMenue();
}

创建一个临时容器v来保存当前轮数的晋级信息,如果是第一轮就是v2,第二轮就是vvictory。迭代器接收容器并输出就行

2.3.4、保存比赛结果saveRecord();

//保存分数
void SpeechManager::saveRecord()
{
	ofstream ofs;
	ofs.open("分数.csv", ios::out | ios::app);//用输出的方式打开文件--写文件

	//将每个人的数据写到文件中
	for (vector<int>::iterator it = vvictory.begin(); it != vvictory.end(); it++)
	{
		ofs << *it << "," << m_Speaker[*it].SP_score[1] << ",";
	}
	ofs << endl;

	//关闭文件
	ofs.close();

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

	//更改文件不为空的状态
	this->fileIsEmpty = false;
}

迭代器获取的是最终vvictory容器中的数据,也就是最终三个人的成绩,*it是选手编号,后面是用来保存选手两轮成绩的map,选第二轮成绩作为结果,用,间隔开。最后更改文件不为空的状态为false;

2.4、查看往届记录showRecord();

//显示往届记录
void SpeechManager::showRecord()
{
	if (this->fileIsEmpty)
	{
		cout << "文件为空或者文件不存在" << endl;
	}
	else
	{
		for (map<int, vector<string>>::iterator it = m_Record.begin(); it != m_Record.end(); it++)
		{
		cout << it->first
			<< "冠军编号:" << it->second[0] << "分数:" << it->second[1] << " "
			<< "亚军编号:" << it->second[2] << "分数:" << it->second[3] << " "
			<< "季军编号:" << it->second[4] << "分数:" << it->second[5] << endl;
			
		}
	}

	system("pause");
	system("cls");
}

这里用的是一个m_Record来保存读取到的每一届的胜者信息,第一个int属性是第几届,第二个vector是读取.csv文件中的每一行的数据

2.5、清空比赛程序clearRecord();

//清空记录
void SpeechManager::clearRecord()
{
	cout << "是否清空文件??????" << endl;
	cout << "1、是" << endl;
	cout << "2、否" << endl;

	int select;
	cin >> select;

	if (select == 1)
	{
		//确认清空
		ofstream ofs("分数.csv", ios::trunc);//存在则删除且重新创建 
		ofs.close();

		//初始化容器和属性
		this->initSpeech();

		//创建12名选手
		this->creatSpeeker();

		//加载往届记录
		this->loadRecord();

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

	}


	system("pause");
	system("cls");
}

在清空完文件之后,初始化一遍容器与属性,更新读取到的文件状态

3、全部代码展示

3.1、head.h

#pragma once
#include<iostream>
#include<vector>
#include<ctime>
#include<algorithm>
#include<string>
#include<map>
#include<deque>
#include<functional>//用于使用内建函数对象greater
#include<numeric>//小型算法
#include<fstream> //文件操作头文件
using namespace std;

3.2、speechManager.h

#pragma once
#include"head.h"
#include"speeker.h"

class SpeechManager
{
public:
	//构造函数
	SpeechManager();
	
	//展示菜单
	void ShowMenue();

	//退出系统
	void exitSystem();

	//析构函数
	~SpeechManager();

	//初始化容器属性
	void initSpeech();

	//创建12名选手
	void creatSpeeker();

	//开始比赛
	void starManager();

	//抽签
	void speechDraw();

	//比赛
	void speechContest();

	//显示得分
	void showScore();

	//保存分数
	void saveRecord();

	//读取记录
	void loadRecord();

	//显示往届记录
	void showRecord();

	//清空记录
	void clearRecord();

	//判断文件是否为空的标志
	bool fileIsEmpty;

	//存放往届记录的容器 
	map<int, vector<string>> m_Record;

	//成员属性
	//保存第一轮选手编号的容器
	vector<int>v1;

	//第一轮晋级选手编号容器
	vector<int>v2;

	//胜出前三名选手编号容器
	vector<int>vvictory;

	//存放编号以及对应选手容器
	map<int, Speaker>m_Speaker;

	//记录比赛轮数
	int m_Index;

};

3.3、speechManager.cpp

#include"speechManager.h"

//构造函数
SpeechManager::SpeechManager()
{
	//初始化容器和属性
	this->initSpeech();

	//创建12名选手
	this->creatSpeeker();

	//加载往届记录
	this->loadRecord();
}

//展示系统
void SpeechManager::ShowMenue()
{
	cout << "****************************************" << endl;
	cout << "************欢迎参加演讲比赛************" << endl;
	cout << "************1、开始演讲比赛*************" << endl;
	cout << "************2、查看往届记录*************" << endl;
	cout << "************3、清空比赛记录*************" << endl;
	cout << "************0、退出比赛程序*************" << endl;
	cout << "****************************************" << endl;
	cout << endl;
}

//退出系统
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_Record.clear();
	//初始化比赛轮数
	this->m_Index = 1;
}


//创建12名选手
void SpeechManager::creatSpeeker()
{
	string nameSeed = "ABCDEFGHIJKL";

	for (int i = 0; i < nameSeed.size(); i++)
	{
		string name = "选手";
		name += nameSeed[i];

		//创建具体选手
		Speaker sp;
		sp.SP_name = name;

		//选手的分数置为0
		for (int j = 0; j < 2; j++)
		{
			sp.SP_score[j] = 0;
		}

		//创建选手编号并放入v1容器中
		this->v1.push_back(i + 10001);

		//选手编号以及对应选手放入map中
		this->m_Speaker.insert(make_pair(i + 10001, sp));

	}
}


//开始比赛-比赛流程控制
void SpeechManager::starManager()
{
	
	//第一轮开始比赛

	//1、抽签
	this->speechDraw();
	//2、比赛
	this->speechContest();
	//3、显示晋级结果
	this->showScore();
	//第二轮开始比赛
	this->m_Index++;
	//1、抽签6
	this->speechDraw();
	//2、比赛
	this->speechContest();
	//3、显示最终结果
	this->showScore();
	//4、保存分数到文件中
	this->saveRecord();

	//重置比赛,并且获取记录
	//初始化容器和属性
	this->initSpeech();

	//创建12名选手
	this->creatSpeeker();

	//加载往届记录
	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");
	system("cls");//清屏
	cout << endl;
}

//比赛
void SpeechManager::speechContest()
{
	//准备一个临时容器存放小组成绩
	multimap<double,int,greater<double>>groupScore;

	int num = 0;//记录人员个数6人一组
	cout << "------------第" << this->m_Index << "轮比赛正式开始----------" << endl;
	
	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容器中
		deque<double>d;
		for (int i = 0; i < 10; i++)
		{
			double score = (rand() % 401 + 600) / 10.f;//600~1000初始值是600,随机0`400
			//cout << score << " ";
			d.push_back(score);
		}
		//cout << endl;

		//将打的分进行排序
		sort(d.begin(), d.end(), greater<double>());

		//去掉最高分与最低分
		d.pop_back();
		d.pop_front();

		//求平均分
		double sum = accumulate(d.begin(), d.end(), 0.0f);
		double avg = sum / (double)d.size();

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

		//将平均分放到map中
		//将平均分存入之前的编号与成绩的map中m-Speaker
		this->m_Speaker[*it].SP_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].SP_name << "成绩为: " << this->m_Speaker[it->second].SP_score[this->m_Index - 1] << endl;
				
			}
			int count = 0;
			//取走前三名
			//每一轮是六个人比赛,将每一轮的前三个取出,第一轮的取出放入v2中,第二轮放入vvictory中
			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;
	//cout << 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].SP_name << "分数为: " << this->m_Speaker[*it].SP_score[this->m_Index-1] << endl;
	}
	cout << endl;

	v.clear();
	
	system("pause");
	system("cls");

	
	this->ShowMenue();
}

//保存分数
void SpeechManager::saveRecord()
{
	ofstream ofs;
	ofs.open("分数.csv", ios::out | ios::app);//用输出的方式打开文件--写文件

	//将每个人的数据写到文件中
	for (vector<int>::iterator it = vvictory.begin(); it != vvictory.end(); it++)
	{
		ofs << *it << "," << m_Speaker[*it].SP_score[1] << ",";
	}
	ofs << endl;

	//关闭文件
	ofs.close();

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

	//更改文件不为空的状态
	this->fileIsEmpty = false;
}

//读取往届记录
void SpeechManager::loadRecord()
{
	ifstream ifs("分数.csv",ios::in);//读文件
	if (!ifs.is_open())//如果打开失败返回0,加上!就是1
	{
		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++)
	//{
	//	//因为第二个值是一个vector容器,所以第一个选手的分数在第二个位置,也就是1下标上
	//	cout << it->first << "编号:" << it->second[0] << "分数:" << it->second[1] << endl;
	//}
}

//显示往届记录
void SpeechManager::showRecord()
{
	if (this->fileIsEmpty)
	{
		cout << "文件为空或者文件不存在" << endl;
	}
	else
	{
		for (map<int, vector<string>>::iterator it = m_Record.begin(); it != m_Record.end(); it++)
		{
		cout << it->first
			<< "冠军编号:" << it->second[0] << "分数:" << it->second[1] << " "
			<< "亚军编号:" << it->second[2] << "分数:" << it->second[3] << " "
			<< "季军编号:" << it->second[4] << "分数:" << it->second[5] << endl;
			
		}
	}

	system("pause");
	system("cls");
}

//清空记录
void SpeechManager::clearRecord()
{
	cout << "是否清空文件??????" << endl;
	cout << "1、是" << endl;
	cout << "2、否" << endl;

	int select;
	cin >> select;

	if (select == 1)
	{
		//确认清空
		ofstream ofs("分数.csv", ios::trunc);//存在则删除且重新创建 
		ofs.close();

		//初始化容器和属性
		this->initSpeech();

		//创建12名选手
		this->creatSpeeker();

		//加载往届记录
		this->loadRecord();

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

	}


	system("pause");
	system("cls");
}

//析构函数
SpeechManager::~SpeechManager()
{

}

3.4、speeker.h

用于创建选手类,成员属性为选手名字以及选手每一轮比赛的分数

#pragma once
#include"head.h"

class Speaker
{
public:
    //如选手A,选手B.....
	string SP_name;
    //一共两轮比赛
	double SP_score[2];
};

3.5、演讲比赛管理系统.cpp

#include"speechManager.h"


int main()
{
	srand((unsigned int)time(NULL));//随机种子

	//创建管理对象
	SpeechManager sp;

	测试12名选手创建
	//for (map<int, Speaker>::iterator it = sp.m_Speaker.begin(); it != sp.m_Speaker.end(); it++)
	//{
	//	cout << "选手编号:" << it->first << "姓名:" << it->second.SP_name << "分数:" << it->second.SP_score[0] << endl;
	//}

	//用于用户输入
	int choice = 0;
	
	while (true)
	{
		sp.ShowMenue();

		cout << "请输入你的选择" << endl;
		cin >> choice;

		switch (choice)
		{
		case 1://开始比赛
			sp.starManager();
			break;
		case 2://查看记录
			sp.showRecord();
			break;
		case 3://清空记录
			sp.clearRecord();
			break;
		case 0://退出系统
			sp.exitSystem();
			break;

		default:
			system("cls");//清屏
			break;
		}
	}
	system("pause");
	return 0;
}

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-05-08 07:51:17  更:2022-05-08 07:53:59 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/21 0:37:09-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码