1. 程式人生 > >資料結構程式設計回顧(六).學生成績管理系統-冒泡、快排、希爾、雙向冒泡和堆排

資料結構程式設計回顧(六).學生成績管理系統-冒泡、快排、希爾、雙向冒泡和堆排

題目六:學生成績處理系統
設計要求:本設計要求採用順序儲存結構,實現關於學生成
績處理的相關問題,包括:學生資訊的錄入、查詢、修改、
排序、確定名次以及資訊的輸出。其中學生資訊包括:學號、
姓名、四門課、總分以及排名;排序方法包括:雙向冒泡排
序、希爾排序、快速排序、堆排序等方法。

選單內容:
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;
}