数据结构

  • 格式: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)

{