数据结构课程设计——学生成绩管理系统

student.cpp
/*********************************************
*版权所有(C)2017,SunMingxin
*
*文件名称:student.cpp
*文件标识:无
*内容摘要:该部分代码用于自定义函数说明
*其它说明:无
*当前版本:V1.0
*作    者:孙铭馨
*完成日期:20171221
*
*版本号:V1.0
***********************************************/

#include "student.h"

int choose;/*用于接受用户的选择*/
STUDENT *headLink;/*链表表头指针*/

/************************************
函数功能:从文件中读学生信息到链表中
************************************/

void ReadInfoFormFile(void)
{
    FILE *fp;
    STUDENT *p;
    fp=fopen("student.txt","r");
    if(!fp)
    {
        printf("文件不存在\n");
        return;
    }
    p=MallocNode();
    while(fscanf(fp,"%s%s%f%f%f",p->studentNumber,p->studentName,&(p->mark1),&(p->mark2),&(p->mark3))>0)
    {
        InsertOneNode(p);
        p=MallocNode();
    }
    fclose(fp);
}


/************************************
函数功能:显示菜单,根据用户的输入
完成相应的功能
************************************/

void DesplayMenu(void)
{
    STUDENT *p;
    printf("                     ##############学生成绩管理系统###############\n");
    printf("                     *********************************************\n");
    printf("                     ***************请选择您的操作****************\n");
    printf("                     #          ① 增加学生                      #\n");
    printf("                     #          ② 按姓名查询                    #\n");
    printf("                     #          ③ 输出学生成绩单                #\n");
    printf("                     #          ④ 删除学生                      #\n");
    printf("                     #          ⑤ 按姓名修改学生成绩            #\n");
    printf("                     #          ⑥ 按学号修改学生成绩            #\n");
    printf("                     #          ⑦ 按平均成绩排序并输出学生信息  #\n");
    printf("                     #          ⑧ 显示不及格学生成绩            #\n");
    printf("                     #          ⑨ 保存信息到文件中              #\n");
    printf("                     #          10 退出操作                      #\n");
    printf("                     *********************************************\n");
    printf("                     #############################################\n");

    scanf("%d",&choose);/*取得用户的选择*/
    switch(choose)
    {
    case 1:
        p=MallocNode();/*先申请一个新结点*/
        GetInformation(p);/*要求用户输入信息到新结点中*/
        InsertOneNode(p);/*将新结点加到链表中*/

        break;
    case 2:
        DesplayInfoBystudentName();

        break;
    case 3:
        OutputInformation();/*显示所有学生的信息*/

        break;
    case 4:
        DeleteNodeBystudentNumber();/*根据用户输入的学号删除该学生*/
        break;
    case 5:
        ChangeMarkByName();/*根据用户输入的姓名修改学生成绩*/
        break;
    case 6:
        ChangeMarkByNumber();/*根据用户输入的学号修改学生成绩*/
        break;
    case 7:
        CompositorByTotalMark();/*按平均成绩排序*/
        break;
    case 8:
        DesplayMarkSegment();/*显示不及格的学生成绩*/
        break;
    case 9:
        SaveLinkToFile();/*保存数据*/

        break;
    case 10:
        SaveLinkToFile();/*保存数据后再退出*/

        free(headLink);
        exit(0);
        break;
    default:
        break;
    }
    DesplayMenu();/*递归调用*/
}
/************************************
函数功能:建立链表表头
************************************/
void CreateHeadLink(void)
{
    STUDENT *p;
    p=(STUDENT*)malloc(sizeof(STUDENT));
    headLink=p;
    p->next=NULL;
}



/************************************
函数功能:申请一个新结点,并将其初始化
************************************/


STUDENT *MallocNode(void)
{
    STUDENT *p;
    int i;
    p=(STUDENT*)malloc(sizeof(STUDENT));
    if(p==NULL)
        return NULL;
    for(i=0; i<10; i++)
        p->studentNumber[i]='\0';
    for(i=0; i<20; i++)
        p->studentName[i]='\0';
    for(i=0; i<20; i++)
        p->mark1=0.0;
    p->mark2=0.0;
    p->mark3=0.0;
    p->next=NULL;
    return p;
}

/************************************
函数功能:取得用户输入的学生信息
************************************/

void GetInformation(STUDENT *t)
{
    printf("请输入学生学号:\n");
    scanf("%s",t->studentNumber);
    printf("请输入学生姓名:\n");
    scanf("%s",t->studentName);
    printf("请输入第1门成绩:\n");
    scanf("%f",&(t->mark1));
    printf("请输入第2门成绩:\n");
    scanf("%f",&(t->mark2));
    printf("请输入第3门成绩:\n");
    scanf("%f",&(t->mark3));
}

/************************************
函数功能:在链表的结尾处增加一个结点
************************************/

