课程设计之学生成绩管理系统改良版

问题描述及代码:

/**********************************************
*版权所有 (C)2015,yangzheng
*
*文件名称:学生成绩管理系统
*文件标识:无
*内容摘要:实现学成成绩的输入、插入、删除、修改、排序和输出
*其他内容:无
*当前版本:codeblocks
*作者:杨征
*完成日期:2015.12.25
*
*修改记录:
*修改日期:2015125
*版本号:codeblocks
*修改人:杨征
*修改内容:添加创建成绩单
*************************************************/

头文件:

<pre name="code" class="cpp">#include<stdlib.h>
#include<stdio.h>
#include<conio.h>
#include<malloc.h>
#include<string.h>
#include<iostream>
using namespace std;
typedef struct STUDENT
{
    char Num[10];/*学生学号*/
    char Name[20];/*学生姓名*/
    char className[20];/*班级名称*/
    char yearName[20];/*学期名称*/
    float mark1;/*第1门成绩*/
    float mark2;/*第2门成绩*/
    float mark3;/*第3门成绩*/
    struct STUDENT *next;
} STUDENT;
/*以下是函数声明*/
void chuangjian();
void Read();//从文件中读学生信息到链表中
void Menu();//显示菜单,根据用户的输入
void Create();//建立链表表头
STUDENT *MallocNode();//申请一个新结点,并将其初始化
void Input(STUDENT *t);//在链表的结尾处增加一个结点
void Output();//显示所有学生的信息
void DesplayInfoBystudentName();//根据用户输入的学生姓名显示该学生的信息
void shuchujiedian(STUDENT *t);//输出一个结点的信息
void Insert(STUDENT *t);//在链表的结尾处增加一个结点
void DeleteNodeBystudentNumber();//根据用户输入的学号删除该学生
void ChangeMarkByName();//根据输入的班级修改成绩
void ChangeMarkByNumber();//根据输入的学期修改成绩
void Save();//保存链表数据到文件中
void DesplayMarkSegment();//不及格学生成绩
void paixu();//按平均成绩排序

#endif // ST_H_INCLUDED





各个函数的代码

