最近继续开始学习c++语法:学习了结构体嵌套结构体的组合形式,前几天写过一个冒泡排序,想到可以将两个知识点结合,作为复习总结。
描述为:有3个老师,每个老师辅导5名学生同一门课程,对每个老师所带学生的成绩进行按小到大排序,成绩相同时不计排名。
在此基础上还有更多的操作,比如计算每个老师带的所有学生成绩的平均值,再按照此平均值对老师进行排序。此处就不展开。仅仅对学生排名,记录下这两个知识点的学习。
下面是最终的版本:
#include<iostream>
#include<string>
using namespace std;
const int len = 5; //每个老师带的学生数
//学生信息结构体
struct student {
string s_name;
int s_score;
};
//老师信息结构体
struct teacher {
string t_name;
struct student stud[len];
};
//初始化每个老师的信息及其带的5个学生信息
void initInfo(teacher t_arr[]) {
string nameSeed = "ABCDE";
for (int i = 0; i < 3; i++) {
t_arr[i].t_name = "Teacher_";
t_arr[i].t_name += nameSeed[i];
for (int j = 0; j < len; j++) {
t_arr[i].stud[j].s_name = "Student_";
t_arr[i].stud[j].s_name += nameSeed[j];
t_arr[i].stud[j].s_score = rand() % 41 + 60;
}
}
}
//打印输出信息
void printInfo(teacher t_arr[]) {
for (int i = 0; i < 3; i++) {
for (int j = 0; j < len; j++) {
cout << "老师 " << t_arr[i].t_name << " 的学生 :" << t_arr[i].stud[j].s_name
<< "成绩为:"<< t_arr[i].stud[j].s_score << endl;
}
cout << endl;
}
}
//冒泡排序
void bubbleSort(teacher t_arr[]) {
for(int i=0;i<3;i++){
for (int k = 0; k < len - 1; k++) {
for (int m = 0; m < len - 1 - k; m++) {
student max = t_arr[i].stud[m];
if (max.s_score >= t_arr[i].stud[m + 1].s_score) {
t_arr[i].stud[m] = t_arr[i].stud[m + 1];
t_arr[i].stud[m + 1] = max;
}
}
}
}
}
//主函数
int main() {
srand((unsigned)time(NULL));
teacher t_arr[3]; //三个老师
//初始化每个老师的信息及其带的5个学生信息
initInfo(t_arr);
//打印未排序的信息
cout << "未排序的结果:" << endl;
printInfo(t_arr);
//开始排序
bubbleSort(t_arr);
//打印排序后的信息
cout << "排序后结果:" << endl;
printInfo(t_arr);
system("pause");
return 0;
}
结果如下:
##########################################################################################################################################################
以下为之前的尝试记录
#include<iostream>
#include<string>
using namespace std;
const int len = 5; //每个老师带的学生数
//学生信息
struct student {
string s_name;
int s_score;
};
//老师信息
struct teacher {
string t_name;
struct student stud[len];
};
//主函数
int main() {
srand((unsigned)time(NULL));
teacher t_arr[3]; //三个老师
string nameSeed = "ABCDE";
//初始化每个老师的信息及其带的5个学生信息
for (int i = 0; i < 3; i++) {
t_arr[i].t_name = "Teacher_";
t_arr[i].t_name += nameSeed[i];
for (int j = 0; j < len; j++) {
t_arr[i].stud[j].s_name = "Student_";
t_arr[i].stud[j].s_name += nameSeed[j];
t_arr[i].stud[j].s_score = rand() % 41 + 60;
}
//用冒泡排序,对每个老师所带学生按照成绩从小到大排序
for (int k = 0; k < len - 1; k++) {
for (int m = 0; m < len - 1 - k; m++) {
int max = t_arr[i].stud[m].s_score;
if (max >= t_arr[i].stud[m + 1].s_score) {
t_arr[i].stud[m].s_score = t_arr[i].stud[m + 1].s_score;
t_arr[i].stud[m + 1].s_score = max;
}
}
}
}
//分别输出每个老师所带学生按照成绩排名后的信息
for (int i = 0; i < 3; i++) {
for (int j = 0; j < len; j++) {
cout << "老师 " << t_arr[i].t_name << " 的学生 :" << t_arr[i].stud[j].s_name << "年龄为:"
<< t_arr[i].stud[j].s_score << endl;
}
cout << endl;
}
system("pause");
return 0;
}
程序运行后的结果如下:
同时,也使用了 srand((unsigned)time(NULL)) 来产生每个学生的随机成绩,但在vs2019里没有包含头文件< ctime >也能正常运行。第二次运行结果如下:
仅记录自己的学习历程。欢迎大家批评指正。
自己发现了错误上述两幅结果的学生的顺序依次为ABCDE,与真实成绩并没有对应起来,原因是在排序的过程中仅对成绩进行了比较与排序,并没有对学生进行排序,经过修改,正确的程序如下:
#include<iostream>
#include<string>
using namespace std;
const int len = 5; //每个老师带的学生数
//学生信息
struct student {
string s_name;
int s_score;
};
//老师信息
struct teacher {
string t_name;
struct student stud[len];
};
//主函数
int main() {
srand((unsigned)time(NULL));
teacher t_arr[3]; //三个老师
string nameSeed = "ABCDE";
//初始化每个老师的信息及其带的5个学生信息
for (int i = 0; i < 3; i++) {
t_arr[i].t_name = "Teacher_";
t_arr[i].t_name += nameSeed[i];
for (int j = 0; j < len; j++) {
t_arr[i].stud[j].s_name = "Student_";
t_arr[i].stud[j].s_name += nameSeed[j];
t_arr[i].stud[j].s_score = rand() % 41 + 60;
}
//用冒泡排序,对每个老师所带学生按照成绩从小到大排序
for (int k = 0; k < len - 1; k++) {
for (int m = 0; m < len - 1 - k; m++) {
student max= t_arr[i].stud[m];
if (max.s_score >= t_arr[i].stud[m + 1].s_score) {
t_arr[i].stud[m] = t_arr[i].stud[m + 1];
t_arr[i].stud[m + 1] = max;
}
}
}
//分别输出每个老师所带学生按照成绩排名后的信息
for (int j = 0; j < len; j++) {
cout << "老师 " << t_arr[i].t_name << " 的学生 :" << t_arr[i].stud[j].s_name << "成绩为:"
<< t_arr[i].stud[j].s_score << endl;
}
cout << endl;
}
//分别输出每个老师所带学生按照成绩排名后的信息
/*for (int i = 0; i < 3; i++) {
for (int j = 0; j < len; j++) {
cout << "老师 " << t_arr[i].t_name << " 的学生 :" << t_arr[i].stud[j].s_name << "成绩为:"
<< t_arr[i].stud[j].s_score << endl;
}
cout << endl;
}*/
system("pause");
return 0;
}
改正后的结果如下图:
仅记录自己的学习历程。欢迎大家批评指正。