一、实验内容
- 编写程序将自己学号后面的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 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
文章来源地址https://www.toymoban.com/news/detail-508141.html
到了这里,关于查找和排序算法的学生成绩分析实验的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!