数据结构
- 格式:doc
- 大小:70.00 KB
- 文档页数:9
7.3学生成绩处理
7.3.1 设计要求与分析
1.设计要求
本设计要求采用顺序存储结构,实现关于学生成绩处理的相关问题,包括:学生信息的录入、查询、修改、排序、确定名次以及信息的输出等。其中学生信息包括:学号、姓名、四门课、总分以及排名,排序方法包括:双向冒泡排序、希尔排序、快速排序、推排序。
2.问题分析
1)数据类型分析:根据设计要求,一个学生的信息可以用一个结构体类型来描述:
typedef struct{
char sno[10];
char name[16];
int score[4];
int iotal;
int mc;
}student; //定义结构体类型
有了该类型之后,全班学生(设为40人)的信息就可以用一个结构数组来存储,结构数组定义如下:
student stud[41]; //为了使下表从1开始处理,多定义了一个元素
2)功能要求分析:根据设计要求,整个数据处理系统包括六大功功能模块。其中学生信息录入模块包括信息输入以及总分的计算;信息查询模块包括按学号和按姓名两种查询方法,都采用顺序查找方式;信息修改模块仅对四门成绩进行修改。一律按学号对应修改,排序功能模块又分为四个子模块;双向冒泡排序、希尔排序、快速排序和推排序;信息输出模块非常快捷,在这里不作进一步的分析,直接在后面给出其具体实验的函数;排名次模块稍微复杂一些、在排序之后排名次已定,但是如果有成绩相同的情况出现,就会有并列名次,所以还需要进行相应的处理、这种处理也很简单;先按排序的次序给出每个学生名次,然后从第二个学生开始。进行并列名次的处理,如果当前处理的学生成绩与前一学生相等。则给当前学生相同的名次,若不等,则不需要修改该名次。
7.3.2算法设计源程序
有了上述的分析之后,不难给出各个模块的算法程序。
1.算法设计源程序
void sr(student stud[],int n)
{ int i;
for (i=1;i<=n;i++)
{
printf("输入学号 姓名(中间不留有空格) \n");
scanf("%s %s,stud[i].sno,stud[i].name");
printf("成绩1,成绩2,成绩3,成绩4\n");
scanf("%d,%d,%d,%d,&stud[i].score[0],&stud[i].score[1],&stud[i].score[2],&stud[i].score[3]");
stud[i].total=stud[i].score[0]+stud[i].score[1]+stud[i].score[2]+stud[i].score[3];
stud[i].mc=1;
}
}
2.信息查询程序 void cx(student stud[],int n)
{ int xz,i; char no[10],nm[16];
printf("1.按学号查询 2.按姓名查询\n");
printf("请输入1.或2.并按回车键:");
scanf("%d",&xz);getchar();
if(xz==1){
printf("请输入学号:");gets(no);
}
else if(xz==2){
printf("输入姓名:");
gets(nm);
}
for(i=1;i<=n;i++)
switch(xz){
case 1:if(strcmp(stud[i].sno,no)==0){
printf("学号 姓名 成绩1 成绩2 成绩3 成绩4 总分\n",
stud[i].sno,stud[i].name,stud[i].score[0],stud[i].score[1],
stud[i].score[2],stud[i].score[3],stud[i].total,stud[i].mc)
return;
}
case 2: if(strcmp(stud[i].name.nm)==0){
printf("%12s,%18s,%6d,%6d,%6d,%6d,%6d,%4d\n",
stud[i].sno,stud[i].name,stud[i].score[0],stud[i].score[1],
stud[i].score[2],stud[i].score[3],stud[i].total,stud[i].mc)
return;
}
}
if(i>n) printf("你要查的学生没有查到:\n");
}
3.信息修改程序
void xg(student stud[],int n)
{ char no[10];
int 1;
printf("请输入要修改的学生学号:");
getchar();
gets(no);
for(i=1;i<=n;i++)
if(strcmp(stud[i].sno,no)==0){
printf("%12s,%18s,%5d,%5d,%5d,%5d,%5d,%4d\n",
stud[i].sno,stud[i].name,stud[i].score[0],stud[i].score[1],
stud[i].score[2],stud[i].score[3],stud[i].total);
printf("输入最新成绩:成绩1,成绩2,成绩3,成绩4\n");
scanf("%d,%d,%d,%d,&stud[i].score[0],&stud[i].score[1],&stud[i].score[2],&stud[i].score[3]"); stud[i].total=stud[i].score[0]+stud[i].score[1]+stud[i].score[2]+stud[i].score[3];
break;
}
if(i>n)
printf("你要查询的学生没查到:\n")
}
4.排名次程序
void qdmc(student stud[],intn)
{int i;
for(i=1;i<=n;i++)
stud[i].mc=i;
for(i=2;i<=n;i++)
if(stud[i].total==stud[i-1].total)
stud[i].mc=stud[i-1].mc;
}
5.信息输出程序
void sc(stduent stud[ ],int n)
{ int i;
printf("学号 姓名 成绩1 成绩2 成绩3 成绩4 总分 名次\n");
for(i=1;i<=n;i++)
printf(:%12s,%18s,%5d,%6d,%6d,%6d,%4d\n",
stud[i].sno,stud[i].name,stud[i].score[0],stud[i].score[i],
stud[i].score[2],stud[i].score[3],stud[i],toat1,stud[i],mc);
6.排序选择程序
void x(student stud[],int n)
{ int xz,i;
int d[5],t;
void DbubbleSort(student stud[],int n),ShellSort(student stud[],int d[],int n,int t);
OuichSort(student stud[],int,int ),HeapSort(student
stud[],int),qdmc(student stud[],int);
//排序函数声明,在后面定义
printf("***排序方法选择***\n");
printf("=============\n");
printf(" 1.双向冒泡排序 \n");
printf(" 2.希尔排序 \n");
printf(" 3.快递排序 \n");
printf(" 4.堆排序 \n");
printf("============\n");
printf(" 请选择 1,2,3,4:");
scanf("%d",&xz);
switch(xz) {
case 1: DbubbleSort(stud,n); break;
case 2: printf("输入增量个数: ");
scanf("%d",&t); printf("输入增量: \n");
for(i=0;i
ShellSort(stud (stud,d,n,t); break;
case 3: QuickSort(stud,1,n); break;
case 4: HeapSort (stud,n); break;
}
qdmc(stud,n);
}
//双向冒泡排序算法
void DbubbleSort(student R[],int n)
{
//R[]..n}是待排序文件,采用自顶向下,
//自底向上交替双向扫描冒泡排序,按顺序
int i,j;
student t;
int NoSwap;
NoSwap=1;
i=1;
while(NoSwap)
{
NoSwap=0;
for(j=n-j+1;j>=i+1;j--)
if(R[j].total>R[j-1].total)
{ //若反序(后面的大于前一个),即交换
t=R[j];
R[j]=R[j-1];
R[j-1]=t;
NoSwap=1;
}
for(j=i+1;j<=n-i+1;j++)
if(R[j].total
{
//若反序(前面的小于后一个),即交换
t=R[j];
R[j]=R[j+1];
R[j+1]=t;
NoSwap;
}
i=i+1;
}
}
//希尔排序算法
void ShellInsert(student R[],int n,int dk)
{