码迷,mamicode.com
首页 > 其他好文 > 详细

学生信息管理系统---顺序表

时间:2016-04-25 19:28:44      阅读:296      评论:0      收藏:0      [点我收藏+]

标签:

技术分享
#include <stdio.h>
#include<iostream>
#include<string.h>
#include<math.h>
#include<stdlib.h>
using namespace std;
#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];
void init(SqList &L);
int menu_select();
void create(SqList &L);
void print(SqList L);
void del(SqList &L);
void append(SqList &L);
void insert(SqList &L);
void save(SqList L);
void load(SqList &L);
void compute(SqList &L);
void Insert_Sort(SqList &L);//插入排序
void Select_Sort(SqList &L);//选择排序
void quick_sort(int l, int r,SqList &L);//快排
void Binary_Search(SqList &L);//折半查找
void hash_search(SqList L);//哈希查找
void Squence_Search(SqList L);//顺序查找
void creathashtable(SqList L);
void Select_Sort1(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(0,L.length-1,L);
            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 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;
    int i=0;
    for(t=L.elem; t<L.elem+L.length; t++)
    {
        L.elem[i].order=i+1;
        i++;
    }
}
//快速排序
void quick_sort(int s,int t,SqList &L)
{
    int i=s,j=t,x=L.elem[(i+j)/2].sum;
    student y;
    do
    {
        while(L.elem[i].sum>x)
            i++;
        while(L.elem[j].sum<x)
            j--;
        if(i<=j)
        {
            y=L.elem[j];
            L.elem[j]=L.elem[i];
            L.elem[i]=y;
            i++;
            j--;
        }
    }
    while(i<j);
    if(j>s)
        quick_sort(s,j,L);
    if(i<t)
        quick_sort(i,t,L);
    student *p;
    i=0;
    for(p=L.elem; p<L.elem+L.length; p++)
    {
        L.elem[i].order=i+1;
        i++;
    }
}
//顺序查找
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)
{
    Select_Sort1(L);
    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;
        }
        else if(strcmp(L.elem[mid].no,search_number)<0)
            low=mid+1;
        else if(strcmp(L.elem[mid].no,search_number)>0)
            high=mid-1;
    }
    printf("错误!!!没有此学生信息!\n");
}
//建立哈希表
void creathashtable(SqList L)
{
    int i=0;
    while(i<L.length)
    {
        int len=strlen(L.elem[i].no);
        int j=0;
        int sum=0;
        while(j<4&&len)
        {
            sum+=(L.elem[i].no[len-1]-0)*pow(10,j);
            j++;
            len--;
        }
        if(strlen(HashTable[sum].no)==0)
            HashTable[sum]=L.elem[i];
        else
        {
            while(strlen(HashTable[sum].no)!=0)
            {
                sum++;
            }
            HashTable[sum]=L.elem[i];
        }
        i++;
    }
}
//哈希查找
void hash_search(SqList L)
{
    creathashtable(L);
    char search_number[11];
    printf("输入要查找的学生学号:");
    scanf("%s",search_number);
    int len=strlen(search_number);
    int j=0;
    int sum=0;
    while(j<4&&len)
    {
        sum+=(search_number[len-1]-0)*pow(10,j);
        j++;
        len--;
    }
    student *p=&HashTable[sum];
    while(strcmp(p->no,search_number)!=0)
    {
        p++;
    }
    printf("%s %s %d %d %d %d %.2f %d\n",p->no,p->name,p->score[0],p->score[1],p->score[2],p->sum,p->average,p->order);

}
//按学号排序
void Select_Sort1(SqList &L)
{
    for (int i = 0; i <L.length - 1; i++)
    {
        int index = i;
        for (int j = i + 1; j < L.length; j++)
        {
            if (strcmp(L.elem[index].no,L.elem[j].no)>0)
            {
                index = j;
            }
        }
        student p;
        p = L.elem[index];
        L.elem[index] = L.elem[i];
        L.elem[i] = p;
    }
}
View Code

 

学生信息管理系统---顺序表

标签:

原文地址:http://www.cnblogs.com/calmwithdream/p/5432314.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!