统计成绩
给出n个学生的考试成绩表,每条信息由姓名和分数组成,试设计算法:
(1) 查找最高分和最低分的学生,并列出其姓名与分数
(2) 按分数高低次序,打印出每个学生在考试中获得的名次,分数相同的为同一名次
数据结构的设计
顺序列表有利于数据的添加,删除和查找,而且容易编写代码。
创建链表、排序、输出函数
void create_xu( )
功能:创建学生信息数组,进行排序和输出需要的相关信息。
具体实现:首先创建链表,将学生信息存入该链表中,经过冒泡排序法将无序的学生信息进行按分数降序排序,在输出该数组的第一个和最后一个学生的信息(分数最高、最低),最输出每个学生信息。
源代码
#define m 40//定义m的大小,并且为全局变量
#include<stdio.h>//引用输入输出库
#include<malloc.h>
typedef struct//创建链表
{
char name[15];//定义name[]类型
int score;//定义score类型
}student;//链表简写为student
typedef struct//创建链表
{
student ci[m];//ci类型为student
int n;//n为int类型,主要用来说明学生数量
}shuzu;//链表简写为shuzu
void create_xu( )//创建函数
{
int i,j,k;//定义i,j,k类型
shuzu *p;//创建一个shuzu类型的空链表p
p=(shuzu *)malloc(sizeof(shuzu));//给p存储空间大小
printf("输入学生人数:");//输出
scanf("%d",&p->n);//输入学生人数
k=p->n;//赋值
for(i=0;i<k;i++)//输入学生的相关信息
{
printf("输入第%d个学生的名字:",i+1);
scanf("%s",p->ci[i].name);
printf("输入第%d个学生的分数:",i+1);
scanf("%d",&p->ci[i].score);
}
for(i=0;i<k-1;i++)//将学生的信息按分数利用冒泡进行降序排列
{
for (j=i+1;j<k;j++)
{
if(p->ci[i].score < p->ci[j].score)
{
p->ci[k]=p->ci[i];
p->ci[i]=p->ci[j];
p->ci[j]=p->ci[k];
}
}
}
//输出学生的第一名和最后一名
printf("输出分数最高和最低:\n");
printf("%s %d \n",p->ci[0].name,p->ci[0].score);
printf("%s %d \n",p->ci[k-1].name,p->ci[k-1].score);
//将所有学生信息按降序输出
printf("输出排完序的成绩:\n");
for (i=0;i<k;i++)
{
printf("%s %d \n",p->ci[i].name,p->ci[i].score);
}
}
main()
{
create_xu();//引用创建的函数
}