前言
到目前为止,8个数据结构实验在这里就全部更完啦(撒花)!我那一段难忘的周二晚课时光也告一段落,整体来说,有赶课的折腾,有调错的崩溃,也有故意迟到五分钟的惬意,用GPT生成我想要的东西的爽快......
当然也有折磨的实验总评86分呜呜呜,不过遗憾也都是过去了,接下来我要学的是计网实验、计组实验、数据库实验、密码实验......3G大学我谢谢你,有缘有时间再更。
那就希望我的博客能帮到你吧,不是那种应付式的帮,是能借我的讲解让看客更懂一些,哪怕一些。如果真要找,还不如直接去找那些阅读量1w+的文章,那些大佬讲原理比我清楚。
实验实习过程步骤(注意是主要关键步骤,不是所有步骤,适当文字+截图说明)
排序算法是一个再熟悉不过的领域,选择排序、冒泡排序、插入排序、快速排序、桶排序等等。大一C语言第八章就讲过选择排序,尤其是对于这种成绩排序的题目,我实在不想手搓快速排序,太杀鸡用牛刀了,为了避免老师怀疑我在水题解,咳咳先放一张图,我真的只是懒,不是不会写哈哈哈。
![](https://i-blog.csdnimg.cn/direct/7095184bf2ef48218a8b3add22eabafb.png)
选择排序的算法如下,实际上就是找谁后面的数字谁比当前的数字更大,然后往前放。复杂度为O(n^2)。代码给大一小朋友都会写,但是实际上我出了很多问题。
图来源:【排序算法】快速排序(C语言)_c语言快速排序-CSDN博客
![](https://i-blog.csdnimg.cn/direct/56238c42ea7e456993c0005bede808cc.png)
主要是很多细节问题,零碎的细节不讲了,讲两个重要的细节:
第一个细节是我想用len全局变量一把梭,当成n这样一个位置,这个没问题,但是咱们题目是while循环直到输入0 0截止,所以n是需要自己算的。我一开始是len--,但实际上要是len-=2,问题出在len最后指的地方是在0 0后面,但是我要找到0 0前面的位置,那差值应该是2。
第二个细节是我写了个p[i].score<p[j].score,i是定点,我们要找的是后面的最大点,所以需要不断迭代更新最大值点位,否则这样排序还是乱序,再一个如果是ij比较,那你设置k是来干嘛的。
只能说学海无涯,需要时时温故而知新,真别觉得自己多厉害,不去写别的排序方法是会忘记的,这个排序我都纠错纠正了很久。
其实排序完这题真正的关键点还没说完,就是这个成绩排名到底怎么去记录,因为有同分的。我的思路是dp,可能我对dp理解还不够深入,我的意思就是一条线走到底不需要回头。复杂度就是0(n)。怎么做呢,初始化num是排名,让后面的数跟前面的数比较,如果不等,那么num++,然后把每个num都赋值到对应的人上面。(我觉等更难的是1 2 2 4 4 4 7这种,还更难改,而这个才是我们考试真正采用的排名方法。)
至此,这题就做完啦!排序你怎么这么博大精深,真的折腾。
实验实习结果及分析
符合题意,而且也符合大多数排名情况。
![](https://i-blog.csdnimg.cn/direct/05a7724f5a3c407a9066aa4d56b39050.png)
实验遇到的问题及解决办法,实验心得体会及对此实验的意见或建议(有就写,无可不写)
如上,学海无涯,需要时时温故而知新,真别觉得自己多厉害,不去写别的排序方法是会忘记的,这个排序我都纠错纠正了很久。排序你怎么这么博大精深,真的折腾。
搬运工有话说
我在这里防抄袭设置的两个错误,就是我上面说的对应的两个点,自己找吧。
Code:
cpp
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct student{ //学生信息定义
char name[8]; //学生姓名
double score; //学生成绩
}STUDENT;
STUDENT p[20];
int rank[20];
int len=1;
void input();
void Mysort();
void ranking();
void output();
int main()
{
input();
Mysort();
ranking();
output();
return 0;
}
void input()
{
do
{
scanf("%s %lf",p[len].name,&p[len].score);
getchar();
len++;
}while(p[len-1].score!=0);
len-=1;//0 0在假想len的上一层,而输入0 0,len还往上走了一层,因此减2
}
void Mysort()
{
int i,j,k;
double t;
char temp[10];
for(i=1;i<=len-1;i++){
k=i;
for(j=i+1;j<=len;j++){
if(p[i].score<p[j].score)//
{
k=j;
}
}
if(k!=i){
t=p[k].score;
p[k].score=p[i].score;
p[i].score=t;
strcpy(temp,p[k].name);
strcpy(p[k].name,p[i].name);
strcpy(p[i].name,temp);
}
}
return ;
}
void ranking()
{
int num=1;
rank[1]=num;
for(int i=2;i<=len;i++){
if(p[i].score!=p[i-1].score){
num++;//名次
}
rank[i]=num;
}
}
void output()
{
for(int i=1;i<=len;i++) {
printf("%d %s %.2lf\n",rank[i],p[i].name,p[i].score);
}
}
测试点:
张三 80.00
李四 96.00
王五 90.00
郑六 78.00
田七 85.00
李明 90.00
0 0
完结 完结 完结 ✿✿ヽ(°▽°)ノ✿撒花 撒花 撒花✿✿ヽ(°▽°)ノ✿
感谢愿意看到底的你们!