查找和排序算法的学生成绩分析实验

基于查找和排序算法的学生成绩分析实验

一、实验内容

  1. 编写程序将自己学号后面的8位同学的学号、姓名以及数学、英语和数据结构的成绩信息保存到学生成绩表中。
学号姓名数学英语数据结构
189000202张三807586
189000203李四556372
189000204王一887585
189000205王二799683
189000206王三874577
189000207王四665650
189000208王五355568
189000209王六899896
  1. 用顺序表插入算法,将自己的学号信息插入到表的第一个位置;再应用删除算法删除现在表中第五位同学的信息,然后输出表里面所有数据信息。

  2. 用顺序查找算法,查找自己的学号在表中是否存在,如果存在请输出学姓名以及各科成绩信息。

  3. 用直接插入排序算法,对学生成绩表里面信息,按照数学成绩升序排序,并显示输出排序结果。然后用二分查找,查找数学成绩为 80的同学是否存在,如果存在,请输出该学生的学号和姓名。(拓展:用二分插入排序、希尔排序完成该步骤(选做))

  4. 用冒泡排序算法,对学生成绩表里面信息,按照英语成绩升序排序,并显示输出排序结果。然后用二分查找,查找英语成绩为90的同学是否存在,如果存在,请输出该学生的学号和姓名。(拓展:用快速排序完成该步骤(选做))

  5. 用简单选择排序算法,对学生成绩表里面信息,按照数据结构成绩升序排序,并显示输出排序结果。然后用二分查找,查找数据结构成绩为 50 的同学是否存在,如果存在,请输出该学生的学号和姓名。(拓展:用堆排序排序完成该步骤(选做))

  6. 分别统计数学、英语、数据结构三门课程的最低分、最高分以及平均分并输出结果。

二、实验原理

  1. 顺序表插入操作的算法思想
    在顺序表第i个位置插入一条数据:
    (1) 检查i的合法性;
    (2) 检查线性表是否为满,若是,则动态分配存储;
    (3) 从第i个插入位置起,将该位置元素以及其后所有位置上的元素均后移一个位置;
    (4) 把新元素写入到空出的位置上;
    (5) 线性表的长度加1。
  2. 顺序表删除操作的算法思想
    删除顺序表第i个位置的数据:
    (1) 检查i的合法性;
    (2) 删除第i个位置的元素,使后面第i+1至第n个元素(共n-i个)依次前移一个位置;
    (3) 线性表的长度减1。
  3. 线性表顺序查找的算法思想
    (1) 从表的一端开始,顺序扫描线性表,依次将扫描到的结点关键字和给定值K相比较;
    (2) 若找到,则查找成功,返回该记录的信息或该记录在表中的位置;
    (3) 否则查找失败,返回相关指示信息。
  4. 线性表二分查找的算法思想
    (1) 令low为有序表的第一个元素下标,high为有序表最后一个元素下标;
    (2) mid=(low+high)/2,mid需向下取整作为查找范围的中间元素的下标;
    (3) 将待查值和有序表的mid下标元素比较,如果两者相等,则返回mid的值查找到此步停止:如果不相等则进行如下步骤;
    (4) 如果小于mid元素,则待查值处在表的前一半范围内,修改high=mid-1,从而缩小查找范围,如果大于mid元素,待查值处于表的后一半范围内,修改 low= mid +1;
    (5) 若low <high, 重复(2)到(5);若low>high,则查找失败。
  5. 直接插入排序算法思想
    (1) 假设待排序的记录存放在数组r[1…n]中,任何一个待排序的记录序列初始状态可以看成是这种情况:初始时,r[1]自成1个有序区,无序区为r[2…n];
    (2) 然后从第2个记录开始,逐个进行插入,直至整个序列有序。
  6. 冒泡排序算法算法思想
    (1) 第1个与第2个比较,大则交换:第2个与第3个比较,大则交换,…关键字最大的记录交换到最后一个位置上;
    (2) 对前n-1个记录进行同样的操作,关键字次大的记录交换到第n-1个位置上;
    (3) 依次类推,则完成排序。
  7. 简单选择排序算法思想
    (1) 首先通过 n-1次关键字比较,从 n个记录中找出关键字最小的记录,将它与第一个记录交换;
    (2) 再通过n-2次比较,从剩余的n-1个记录中找出关键字次小的记录将它与第二个记录交换;
    (3) 重复上述操作,共进行 n-1趟排序后,排序结束。

