7-2 多线程计算 分数 10 作者 孙晨霞 单位 河北农业大学 已知某学校有n名教师,学校有m名学生,学校搞学生民意调查,每一位学生为每一位老师都打分,学生所打的所有的分数都集中到一个数组中。数据存放规律是,前m个数据是对1号老师的打分,接下来m个数据是对2号老师的打分,以此类推。请设计一个多线程的算法,计算出每一位老师的总打分。 输入格式: 第一行输入教师数,第二行输入学生数,第三行输入所有n*m个打分(整型),各个分数之间以一个空格分隔 输出格式: 按照教师原来的顺序,每行输出每一位老师的得分
时间: 2024-03-15 20:42:42 浏览: 230
有n个学生,每人有m门课程的分数,要求: (1)找出总分最高的学生号; (2)找出至少有一门课分数不及格的学生号并输出其所有分数; (3)统计每门分数都在85分
以下是一个多线程计算的示例代码,可以实现题目中的要求:
```c++
#include <iostream>
#include <thread>
#include <vector>
using namespace std;
// 定义全局变量,存放每位老师的得分
vector<int> teacher_scores;
// 定义线程函数,计算每位老师的得分
void compute_scores(int teacher_id, int num_students, const vector<int>& all_scores) {
int start_index = (teacher_id - 1) * num_students;
int end_index = start_index + num_students;
// 计算当前老师的得分
int score_sum = 0;
for (int i = start_index; i < end_index; i++) {
score_sum += all_scores[i];
}
// 将当前老师的得分存入全局变量中
teacher_scores[teacher_id - 1] = score_sum;
}
int main() {
int num_teachers, num_students;
cin >> num_teachers >> num_students;
// 读入所有学生的打分,存入一个向量中
vector<int> all_scores(num_teachers * num_students);
for (int i = 0; i < num_teachers * num_students; i++) {
cin >> all_scores[i];
}
// 初始化全局变量
teacher_scores.resize(num_teachers);
// 创建线程,计算每位老师的得分
vector<thread> threads;
for (int i = 1; i <= num_teachers; i++) {
threads.emplace_back(compute_scores, i, num_students, ref(all_scores));
}
// 等待所有线程执行完毕
for (auto& thread : threads) {
thread.join();
}
// 输出每位老师的得分
for (int score : teacher_scores) {
cout << score << endl;
}
return 0;
}
```
在这段代码中,我们首先读入输入数据,然后定义了一个全局变量`teacher_scores`,用于存放每位老师的得分。接下来,我们创建了一个向量`all_scores`,用于存放所有学生的打分,然后使用`resize`函数初始化了`teacher_scores`向量。
我们创建了`num_teachers`个线程,每个线程计算一个老师的得分。在计算每个老师的得分时,我们使用了该老师对应的起始和结束索引,遍历该老师对应的所有学生的打分,并求和得到该老师的得分。
最后,我们等待所有线程执行完毕,然后输出每位老师的得分。
阅读全文