<pre name="code" class="cpp">#include"st.h"
int choose;/*用于接受用户的选择*/
STUDENT *headLink;/*链表表头指针*/
/************************************
* 功能描述:从文件中读学生信息到链表中
* 输入参数:无
* 输出参数:无
************************************/
void Read(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->Num,p->Name,p->className,&(p->mark1),&(p->mark2),&(p->mark3))>0)
    {
        Insert(p);
        p=MallocNode();
    }
    fclose(fp);
}
/************************************
* 功能描述:显示菜单,根据用户的输入
*            完成相应的功能
* 输入参数:你要选择的功能的序号
* 输出参数:选择的功能
************************************/
void Menu()
{
    STUDENT *p;
    printf("-------请选择相应功能------------\n\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\n");
    scanf("%d",&choose);/*取得用户的选择*/
    switch(choose)
    {
    case 1:
        system("cls");
        chuangjian();
        getch();
        break;
    case 2:
        system("cls");
        Output();/*显示所有学生的信息*/
        getch();
        break;
    case 3:
        system("cls");
        DesplayInfoBystudentName();//根据用户输入的学生姓名显示该学生的信息
        break;
    case 4:
        system("cls");
        p=MallocNode();/*先申请一个新结点*/
        Input(p);/*要求用户输入信息到新结点中*/
        Insert(p);/*将新结点加到链表中*/
        getch();
        break;
    case 5:
        system("cls");
        DeleteNodeBystudentNumber();/*根据用户输入的学号删除该学生*/
        getch();
        break;
    case 6:
        system("cls");
        ChangeMarkByName();/*根据用户输入的姓名修改学生成绩*/
        getch();
        break;
    case 7:
        system("cls");
        ChangeMarkByNumber();/*根据用户输入的学号修改学生成绩*/
        getch();
        break;
    case 8:
        system("cls");
        Save();/*保存数据*/
        break;
    case 9:
        system("cls");
        DesplayMarkSegment();/*显示不及格的学生成绩*/
        getch();
        break;
    case 10:
        system("cls");
        paixu();/*按平均成绩排序*/
        getch();
        break;
    case 11:
        system("cls");
        Save();/*保存数据后再退出*/
        free(headLink);
        break;
    default:
        break;
    }
    Menu();/*递归调用*/
    Save();
}
void chuangjian()//创建学生成绩单
{
    int a,i;
    printf("输入学生的个数:\n");
    scanf("%d",&a);
    for (i=0; i<a; i++)
    {
        STUDENT *p,*q;
        p= (STUDENT*)malloc(sizeof(STUDENT));
        printf("输入第%d个学生的信息:\n",i+1);
        printf("请输入:学号\t姓名\t班级\t成绩1\t成绩1\t成绩3\n\n");
        scanf("%s %s %s %d %d %d",p->Num,p->Name,&p->className,&p->mark1,&p->mark2,&p->mark3);
        p->next=NULL;
        q->next=p;
        q=q->next;
    }

}
/************************************
* 功能描述:建立链表表头
* 输入参数:无
* 输出参数:无
************************************/
void Create(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->Num[i]='\0';
    for(i=0; i<20; i++)
        p->Name[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;
}
/************************************
* 功能描述:取得用户输入的学生信息
* 输入参数:学生的姓名、学号、班级、
*            成绩1、成绩2、成绩3
* 输出参数:输出学生的姓名、学号、
*            班级、成绩1、成绩2、成绩3
************************************/
void Input(STUDENT *t)
{
    printf("请输入学生学号:\n");
    scanf("%s",t->Num);
    printf("请输入学生姓名:\n");
    scanf("%s",t->Name);
    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 Insert(STUDENT *t)
{
    STUDENT *p;
    p=headLink;
    while(p->next)
    {
        p=p->next;
    }
    p->next=t;
}
/************************************
* 功能描述:根据用户输入的学生姓名显
*             示该学生的信息
* 输入参数:学生姓名
* 输出参数:输出学生的姓名、学号、
*            班级、成绩1、成绩2、成绩3
************************************/
void DesplayInfoBystudentName(void)
{
    STUDENT *p;
    char studentName[20];
    char flag=0;
    p=headLink->next;
    printf("请输入学生姓名:\n");
    scanf("%s",studentName);
    while(p)
    {
        if(strcmp(p->Name,studentName)==0)
        {
            printf("学号\t姓名\t班级\t成绩1\t成绩1\t成绩3\t总成绩\t平均成绩\n\n");
            shuchujiedian(p);
            flag=1;
            break;
        }
        p=p->next;
    }
    if(!flag)
        printf("对不起,不存在姓名为 %s 的学生\n",studentName);
}
/************************************
* 功能描述:输出一个结点的信息
* 输入参数:无
* 输出参数:输出学生的姓名、学号、
*            班级、成绩1、成绩2、成绩3
************************************/
void shuchujiedian(STUDENT *t)
{
    printf("%s\t",t->Num);
    printf("%s\t",t->Name);
    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);
}
/************************************
* 功能描述:根据用户输入的学号删除该学生
* 输入参数:学生学号
* 输出参数:无
************************************/
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->Num,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、成绩2、成绩3
************************************/
void Output(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)
    {
        shuchujiedian(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("%d",&a);
    printf("请输入学生姓名:\n");
    scanf("%s",studentName);
    while(p)
    {
        if(strcmp(p->Name,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);
}
/************************************
* 功能描述:根据输入的学期修改成绩
* 输入参数:学期、姓名
* 输出参数:无
************************************/
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->Num,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 Save(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->Num,p->Name,p->className,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班级\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++;
            shuchujiedian(p);
        }
        p=p->next;
    }
    printf("不及格的学生一共有%d人\n",count);
}
/************************************
* 功能描述:按平均成绩排序
* 输入参数:无
* 输出参数:无
************************************/
void paixu(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.Num,q->Num);/*先复制q结点信息到exchange*/
                strcpy(exchange.Name,q->Name);
                strcpy(exchange.className,q->className);
                exchange.mark1=q->mark1;
                exchange.mark2=q->mark2;
                exchange.mark3=q->mark3;

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


 main.cpp

<pre name="code" class="cpp">#include"st.h"
/************************************
* 功能描述:主函数
* 输入参数:无
* 输出参数:无
************************************/
int  main()
{
    Create();
    Menu();
    Read();
}

 运行结果:

课程设计之学生成绩管理系统改良版_第1张图片

课程设计之学生成绩管理系统改良版_第2张图片

课程设计之学生成绩管理系统改良版_第3张图片

课程设计之学生成绩管理系统改良版_第4张图片

课程设计之学生成绩管理系统改良版_第5张图片

课程设计之学生成绩管理系统改良版_第6张图片





你可能感兴趣的:(课程设计之学生成绩管理系统改良版)