三、实验代码记录

	#include <stdio.h>
	#include <stdlib.h>
	#define MAXNUM 10
	 
	typedef struct Student{
		int sNo;
		char *name;
		int mathScore;
		int englishScore;
		int datastructScore;
	}Stu;
	
	Stu *scoreList = NULL;
	int length;
	void seqInsert(Stu *list, int pos, Stu s);
	
	//初始化成绩表 
	void initSeqlist(){
		scoreList = (Stu*)malloc(sizeof(Stu) * MAXNUM);
		length = 0;
		printf("初始化成绩表.......\n\n");
		Stu stu1;
		stu1.sNo = 189000202;
		stu1.name = "张三";
		stu1.mathScore = 88;
		stu1.englishScore = 90;
		stu1.datastructScore = 84;
		seqInsert(scoreList, 1, stu1);
		Stu stu2;
		stu2.sNo = 189000203;
		stu2.name = "李四";
		stu2.mathScore = 90;
		stu2.englishScore = 86;
		stu2.datastructScore = 85;
		seqInsert(scoreList, 2, stu2);
		Stu stu3;
		stu3.sNo = 189000203;
		stu3.name = "王一";
		stu3.mathScore = 80;
		stu3.englishScore = 76;
		stu3.datastructScore = 81;
		seqInsert(scoreList, 3, stu3);
		Stu stu4;
		stu4.sNo = 189000204;
		stu4.name = "王二";
		stu4.mathScore = 82;
		stu4.englishScore = 88;
		stu4.datastructScore = 76;
		seqInsert(scoreList, 4, stu4);
		Stu stu5;
		stu5.sNo = 189000205;
		stu5.name = "王三";
		stu5.mathScore = 81;
		stu5.englishScore = 86;
		stu5.datastructScore = 78;
		seqInsert(scoreList, 5, stu5);
		Stu stu6;
		stu6.sNo = 189000206;
		stu6.name = "王四";
		stu6.mathScore = 84;
		stu6.englishScore = 79;
		stu6.datastructScore = 76;
		seqInsert(scoreList, 6, stu6);
		Stu stu7;
		stu7.sNo = 189000207;
		stu7.name = "王五";
		stu7.mathScore = 92;
		stu7.englishScore = 80;
		stu7.datastructScore = 80;
		seqInsert(scoreList, 7, stu7);
		Stu stu8;
		stu8.sNo = 189000208;
		stu8.name = "王六";
		stu8.mathScore = 88;
		stu8.englishScore = 83;
		stu8.datastructScore = 84;
		seqInsert(scoreList, 8, stu8);
	}
	
	//顺序表插入算法 
	void seqInsert(Stu *list, int pos, Stu s){
		if(pos < 1 || pos > MAXNUM - 1 || length > MAXNUM -2){
			printf("成绩信息插入失败!\n");
			printf("---------------------------------------------------------------------------------------------------------\n"); 
		}
		else{
			int i = 0;
			for(i = length + 1; i >= pos; i--){
				list[i+1] = list[i];
			}
			list[pos] = s;
			length++;
			printf("学号为%d的成绩信息插入到成绩列表中的第%d个位置成功。\n", s.sNo, pos);
			printf("---------------------------------------------------------------------------------------------------------\n");  
		}
	}
	
	//删除算法 
	void seqDelete(Stu *list, int pos){
		if(pos < 1 || pos > length){
			printf("成绩信息删除失败!\n"); 
			printf("---------------------------------------------------------------------------------------------------------\n"); 
		}
		else{
			int i = 0;
			for(i = pos; i < length; i++){
				list[i] = list[i+1];
			}
			length--;
			printf("删除成绩列表中第%d条成绩信息成功。\n",pos);
			printf("---------------------------------------------------------------------------------------------------------\n"); 
		}
	}
	
	//顺序查找算法 
	void seqSearch(Stu *list, int sNo){
		int i = 0, j = 0;
		for(i = 1; i <= length; i++){
			if(list[i].sNo == sNo){
				printf("查找学号为%d的学生的成绩信息在表中存在,其成绩信息为:%d\t%s\t%d\t%d\t%d\n", sNo, scoreList[i].sNo, scoreList[i].name, scoreList[i].mathScore, scoreList[i].englishScore, scoreList[i].datastructScore);
				printf("---------------------------------------------------------------------------------------------------------\n");  
				break;
			}
			if((i == length) && (list[i].sNo != sNo)){
				j = 1;
			}
		}
		if(j == 1){
			printf("成绩列表中无学号为%d的成绩信息!\n",sNo);
			printf("---------------------------------------------------------------------------------------------------------\n"); 
		}
	}
	
	//打印当前表中所有学生的成绩信息 
	void printList(){
		int i = 1;
		for(i = 1; i <= length; i++){
			printf("成绩信息列表的第%d条成绩信息是:%d\t%s\t%d\t%d\t%d\n",i , scoreList[i].sNo, scoreList[i].name, scoreList[i].mathScore, scoreList[i].englishScore, scoreList[i].datastructScore);
		}
		printf("---------------------------------------------------------------------------------------------------------\n");  
	}
	
	//直接插入排序算法
	void directInsertSort(Stu *list){
		int i = 0, j = 0;
		for(i = 2; i <= length; i++){
			if(list[i].mathScore <= list[i-1].mathScore){
				list[0] = list[i];
				for(j = i-1; (j > 0)&&(list[j].mathScore >= list[0].mathScore); j--){
					list[j+1] = list[j];
				}
				list[j+1] = list[0];
			}
		}
	}
	
	//冒泡排序算法
	void bubbleSort(Stu *list){
		int i = 0, j = 0;
		for(i = 1; i < length; i++){
			for(j = 1; j < length - i + 1; j++){
				if(list[j].englishScore  > list[j+1].englishScore){
					list[0] = list[j];
					list[j] = list[j+1];
					list[j+1] = list[0];
				}
			}
		}
	} 
	
	//直接选择排序算法 
	void directSelectionSort(Stu *list){
		int i = 0, j = 0, k = 0;
		for(i = 1; i < length; i++){
			k = i;
			for(j = i; j <= length; j++){
				if(list[j].datastructScore < list[k].datastructScore){
					k = j;
				}
			}
			if(k != i){
				list[0] = list[i];
				list[i] = list[k];
				list[k] = list[0];
			}
		}	
	} 
	
	//二分查找算法 
	void binarySearch_math(Stu *list, int maScore){
		int low = 1, high = length;
		while(high >= low){
			int mid = (low + high) / 2;
			if(list[mid].mathScore > maScore){
				high = mid - 1;
			}
			else if(list[mid].mathScore < maScore){
				low = mid + 1;
			}
			else{
				printf("成绩表中数学成绩为%d的学生存在,其成绩信息为:%d\t%s\t%d\t%d\t%d\n", maScore, scoreList[mid].sNo, scoreList[mid].name, scoreList[mid].mathScore, scoreList[mid].englishScore, scoreList[mid].datastructScore);
				printf("---------------------------------------------------------------------------------------------------------\n");  
				break;
			}
		}
		if(high < low){
			printf("成绩表中无数学成绩为%d的学生!\n",maScore);
			printf("---------------------------------------------------------------------------------------------------------\n"); 
		}
	}
	
	void binarySearch_english(Stu *list, int engScore){
		int low = 1, high = length;
		while(high >= low){
			int mid = (low + high) / 2;
			if(list[mid].englishScore > engScore){
				high = mid - 1;
			}
			else if(list[mid].englishScore < engScore){
				low = mid + 1;
			}
			else{
				printf("成绩表中英语成绩为%d的学生存在,其成绩信息为:%d\t%s\t%d\t%d\t%d\n", engScore, scoreList[mid].sNo, scoreList[mid].name, scoreList[mid].mathScore, scoreList[mid].englishScore, scoreList[mid].datastructScore);
				printf("---------------------------------------------------------------------------------------------------------\n"); 
				break;
			}
		}
		if(high < low){
			printf("成绩表中无英语成绩为%d的学生!\n",engScore);
			printf("---------------------------------------------------------------------------------------------------------\n");  
		}
	}
	
	void binarySearch_datastruct(Stu *list, int dsScore){
		int low = 1, high = length;
		while(high >= low){
			int mid = (low + high) / 2;
			if(list[mid].datastructScore > dsScore){
				high = mid - 1;
			}
			else if(list[mid].datastructScore < dsScore){
				low = mid + 1;
			}
			else{
				printf("成绩表中数据结构成绩为%d的学生存在,其成绩信息为:%d\t%s\t%d\t%d\t%d\n", dsScore, scoreList[mid].sNo, scoreList[mid].name, scoreList[mid].mathScore, scoreList[mid].englishScore, scoreList[mid].datastructScore);
				printf("---------------------------------------------------------------------------------------------------------\n");  
				break;
			}
		}
		if(high < low){
			printf("成绩表中无数据结构成绩为%d的学生!\n",dsScore);
			printf("---------------------------------------------------------------------------------------------------------\n");  
		}
	}
	
	//统计分数
	void statisticScore(Stu *list){
		int i, min = 1, max = 1;
		float sum,avg = 0;
		for(i = 1; i <= length; i++){
			if(list[i].mathScore < list[min].mathScore){
				min = i;
			}
		}
		printf("成绩表中数学成绩最低分为:%d,",list[min].mathScore);
		min = 1;
		for(i = 1; i <= length; i++){
			if(list[i].englishScore < list[min].englishScore){
				min = i;
			}
		}
		printf("成绩表中英语成绩最低分为:%d,",list[min].englishScore);
		min = 1;
		for(i = 1; i <= length; i++){
			if(list[i].datastructScore < list[min].datastructScore){
				min = i;
			}
		}
		printf("成绩表中数据结构成绩最低分为:%d。\n",list[min].datastructScore);
		printf("---------------------------------------------------------------------------------------------------------\n"); 
		for(i = 1; i <= length; i++){
			if(list[i].mathScore < list[max].mathScore){
				max = i;
			}
		}
		printf("成绩表中数学成绩最高分为:%d,",list[max].mathScore);
		max = 1;
		for(i = 1; i <= length; i++){
			if(list[i].englishScore > list[max].englishScore){
				max = i;
			}
		}
		printf("成绩表中英语成绩最高分为:%d,",list[max].englishScore);
		max = 1;
		for(i = 1; i <= length; i++){
			if(list[i].datastructScore > list[max].datastructScore){
				max = i;
			}
		}
		printf("成绩表中数据结构成绩最高分为:%d。\n",list[max].datastructScore);
		printf("---------------------------------------------------------------------------------------------------------\n");  
		for(i = 1; i <= length; i++){
			sum += list[i].mathScore;
		}
		avg = sum /= length;
		printf("成绩表中数学成绩的平均分为:%.2f,", avg);
		sum = 0, avg = 0;
		for(i = 1; i <= length; i++){
			sum += list[i].englishScore;
		}
		avg = sum /= length;
		printf("成绩表中英语成绩的平均分为:%.2f,", avg);
		sum = 0, avg = 0;
		for(i = 1; i <= length; i++){
			sum += list[i].datastructScore;
		}
		avg = sum /= length;
		printf("成绩表中数据结构成绩的平均分为:%.2f。\n", avg);
		printf("---------------------------------------------------------------------------------------------------------\n"); 
	} 
	
	int main(int argc, char *argv[]) {
		//1、保存自己学号后八位同学的成绩信息到成绩表中 
		initSeqlist();
		//打印初始成绩信息表的中的每一条信息 
		printList(); 
		//2、用顺序表插入算法,将自己的学号信息插入到表的第一个位置 
		Stu stu9;
		stu9.sNo = 189000201;
		stu9.name = "李小明";
		stu9.mathScore = 100;
		stu9.englishScore = 100;
		stu9.datastructScore = 50; 
		seqInsert(scoreList, 1, stu9);
		//应用删除算法删除表中的第五位同学的信息 
		seqDelete(scoreList, 5); 
		printList();
		//3、用顺序查找算法,查找自己的学号在表中是否存在
		seqSearch(scoreList, 209000647);
		//4、用直接插入算法,对成绩表中的信息按数学成绩升序排序 
		directInsertSort(scoreList);
		printList();//输出结果
		//二分查找,查找数学成绩为90的同学是否存在 
		binarySearch_math(scoreList, 80);
		//5、用冒泡排序算法,对成绩表中的信息按英语成绩升序排序
		bubbleSort(scoreList);
		printList();//输出结果 
		//二分查找,查找英语成绩为90的同学是否存在 
		binarySearch_english(scoreList, 90);
		//6、用直接选择排序算法,对成绩表中的信息按数据结构成绩升序排序
		directSelectionSort(scoreList);
		printList();//输出结果
		//二分查找,查找数据结构成绩为50的同学是否存在
		binarySearch_datastruct(scoreList, 50);
		//7、分别统计数学、英语、数据结构三门课程的最低分、最高分以及平均分,并输出结果 
		statisticScore(scoreList);
		return 0;
	}

四、实验结果

控制台输出:

在这里插入图片描述

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sirius小鑫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值