欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

团委成员考核成绩管理系统

程序员文章站 2022-05-08 14:35:23
...

每到期末学院的各项大量评优工作总是令人头疼,为了高效完成优秀团员的筛选工作,用链表实现团员考核成绩管理系统。每个团员包括三项成绩,分别为笔试成绩,面试成绩和专业课成绩,从键盘输入团员信息,包括姓名,学号,专业以及三项成绩,即可实现分别按照不同项目成绩和按总成绩对团员进行排名,同时可实现学生信息的增删查改功能。
这里主要实践了对指针的灵活应用。

代码实现:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Student//学生结构
{
    char Name[10];//姓名
    char Major[10];//专业
    int No;//学号
    float Score[3];//总成绩
    float Total;//总分
    float Ave;//平均分
};


typedef struct Node//结点
{
    struct Student st;//数据域

    struct Node *pNext;//指针域
}NODE, *PNODE;


//输入函数,用于输入学生信息
PNODE InputStudent(void);

//输出学生信息
void OutputStudent(PNODE pHead);

//删除学生信息
void DeleteStudent(PNODE pHead);

//查找学生信息
void SearchStudent(PNODE pHead);

//修改学生信息
void ChangeStudent(PNODE pHead);

//增加学生信息
void InsertStudent(PNODE pHead);

//对学生的笔试成绩排序
void WriteSort(PNODE pHead);

//对学生的面试成绩排序
void AuditionSort(PNODE pHead);

//对学生的专业课成绩排序
void ClassSort(PNODE pHead);

//对学生的总分排序
void ScortByTotal(PNODE pHead);

void main()
{
    printf("********************************************************************************\n\n");
    printf("================================================================================\n\n");
    printf("=========欢迎进入西安工业大学计算机学院团委成员考核成绩管理系统=================\n\n");
    printf("-------------------------------------------------------------------制作人:北佳画\n\n");
    printf("********************************************************************************\n\n");
    printf("================================================================================\n\n");

    printf("请按任意将进入学生管理系统:\n");
    getchar();
    system("cls");

    printf("********************************************************************************\n\n");
    printf("------------------------ 请选择要操作的命令:-----------------------------------\n\n");
    printf("-------------------------- 1  输入团员信息--------------------------------------\n\n");
    printf("-------------------------- 2  输出团员信息--------------------------------------\n\n");
    printf("-------------------------- 3  删除团员信息--------------------------------------\n\n");
    printf("-------------------------- 4  查找团员信息--------------------------------------\n\n");
    printf("-------------------------- 5  修改团员信息--------------------------------------\n\n");
    printf("-------------------------- 6  增加团员信息--------------------------------------\n\n");
    printf("-------------------------- 7  按笔试成绩排名------------------------------------\n\n");
    printf("-------------------------- 8  按面试成绩排名------------------------------------\n\n");
    printf("-------------------------- 9  按专业课成绩排名----------------------------------\n\n");
  printf("-------------------------- 10 按总成绩按排--------------------------------------\n\n");
    printf("********************************************************************************\n\n");

    int Item;//保存操作命令

    PNODE pHead = NULL;//定义一个指针

    while(1)
    {
        printf("请选择操作命令:");
        scanf("%d",&Item);

        system("cls");//清屏

        switch(Item)
        {
            case 1://输入学生信息
            {
                pHead = InputStudent();
            }
            break;

            case 2://输出学生信息
            {
                OutputStudent(pHead);
            }
            break;

            case 3://删除学生信息
            {
                DeleteStudent(pHead);
            }
            break;

            case 4://查找学生信息
            {
                SearchStudent(pHead);
            }
            break;

            case 5://修改学生信息
            {
                ChangeStudent(pHead);
            }
            break;

            case 6://增加学生信息
            {
                InsertStudent(pHead);
            }
            break;

            case 7://对学生的笔试成绩排序
            {
                WriteSort(pHead);
                OutputStudent(pHead);
            }
            break;

            case 8://对学生的面试成绩排序
            {
                AuditionSort(pHead);
                OutputStudent(pHead);
            }
            break;

            case 9://对学生的专业课成绩排序
            {
                ClassSort(pHead);
                OutputStudent(pHead);
            }
            break;

            case 10://对学生的总分排序
            {
                ScortByTotal(pHead);
                OutputStudent(pHead);
            }
            break;
            default:
            break;
        }
    }

    system("pause");
}


