学生信息管理系统(顺序表)

顺序表实现了简单的增,删,改,查,排序,文件操作等,有待改进。。。

#include <stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
#include<stdlib.h>
#define INITLISTSIZE 5
#define LISTINCREMENT 5
#define M 1000007
typedef struct z1
{
    char no[11];
    char name[15];
    int score[3];
    int sum;
    float average;
    int order;
} student;
typedef struct SqList
{
    student *elem;
    int listsize;
    int length;
} SqList;
student HashTable[M];
int BKDRHash(char *str);//哈希函数
void init(SqList &L);
int menu_select();
void create(SqList &L);
void print(SqList L);
void Squence_Search(SqList L);//顺序查找
void del(SqList &L);
void append(SqList &L);
void insert(SqList &L);
void save(SqList L);
void load(SqList &L);
void Insert_Sort(SqList &L);//插入排序
void Select_Sort(SqList &L);
void compute(SqList &L);
void quick_sort(SqList &L,int l, int r);//快排
void Binary_Search(SqList &L);//折半查找
void Hash_Search(SqList L);//哈希查找
int main()
{
    int select;
    SqList L;
    init(L);
    while(1)
    {
        switch(menu_select())
        {
        case 0:
            init(L);
            break;
        case 1:
            create(L);
            break;
        case 2:
            print(L);
            break;
        case 3:
            int opt;
            printf("1:顺序查找\n2:二分查找\n3:哈希查找\n");
            scanf("%d",&opt);
            if(opt==1)
                Squence_Search(L);
            else if(opt==2)
                Binary_Search(L);
            else if(opt==3)
                Hash_Search(L);
            break;
        case 4:
            compute(L);
            break;
        case 5:
            del(L);
            break;
        case 6:
            append(L);
            break;
        case 7:
            insert(L);
            break;
        case 8:
            save(L);
            break;
        case 9:
            load(L);
            break;
        case 10:
            printf("1:插入排序\n2:选择排序\n3:快速排序\n");
            scanf("%d",&select);
            if(select==1) Insert_Sort(L);
            else if(select==2) Select_Sort(L);
            else if(select==3) quick_sort(L,0,L.length-1);
            break;
        case 11:
            exit(0);
        }
    }
    return 0;
}
int menu_select()
{
    int choice;

    printf("****************************菜单*******************************\n");
    printf("                        0  初始化             \n");
    printf("                        1  输入               \n");
    printf("                        2  打印               \n");
    printf("                        3  查找               \n");
    printf("                        4  计算               \n");
    printf("                        5  删除               \n");
    printf("                        6  追加               \n");
    printf("                        7  插入               \n");
    printf("                        8  保存               \n");
    printf("                        9  读入               \n");
    printf("                        10 排序              \n");
    printf("                        11  退出              \n");
    printf("Enter your choice(0-11):");
    scanf("%d",&choice);
    return choice;
}

