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

<span style="font-size:14px;">/*   
* Copyright (c)2015,烟台大学计算机与控制工程学院   
* All rights reserved.   
* 文件名称:sjjg.cpp
* 作    者:杨惠娟 
* 完成日期:2015年12月25日   
* 版 本 号:v1.0   
   
* 问题描述:   本项目为学生成绩管理系统,设计一个可以管理学生成绩的软件系统。
   
* 输入描述:学生信息及成绩
* 程序输出:   
*/    </span>

1.头文件:

<pre name="code" class="cpp"><pre name="code" class="cpp">/***********************************************************
* 版权所有 (C)2015, 杨惠娟。
*
* 文件名称: head.h
* 文件标识:无
* 内容摘要:学生成绩管理
* 其它说明:无
* 当前版本: V1.1
* 作 者:杨惠娟
* 完成日期: 20151225
*
**********************************************************/
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<malloc.h>
#include<string.h>


typedef struct STUDENT
{
    char studentNumber[10];/*学生学号*/
    char studentName[20];/*学生姓名*/
    char className[20];/*班级名称*/
    char yearName[20];/*学期名称*/
    float mark1;/*第1门成绩*/
    float mark2;/*第2门成绩*/
    float mark3;/*第3门成绩*/
    struct STUDENT *next;
} STUDENT;
STUDENT *headLink;/*链表表头指针*/
/*以下是函数声明*/
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);//函数功能:按平均成绩排序
int choose;/*用于接受用户的选择*/
2.源文件:
<pre name="code" class="cpp">/***********************************************************
* 版权所有 (C)2015, 杨惠娟。
*
* 文件名称: 1.cpp
* 文件标识:无
* 内容摘要:学生成绩管理
* 其它说明:无
* 当前版本: V1.1
* 作 者:杨惠娟
* 完成日期: 20151225
**********************************************************/
/************************************
函数功能:从文件中读学生信息到链表中
输入参数:无
输出参数:无
返回值:无
************************************/
void ReadInfoFormFile(void)
{
    FILE *fp;
    STUDENT *p;
    fp=fopen("student.txt","r");
    if(!fp)
    {
        printf("文件不存在\n");
        return;
    }
    p=MallocNode();
    while(fscanf(fp,"%s%s%s%f%f%f",p->studentNumber,p->studentName,p->className,&(p->mark1),&(p->mark2),&(p->mark3))>0)
    {
        InsertOneNode(p);
        p=MallocNode();
    }
    fclose(fp);
}
/************************************
函数功能:显示菜单,根据用户的输入
完成相应的功能
输入参数:(1~10)
输出参数:学生信息
返回值:无
************************************/
void DesplayMenu(void)
{
    STUDENT *p;
    printf("\t\t\t-------请选择相应功能------------\t\t\t\n");
    printf("\t| 1 按班级输出学生成绩单 |\t\t| 2 按姓名查询 |\n");
    printf("\t| 3 增加学生 |\t\t\t\t| 4 删除学生 |\n");
    printf("\t| 5 按班级修改学生成绩|\t\t\t| 6 按学期修改学生成绩 |\n");
    printf("\t| 7 保存所有学生信息 |\t\t\t| 8 显示不及格学生成绩 |\n");
    printf("\t| 9 按平均成绩排序并输出绩 |\t\t| 10 退出 |\n\n");
    scanf("%d",&choose);/*取得用户的选择*/
    switch(choose)
    {
    case 1:
        OutputInformation();/*显示所有学生的信息*/
        break;
    case 2:
        DesplayInfoBystudentName();
        break;
    case 3:
        p=MallocNode();/*先申请一个新结点*/
        GetInformation(p);/*要求用户输入信息到新结点中*/
        InsertOneNode(p);/*将新结点加到链表中*/
        break;
    case 4:
        DeleteNodeBystudentNumber();/*根据用户输入的学号删除该学生*/
        break;
    case 5:
        ChangeMarkByName();/*根据用户输入的姓名修改学生成绩*/
        break;
    case 6:
        ChangeMarkByNumber();/*根据用户输入的学号修改学生成绩*/
        break;
    case 7:
        SaveLinkToFile();/*保存数据*/
        break;
    case 8:
        DesplayMarkSegment();/*显示不及格的学生成绩*/
        break;
    case 9:
        CompositorByTotalMark();/*按平均成绩排序*/
        break;
    case 10:
        SaveLinkToFile();/*保存数据后再退出*/
        free(headLink);
        break;
    default:
        exit(0);
    }
    DesplayMenu();/*递归调用*/
}
/************************************
函数功能:建立链表表头
输入参数:无
输出参数:无
************************************/
void CreateHeadLink(void)
{
    STUDENT *p;
    p=(STUDENT*)malloc(sizeof(STUDENT));
    headLink=p;
    p->next=NULL;
}
/************************************
函数功能:申请一个新结点,并将其初始化
输入参数:3
输出参数:无
返回值:p
************************************/
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->className[i]='\0';
    p->mark1=0.0;
    p->mark2=0.0;
    p->mark3=0.0;
    p->next=NULL;
    return p;
}
/************************************
函数功能:取得用户输入的学生信息
输入参数:3
输出参数:用户输入的学生信息
************************************/
void GetInformation(STUDENT *t)
{
    printf("请输入学生学号:\n");
    scanf("%s",t->studentNumber);
    printf("请输入学生姓名:\n");
    scanf("%s",t->studentName);
    printf("请输入该生所在班级:\n");
    scanf("%s",t->className);
    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;
}
/************************************
函数功能:根据用户输入的学生姓名显示该学生的信息
输入参数:2
输出参数:学生信息
************************************/
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班级\t成绩1\t成绩1\t成绩3\t总成绩\t平均成绩\n\n");
            DesplayOneNode(p);
            flag=1;
            break;
        }
        p=p->next;
    }
    if(!flag)
        printf("对不起,不存在姓名为 %s 的学生\n",studentName);
}
/************************************
函数功能:输出一个结点的信息
输入参数:无
输出参数:结点信息
************************************/
void DesplayOneNode(STUDENT *t)
{
    printf("%s\t",t->studentNumber);
    printf("%s\t",t->studentName);
    printf("%s\t",t->className);
    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);
}
/************************************
函数功能:根据用户输入的学号删除该学生
输入参数:4
输出参数:学生信息
************************************/
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");
}
/************************************
函数功能:显示所有学生的信息
输入参数:1
输出参数:所以学生信息
************************************/
void OutputInformation(void)
{
    STUDENT *p;
    p=headLink->next;
    if(p==NULL)
    {函数功能:根据输入的学期修改成绩
        printf("现在没有学生信息,请先输入学生信息\n\n");
        return;
    }
    printf("学号\t姓名\t班级\t成绩1\t成绩1\t成绩3\t总成绩\t平均成绩\n\n");
    while(p)
    {
        DesplayOneNode(p);
        p=p->next;
    }
}
/************************************
函数功能:根据输入的姓名修改成绩
输入参数:5
输出参数:学生信息
************************************/
void ChangeMarkByName(void)
{
    STUDENT *p;
    int a;
    char studentName[20];
    char flag=0;
    float mark1,mark2,mark3;
    p=headLink->next;
    printf("请输入学生班级:\n");
    scanf("%d",&a);
    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("对不起,不存在班级为 %s 的学生\n",studentName);
}
/************************************
函数功能:根据输入的学期修改成绩
输入参数:6
输出参数:学生信息
************************************/
void ChangeMarkByNumber(void)
{
    STUDENT *p;
    int b;
    char studentNumber[20];
    char flag=0;
    float mark1,mark2,mark3;
    p=headLink->next;
    printf("请输入学生所在学期:\n");
    scanf("%d",&b);
    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);
}
/************************************
函数功能:保存链表数据到文件中
输入参数:7
输出参数:无
************************************/
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 %s %f %f %f\n",p->studentNumber,p->studentName,p->className,p->mark1,p->mark2,p->mark3);
        p=p->next;
    }
    fclose(fp);
}
/************************************
函数功能:不及格学生成绩
输入参数:8
输出参数:不及格学生成绩
************************************/
void DesplayMarkSegment(void)
{
    STUDENT *p;
    int count=0;
    p=headLink->next;
    printf("60分以下(不及格)的学生成绩如下:\n");
    printf("学号\t姓名\t班级\t成绩1\t成绩1\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);
}
/************************************
函数功能:按平均成绩排序
输入参数:9
输出参数:排序
************************************/
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);
                strcpy(exchange.className,q->className);
                exchange.mark1=q->mark1;
                exchange.mark2=q->mark2;
                exchange.mark3=q->mark3;

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