//输入函数,用于输入学生信息
PNODE InputStudent(void)
{
    int len;//学生的人数

    NODE stu;//学生结构

    //定义一个头结点并且为头结点分配内存
    PNODE pHead = (PNODE)malloc(sizeof(NODE));

    //判断内存是否为空
    if(NULL == pHead)
    {
        printf("内存分配失败,程序终止!\n");

        exit(-1);
    }

    //定义一个指向头结点的指针
    PNODE pTail = pHead;
    pTail->pNext = NULL;//清空指针域

    printf("请输入学生的人数:");
    scanf("%d",&len);

    for(int i=0; i<len; i++)
    {
        system("cls");//清屏

        printf("请输入第%d个学生的姓名:", i+1);
        scanf("%s", stu.st.Name);

        printf("请输入第%d个学生的专业:", i+1);
        scanf("%s", &stu.st.Major);

        printf("请输入第%d个学生的学号:", i+1);
        scanf("%d", &stu.st.No);

        printf("请输入第%d个学生的笔试成绩:", i+1);
        scanf("%f", &stu.st.Score[0]);

        printf("请输入第%d个学生的面试成绩:", i+1);
        scanf("%f", &stu.st.Score[1]);

        printf("请输入第%d个学生的专业课成绩:", i+1);
        scanf("%f", &stu.st.Score[2]);

        //计算总分
        stu.st.Total = stu.st.Score[0] + stu.st.Score[1] + stu.st.Score[2];

        //计算平均分
        stu.st.Ave = stu.st.Total / 3.0f;

        //为新节点分配内存
        PNODE pNew = (PNODE)malloc(sizeof(NODE));

        //判断内存是否为空
        if(NULL == pNew)
        {
            printf("内存分配失败,程序终止!\n");

            exit(-1);
        }

        //初始化结点的数据域
        pNew->st = stu.st;

        //将新结点挂到老结点后
        pTail->pNext = pNew;

        //清空新结点的指针域
        pNew->pNext = NULL;

        //将pTail移到新结点上
        pTail = pNew;
    }

    return pHead;
}

//输出学生信息
void OutputStudent(PNODE pHead)
{
    //定义一个指针用于遍历学生信息
    PNODE p = pHead->pNext;

    printf("姓名 专业  学号  笔试  面试  专业课  总分 平均分\n");

    while(NULL != p)
    {
        printf("%s  %s  %d  %g  %g  %g  %g  %g\n", p->st.Name, p->st.Major, p->st.No, p->st.Score[0], p->st.Score[1], p->st.Score[2], p->st.Total, p->st.Ave);

        p = p->pNext;
    }
}

//删除学生信息
void DeleteStudent(PNODE pHead)
{
    PNODE p = pHead;

    int i = 0;

    int pos;

    printf("请输入你需要删除的学生的编号:");
    scanf("%d",&pos);

    while(NULL != p->pNext && i<pos-1)
    {
        p = p->pNext;

        i++;
    }

    if(NULL == p->pNext || i>pos-1)
    {
        printf("没找到需要删除的学生的编号!\n");

        return;
    }

    PNODE q = p->pNext;

    p->pNext = q->pNext;

    free(q);
    q == NULL;

    printf("你已经成功删除了第%d个学生的信息!\n",pos);
}
//查找学生信息
void SearchStudent(PNODE pHead)
{
    char Name[10];

    printf("请输入你需要查找的学生的姓名:");
    scanf("%s",Name);

    PNODE p = pHead->pNext;

    while(NULL != p)
    {
        if(0 == strcmp(Name,p->st.Name))
        {
            printf("%s %s %d %g %g %g %g %g\n",p->st.Name, p->st.Major, p->st.No, p->st.Score[0], p->st.Score[1], p->st.Score[2], p->st.Total, p->st.Ave);
        }

        p = p->pNext;
    }
}

//修改学生信息
void ChangeStudent(PNODE pHead)
{
    char Name[10];

    printf("请输入你需要修改的学生的姓名:");
    scanf("%s",&Name);

    PNODE p = pHead->pNext;//定义一个指针用于遍历学生信息


    while(NULL != p)
    {
        if(0 == strcmp(Name, p->st.Name))
        {
            printf("姓名 专业  学号  笔试  面试  专业课  总分 平均分\n");

            printf("修改前的学生信息!\n");
            printf("%s %s %d %g %g %g %g %g\n",p->st.Name, p->st.Major, p->st.No, p->st.Score[0], p->st.Score[1], p->st.Score[2], p->st.Total, p->st.Ave);

            system("pause");
            system("cls");//清屏

            printf("请输入新的学生姓名:");
            scanf("%s", p->st.Name);

            printf("请输入新的学生专业:");
            scanf("%s", &p->st.Major);

            printf("请输入新的学生学号:");
            scanf("%d", &p->st.No);

            printf("请输入新的学生的笔试成绩:");
            scanf("%f", &p->st.Score[0]);

            printf("请输入新的学生的面试成绩:");
            scanf("%f", &p->st.Score[1]);

            printf("请输入新的学生的专业课成绩:");
            scanf("%f", &p->st.Score[2]);

            //计算总分
            p->st.Total = p->st.Score[0] + p->st.Score[1] + p->st.Score[2];

            //计算平均分
            p->st.Ave = p->st.Total / 3.0f;

            break;
        }

        p = p->pNext;
    }
}