void InsertOneNode(STUDENT *t)
{
    STUDENT *p;
    p=headLink;
    while(p->next)
    {
        p=p->next;
    }
    p->next=t;
}




/************************************
函数功能:根据用户输入的学生姓名
      显示该学生的信息
************************************/


void DesplayInfoBystudentName(void)
{
    STUDENT *p;
    char studentName[20];
    char flag=0;
    p=headLink->next;
    printf("请输入学生姓名:\n");
    scanf("%s",studentName);
    while(p)
    {
        if(strcmp(p->studentName,studentName)==0)
        {
            printf("学号\t姓名\t成绩1\t成绩2\t成绩3\t总成绩\t平均成绩\n\n");
            DesplayOneNode(p);
            flag=1;
            break;
        }
        p=p->next;
    }
    if(!flag)
        printf("对不起,不存在该学生\n",studentName);
}



/************************************
函数功能:输出一个结点的信息
************************************/
void DesplayOneNode(STUDENT *t)
{
    printf("%s\t",t->studentNumber);
    printf("%s\t",t->studentName);
    printf("%.2f\t",t->mark1);
    printf("%.2f\t",t->mark2);
    printf("%.2f\t",t->mark3);
    printf("%.2f\t",t->mark1+t->mark2+t->mark3);
    printf("%.2f\t\n",(t->mark1+t->mark2+t->mark3)/3);
}


/************************************
函数功能:根据用户输入的学号
         删除该学生
************************************/

void DeleteNodeBystudentNumber(void)
{
    char studentNumber[10];
    STUDENT *p,*q;
    char flag=0;
    printf("请输入要删除的学生学号:");
    scanf("%s",studentNumber);
    p=headLink;
    q=headLink->next;
    while(q)
    {
        if(strcmp(q->studentNumber,studentNumber)==0)
        {
            p->next=q->next;
            free(q);
            flag=1;
            break;

        }
        p=p->next;
        q=q->next;
    }
    if(!flag)
    {
        printf("不存在该学号的学生\n");
        return;
    }
    printf("成功删除\n");
}



/************************************
函数功能:显示所有学生的信息
************************************/

void OutputInformation(void)
{
    STUDENT *p;
    p=headLink->next;
    if(p==NULL)
    {
        printf("现在没有学生信息,请先输入学生信息\n\n");
        return;
    }
    printf("学号\t姓名\t成绩1\t成绩2\t成绩3\t总成绩\t平均成绩\n\n");
    while(p)
    {
        DesplayOneNode(p);
        p=p->next;
    }
}




/************************************
函数功能:根据输入的姓名
         修改成绩
************************************/
void ChangeMarkByName(void)
{
    STUDENT *p;
    int a;
    char studentName[20];
    char flag=0;
    float mark1,mark2,mark3;
    p=headLink->next;
    printf("请输入学生姓名:\n");
    scanf("%s",studentName);
    while(p)
    {
        if(strcmp(p->studentName,studentName)==0)
        {

            printf("请输入新的第1门成绩:\n");
            scanf("%f",&mark1);
            printf("请输入新的第2门成绩:\n");
            scanf("%f",&mark2);
            printf("请输入新的第3门成绩:\n");
            scanf("%f",&mark3);
            p->mark1=mark1;
            p->mark2=mark2;
            p->mark3=mark3;
            flag=1;
            printf("修改成功\n");
            break;

        }
        p=p->next;
    }
    if(!flag)
        printf("对不起,不存在该学生\n",&a,studentName);
}


/************************************
函数功能:根据输入的学号
         修改成绩
************************************/

void ChangeMarkByNumber(void)
{
    STUDENT *p;
    int b;
    char studentNumber[20];
    char flag=0;
    float mark1,mark2,mark3;
    p=headLink->next;
    printf("请输入学生学号:\n");
    scanf("%s",studentNumber);
    while(p)
    {
        if(strcmp(p->studentNumber,studentNumber)==0)
        {
            printf("请输入新的第1门成绩:\n");
            scanf("%f",&mark1);
            printf("请输入新的第2门成绩:\n");
            scanf("%f",&mark2);
            printf("请输入新的第3门成绩:\n");
            scanf("%f",&mark3);
            p->mark1=mark1;
            p->mark2=mark2;
            p->mark3=mark3;
            flag=1;
            printf("修改成功\n");
            break;

        }
        p=p->next;
    }
    if(!flag)
        printf("对不起,不存在学号为 %s 的学生\n",studentNumber);
}
/************************************
函数功能:保存链表数据到文件中
************************************/
void SaveLinkToFile(void)
{
    STUDENT *p;
    FILE *fp;
    p=headLink->next;
    if(p==NULL)
    {
        printf("现在没有学生信息,请先输入学生信息\n\n");
        return;
    }
    fp=fopen("student.txt","w+");
    if(!fp)
    {
        printf("文件不存在\n");
        return;
    }
    while(p)
    {
        fprintf(fp,"%s %s %f %f %f\n",p->studentNumber,p->studentName,p->mark1,p->mark2,p->mark3);
        p=p->next;
    }
    fclose(fp);

}