3.main函数:

 
<pre name="code" class="cpp">#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<malloc.h>
#include<string.h>

int main()
{
    CreateHeadLink();
    ReadInfoFormFile();
    DesplayMenu();
}
运行结果:
<img src="https://img-blog.csdn.net/20151226103652206?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />

 

<img src="https://img-blog.csdn.net/20151226103728977?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
<img src="https://img-blog.csdn.net/20151226105435991?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
<img src="https://img-blog.csdn.net/20151226105450709?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
<img src="https://img-blog.csdn.net/20151226105517032?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />

<img src="https://img-blog.csdn.net/20151226105524789?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
 
 

  • 5
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 建立文件 (1)可以使用默认文件名或指定文件名将记录存储到文件 (2)设置适当的标志位,作为对记录进行操作的信息 (3)写同名文件将覆盖原来文件的内容 2.增加学生记录 (1) 可在已有记录后面追加新的记录  (2) 可以随时增加新的记录,它们仅保存在向量数组中 (3) 可以将一个文件读入,追加在已有记录之后 (4) 采取文件追加方式时,在没有保存到文件之前,将继续保持文件追加状态,以便实现连 续追加操作方式 3. 新建学生信息文件 (1) 用来新建学生信息记录 (2) 如果已经有记录存在,可以覆盖原记录或者在原记录后面追加,也可以将原有记录信息保存 到一个指定文件,然后重新建立记录 (3) 给出相应的提示信息 4. 显示记录 (1) 如果没有记录可供显示,给出提示信息 (2) 可以随时显示内存中的记录 (3) 显示表头 5. 文件存储 可以按默认名字或指定名字存储记录文件 6. 读取文件 (1) 可以按默认名字或指定名字将记录文件读入内存 (2) 可以将指定或默认文件追加到现有记录的尾部 (3) 可以将文件连续追加到现有记录并更新记录中的“名次”项 7. 删除记录 (1) 可以按“学号”、“姓名”或“名次”方式删除记录 (2) 标志将被删除的记录, 可以再次取消标志, 经确认后删除已经标志的记录 (3) 如果记录是空表, 删除时应给出提示信息并返回主菜单 (4) 如果没有要删除的信息, 输出“没有找到”的信息 (5) 更新其他记录的名次 (6) 删除操作仅限于内存, 只有执行存储操作时, 才能覆盖原记录 8. 修改记录 (1) 可以按“学号”、“姓名”或“名次”方式查找要修改的记录内容 (2) 给出将被修改记录的信息, 经确认后进行修改 (3) 如果记录已经是空表,应给出提示信息并返回主菜单 (4) 如果没有找到需要修改的信息, 输出“没有找到”的信息 (5) 更新其他记录的名次 (6) 修改操作仅限于内存, 只有执行存储操作时, 才能覆盖原记录 9. 查询记录 (1) 可以按“学号”、“姓名”或“名次”方式查询记录 (2) 能给出查询记录的信息 (3) 如果查询的信息不存在, 输出提示信息 10. 对记录进行排序 (1) 可以按”学号”进行升序和降序排列 (2) 可以按”姓名”进行升序和降序排列 (3) 可以按”名次”进行升序和降序排列 (4) 如果属于选择错误, 可以立即退出程序

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值