void init(SqList &L)
{
    L.elem=(student *)malloc(INITLISTSIZE*sizeof(student));
    L.listsize=INITLISTSIZE;
    L.length=0;
}
void create(SqList &L)
{
    int i=0;
    while(1)
    {
        printf("请输入学号:");
        scanf("%s",L.elem[i].no);
        if(L.elem[i].no[0]=='@')
            break;
        printf("请输入姓名:");
        scanf("%s",L.elem[i].name);
        printf("请输入数学成绩:");
        scanf("%d",&L.elem[i].score[0]);
        printf("请输入英语成绩:");
        scanf("%d",&L.elem[i].score[1]);
        printf("请输入数据结构成绩:");
        scanf("%d",&L.elem[i].score[2]);
        L.elem[i].sum=0;
        L.elem[i].average=0;
        L.elem[i].order=0;
        L.length++;
        i++;
    }
}
void print(SqList L)
{
    int i;
    for(i=0; i<L.length; i++)
    {
        printf("学号:%s 姓名:%s 数学:%d 英语:%d 数据结构:%d 总分:%d 平均分:%.2f 排名:%d\n",L.elem[i].no,L.elem[i].name,L.elem[i].score[0],L.elem[i].score[1],L.elem[i].score[2],L.elem[i].sum,L.elem[i].average,L.elem[i].order);
    }
}
//顺序查找
void Squence_Search(SqList L)
{
    int i;
    char search_number[11];
    printf("输入要查找的学生学号:");
    scanf("%s",search_number);
    for( i=0; i<L.length; i++)
    {
        if(strcmp(search_number,L.elem[i].no)==0)
        {
            printf("%s %s %d %d %d %d %.2f %d\n",L.elem[i].no,L.elem[i].name,L.elem[i].score[0],L.elem[i].score[0],L.elem[1].score[2],L.elem[i].sum,L.elem[i].average,L.elem[i].order);
            break;
        }
    }
    if(i==L.length)
        printf("错误!!!没有此学生信息!\n");
}
//二分查找
void Binary_Search(SqList &L)
{
    quick_sort(L,0,L.length);
    char search_number[11];
    printf("输入要查找的学生学号:");
    scanf("%s",search_number);
    int low=0,high=L.length;
    while(low<=high)
    {
        int mid=low+(low+high)/2;
        if(strcmp(L.elem[mid].no,search_number)==0)
        {
            printf("%s %s %d %d %d %d %.2f %d\n",L.elem[mid].no,L.elem[mid].name,L.elem[mid].score[0],L.elem[mid].score[0],L.elem[mid].score[2],L.elem[mid].sum,L.elem[mid].average,L.elem[mid].order);
            return;
        }
    }
    printf("错误!!!没有此学生信息!\n");
}
//建立哈希表
void CreatHashTable(SqList L)
{
    int i=0;
    while(i<L.length)
    {
        int index=BKDRHash(L.elem[i].no);
        HashTable[index]=L.elem[i];
        i++;
    }
}
//哈希查找
void Hash_Search(SqList L)
{
    CreatHashTable(L);
    char search_number[11];
    printf("输入要查找的学生学号:");
    scanf("%s",search_number);
    int dex=BKDRHash(search_number);
    printf("%s %s %d %d %d %d %.2f %d\n",HashTable[dex].no,HashTable[dex].name,HashTable[dex].score[0],HashTable[dex].score[1],HashTable[dex].score[2],HashTable[dex].sum,HashTable[dex].average,HashTable[dex].order);
}
void del(SqList &L)
{
    printf("输入要删除的学生学号:");
    char number[11];
    scanf("%s",number);
    int i=0;
    while(i<L.length&&strcmp(number,L.elem[i].no))
        i++;
        while(i<L.length-1)
        {
            L.elem[i]=L.elem[i+1];
            i++;
        }
    L.length-=1;
}
void append(SqList &L)
{
    printf("请输入要增加的学生信息:");
    char no[11];
    printf("请输入学号:");
    scanf("%s",no);
    char name[15];
    printf("请输入姓名:");
    scanf("%s",name);
    int score[3];
    printf("请输入成绩:");
    scanf("%d%d%d",&score[0],&score[1],&score[2]);
    float sum=0;
    float average=0;
    strcpy(L.elem[L.length].no,no);
    strcpy(L.elem[L.length].name,name);
    memcpy(L.elem[L.length].score,score,sizeof(score));
    L.elem[L.length].sum=sum;
    L.elem[L.length].average=average;
    L.elem[L.length].order=0;
    L.length+=1;
}
void insert(SqList &L)
{
    printf("请输入指定的学生学号:");
    char no[11];
    scanf("%s",no);
    student *p;
    p=L.elem;
    while(p&&strcmp(p->no,no))
        p++;
    if(!p)
        printf("没有此人!\n");
    else
    {
        student *q;
        for(q=L.elem+L.length; q>=p; q--)
        {
            *(q+1)=*q;
        }
    }
    printf("请输入学号:");
    scanf("%s",p->no);
    printf("请输入姓名:");
    scanf("%s",p->name);
    printf("请输入数学成绩:");
    scanf("%d",&p->score[0]);
    printf("请输入英语成绩:");
    scanf("%d",&p->score[1]);
    printf("请输入数据结构成绩:");
    scanf("%d",&p->score[2]);
    L.length++;
}
void compute(SqList &L)
{
    student *p;
    for(p=L.elem; p<L.elem+L.length; p++)
    {
        p->sum=p->score[0]+p->score[1]+p->score[2];
        p->average=p->sum/3.0;
    }
}
void save(SqList L)
{
    FILE *fp;
    if((fp=fopen("student.txt","w"))==NULL)
    {
        printf("文件打开失败\n");
        getchar();
        exit(1);
    }

    student *p;
    for(p=L.elem; p<L.elem+L.length; p++)
    {
        fprintf(fp,"%s %s %d %d %d %d %f %d\n",p->no,p->name,p->score[0],p->score[1],p->score[2],p->sum,p->average,p->order);
    }
    fclose(fp);
}
void load(SqList &L)
{
    int i=0;
    FILE *fp;
    if((fp=fopen("student.txt","r"))==NULL)
    {
        printf("文件打开失败\n");
        getchar();
        exit(1);
    }
    student *p;
    p=L.elem;
    while(fscanf(fp,"%s%s%d%d%d%d%f%d",p->no,p->name,&p->score[0],&p->score[1],&p->score[2],&p->sum,&p->average,&p->order)==8)
    {
        p++;
        i++;
    }
    L.length=i;
    fclose(fp);
}
//直接插入排序
void Insert_Sort(SqList &L)
{
    student p;
    int i, j;
    for (i = 1; i < L.length; i++)
        if (L.elem[i].sum > L.elem[i - 1].sum)
        {
            p = L.elem[i];
            for (j = i - 1; j >= 0 && L.elem[j].sum < p.sum; j--)
                L.elem[j + 1] = L.elem[j];
            L.elem[j + 1] = p;
        }
    student *t;
    i=0;
    for(t=L.elem; t<L.elem+L.length; t++)
    {
        L.elem[i].order=i+1;
        i++;
    }
}
//选择排序
void Select_Sort(SqList &L)
{
    for (int i = 0; i <L.length - 1; i++)
    {
        int index = i;
        for (int j = i + 1; j < L.length; j++)
        {
            if (L.elem[index].sum <L.elem[j].sum)
            {
                index = j;
            }
        }
        student p;
        p = L.elem[index];
        L.elem[index] = L.elem[i];
        L.elem[i] = p;
    }
    student *t;
    i=0;
    for(t=L.elem; t<L.elem+L.length; t++)
    {
        L.elem[i].order=i+1;
        i++;
    }
}
//快排
void quick_sort(SqList &L, int l, int r)
{
    if (l < r)
    {
        int i = l, j = r, x = L.elem[l].sum;
        while (i < j)
        {
            while(i < j && L.elem[j].sum <= x)
                j--;
            if(i < j)
                L.elem[i++] = L.elem[j];

            while(i < j && L.elem[i].sum > x)
                i++;
            if(i < j)
                L.elem[j--] = L.elem[i];
        }
        L.elem[i].sum = x;
        quick_sort(L, l, i - 1);
        quick_sort(L, i + 1, r);
    }
    student *t;
    int i=0;
    for(t=L.elem; t<L.elem+L.length; t++)
    {
        L.elem[i].order=i+1;
        i++;
    }
}
//哈希函数
int BKDRHash(char *str)
{
    unsigned int seed = 131;
    unsigned int hash = 0;
    while (*str)
    {
        hash = hash * seed + (*str++);
    }
    return (hash & 0x7FFFFFFF);
}

 

posted @ 2016-04-16 17:27  请叫我凯凯大人  阅读(652)  评论(0)    收藏  举报