题目六:学生成绩处理系统
设计要求:本设计要求采用顺序存储结构,实现关于学生成
绩处理的相关问题,包括:学生信息的录入、查询、修改、
排序、确定名次以及信息的输出。其中学生信息包括:学号、
姓名、四门课、总分以及排名;排序方法包括:双向冒泡排
序、希尔排序、快速排序、堆排序等方法。

菜单内容:
1、 学生信息录入
2、 学生信息查询
3、 学生信息修改
4、 学生成绩排序
5、 学生成绩输出
6、 结束程序

科目一使用希尔排序

科目二使用快速排序

科目三使用堆排序

科目四使用冒泡排序

总成绩使用双向冒泡排序

 

 

希尔排序:

void sort_1(Sqlist &L){//希尔排序
    printf("以下按照科目一成绩希尔排序:\n");
    int dlta[3]={L.length/2,L.length/4,1};
int t=3,i;
for(i=0;i<t;i++){
    ShellInsert(L,dlta[i]);
}
}
void ShellInsert(Sqlist &L,int dk){
int i;

for(i=0;i+dk<L.length;i++){
    if(L.student[i].cj1<L.student[i+dk].cj1){
        stu temp=L.student[i];
        L.student[i]=L.student[i+dk];
        L.student[i+dk]=temp;
    }
}
}

快速排序:

void sort_2(Sqlist &L){//快速排序
     printf("以下按照科目二成绩快速排序:\n");
quick_sort(L,0,L.length-1);
}
void quick_sort(Sqlist &L,int left,int right){
int i=left,j=right;
if(left>right)
    return;
stu temp=L.student[left];
while(i!=j){
    while(L.student[j].cj2<=temp.cj2&&i<j) j--;
    while(L.student[i].cj2>=temp.cj2&&i<j) i++;
    if(i<j){
        stu t=L.student[i];
        L.student[i]=L.student[j];
        L.student[j]=t;
    }
}
L.student[left]=L.student[i];
L.student[i]=temp;
quick_sort(L,left,i-1);
quick_sort(L,i+1,right);
}

堆排序:

