嵌套结构体中用冒泡排序

最近继续开始学习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;
}

改正后的结果如下图:

 

  仅记录自己的学习历程。欢迎大家批评指正。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值