• 数据结构顺序表小应用——学生成绩管理查询


    数据结构顺序表实用练习
    都是基本的函数调用和排序,加了点小小的选项。就算对顺序表的结构熟悉练练手吧。。。。

    #include<string.h>
    #include<malloc.h>
    #include<stdio.h>
    #include<stdlib.h>
    #include<math.h>
    #include<string>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    #define TRUE 1
    #define FALSE 0
    #define OK 1
    #define ERROR 0
    #define INFEASIBLE -1
    struct stu
    {
        string name;
        string num;
        int m,e,c;
    };
    typedef  stu ElemType;
    #define LIST_INIT_SIZE 1000 // 线性表存储空间的初始分配量
    #define LISTINCREMENT 1000 // 线性表存储空间的分配增量
    struct SqList
    {
        ElemType elem[1000]; // 存储空间基址
        int length; // 当前长度
        int listsize; // 当前分配的存储容量(以sizeof(ElemType)为单位)
    };
    int InitList(SqList &L)
    {
        // 操作结果:构造一个空的顺序线性表
    //    L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
        if(!L.elem) exit(OVERFLOW); // 存储分配失败
        L.length=0; // 空表长度为0
        L.listsize=LIST_INIT_SIZE; // 初始存储容量
        return OK;
    }
    
    int ListLength(SqList L)///返回线性表元素个数
    {
        return L.length;
    }
    
    int LocateElem(SqList L,ElemType e,int(*compare)(ElemType,ElemType))///算法2.6 按compare()位序返回元素
    {
        // 初始条件:顺序线性表L已存在,compare()是数据元素判定函数(满足为1,否则为0)
        // 操作结果:返回L中第1个与e满足关系compare()的数据元素的位序。
        // 若这样的数据元素不存在,则返回值为0。
        int i=0;
        ElemType *p=L.elem;
        while(i<=L.length&&!(*compare)(*p++,e))++i;
        if(i<=L.length)return i;
        else return 0;
    }
    
    int ListDelete(SqList &L,int i,ElemType &e) /// 算法2.5 删除元素
    {
        // 初始条件:顺序线性表L已存在,1≤i≤ListLength(L)
        // 操作结果:删除L的第i个数据元素,并用e返回其值,L的长度减1
        if((i<1)||(i>L.length))return ERROR;
        ElemType *p=&(L.elem[i-1]);
        e=*p;
        ElemType *q=L.elem+L.length-1;
        for(++p; p<=q; ++p) *(p-1)=*p;
        L.length--;
        return OK;
    }
    
    int ListTraverse(SqList L,void(*vi)(ElemType&))///依次对L的每个数据元素调用函数vi()
    {
        // 初始条件:顺序线性表L已存在
        // 操作结果:依次对L的每个数据元素调用函数vi()。一旦vi()失败,则操作失败
        //           vi()的形参 加'&',表明可通过调用vi()改变元素的值
        ElemType *p;
        int i;
        p=L.elem;
        for(i=1; i<=L.length; i++)
            vi(*p++);
        cout<<endl;//相当于c语言里面的printf("
    ")
        return OK;
    }
    
    int EndInsert(SqList &L,ElemType e)///在顺序表L 尾部 插入新元素
    {
        // 初始条件:顺序线性表L已存在。操作结果:在L的尾部插入新的数据元素e,L的长度加1。
        ElemType *p,*q,*newbase;
    //    if(L.length>=L.listsize)
    //    {
    //        if(!(newbase=(ElemType *)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType))))
    //            exit(OVERFLOW);
    //        L.elem=newbase;
    //        L.listsize+=LISTINCREMENT;
    //    }
        q=L.elem+L.length;
        *q=e;
        L.length++;
        return OK;
    }
    
    int DeleteElem_num(SqList &L,ElemType e)///按学号删除
    {
        // 删除表中值为e的元素,并返回TRUE;如无此元素,则返回FALSE
        ElemType *p;
        int flag=0;
        for(p=L.elem; p<=L.elem+L.length-1; p++)
        {
            if((*p).num==e.num)
            {
                flag=1;
                ElemType *q=L.elem+L.length-1;
                ElemType *P=p;
                for(++P; P<=q; ++P) *(P-1)=*P;
                L.length--;
                p--;
            }
        }
        return flag?TRUE:FALSE;
    }
    
    int comp_num(ElemType c1,ElemType c2)
    {
        if(c1.num==c2.num)
            return TRUE;
        else
            return FALSE;
    }
    int comp_name(ElemType c1,ElemType c2)
    {
        if(c1.name==c2.name)
            return TRUE;
        else
            return FALSE;
    }
    void output(SqList L,int local)
    {
        cout<<L.elem[local].num<<"-----"<<L.elem[local].name<<"-----"<<L.elem[local].c<<"-----"<<L.elem[local].m<<"-----"<<L.elem[local].e<<endl;
        return;
    }
    void add_or_del(SqList &L)
    {
        printf("1.增加学生信息
    ");
        printf("2.删除学生信息
    ");
        printf("请输入要执行的操作:");
        int work,n;
        ElemType tmp;
        scanf("%d",&work);
        if(work==1)
        {
            printf("请输入增加学生个数:
    ");
            scanf("%d",&n);
            for(int i=0; i<n; i++)
            {
                printf("请依次输入增加学生的姓名、学号:
    ",i);
                cin>>tmp.name;
                cin>>tmp.num;
                printf("请依次输入增加学生的语文、数学、英语成绩:
    ");
                scanf("%d%d%d",&tmp.c,&tmp.m,&tmp.e);
                EndInsert(L,tmp);
            }
            printf("增加完毕
    ");
        }
        else
        {
            printf("请输入删除学生个数:
    ");
            scanf("%d",&n);
            for(int i=0; i<n; i++)
            {
                printf("请输入要删除学生的学号:
    ");
                cin>>tmp.num;
                DeleteElem_num(L,tmp);
            }
            printf("删除完毕
    ");
        }
    }
    
    void check_stu(SqList &L)
    {
        int work,n;
        ElemType tmp;
        printf("1.输入学号查找
    ");
        printf("2.输入姓名查找
    ");
        printf("请输入操作类型:
    ");
        scanf("%d",&work);
        printf("请输入要查找的学生个数:");
        scanf("%d",&n);
        if(work==1)
        {
            for(int i=0; i<n; i++)
            {
                printf("请输入要查找的学号:");
                cin>>tmp.num;
                int local=LocateElem(L,tmp,comp_num);
                if(local<=L.length)
                    output(L,local);
                else printf("查无此人
    ");
            }
        }
        else
        {
            for(int i=0; i<n; i++)
            {
                printf("请输入要查找的姓名:");
                cin>>tmp.name;
                int local=LocateElem(L,tmp,comp_name);
                if(local<=L.length)
                    output(L,local);
                else printf("查无此人
    ");
            }
        }
    }
    void check_mark(SqList &L)
    {
        int work,low,high;
        ElemType tmp;
        printf("1.语文
    ");
        printf("2.数学
    ");
        printf("3.英语
    ");
        printf("请输入要查找的科目:");
        scanf("%d",&work);
        printf("请输入要查找的分数段:
    ");
        scanf("%d%d",&low,&high);
        if(work==1)
        {
            for(int i=0; i<L.length; i++)
                if(L.elem[i].c>=low&&L.elem[i].c<=high)
                    output(L,i);
        }
        else if(work==2)
        {
            for(int i=0; i<L.length; i++)
                if(L.elem[i].m>=low&&L.elem[i].m<=high)
                    output(L,i);
        }
        else
        {
            for(int i=0; i<L.length; i++)
                if(L.elem[i].e>=low&&L.elem[i].e<=high)
                    output(L,i);
        }
    }
    bool c_up(ElemType a,ElemType b)
    {
        return a.c<b.c;
    }
    bool c_down(ElemType a,ElemType b)
    {
        return a.c>b.c;
    }
    bool m_up(ElemType a,ElemType b)
    {
        return a.m<b.m;
    }
    bool m_down(ElemType a,ElemType b)
    {
        return a.m>b.m;
    }
    bool e_up(ElemType a,ElemType b)
    {
        return a.e<b.e;
    }
    bool e_down(ElemType a,ElemType b)
    {
        return a.e>b.e;
    }
    void Sort(SqList &L)
    {
        int work,up_down;
        ElemType tmp;
        printf("1.语文
    ");
        printf("2.数学
    ");
        printf("3.英语
    ");
        printf("请输入排序作为关键字的科目:");
        scanf("%d",&work);
        printf("1.升序
    ");
        printf("2.降序
    ");
        printf("请输入升序或降序操作:");
        scanf("%d",&up_down);
        if(work==1)
        {
            if(up_down==1)sort(L.elem,L.elem+L.length,c_up);
            else sort(L.elem,L.elem+L.length,c_down);
            for(int i=0; i<L.length; i++)output(L,i);
        }
        else if(work==2)
        {
            if(up_down==1)sort(L.elem,L.elem+L.length,m_up);
            else sort(L.elem,L.elem+L.length,m_down);
            for(int i=0; i<L.length; i++)output(L,i);
        }
        else
        {
            if(up_down==1)sort(L.elem,L.elem+L.length,e_up);
            else sort(L.elem,L.elem+L.length,e_down);
            for(int i=0; i<L.length; i++)output(L,i);
        }
    }
    int main()
    {
        SqList La;
        InitList(La);
        int n;
        printf("请输入学生个数:");
        scanf("%d",&n);
        ElemType tmp;
        for(int i=1; i<=n; i++)
        {
            printf("请依次输入第%d个学生的姓名、学号:
    ",i);
            cin>>tmp.name;
            cin>>tmp.num;
            printf("请依次输入第%d个学生的语文、数学、英语成绩:
    ",i);
            scanf("%d%d%d",&tmp.c,&tmp.m,&tmp.e);
            EndInsert(La,tmp);
        }
        int work;
        printf("1.增加、删除学生信息
    ");
        printf("2.输入学号或姓名查询学生信息
    ");
        printf("3.统计课程分数段信息
    ");
        printf("4.将学生信息按课程分数进行排序
    ");
        printf("请输入要执行的操作:");
        while(scanf("%d",&work)!=EOF)
        {
            switch(work)
            {
            case 1:
                add_or_del(La);
                break;
            case 2:
                check_stu(La);
                break;
            case 3:
                check_mark(La);
                break;
            case 4:
                Sort(La);
                break;
            default:
                printf("输入错误,请重新输入
    ");
            }
        }
    }
    /*
    6
    zhangruida 1604010901 23 56 89
    aldjfjajo 1604010978 78 78 19
    alkjdfiadf 160488405 78 98 29
    wwwwwww 1604010902 56 73 45
    eeeeeoooo 1604019013 79 48 15
    qqqqqqppppp 1604018098 78 98 56
    */
    
  • 相关阅读:
    [转载]Delphi 2009 (Tiburon) 新特性之 Exit 函数的新用法
    [转载][转]Delphi 2009 泛型+闭包能带来什么?
    [转载]现有 Delphi 项目迁移到 Tiburon 中的注意事项 (中)
    [转载]现有 Delphi 项目迁移到 Tiburon 中的注意事项 (上)
    [转载]现有 Delphi 项目迁移到 Tiburon 中的注意事项 (下)
    [转载]Delphi 2009 (Tiburon) 新特性之 Unicode 支持!
    [转载]Tiburon 支持 Unicode 的 LoadFromFile, SaveToFile
    GdiPlus[37]: IGPGraphicsPath (四) 路径变换
    GdiPlus[36]: IGPGraphicsPath (三) 路径中的数据
    GdiPlus[43]: IGPGraphics (二) 关于文本绘制
  • 原文地址:https://www.cnblogs.com/kuronekonano/p/11135820.html
Copyright © 2020-2023  润新知