评委打分项目
代码展示
#include<iostream>
#include<string>
#include<vector>
#include<deque>
#include<algorithm>
using namespace std;
class Person {
public:
Person(int score, string name) {
this->m_name = name;
this->m_score = score;
}
string m_name;
int m_score;
};
//创建选手
void createPerson(vector<Person>& v) {
string nameSeed = "ABCDEF";
for (int i = 0; i < 5; i++) {
string name = "选手";
name += nameSeed[i];
int score = 0;//将初始成绩设为0
Person p(score,name);
v.push_back(p);
}
}
//打分
void setScore(vector<Person>& v) {
for (vector<Person>::iterator it = v.begin(); it != v.end(); it++) {
deque<int>d;
for (int i = 0; i < 10; i++) {
int score = rand() % 41 + 60;
d.push_back(score);
}
/*cout << "选手:" << it->m_name << "打分:" << endl;
for (deque<int>::iterator dit = d.begin(); dit < d.end(); dit++) {
cout << *dit<<" ";
}
cout << endl;*/
//排序
sort(d.begin(), d.end());
//除去最小值和最大值
d.pop_back();
d.pop_front();
//累加分数
int sum = 0;
for (deque<int>::iterator dit = d.begin(); dit < d.end(); dit++) {
sum += *dit;//注意必须要用地址而不是直接用数
}
int avg = sum / d.size();
//把平均数给选手
it->m_score = avg;
}
//显示平均分
}
void ShowScore(vector<Person>& v) {
for (vector<Person>::iterator it = v.begin(); it != v.end(); it++) {
cout << "选手:" << it->m_name << "平均分:" << it->m_score << endl;
}
}
int main() {
vector<Person>v;
createPerson(v);
//测试
/*for (vector<Person>::iterator it = v.begin(); it != v.end(); it++) {
cout << it->m_name << "成绩:" << it->m_score << endl;
}*/
setScore(v);
ShowScore(v);
system("pause");
return 0;
}
逐行解释代码
头文件包含
#include<iostream>
#include<string>
#include<vector>
#include<deque>
#include<algorithm>
using namespace std;
#include<iostream>
:包含输入输出流的头文件,用于标准输入输出操作。#include<string>
:包含字符串类的头文件。#include<vector>
:包含vector
容器的头文件。#include<deque>
:包含deque
容器的头文件。#include<algorithm>
:包含算法库的头文件,用于排序等操作。using namespace std;
:使用标准命名空间,避免每次调用标准库函数时都要加上std::
前缀。
定义Person
类
class Person {
public:
Person(int score, string name) {
this->m_name = name;
this->m_score = score;
}
string m_name;
int m_score;
};
class Person
:定义一个名为Person
的类。public:
:声明公共成员。Person(int score, string name)
:定义一个构造函数,接受一个整数score
和一个字符串name
。this->m_name = name;
:将传入的name
赋值给成员变量m_name
。this->m_score = score;
:将传入的score
赋值给成员变量m_score
。string m_name;
:定义一个字符串成员变量m_name
,用于存储姓名。int m_score;
:定义一个整数成员变量m_score
,用于存储分数。
创建选手函数
void createPerson(vector<Person>& v) {
string nameSeed = "ABCDEF";
for (int i = 0; i < 5; i++) {
string name = "选手";
name += nameSeed[i];
int score = 0; // 将初始成绩设为0
Person p(score, name);
v.push_back(p);
}
}
void createPerson(vector<Person>& v)
:定义一个函数,接受一个vector<Person>
类型的引用参数。string nameSeed = "ABCDEF";
:定义一个字符串nameSeed
,用于生成选手的名字。for (int i = 0; i < 5; i++)
:使用循环创建5个选手。string name = "选手";
:初始化一个字符串name
,值为“选手”。name += nameSeed[i];
:将nameSeed
中的一个字符追加到name
中,生成完整的选手名字。int score = 0;
:初始化一个整数score
,值为0,表示初始成绩。Person p(score, name);
:创建一个Person
对象p
,传入初始成绩和名字。v.push_back(p);
:将创建的Person
对象p
添加到vector
容器v
中。
打分函数
void setScore(vector<Person>& v) {
for (vector<Person>::iterator it = v.begin(); it != v.end(); it++) {
deque<int> d;
for (int i = 0; i < 10; i++) {
int score = rand() % 41 + 60;
d.push_back(score);
}
// 排序
sort(d.begin(), d.end());
// 除去最小值和最大值
d.pop_back();
d.pop_front();
// 累加分数
int sum = 0;
for (deque<int>::iterator dit = d.begin(); dit < d.end(); dit++) {
sum += *dit; // 注意必须要用地址而不是直接用数
}
int avg = sum / d.size();
// 把平均数给选手
it->m_score = avg;
}
}
void setScore(vector<Person>& v)
:定义一个函数,接受一个vector<Person>
类型的引用参数。for (vector<Person>::iterator it = v.begin(); it != v.end(); it++)
:使用迭代器遍历vector
容器中的每个Person
对象。deque<int> d;
:定义一个deque<int>
类型的容器d
,用于存储评分。for (int i = 0; i < 10; i++)
:使用循环生成10个评分。int score = rand() % 41 + 60;
:生成一个60到100之间的随机整数,作为评分。d.push_back(score);
:将生成的评分添加到deque
容器d
中。sort(d.begin(), d.end());
:使用sort
函数对deque
容器d
中的评分进行排序。d.pop_back();
:删除deque
容器d
中的最大评分。d.pop_front();
:删除deque
容器d
中的最小评分。int sum = 0;
:初始化一个整数sum
,用于累加评分。for (deque<int>::iterator dit = d.begin(); dit < d.end(); dit++)
:使用迭代器遍历deque
容器d
中的每个评分。sum += *dit;
:将当前迭代器指向的评分累加到sum
中。int avg = sum / d.size();
:计算平均评分。it->m_score = avg;
:将计算得到的平均评分赋值给当前Person
对象的m_score
成员变量。
显示评分函数
void ShowScore(vector<Person>& v) {
for (vector<Person>::iterator it = v.begin(); it != v.end(); it++) {
cout << "选手:" << it->m_name << "平均分:" << it->m_score << endl;
}
}
void ShowScore(vector<Person>& v)
:定义一个函数,接受一个vector<Person>
类型的引用参数。for (vector<Person>::iterator it = v.begin(); it != v.end(); it++)
:使用迭代器遍历vector
容器中的每个Person
对象。cout << "选手:" << it->m_name << "平均分:" << it->m_score << endl;
:输出当前Person
对象的姓名和平均评分。
主函数
int main() {
vector<Person> v;
createPerson(v);
// 测试
/*for (vector<Person>::iterator it = v.begin(); it != v.end(); it++) {
cout << it->m_name << "成绩:" << it->m_score << endl;
}*/
setScore(v);
ShowScore(v);
system("pause");
return 0;
}
vector<Person> v;
:创建一个vector<Person>
类型的容器v
。createPerson(v);
:调用createPerson
函数,创建5个选手并添加到v
中。/*for (vector<Person>::iterator it = v.begin(); it != v.end(); it++) { cout << it->m_name << "成绩:" << it->m_score << endl; }*/
:注释掉的测试代码,用于输出每个选手的姓名和初始成绩。setScore(v);
:调用setScore
函数,为每个选手生成评分并计算平均评分。ShowScore(v);
:调用ShowScore
函数,输出每个选手的姓名和平均评分。system("pause");
:暂停程序,等待用户按键。return 0;
:返回0,表示程序正常结束。
核心思想
这段代码的核心思想是模拟一个比赛评分系统,具体步骤如下:
- 创建选手:生成5个选手,每个选手的名字由“选手”加上一个字母组成,初始成绩为0。
- 打分:为每个选手生成10个评委的评分,去掉最高分和最低分,计算剩余评分的平均值,作为选手的最终成绩。
- 显示评分:输出每个选手的姓名和最终成绩。
所需知识及解释
-
类和对象
- 类的定义:使用
class
关键字定义类,包含成员变量和成员函数。 - 构造函数:用于初始化对象,可以在构造函数中设置成员变量的初始值。
- 成员变量:类中定义的变量,用于存储对象的状态。
- 成员函数:类中定义的函数,用于操作对象的状态。
- 类的定义:使用
-
容器
vector
容器:动态数组,支持高效的尾部插入和删除操作。deque
容器:双端队列,支持高效的两端插入和删除操作。
-
迭代器
- 迭代器的概念:迭代器是访问容器中元素的一种方式,类似于指针。
- 迭代器的使用:使用迭代器遍历容器中的元素,可以进行读取、修改等操作。
-
算法
sort
函数:用于对容器中的元素进行排序。rand
函数:生成随机数,用于模拟评委的评分。
-
输入输出
cout
和endl
:用于输出文本和换行。system("pause")
:用于暂停程序,等待用户按键。
-
字符串操作
- 字符串拼接:使用
+
操作符将字符串拼接在一起。
- 字符串拼接:使用