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

这篇具有很好参考价值的文章主要介绍了查找和排序算法的学生成绩分析实验。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、实验内容

  1. 编写程序将自己学号后面的8位同学的学号、姓名以及数学、英语和数据结构的成绩信息保存到学生成绩表中。
学号 姓名 数学 英语 数据结构
189000202 张三 80 75 86
189000203 李四 55 63 72
189000204 王一 88 75 85
189000205 王二 79 96 83
189000206 王三 87 45 77
189000207 王四 66 56 50
189000208 王五 35 55 68
189000209 王六 89 98 96
  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;
	}

四、实验结果

控制台输出:

查找和排序算法的学生成绩分析实验文章来源地址https://www.toymoban.com/news/detail-508141.html

到了这里,关于查找和排序算法的学生成绩分析实验的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据结构实验报告(四)——查找和排序算法

    1. 掌握顺序查找技术和拆半查找技术以及部分排序算法的设计思想; 2. 掌握查找、部分排序算法的实现与执行过程。 查找算法 1.顺序查找: 从数组第一个元素开始逐个比较,找到后返回相应下标。 2.折半查找: 从数组中间开始比较,如果需查找值比中间值大,则在中间值右

    2024年02月07日
    浏览(45)
  • 「SQL面试题库」 No_106 查找成绩处于中游的学生

    「SQL面试题库」是由 不是西红柿 发起,全员免费参与的SQL学习活动。我每天发布1道SQL面试真题,从简单到困难,涵盖所有SQL知识点,我敢保证只要做完这100道题,不仅能轻松搞定面试,代码能力和工作效率也会有明显提升。 1.1 活动流程 整理题目 :西红柿每天无论刮风下雨

    2024年02月11日
    浏览(63)
  • Python学生成绩排序(循环实现)

    题目要求 (成绩数据已给出) 输入学生成绩信息序列,完成对于每个学生成绩数据的储存,并将所有学生储存于列表中;在此基础上,按照总分从高到低的学生名单,总分从低到高的学生名单,三门课成绩从高到低的学生名单   相同成绩都按先录入排列在前的规则处理。

    2024年02月08日
    浏览(42)
  • 合肥工业大学 宣城校区 数据结构与算法实验 队列、二叉树、查找和排序

    1.实验目标 熟练掌握队列的顺序存储结构和链式存储结构。 熟练掌握队列的有关算法设计,并在循环顺序队列和链队列上实现。 根据具体给定的需求,合理设计并实现相关结构和算法。 2.实验内容和要求 循环顺序队列的实验要求 循环顺序队列结构和运算定义,算法的实现以

    2024年02月11日
    浏览(49)
  • 用C语言对学生成绩进行排序(归并排序与基数排序)

    我们内部排序已经学了插入排序(直接插入排序、折半插入排序、希尔排序),交换排序(冒泡排序、快速排序),选择排序(简单选择排序、堆排序),这些都属于内部排序,接下来我们学习内部排序里面剩下的归并排序和基数排序。 归并排序与上述基于交换、选择等排序

    2024年02月16日
    浏览(36)
  • 用C语言进行学生成绩排序(简单选择排序和堆排序)

    选择排序的基本思想是:每一趟(如第i趟)在后面n-i+1 (i=1,2…,n-1) 个待排序元素中选取最小的元素,作为有序子序列的第i个元素,直到第n-1趟做完,待排序元素只剩下1个,就不用再选了。选择排序中的堆排序算法是历年考查的重点。 根据上面选择排序的思想,可以很直观

    2024年02月15日
    浏览(36)
  • 用C语言进行学生成绩排序(简单选择排序和对堆排序)

    选择排序的基本思想是:每一趟(如第i趟)在后面n-i+1 (i=1,2…,n-1) 个待排序元素中选取最小的元素,作为有序子序列的第i个元素,直到第n-1趟做完,待排序元素只剩下1个,就不用再选了。选择排序中的堆排序算法是历年考查的重点。 根据上面选择排序的思想,可以很直观

    2024年02月13日
    浏览(46)
  • 实验八 排序算法的实现与分析

    实验八 排序算法的实现与分析 一.实验目的 1.掌握常用的排序方法,并掌握用高级语言实现排序算法的方法; 2.深刻理解排序的定义和各种排序方法的特点,并能加以灵活应用; 3.了解各种方法的排序过程及其时间复杂度的分析方法。 二、实验内容 统计成绩:给出 n 个学生

    2024年01月21日
    浏览(34)
  • C语言课程设计:学生成绩信息管理系统(排序、平均分、总分)详解

    1、需求分析 利用C语言编写一个可以对学生成绩信息进行管理的系统 0、退出系统 1、录入学生信息和成绩 2、打印学生信息 3、统计学生人数 4、查找学生信息 5、修改学生信息 6、删除学生信息 7、排序学生成绩 8、生成学生信息文件 9、读取文件学生信息 10、输出各科成绩不

    2024年02月11日
    浏览(54)
  • 线性回归模型分析学生成绩

    LinearRegression 是线性回归模型的实现类; train_test_split 用于将数据集分成训练集和测试集; cross_val_score 用于交叉验证; r2_score 用于评估模型在测试集上的预测性能。 计算各个特征之间的相关系数,并打印输出 corr_matrix = df.corr() print(corr_matrix) 使用 corr() 方法计算各个特征之间

    2024年02月06日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包