/************************************
函数功能:不及格学生成绩
************************************/
void DesplayMarkSegment(void)
{
    STUDENT *p;
    int count=0;

    p=headLink->next;
    printf("60分以下(不及格)的学生成绩如下:\n");
    printf("学号\t姓名\t成绩1\t成绩2\t成绩3\t总成绩\t平均成绩\n\n");
    while(p)
    {
        if((6>((int)(p->mark1/10)))||(6>((int)(p->mark2/10)))||(6>((int)(p->mark3/10))))/*只要有一科不及格就认为该生不及格*/
        {
            count++;
            DesplayOneNode(p);
        }
        p=p->next;
    }
    printf("不及格的学生一共有%d人\n",count);
}



/************************************
函数功能:按平均成绩排序
************************************/

void CompositorByTotalMark(void)
{
    STUDENT exchange,*r,*p,*q;
    r=headLink->next;
    if(r==NULL)
    {
        printf("现在还没学生信息,请先输入学生信息\n");
        return;
    }
    while(r)/*两层while循环实现排序*/
    {
        p=r;
        q=r->next;
        while(q)
        {
            if((q->mark1+q->mark2+q->mark3)>(p->mark1+p->mark2+p->mark3))
            {

                strcpy(exchange.studentNumber,q->studentNumber);/*先复制q结点信息到exchange*/
                strcpy(exchange.studentName,q->studentName);
                exchange.mark1=q->mark1;
                exchange.mark2=q->mark2;
                exchange.mark3=q->mark3;

                strcpy(q->studentNumber,p->studentNumber);/*再复制p结点信息到q*/
                strcpy(q->studentName,p->studentName);
                q->mark1=p->mark1;
                q->mark2=p->mark3;
                q->mark3=p->mark3;
                strcpy(p->studentNumber,exchange.studentNumber);/*最后复制exchange结点信息到p*/
                strcpy(p->studentName,exchange.studentName);
                p->mark1=exchange.mark1;
                p->mark2=exchange.mark2;
                p->mark3=exchange.mark3;
            }
            q=q->next;
        }
        r=r->next;
    }
    OutputInformation();
}

student.h

/*********************************************
*版权所有(C)2017,SunMingxin
*
*文件名称:student.h
*文件标识:无
*内容摘要:函数声明
*其它说明:无
*当前版本:V1.0
*作    者:孙铭馨
*完成日期:20171221
*
*版本号:V1.0
***********************************************/

#ifndef STUDENT_H_INCLUDED
#define STUDENT_H_INCLUDED

#include<stdio.h>
#include<conio.h>
#include<malloc.h>
#include<string.h>

typedef struct STUDENT
{
    char studentNumber[10];/*学生学号*/
    char studentName[20];/*学生姓名*/

    float mark1;/*第1门成绩*/
    float mark2;/*第2门成绩*/
    float mark3;/*第3门成绩*/

    struct STUDENT *next;
} STUDENT;


/*以下是函数声明*/

void ReadInfoFormFile(void);//从文件中读学生信息到链表中
void DesplayMenu(void);//显示菜单,根据用户的输入完成相应的功能
void CreateHeadLink(void);//建立链表表头
STUDENT *MallocNode(void);//申请一个新结点,并将其初始化
void GetInformation(STUDENT *t);//获取信息
void OutputInformation(void);//显示所有学生信息
void DesplayInfoBystudentName(void);//根据姓名显示学生信息
void DesplayOneNode(STUDENT *t);//输出一个结点的信息
void InsertOneNode(STUDENT *t);//结尾处增加一个结点
void DeleteNodeBystudentNumber(void);//删除学生信息
void ChangeMarkByName(void);//通过姓名修改
void ChangeMarkByNumber(void);//通过学号修改
void SaveLinkToFile(void);//保存信息到文件中

void DesplayMarkSegment(void);//显示不及格学生信息
void CompositorByTotalMark(void);//按平均成绩排序



#endif // STUDENT_H_INCLUDED

main.cpp
/*********************************************
*版权所有(C)2017,SunMingxin
*
*文件名称:main.cpp
*文件标识:无
*内容摘要:主函数
*其它说明:无
*当前版本:V1.0
*作    者:孙铭馨
*完成日期:20171221
*
*版本号:V1.0
***********************************************/

#include "student.h"
int main()
{
    CreateHeadLink();
    ReadInfoFormFile();

    DesplayMenu();
}

  • 12
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值