//增加学生信息
void InsertStudent(PNODE pHead)
{
    PNODE p = pHead;

    int i = 0;

    struct Student stu;//学生结构

    int pos;//插入结点的位置

    printf("请输入插入学生的位置:");
    scanf("%d",&pos);

    while(NULL != p && i<pos-1)
    {
        p = p->pNext;

        i++;
    }

    if(NULL == p || i>pos)
    {
        printf("插入结点的位置不存在!\n");

        return;
    }

    printf("你将在第%d个学生后面插入一个学生\n",pos-1);

    printf("请输入第%d个学生的姓名:",pos);
    scanf("%s",stu.Name);

    printf("请输入第%d个学生的专业:",pos);
    scanf("%s",&stu.Major);

    printf("请输入第%d个学生的学号:",pos);
    scanf("%d",&stu.No);

    printf("请输入第%d个学生的笔试成绩:",pos);
    scanf("%f",&stu.Score[0]);

    printf("请输入第%d个学生的面试成绩:",pos);
    scanf("%f",&stu.Score[1]);

    printf("请输入第%d个学生的专业课成绩:",pos);
    scanf("%f",&stu.Score[2]);

    //计算总分
    stu.Total = stu.Score[0] + stu.Score[1] + stu.Score[2];

    //计算平均分
    stu.Ave = stu.Total / 3.0f;

    PNODE pNew = (PNODE)malloc(sizeof(NODE));

    if(NULL == pNew)
    {
        printf("动态内存分配失败,程序终止!\n");

        exit(-1);
    }
    pNew->st = stu;
    PNODE q = p->pNext;
    p->pNext = pNew;
    pNew->pNext = q;
}

//对学生的笔试成绩排序
void WriteSort(PNODE pHead)
{
    PNODE p, q;//定义两个指针

    NODE temp;

    for(p=pHead->pNext; NULL != p; p=p->pNext)
    {
        for(q=p->pNext; NULL !=q; q=q->pNext)
        {
            if(p->st.Score[0] < q->st.Score[0])//当前一个学生的语文成绩小于后一个学生的语文成绩时
            {
                temp.st  = p->st;//交换学生的位置
                p->st =  q->st;
                q->st = temp.st;
            }
        }
    }
}

//对学生的面试成绩排序
void AuditionSort(PNODE pHead)
{
    PNODE p, q;//定义两个指针

    NODE temp;

    for(p=pHead->pNext; NULL != p; p=p->pNext)
    {
        for(q=p->pNext; NULL !=q; q=q->pNext)
        {
            if(p->st.Score[1] < q->st.Score[1])//当前一个学生的数学成绩小于后一个学生的数学成绩时
            {
                temp.st  = p->st;//交换学生的位置
                p->st =  q->st;
                q->st = temp.st;
            }
        }
    }
}

//对学生的专业课成绩排序
void ClassSort(PNODE pHead)
{
    PNODE p, q;//定义两个指针

    NODE temp;

    for(p=pHead->pNext; NULL != p; p=p->pNext)
    {
        for(q=p->pNext; NULL !=q; q=q->pNext)
        {
            if(p->st.Score[2] < q->st.Score[2])//当前一个学生的英语成绩小于后一个学生的英语成绩时
            {
                temp.st  = p->st;//交换学生的位置
                p->st =  q->st;
                q->st = temp.st;
            }
        }
    }
}

//对学生的总分排序
void ScortByTotal(PNODE pHead)
{
    PNODE p, q;//定义两个指针

    NODE temp;

    for(p=pHead->pNext; NULL != p; p=p->pNext)
    {
        for(q=p->pNext; NULL !=q; q=q->pNext)
        {
            if(p->st.Total < q->st.Total)//当前一个学生的总分小于后一个学生的总分时
            {
                temp.st  = p->st;//交换学生的位置
                p->st =  q->st;
                q->st = temp.st;
            }
        }
    }
}

效果显示:
进入主界面:
团委成员考核成绩管理系统
操作指南:
团委成员考核成绩管理系统
按照笔试成绩进行排序:
团委成员考核成绩管理系统
按照面试成绩进行排序:
团委成员考核成绩管理系统
按照专业课成绩进行排序:
团委成员考核成绩管理系统
按照总成绩进行排序:
团委成员考核成绩管理系统