查找和排序算法的学生成绩分析实验
基于查找和排序算法的学生成绩分析实验
- 一、实验内容
- 二、实验原理
- 三、实验代码记录
- 四、实验结果
一、实验内容
- 编写程序将自己学号后面的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 |
用顺序表插入算法,将自己的学号信息插入到表的第一个位置;再应用删除算法删除现在表中第五位同学的信息,然后输出表里面所有数据信息。
用顺序查找算法,查找自己的学号在表中是否存在,如果存在请输出学姓名以及各科成绩信息。
用直接插入排序算法,对学生成绩表里面信息,按照数学成绩升序排序,并显示输出排序结果。然后用二分查找,查找数学成绩为 80的同学是否存在,如果存在,请输出该学生的学号和姓名。(拓展:用二分插入排序、希尔排序完成该步骤(选做))
用冒泡排序算法,对学生成绩表里面信息,按照英语成绩升序排序,并显示输出排序结果。然后用二分查找,查找英语成绩为90的同学是否存在,如果存在,请输出该学生的学号和姓名。(拓展:用快速排序完成该步骤(选做))
用简单选择排序算法,对学生成绩表里面信息,按照数据结构成绩升序排序,并显示输出排序结果。然后用二分查找,查找数据结构成绩为 50 的同学是否存在,如果存在,请输出该学生的学号和姓名。(拓展:用堆排序排序完成该步骤(选做))
分别统计数学、英语、数据结构三门课程的最低分、最高分以及平均分并输出结果。
二、实验原理
- 顺序表插入操作的算法思想
在顺序表第i个位置插入一条数据:
(1) 检查i的合法性;
(2) 检查线性表是否为满,若是,则动态分配存储;
(3) 从第i个插入位置起,将该位置元素以及其后所有位置上的元素均后移一个位置;
(4) 把新元素写入到空出的位置上;
(5) 线性表的长度加1。 - 顺序表删除操作的算法思想
删除顺序表第i个位置的数据:
(1) 检查i的合法性;
(2) 删除第i个位置的元素,使后面第i+1至第n个元素(共n-i个)依次前移一个位置;
(3) 线性表的长度减1。 - 线性表顺序查找的算法思想
(1) 从表的一端开始,顺序扫描线性表,依次将扫描到的结点关键字和给定值K相比较;
(2) 若找到,则查找成功,返回该记录的信息或该记录在表中的位置;
(3) 否则查找失败,返回相关指示信息。 - 线性表二分查找的算法思想
(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,则查找失败。 - 直接插入排序算法思想
(1) 假设待排序的记录存放在数组r[1…n]中,任何一个待排序的记录序列初始状态可以看成是这种情况:初始时,r[1]自成1个有序区,无序区为r[2…n];
(2) 然后从第2个记录开始,逐个进行插入,直至整个序列有序。 - 冒泡排序算法算法思想
(1) 第1个与第2个比较,大则交换:第2个与第3个比较,大则交换,…关键字最大的记录交换到最后一个位置上;
(2) 对前n-1个记录进行同样的操作,关键字次大的记录交换到第n-1个位置上;
(3) 依次类推,则完成排序。 - 简单选择排序算法思想
(1) 首先通过 n-1次关键字比较,从 n个记录中找出关键字最小的记录,将它与第一个记录交换;
(2) 再通过n-2次比较,从剩余的n-1个记录中找出关键字次小的记录将它与第二个记录交换;
(3) 重复上述操作,共进行 n-1趟排序后,排序结束。
三、实验代码记录
#include <stdio.h>#include <stdlib.h>#define MAXNUM 10typedef 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;}
四、实验结果
控制台输出:
查找和排序算法的学生成绩分析实验相关推荐
- C语言实现基于查找和排序算法的学生成绩分析
1.编写程序将自己学号后面的8位同学的学号.姓名以及数学.英语和数据结构的成绩信息保存到学生成绩表中.如果学号后面没有8位同学,就用学号在班级最前面的学生依次补齐,例如学号为189000248号张二同 ...
- 成绩分析系统c语言实验报告,学生成绩管理系统实验报告
<学生成绩管理系统实验报告>由会员分享,可在线阅读,更多相关<学生成绩管理系统实验报告(13页珍藏版)>请在人人文库网上搜索. 1.学生成绩管理系统实验报告实验名称:学生成绩管 ...
- 成绩分析系统c语言,学生成绩分析及排名系统C语言程序设计课程设计实习报告...
学生成绩分析及排名系统C语言程序设计课程设计实习报告 长江大学计算机上机实习报告题目学生成绩分析及排名系统姓名学院__专业班级学号指导教师20120222目录一设计目的1二课程设计摘要2三课程设计的任 ...
- 实验四 查找和排序算法实现
广州大学学生实验报告 开课实验室:计算机科学与工程实验(电子楼418A) 学院 计算机科学与网络工程学院 实验课程 数据结构实验 实验项目 实验四 查找和排序算法实现 一.实验目的: 1.各种排序算法 ...
- 【数据结构基础应用】【查找和排序算法】
代码参考<妙趣横生的算法.C语言实现> 文章目录 前言 1.顺序查找 2.折半查找 3.直接插入排序 4.选择排序 5.冒泡排序 6.希尔排序 7.快速排序 8.堆排序 9.排序算法性能比 ...
- 用C语言学生成绩数据库排序功能设计,[c语言学生成绩管理系统]C语言学生成绩管理系统实验报告...
篇一 : C语言学生成绩管理系统实验报告 实 验 四:结构体(6学时) 实验目的: 1.更加灵活的使用数组作为函数参数: 2.初步掌握开发一个小型实用系统的基本方法: 3.初步掌握书写程序设计开发文档 ...
- 3+1+2模式excel学生成绩分析模板探讨
一.引言 设计的学生成绩分析模板的初衷是不动用VBA编写excel文件,增加文件可读性,迁移性,执行性.同时,设计全科分析模式,使其有成绩者均可以依据不同的模式从而能进行成绩分析 二.设计的小样 基本 ...
- 用access做考场桌贴_利用Word、Excel、Access进行考务安排及学生成绩分析的有效途径-教育文档...
利用 Word . Excel . Access 进行考务安排及学生成绩 分析的有效途径 一 问题的提出 在新课改教学评价过程中,学生考试评价扮演着重要的角 色. 考试安排的科学性和有效性是评价的基础 ...
- python数据分析学生成绩查询系统_python数据分析-学生成绩分析
python数据分析-学生成绩分析 python数据分析-学生成绩分析 目标:分析学生成绩的影响因素 1.导入原始数据,以及需要用到的库 import pandas as pd import nump ...
最新文章
- 免费的私人代码托管(bitbucket) 和 常用git指令
- [MySQL 5.1 体验]MySQL 复制
- 调用webservice时提示对操作的回复消息正文进行反序列化时出错
- RedisTemplate操作hash数据类型示例
- ICLR 2020:从去噪自编码器到生成模型
- OpenGL渲染纹理和平面反射
- 计算机基础知识表格加密管理,【事业单位考试】计算机网络知识:数据加密技术之密钥管理...
- 如何使用mysql添加更新_Mysql 存在既更新,不存在就添加(sql语句)
- 带你了解Python炫酷的颜色输出与进度条打印
- 如何在工作中更好的学习
- canvas一些属性
- 欧空局2018机器学习系列课程发布:从概念到实践(视频+PPT)
- modelsim调用产生随机数及创建虚拟类
- 数字图像处理(五) 图像复原
- win11toast:python桌面通知工具
- elas源码赏析(二)sobel算子3*3行列分解快速卷积
- 如何利用物联网关实现智慧路灯杆组网通信
- HDU5442 Favorite Donut(KMP+最大表示法)
- W74 - 999、云计算工程师认证
- pytorch训练时前一次迭代的loss正常后一次迭代却报nan
热门文章
- 太原理工大学学生校园邮箱登陆方法
- 张家港python培训_张的英文_张翻译_张英语怎么说_海词词典
- IBM 3650 M3阵列在bios中的WebBios的设置
- 工字型钢弹性截面模量计算公式_截面模量的计算公式是什么?
- linux local socket,关于Local socket
- Android之NDK开发初体验
- MySQL全版本安装步骤
- Java实现微信小程序发送服务通知
- XTU OJ 1279 Dual Prime
- [ 云计算 华为云 ] 华为云开天 aPaaS:构建高效的企业数字化平台(下)