从0到1入门C++编程——12 演讲比赛流程管理系统

文章目录

  • 一、创建类并显示菜单
  • 二、退出管理系统
  • 三、开始演讲比赛
  • 四、查看往届记录
  • 五、清空比赛记录
  • 六、案例源代码


演讲比赛流程管理系统
比赛规则:演讲比赛共有12个人参加,比赛分两轮进行,第一轮为淘汰赛,第二轮为决赛。每名选手都有对应的编号,如10001~10012,可以根据届数的不同修改选手编号,第一轮分为两个小组,每组6个人,整体按照选手编号进行抽签后顺序演讲。十个评委分别给每名选手打分,去除最高分和最低分,平均分作为本轮选手的成绩。第一轮过后,分别淘汰两组内排名后三名的选手,每组前三名晋级。第二轮为决赛,前三名胜出,每轮比赛过后需要显示晋级选手的信息。
程序功能
开始演讲比赛:完成整届比赛的流程,每个比赛阶段需要给用户一个提示,用户按任意键后继续下一个阶段;
查看往届记录:查看之前比赛前三名结果,每次比赛都会记录到文件中,文件用.csv后缀名保存;
清空比赛记录:将文件中数据清空;
退出比赛程序:用户输入某一选择后退出程序。


一、创建类并显示菜单

创建管理类头文件和cpp文件,在头文件中创建一个类,后续相关的成员函数在类中进行声明,具体的实现在cpp文件中。
在这里插入图片描述
菜单显示功能的实现步骤:先在头文件speechManager.h中声明显示菜单的函数,然后在speechManager.cpp中实现该函数,再到main.cpp中通过实例化对象调用该函数接口。之后的功能基本上都是按照这个步骤进行的。
头文件speechManager.h中声明显示菜单函数的代码如下。

#pragma once
#include <iostream>
using namespace std;class speechManager
{
public:speechManager();  //构造函数void show_menu();  //显示菜单~speechManager();  //析构函数
};

在speechManager.cpp中实现显示菜单的代码如下。

void speechManager::show_menu()  //显示菜单
{cout<<"****************************************"<<endl;cout<<"**********演讲比赛流程管理系统**********"<<endl;cout<<"**********   0.退出比赛程序   **********"<<endl;cout<<"**********   1.开始演讲比赛   **********"<<endl;cout<<"**********   2.查看往届记录   **********"<<endl;cout<<"**********   3.清空比赛记录   **********"<<endl;cout<<"****************************************"<<endl;cout<<endl;
}

main.cpp中通过实例化对象调用该函数接口的代码如下。

speechManager sp;
sp.show_menu();  //显示菜单

运行程序后的结果如下图所示。
在这里插入图片描述


二、退出管理系统

speechManager.cpp中实现退出管理系统的代码如下。

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

main.cpp中通过switch-case分支对用户的输入进行不同的处理,到此为止的代码框架如下。

int user_choice;
speechManager sp;
while(1)
{sp.show_menu();  //显示菜单cout<<"请输入您的选择: ";cin>>user_choice;switch(user_choice){case 0:sp.exit_system();  //退出系统break;case 1:break;case 2:break;case 3:break;default:system("cls");  //清屏break;}
}

运行程序之后输入0,按回车后显示如下,再按任意键就会退出该程序。
在这里插入图片描述


三、开始演讲比赛

本案例中内容最多的就是演讲比赛功能,在管理类中添加下面各项属性。

vector<int> v1;  //第一轮比赛12人
vector<int> v2;  //第二轮比赛6人
vector<int> v;  //获胜者3人
map<int,Person> m;  //存放选手和编号的容器
int round;  //比赛轮数
bool fileIsEmpty;  //判断文件是否为空
map<int,vector<string>> m_record;  //读取文件记录
int session;  //记录比赛届数

在speechManager.h中创建选手类如下。

class Person
{
public:string name;  //选手姓名double score[2];  //记录平均分,有两轮
};

在构造函数中初始化各项参数、创建比赛选手、然后从文件中加载往届的记录信息,构造函数的内容如下。

speechManager::speechManager()  //构造函数
{init_index();    //初始化各项参数read_from_file();  //加载往届记录信息,读取到session供create_person()使用create_person();  //创建选手
}