void sort_3(Sqlist &L){//堆排序
     printf("以下按照科目三成绩堆排序:\n");
heap_sort(L,L.length);
}
void heap_sort(Sqlist &L,int n){
    int i;
    BuildHeap(L,n);
    for(i=n;i>=1;i--)
    {
        stu temp=L.student[0];
        L.student[0]=L.student[i-1];
        L.student[i-1]=temp;
        HeapAdjust(L,1,i-1);
    }

}
void BuildHeap(Sqlist &L,int n){
    int i;
    for(i=(n)/2;i>=1;i--)
    {
        HeapAdjust(L,i,n);
    }
}
void HeapAdjust(Sqlist &L,int i,int n) { //调整堆
    int lchild=2*i;       //i的左孩子节点序号
    int rchild=2*i+1;     //i的右孩子节点序号
    int maxi=i;            //临时变量
    if(i<=n/2)          //如果i不是叶节点就不用进行调整
    {
        if(lchild<=n&&L.student[lchild-1].cj3<L.student[maxi-1].cj3)
        {
            maxi=lchild;
        }
        if(rchild<=n&&L.student[rchild-1].cj3<L.student[maxi-1].cj3)
        {
            maxi=rchild;
        }
        if(maxi!=i)
        {

            stu temp=L.student[i-1];
            L.student[i-1]=L.student[maxi-1];
            L.student[maxi-1]=temp;
            HeapAdjust(L,maxi,n);
        }
    }

冒泡排序:

void sort_4(Sqlist &L){//冒泡排序
     printf("以下按照科目四成绩冒泡排序:\n");
   int i,j;
   for(i=0;i<L.length;i++){
    for(j=i;j<L.length;j++){
        if(L.student[i].cj4<L.student[j].cj4){
            stu temp=L.student[i];
            L.student[i]=L.student[j];
            L.student[j]=temp;
        }
    }
   }

}

双向冒泡排序:

void sort_all(Sqlist &L){//双向冒泡
     printf("以下按照总成绩双向冒泡排序:\n");
    int left = 0,right = L.length-1,l,r,j;
    stu temp;
    while(left<right){
        l=left+1;
        r=right-1;
         for(j = left; j < right; j++)
        {
            if(L.student[j].sum < L.student[j + 1].sum)
            {
               temp= L.student[j];
                L.student[j] = L.student[j + 1];
                L.student[j + 1] = temp;
                r = j;
            }
        }
        right = r;

        for(j = right; j > left; j--)
        {
            if(L.student[j].sum > L.student[j - 1].sum)
            {
               temp = L.student[j];
                L.student[j] = L.student[j - 1];
                L.student[j - 1] = temp;
                l = j;
            }
        }
        left = l;

    }
}

 

 

 

其他的操作见完整代码:

#include <stdio.h>
#include <windows.h>
#define MAXSIZE 100
#define LIST_INIT_SIZE 100
#define INCRE 10
//using namespace std;
typedef struct stu{
    int num;
    char name[10];
    int cj1;
    int cj2;
    int cj3;
    int cj4;
    int sum;
}Stu;
typedef struct {
Stu *student;
int listsize;
int length;
}Sqlist;
void initlist(Sqlist &L){
L.student=(Stu *)malloc(LIST_INIT_SIZE*sizeof(Stu));
if(!L.student)
    exit(-1);
L.length=0;
L.listsize=LIST_INIT_SIZE;
}
void sq_insert(Sqlist &L){
scanf("%d%s%d%d%d%d",&L.student[L.length].num,L.student[L.length].name,&L.student[L.length].cj1,&L.student[L.length].cj2,&L.student[L.length].cj3,&L.student[L.length].cj4);
L.student[L.length].sum=L.student[L.length].cj1+L.student[L.length].cj2+L.student[L.length].cj3+L.student[L.length].cj4;
L.length++;
}
int found(Sqlist L){
printf("请选择查询方式:  0.学号 1.姓名 \n");
int input;
scanf("%d",&input);
if(input==0){
    printf("请输入要查询的学号:\n");
    int find_num,i;
    scanf("%d",&find_num);
    for(i=0;i<L.length;i++){
        if(L.student[i].num==find_num)
            return i;
    }
    printf("cannot found.\n");
    return -1;
}
else if(input==1){
    printf("请输入要查询的姓名:\n");
    char find_name[20];
    int i;
    scanf("%s",find_name);
    for(i=0;i<L.length;i++){
        if(strcmp(L.student[i].name,find_name)==0)
            return i;
    }
    printf("cannot found.\n");
    return -1;
}
}
void sq_find(Sqlist L){
int i=found(L);
if(i>=0){
    printf("%d: %d   %s   %d  %d  %d  %d   sum=%d\n",i+1,L.student[i].num,L.student[i].name,L.student[i].cj1,L.student[i].cj2,L.student[i].cj3,L.student[i].cj4,L.student[i].sum);
}
}
void sq_modify(Sqlist L){
int i=found(L);

if(i>=0){
       printf("请输入新的全部信息:\n");
        scanf("%d%s%d%d%d%d",&L.student[i].num,L.student[i].name,&L.student[i].cj1,&L.student[i].cj2,&L.student[i].cj3,&L.student[i].cj4);
L.student[i].sum=L.student[i].cj1+L.student[i].cj2+L.student[i].cj3+L.student[i].cj4;

}

}
void print(Sqlist L){
int i;
printf("排名  学号 姓名 科目一 科目二 科目三 科目四 总分\n");
for(i=0;i<L.length;i++){
    printf("%d:    %d   %s   %d     %d      %d      %d      %d\n",i+1,L.student[i].num,L.student[i].name,L.student[i].cj1,L.student[i].cj2,L.student[i].cj3,L.student[i].cj4,L.student[i].sum);

}

}

void sort_all(Sqlist &L){//双向冒泡
     printf("以下按照总成绩双向冒泡排序:\n");
    int left = 0,right = L.length-1,l,r,j;
    stu temp;
    while(left<right){
        l=left+1;
        r=right-1;
         for(j = left; j < right; j++)
        {
            if(L.student[j].sum < L.student[j + 1].sum)
            {
               temp= L.student[j];
                L.student[j] = L.student[j + 1];
                L.student[j + 1] = temp;
                r = j;
            }
        }
        right = r;

        for(j = right; j > left; j--)
        {
            if(L.student[j].sum > L.student[j - 1].sum)
            {
               temp = L.student[j];
                L.student[j] = L.student[j - 1];
                L.student[j - 1] = temp;
                l = j;
            }
        }
        left = l;

    }
}
void ShellInsert(Sqlist &L,int dk){
int i;

for(i=0;i+dk<L.length;i++){
    if(L.student[i].cj1<L.student[i+dk].cj1){
        stu temp=L.student[i];
        L.student[i]=L.student[i+dk];
        L.student[i+dk]=temp;
    }
}
}
void sort_1(Sqlist &L){//希尔排序
    printf("以下按照科目一成绩希尔排序:\n");
    int dlta[3]={L.length/2,L.length/4,1};
int t=3,i;
for(i=0;i<t;i++){
    ShellInsert(L,dlta[i]);
}
}
void quick_sort(Sqlist &L,int left,int right){
int i=left,j=right;
if(left>right)
    return;
stu temp=L.student[left];
while(i!=j){
    while(L.student[j].cj2<=temp.cj2&&i<j) j--;
    while(L.student[i].cj2>=temp.cj2&&i<j) i++;
    if(i<j){
        stu t=L.student[i];
        L.student[i]=L.student[j];
        L.student[j]=t;
    }
}
L.student[left]=L.student[i];
L.student[i]=temp;
quick_sort(L,left,i-1);
quick_sort(L,i+1,right);
}

void sort_2(Sqlist &L){//快速排序
     printf("以下按照科目二成绩快速排序:\n");
quick_sort(L,0,L.length-1);
}
void HeapAdjust(Sqlist &L,int i,int n) { //调整堆
    int lchild=2*i;       //i的左孩子节点序号
    int rchild=2*i+1;     //i的右孩子节点序号
    int maxi=i;            //临时变量
    if(i<=n/2)          //如果i不是叶节点就不用进行调整
    {
        if(lchild<=n&&L.student[lchild-1].cj3<L.student[maxi-1].cj3)
        {
            maxi=lchild;
        }
        if(rchild<=n&&L.student[rchild-1].cj3<L.student[maxi-1].cj3)
        {
            maxi=rchild;
        }
        if(maxi!=i)
        {

            stu temp=L.student[i-1];
            L.student[i-1]=L.student[maxi-1];
            L.student[maxi-1]=temp;
            HeapAdjust(L,maxi,n);
        }
    }
}


void BuildHeap(Sqlist &L,int n){
    int i;
    for(i=(n)/2;i>=1;i--)
    {
        HeapAdjust(L,i,n);
    }
}


void heap_sort(Sqlist &L,int n){
    int i;
    BuildHeap(L,n);
    for(i=n;i>=1;i--)
    {
        stu temp=L.student[0];
        L.student[0]=L.student[i-1];
        L.student[i-1]=temp;
        HeapAdjust(L,1,i-1);
    }

}
void sort_3(Sqlist &L){//堆排序
     printf("以下按照科目三成绩堆排序:\n");
heap_sort(L,L.length);
}
void sort_4(Sqlist &L){//冒泡排序
     printf("以下按照科目四成绩冒泡排序:\n");
   int i,j;
   for(i=0;i<L.length;i++){
    for(j=i;j<L.length;j++){
        if(L.student[i].cj4<L.student[j].cj4){
            stu temp=L.student[i];
            L.student[i]=L.student[j];
            L.student[j]=temp;
        }
    }
   }

}
void _sort(Sqlist &L){
printf("请选择排序类型;1:科目1 2:科目2 3:科目3 4:科目4 0:总分\n");
int input;
scanf("%d",&input);
switch(input){
case 0:
    sort_all(L);
    break;
case 1:
    sort_1(L);
    break;
case 2:
    sort_2(L);
    break;
case 3:
    sort_3(L);
    break;
case 4:
    sort_4(L);
    break;
}
}
void input(Sqlist &L){
    int i=18;
    char str[10]="aefg";
    for(;i<23;i++){
        L.student[i-18].num=i;
        strcpy(L.student[i-18].name,str);
        L.student[i-18].cj1=i-18;
        L.student[i-18].cj2=i-18;
        L.student[i-18].cj3=i-18;
        L.student[i-18].cj4=i-18;
        L.student[i-18].sum=4*L.student[i-18].cj1;
        L.length++;
    }
}
int main()
{
    printf("           -----------学生成绩管理系统---------------\n");
    Sqlist L;
    initlist(L);
    input(L);
    while(1){
            printf("1.学生信息录入 2.学生信息查询 3.学生信息修改4. 学生信息排序 5.学生信息输出 0.退出\n");
        int input;
    scanf("%d",&input);
    switch(input){
    case 0:return 0;
    case 1:
        sq_insert(L);
        break;
    case 2:
        sq_find(L);
        break;
    case 3:
        sq_modify(L);
        break;
    case 4:
        _sort(L);
        print(L);
        break;
    case 5:
        print(L);
    }

    }

return 0;
}