构造函数中调用的各函数如下。

void speechManager::init_index() //初始化
{this->v1.clear();  //清空各容器this->v2.clear();this->v.clear();this->m.clear();this->round = 1;  //第一轮this->m_record.clear();
}void speechManager::read_from_file()  //从文件读取信息
{ifstream ifs("speech.cvs",ios::in);if(!ifs.is_open()){fileIsEmpty = true;//cout<<"文件不存在!"<<endl;session = 0;  //第0届ifs.close();return;}char ch;ifs>>ch;  //先读一个字符if(ifs.eof())  //文件被清空的情况{//cout<<"文件为空!"<<endl;fileIsEmpty = true;session = 0;  //第0届ifs.close();return;}fileIsEmpty = false;  //以上两个if都不满足,说明文件有内容ifs.putback(ch);   //将上面读取的单个字符放回文件中string data;int line = 0;    //记录行数,每一行就是一届的信息while(ifs>>data)  //逐行读取到data中{vector<string> vs; //存放拆分后的字符串int pos = -1;int start = 0;while(1)  //拆分字符串{pos = data.find(",",start);  //从start位置开始找第一个,if(pos == -1){break;  //没找到}string temp = data.substr(start,pos-start);   //截取子串start = pos + 1;   //移动下一次开始找的位置vs.push_back(temp);  //将拆分得到的字符串存入容器中}this->m_record.insert(make_pair(line,vs));  //将届数和记录存入map容器中line++;session = line;  //记录届数//cout<<line<<" data: "<<data<<endl;}ifs.close();
}void speechManager::create_person()  //创建选手
{session++;  //届数string nameSeed = "ABCDEFGHIJKL";for(int i=0;i<nameSeed.size();i++){string name = "选手";name += nameSeed[i];Person p;p.name = name;  //姓名p.score[0] = 0;  //分数都初始化为0p.score[1] = 0;v1.push_back(session*10000+1+i);   //根据届数给选手编号,并插入到vector容器中m.insert(make_pair<int,Person>(session*10000+1+i,p));  //插入到map容器中}
}

正式开始演讲比赛后,分两轮进行,每轮比赛需要进行抽签决定顺序,存放评委打分,显示本轮晋级结果,并在第二轮结束后将本届比赛获胜的三位选手信息写入文件中。

void speechManager::start_speech()  //开始比赛,控制整个流程
{//第一轮比赛speech_draw(); //1.抽签确定比赛顺序speech_contest(); //2.开始比赛并打分show_score();  //3.显示晋级结果//第二轮比赛this->round++;speech_draw();  //1.抽签确定比赛顺序speech_contest(); //2.开始比赛并打分show_score(); //3.显示最终获胜结果save_to_file(); //4.保存分数到文件中cout<<"本次比赛结束!"<<endl;init_index();  //初始化各项参数read_from_file();  //加载往届记录信息create_person();  //创建选手system("pause");system("cls");
}

演讲比赛过程中用到的各个函数如下。

void speechManager::speech_draw()   //抽签
{cout<<"-----------------------"<<endl;cout<<"第"<<this->round<<"轮比赛选手正在抽签..."<<endl;cout<<"-----------------------"<<endl;cout<<"抽签后的演讲顺序如下: "<<endl;if(this->round == 1)  //第一轮抽签{random_shuffle(v1.begin(),v1.end());   //洗牌,打乱v1容器中的编号顺序for(vector<int>::iterator i=v1.begin();i!=v1.end();i++){cout<<*i<<" ";}cout<<endl;}else   //第二轮抽签{random_shuffle(v2.begin(),v2.end());   //洗牌,打乱v2容器中的编号顺序for(vector<int>::iterator i=v2.begin();i!=v2.end();i++){cout<<*i<<" ";}cout<<endl;}cout<<endl;system("pause");cout<<endl;
}void speechManager::speech_contest()  //开始比赛并打分
{cout<<"------------ 第"<<this->round<<"轮比赛开始 ------------"<<endl;multimap<double,int,greater<double>> group;  //防止同分情况定义为multimap容器,降序排列6个人的成绩和编号//这里把得分放在编号前面是为了降序排列得分,map容器是按照第一个位置的参数排序的int num = 0;    //记录小组内成员个数,6人一组vector<int> vtemp;  //创建一个临时容器,根据当前比赛轮数进行拷贝操作if(this->round == 1){vtemp = v1;  //第一轮}else{vtemp = v2;   //第二轮}for(vector<int>::iterator i=vtemp.begin();i!=vtemp.end();i++){num++;deque<double> d;  //存取评委打分,deque容器排序后容易去掉开头末尾两数for(int j=0;j<10;j++){double score = (rand()%401+600)/10.f;  //60.0-100.0d.push_back(score);}sort(d.begin(),d.end(),greater<double>());  //降序排列d.pop_front();  //去除最高分d.pop_back();  //去除最低分double aver = accumulate(d.begin(),d.end(),0.0f) / (double) d.size();  //累加总分并求平均分this->m[*i].score[round-1] = aver;  //将平均分存放在map容器中//cout<<"编号: "<<*i<<" 姓名: "<<m[*i].name<<" 平均分: "<<m[*i].score[round-1]<<endl;group.insert(make_pair<double,int>(aver,*i));   //插入临时容器中,key是得分,value是选手编号if(num % 6 == 0)  //num = 6 或 num = 12 时进入{cout<<"********** 第"<<num/6<<"小组的排名如下 **********"<<endl;int count = 0;for(multimap<double,int,greater<double>>::iterator i=group.begin();i!=group.end();i++){cout<<"编号: "<<i->second<<" 姓名: "<<m[i->second].name<<" 平均分: "<<m[i->second].score[round-1]<<endl;if(count < 3)  //取前三名{if(this->round == 1){v2.push_back(i->second);  //晋级第二轮的选手}else{v.push_back(i->second);  //最终获胜的选手}count++;}}group.clear();  //每6人就清空一次容器}}cout<<"------------ 第"<<this->round<<"轮比赛结束 ------------"<<endl;cout<<endl;system("pause");cout<<endl;
}void speechManager::show_score()  //显示晋级结果
{cout<<"-------- 第"<<this->round<<"轮晋级选手信息如下 --------"<<endl;vector<int> vtemp;  //创建一个临时容器,根据当前比赛轮数进行拷贝操作if(this->round == 1){vtemp = v2;}else{vtemp = v;}for(vector<int>::iterator i=vtemp.begin();i!=vtemp.end();i++){cout<<"编号: "<<*i<<" 姓名: "<<m[*i].name<<" 平均分: "<<m[*i].score[round-1]<<endl;}cout<<"---------------------------------------"<<endl;cout<<endl;system("pause");system("cls");show_menu();
}void speechManager::save_to_file()  //将晋级信息保存到文件
{ofstream ofs;ofs.open("speech.cvs",ios::out | ios::app);   //用追加的方式往文件中写数据for(vector<int>::iterator i=v.begin();i!=v.end();i++){ofs<<*i<<","<<m[*i].score[1]<<",";}ofs<<endl;ofs.close();cout<<"数据已保存!"<<endl;fileIsEmpty = false;   //插入数据后文件已经不为空
}

抽签过程如下图所示。
在这里插入图片描述
第一轮比赛结束后,每个小组按照得分从高到低排列,每个小组取前三名晋级下一轮,如下图所示。
在这里插入图片描述
第二轮抽签、赛果及晋级信息如下图所示。
在这里插入图片描述
本次比赛结束后将获胜三人的信息存入文件中,方便后续访问。
在这里插入图片描述


四、查看往届记录

read_from_file()函数中已经将文件中保存的记录读取到了map容器中,现在查看往届记录只需要从map容器中读取信息即可。
查看往届记录的函数体如下。

void speechManager::show_record()  //显示往届记录
{if(fileIsEmpty){cout<<"文件为空或不存在!"<<endl;}else{for(int i=0;i<m_record.size();i++){cout<<"第"<<i+1<<"届---冠军编号:"<<m_record[i][0]<<" 分数:"<<m_record[i][1]<<"   亚军编号:"<<m_record[i][2]<<" 分数:"<<m_record[i][3]<<"   季军编号:"<<m_record[i][4]<<" 分数:"<<m_record[i][5]<<endl;}/*for(map<int,vector<string>>::iterator i=m_record.begin();i!=m_record.end();i++){cout<<"第"<<i->first+1<<"届---冠军编号:"<<i->second[0]<<" 分数:"<<i->second[1]<<"   亚军编号:"<<i->second[2]<<" 分数:"<<i->second[3]<<"   季军编号:"<<i->second[4]<<" 分数:"<<i->second[5]<<endl;}*/}system("pause");system("cls");
}

读取往届记录信息的截图如下图所示。
在这里插入图片描述
往届记录在项目工程文件夹下的speech.cvs文件中存放的信息如下。
在这里插入图片描述


五、清空比赛记录

清空比赛记录前让用户再确认一次,确认无误后将存取记录的文件删空,这样以往的比赛记录就不存在了,同时还要执行构造函数中执行的几个函数进行初始化操作。
清空比赛记录的函数体如下。

void speechManager::clear_record()  //清空往届记录
{if(fileIsEmpty){cout<<"文件为空!"<<endl;}else{cout<<"确定清空文件?"<<endl;cout<<"输入 1---确定"<<endl;cout<<"其他键---取消"<<endl;int input = 0;cin>>input;if(input == 1){ofstream ofs("speech.cvs",ios::trunc);  //删除文件并重新创建同名文件ofs.close();init_index();    //初始化各项参数session = 0;  //第0届create_person();  //创建选手read_from_file();  //加载往届记录信息cout<<"清空往届比赛记录成功!"<<endl;}}system("pause");system("cls");
}

清空比赛记录的操作截图如下图所示。
在这里插入图片描述
再次查看往届记录,提示文件为空或不存在,打开文件,里面的内容也被清空了,如下图所示。
在这里插入图片描述


六、案例源代码

speechManager.h文件的代码如下。

#pragma once
#include <iostream>
#include <vector>
#include <map>
#include <string>
#include <algorithm>
#include <functional>
#include <numeric>
#include <deque>
#include <fstream>
using namespace std;class Person
{
public:string name;  //选手姓名double score[2];  //记录平均分,有两轮
};class speechManager
{
public:speechManager();  //构造函数void show_menu();  //显示菜单void exit_system();  //退出系统void init_index();  //初始化void create_person();  //创建选手void start_speech();  //开始比赛,控制整个流程void speech_draw();  //抽签void speech_contest();  //开始比赛并打分void show_score();  //显示晋级结果void save_to_file();  //将晋级信息保存到文件void read_from_file();  //从文件读取信息void show_record();  //显示往届记录void clear_record();  //清空往届记录~speechManager();  //析构函数vector<int> v1;  //第一轮比赛12人vector<int> v2;  //第二轮比赛6人vector<int> v;  //获胜者3人map<int,Person> m;  //存放选手和编号的容器int round;  //比赛轮数bool fileIsEmpty;  //判断文件是否为空map<int,vector<string>> m_record;  //读取文件记录int session;  //记录比赛届数
};

speechManager.cpp文件的代码如下。

#include "speechManager.h"speechManager::speechManager()  //构造函数
{init_index();    //初始化各项参数read_from_file();  //加载往届记录信息,读取到session供create_person()使用create_person();  //创建选手
}void speechManager::show_menu()  //显示菜单
{cout<<"****************************************"<<endl;cout<<"**********演讲比赛流程管理系统**********"<<endl;cout<<"**********   0.退出比赛程序   **********"<<endl;cout<<"**********   1.开始演讲比赛   **********"<<endl;cout<<"**********   2.查看往届记录   **********"<<endl;cout<<"**********   3.清空比赛记录   **********"<<endl;cout<<"****************************************"<<endl;cout<<endl;
}void speechManager::exit_system()  //退出系统
{cout<<"欢迎下次使用!"<<endl;system("pause");exit(0);
}void speechManager::init_index() //初始化
{this->v1.clear();  //清空各容器this->v2.clear();this->v.clear();this->m.clear();this->round = 1;  //第一轮this->m_record.clear();
}void speechManager::create_person()  //创建选手
{session++;  //届数string nameSeed = "ABCDEFGHIJKL";for(int i=0;i<nameSeed.size();i++){string name = "选手";name += nameSeed[i];Person p;p.name = name;  //姓名p.score[0] = 0;  //分数都初始化为0p.score[1] = 0;v1.push_back(session*10000+1+i);   //根据届数给选手编号,并插入到vector容器中m.insert(make_pair<int,Person>(session*10000+1+i,p));  //插入到map容器中}
}void speechManager::speech_draw()   //抽签
{cout<<"-----------------------"<<endl;cout<<"第"<<this->round<<"轮比赛选手正在抽签..."<<endl;cout<<"-----------------------"<<endl;cout<<"抽签后的演讲顺序如下: "<<endl;if(this->round == 1)  //第一轮抽签{random_shuffle(v1.begin(),v1.end());   //洗牌,打乱v1容器中的编号顺序for(vector<int>::iterator i=v1.begin();i!=v1.end();i++){cout<<*i<<" ";}cout<<endl;}else   //第二轮抽签{random_shuffle(v2.begin(),v2.end());   //洗牌,打乱v2容器中的编号顺序for(vector<int>::iterator i=v2.begin();i!=v2.end();i++){cout<<*i<<" ";}cout<<endl;}cout<<endl;system("pause");cout<<endl;
}void speechManager::speech_contest()  //开始比赛并打分
{cout<<"------------ 第"<<this->round<<"轮比赛开始 ------------"<<endl;multimap<double,int,greater<double>> group;  //防止同分情况定义为multimap容器,降序排列6个人的成绩和编号//这里把得分放在编号前面是为了降序排列得分,map容器是按照第一个位置的参数排序的int num = 0;    //记录小组内成员个数,6人一组vector<int> vtemp;  //创建一个临时容器,根据当前比赛轮数进行拷贝操作if(this->round == 1){vtemp = v1;  //第一轮}else{vtemp = v2;   //第二轮}for(vector<int>::iterator i=vtemp.begin();i!=vtemp.end();i++){num++;deque<double> d;  //存取评委打分,deque容器排序后容易去掉开头末尾两数for(int j=0;j<10;j++){double score = (rand()%401+600)/10.f;  //60.0-100.0d.push_back(score);}sort(d.begin(),d.end(),greater<double>());  //降序排列d.pop_front();  //去除最高分d.pop_back();  //去除最低分double aver = accumulate(d.begin(),d.end(),0.0f) / (double) d.size();  //累加总分并求平均分this->m[*i].score[round-1] = aver;  //将平均分存放在map容器中//cout<<"编号: "<<*i<<" 姓名: "<<m[*i].name<<" 平均分: "<<m[*i].score[round-1]<<endl;group.insert(make_pair<double,int>(aver,*i));   //插入临时容器中,key是得分,value是选手编号if(num % 6 == 0)  //num = 6 或 num = 12 时进入{cout<<"********** 第"<<num/6<<"小组的排名如下 **********"<<endl;int count = 0;for(multimap<double,int,greater<double>>::iterator i=group.begin();i!=group.end();i++){cout<<"编号: "<<i->second<<" 姓名: "<<m[i->second].name<<" 平均分: "<<m[i->second].score[round-1]<<endl;if(count < 3)  //取前三名{if(this->round == 1){v2.push_back(i->second);  //晋级第二轮的选手}else{v.push_back(i->second);  //最终获胜的选手}count++;}}group.clear();  //每6人就清空一次容器}}cout<<"------------ 第"<<this->round<<"轮比赛结束 ------------"<<endl;cout<<endl;system("pause");cout<<endl;
}void speechManager::show_score()  //显示晋级结果
{cout<<"-------- 第"<<this->round<<"轮晋级选手信息如下 --------"<<endl;vector<int> vtemp;  //创建一个临时容器,根据当前比赛轮数进行拷贝操作if(this->round == 1){vtemp = v2;}else{vtemp = v;}for(vector<int>::iterator i=vtemp.begin();i!=vtemp.end();i++){cout<<"编号: "<<*i<<" 姓名: "<<m[*i].name<<" 平均分: "<<m[*i].score[round-1]<<endl;}cout<<"---------------------------------------"<<endl;cout<<endl;system("pause");system("cls");show_menu();
}void speechManager::save_to_file()  //将晋级信息保存到文件
{ofstream ofs;ofs.open("speech.cvs",ios::out | ios::app);   //用追加的方式往文件中写数据for(vector<int>::iterator i=v.begin();i!=v.end();i++){ofs<<*i<<","<<m[*i].score[1]<<",";}ofs<<endl;ofs.close();cout<<"数据已保存!"<<endl;fileIsEmpty = false;   //插入数据后文件已经不为空
}void speechManager::start_speech()  //开始比赛,控制整个流程
{//第一轮比赛speech_draw(); //1.抽签确定比赛顺序speech_contest(); //2.开始比赛并打分show_score();  //3.显示晋级结果//第二轮比赛this->round++;speech_draw();  //1.抽签确定比赛顺序speech_contest(); //2.开始比赛并打分show_score(); //3.显示最终获胜结果save_to_file(); //4.保存分数到文件中cout<<"本次比赛结束!"<<endl;init_index();  //初始化各项参数read_from_file();  //加载往届记录信息create_person();  //创建选手system("pause");system("cls");
}void speechManager::read_from_file()  //从文件读取信息
{ifstream ifs("speech.cvs",ios::in);if(!ifs.is_open()){fileIsEmpty = true;//cout<<"文件不存在!"<<endl;session = 0;  //第0届ifs.close();return;}char ch;ifs>>ch;  //先读一个字符if(ifs.eof())  //文件被清空的情况{//cout<<"文件为空!"<<endl;fileIsEmpty = true;session = 0;  //第0届ifs.close();return;}fileIsEmpty = false;  //以上两个if都不满足,说明文件有内容ifs.putback(ch);   //将上面读取的单个字符放回文件中string data;int line = 0;    //记录行数,每一行就是一届的信息while(ifs>>data)  //逐行读取到data中{vector<string> vs; //存放拆分后的字符串int pos = -1;int start = 0;while(1)  //拆分字符串{pos = data.find(",",start);  //从start位置开始找第一个,if(pos == -1){break;  //没找到}string temp = data.substr(start,pos-start);   //截取子串start = pos + 1;   //移动下一次开始找的位置vs.push_back(temp);  //将拆分得到的字符串存入容器中}this->m_record.insert(make_pair(line,vs));  //将届数和记录存入map容器中line++;session = line;  //记录届数//cout<<line<<" data: "<<data<<endl;}ifs.close();
}void speechManager::show_record()  //显示往届记录
{if(fileIsEmpty){cout<<"文件为空或不存在!"<<endl;}else{//for(int i=0;i<m_record.size();i++)//{//	cout<<"第"<<i+1<<"届---冠军编号:"<<m_record[i][0]<<" 分数:"<<m_record[i][1]//		<<"   亚军编号:"<<m_record[i][2]<<" 分数:"<<m_record[i][3]//		<<"   季军编号:"<<m_record[i][4]<<" 分数:"<<m_record[i][5]<<endl;//}for(map<int,vector<string>>::iterator i=m_record.begin();i!=m_record.end();i++){cout<<"第"<<i->first+1<<"届---冠军编号:"<<i->second[0]<<" 分数:"<<i->second[1]<<"   亚军编号:"<<i->second[2]<<" 分数:"<<i->second[3]<<"   季军编号:"<<i->second[4]<<" 分数:"<<i->second[5]<<endl;}}system("pause");system("cls");
}void speechManager::clear_record()  //清空往届记录
{if(fileIsEmpty){cout<<"文件为空!"<<endl;}else{cout<<"确定清空文件?"<<endl;cout<<"输入 1---确定"<<endl;cout<<"其他键---取消"<<endl;int input = 0;cin>>input;if(input == 1){ofstream ofs("speech.cvs",ios::trunc);  //删除文件并重新创建同名文件ofs.close();init_index();    //初始化各项参数session = 0;  //第0届create_person();  //创建选手read_from_file();  //加载往届记录信息cout<<"清空往届比赛记录成功!"<<endl;}}system("pause");system("cls");
}speechManager::~speechManager()  //析构函数
{}

main.cpp文件的代码如下。

#include <ctime>
#include "speechManager.h"
using namespace std;int main()
{srand((unsigned int)time(NULL));   //随机数种子int user_choice;  //用户选择speechManager sp;  //实例化对象while(1){sp.show_menu();   //显示菜单cout<<"请输入您的选择: ";cin>>user_choice;switch(user_choice){case 0:sp.exit_system();  //退出系统break;case 1:sp.start_speech();  //开始演讲比赛break;case 2:sp.show_record();  //查看往届记录break;case 3: sp.clear_record();  //清空比赛记录break;default:system("cls");  //清屏break;}}system("pause");return 0;
}

本文参考视频:
黑马程序员匠心之作|C++教程从0到1入门编程,学习编程不再难

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/274962.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java中 final、finally、finalize 有什么区别?

1、典型回答 final、finally、finalize 是 Java 中三个不同的关键字&#xff0c;它们除了长得像之外&#xff0c;其他的&#xff08;作用和含义&#xff09;完全不同。 它们三个的区别就好像&#xff1a;雷、雷锋、雷峰塔之间的区别。&#xff08;是三个完全不同的东西&#…

STM32---通用定时器(一)理论基础

写在前面&#xff1a;在STM32F103中有众多的定时器&#xff0c;其中包括两个基本定时器&#xff0c;基本定时器的内容已经在上节进行了介绍&#xff0c;基本定时器的功能、结构、使用都较为简单。而STM32F1中还含有4个通用定时器&#xff08;TIM2\3\4\5&#xff09;,这些定时器…

【c++】特殊类的设计

&#x1f4bb;文章目录 &#x1f4c4;前言&#x1f33b;特殊类的设计无法被继承的类只能在堆开辟空间的类无法被拷贝的类只能在栈开辟空间的类 &#x1f33a;单例模式饿汉模式懒汉模式 &#x1f4d3;总结 &#x1f4c4;前言 你可听说过只能在堆上创建的类、无法被拷贝的类、甚至…

14双体系Java学习之数组

数组 ★小贴士 数组中保存固定数量的值&#xff0c;声明数组时需要制定数组中元素的类型&#xff0c;数组的长度在创建数组时设定。 保存数据的数据结构有很多&#xff0c;Java的标准函数库中就包含了许多复杂的数据结构&#xff0c;比如map、tree和set&#xff0c;以后会讲解的…

如何做代币分析:以 ARB 币为例

作者&#xff1a;lesleyfootprint.network 编译&#xff1a;mingfootprint.network 数据源&#xff1a;ARB 代币仪表板 &#xff08;仅包括以太坊数据&#xff09; 在加密货币和数字资产领域&#xff0c;代币分析起着至关重要的作用。代币分析指的是深入研究与代币相关的数据…

【考研】高等数学总结

文章目录 第一章 极限 函数 连续1.1 极限存在准则及两个重要极限1.1.1 夹逼定理1.1.1.1 数列夹逼定理1.1.1.2函数夹逼定理 1.1.2 两个重要极限1.1.2.1 极限公式11.1.2.1.1 证明1.1.2.1.2 数列的单调有界收敛准则1.1.2.1.2.1 二项式定理1.1.2.1.2.2 证明 1.1.2.2 极限公式21.1.2…

Linux - 进程信号

1、信号入门 1.1、生活角度的信号 你在网上买了很多件商品&#xff0c;再等待不同商品快递的到来。但即便快递没有到来&#xff0c;你也知道快递来临时&#xff0c; 你该怎么处理快递。也就是你能“识别快递”&#xff1b;当快递员到了你楼下&#xff0c;你也收到快递到来的通…

深圳市优质IDC服务商

深圳市南方联合科技有限公司是一家立足深圳、辐射全国的电信中立数据中心运营商&#xff0c;依托与电信运营商、IT 设备厂商在资源及渠道上的优势&#xff0c;借鉴业界成功运营经验&#xff0c;为用户提供持续、高速、安全的互联网数据中心服务&#xff08;IDC&#xff09;、企…

C#集合和数据结构,随笔记录

C#集合和数据结构 System.Collections命名空间包含接口和类&#xff0c;这些接口和类定义各种对象&#xff08;如列表/链表、位数组、哈希表、队列和堆栈&#xff09;的集合 System.Collections.Generic命名空间&#xff1a; 所有集合都直接或间接基于ICollection接口 列表类集…

Java项目:48 ssm008医院门诊挂号系统+jsp(含文档)

作者主页&#xff1a;舒克日记 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 本选题则旨在通过标签分类管理等方式实现 管理员&#xff1b;个人中心、药房管理、护士管理、医生管理、病人信息管理、科室信息管理、挂号管理、诊断…

案例--某站视频爬取

众所周知&#xff0c;某站的视频是&#xff1a; 由视频和音频分开的。 所以我们进行获取&#xff0c;需要分别获得它的音频和视频数据&#xff0c;然后进行音视频合并。 这么多年了&#xff0c;某站还是老样子&#xff0c;只要加个防盗链就能绕过。&#xff08;防止403&#xf…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的交通标志识别系统详解(深度学习模型+UI界面代码+训练数据集)

摘要&#xff1a;本篇博客详细介绍了利用深度学习构建交通标志识别系统的过程&#xff0c;并提供了完整的实现代码。该系统采用了先进的YOLOv8算法&#xff0c;并与YOLOv7、YOLOv6、YOLOv5等早期版本进行了性能评估对比&#xff0c;分析了性能指标如mAP、F1 Score等。文章深入探…

细粒度IP定位参文2(Corr-SLG):A street-level IP geolocation method (2021年)

[2]S. Ding, F. Zhao, and X. Luo, “A street-level IP geolocation method based on delay-distance correlation and multilayered common routers,” Secur. Commun. Netw., vol. 2021, no. 1, pp. 1–10, 2021. 智能设备的地理位置可以帮助提供多媒体内容提供商和5G网络中…

Apache POI 解析和处理Excel

摘要&#xff1a;由于开发需要批量导入Excel中的数据&#xff0c;使用了Apache POI库&#xff0c;记录下使用过程 1. 背景 Java 中操作 Excel 文件的库常用的有Apache POI 和阿里巴巴的 EasyExcel 。Apache POI 是一个功能比较全面的 Java 库&#xff0c;适合处理复杂的 Offi…

【算法设计】实验四回溯算法(附源代码)

这里写目录标题 一、上机目的二、上机内容与要求三、上机步骤四、上机结果1、将课本5.2节算法改为程序&#xff0c;并输入数据及进行测试&#xff1b;2、自学5.4节&#xff0c;并完成符号三角形问题。 一、上机目的 1、通过回溯法的示例程序理解回溯法的基本思想&#xff1b; …

C语言--从零开始的扫雷游戏

C语言--从零开始的扫雷游戏 1. 游戏说明2. 总体代码3. 详细讲解3.1 菜单部分3.2 游戏主体部分3.2.1 总体分析3.2.2 棋盘初始化3.2.3 棋盘展示3.2.4 设置地雷3.2.5 扫雷阶段3.2.6 统计雷个数的代码3.2.7 使用迭代的方式进行展开&#xff1a;3.2.8 扫雷部分主体代码 4. 总结 1. 游…

图片格式转换怎么操作?这一个方法快快收藏

图片格式转换能够改变图片的质量、大小兼容性。不同的图片格式用途也不同&#xff0c;当我们需要转换图片格式的时候要怎么操作呢&#xff1f;下面&#xff0c;小编给大家分享一款操作简单&#xff0c;小白也能轻松上手的图片转换器&#xff08;https://www.yasuotu.com/geshi&…

DDD领域模型驱动

传统MVC架构 DDD架构: api层:api请求方式,透传【传递参数】,几个业务对应api 业务层:做编排,业务里要有哪些服务,执行顺序是什么,以及怎么做 领域层:负责领域内调用,然后领域怎么划分 Dao层:数据库操作【或者另外一个应用 数据源之类的】 遵守原则: ①允许跨层…

什么是架构?架构设计原则是哪些?什么是设计模式?设计模式有哪些?

什么是架构?架构设计原则是哪些?什么是设计模式?设计模式有哪些? 架构的本质 架构本身是一种抽象的、来自建筑学的体系结构,其在企业及IT系统中被广泛应用。 架构的本质是对事物复杂性的管理,是对一个企业、一个公司、一个系统复杂的内部关系进行结构化、体系化的抽象,…

php apache 后台超时设置

最近在写一个thinkphp项目的时候&#xff0c;发现Ajax从后端请求数据时间比较长&#xff0c;大概需要45秒左右&#xff0c;但是一旦请求时间超过40s&#xff0c;页面就会超时500了&#xff0c;一开始以为是ajax请求时间不能太长&#xff0c;后来将Ajax请求改为同步且timeout设置…