学生管理系统

来源:互联网 发布:淘宝netflix 编辑:程序博客网 时间:2024/06/06 17:32
     *Copyright  (c) 2015, 烟台大学计算机与控制工程学院 
        *All rights reserved
        *作者:李宗政
        *完成日期:2015年12月25日

        *版本号:V1.0

        *项目描述:该项目是一个对学生的成绩进行管理的系统,可以对学生的成绩进行增加,删除,更改等操作。

主函数

#include<stdio.h>#include<conio.h>#include<malloc.h>#include<string.h>#include "student.h"#include <string>#include "stdlib.h"#include <windows.h>#define USERNAME "lzz"#define PASSWORD "123456"STUDENT *headLink;//链表表头指针//以下是函数声明void ReadInfoFormFile(void);//w读文件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);//最终结果void login(void);int choose;/*用于接受用户的选择*//*主函数*/int main(){    login();    CreateHeadLink();    ReadInfoFormFile();    DesplayMenu();}void login(){    system("color fa");    char user[100];    char pass[100];    int counts = 0;    printf("\n");    printf("----------------------Login-----------------------\n");    printf("-----------欢迎进入学生成绩管理系统---------------\n");    printf("~请输入用户名:\n");    scanf("%s",user);    printf("~请输入密码:\n");    /* while((pass[counts++]=getch())!='\r')     {         putchar('*');     }*/    scanf("%s",pass);    //pass[counts] = '\0';    printf("%s %s\n%d %d",user,pass,strcmp(user,USERNAME),strcmp(pass,PASSWORD)==0);    if(strcmp(user,USERNAME)==0&&strcmp(pass,PASSWORD)==0)        Sleep(50)        ;    else        exit(1);}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);}void DesplayMenu(void)//函数功能:显示菜单,根据用户的输入 完成相应的功能{    system("cls");    STUDENT *p;    printf("--------------------请选择相应功能--------------------\n\n");    printf("|-------------- 1 按班级输出学生成绩单  --------------|\n");    printf("| --------------2 按姓名查询            ------------- |\n");    printf("| --------------3 增加学生              -------------|\n");    printf("| --------------4 删除学生              -------------|\n");    printf("| --------------5 按班级修改学生成绩    -------------|\n");   // printf("| --------------6 按学期修改学生成绩    -------------|\n");    printf("| --------------6 保存所有学生信息      -------------|\n");    printf("| --------------7 显示不及格学生成绩    -------------|\n");    printf("| --------------8 按平均成绩排序并输出  -------------|\n");    printf("| --------------9 退出            ------------------|\n\n");    printf("-----------请输入你的选择,Enter确定\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 6:        SaveLinkToFile();//保存数据        break;    case 7:        DesplayMarkSegment();//显示不及格的学生成绩        break;    case 8:        CompositorByTotalMark();//按平均成绩排序        break;    case 9:        SaveLinkToFile();//保存数据后再退出        free(headLink);        return ;        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->className[i]='\0';    p->mark1=0.0;    p->mark2=0.0;    p->mark3=0.0;    p->next=NULL;//数据初始化,保证不用的时候是0    return p;}void GetInformation(STUDENT *t)//函数功能:取得用户输入的学生信息{    printf("请输入学号:\n");    scanf("%s",t->studentNumber);    printf("请输入姓名:\n");    scanf("%s",t->studentName);    printf("请输入该生所在班级:\n");    scanf("%s",t->className);    printf("请输入高数成绩:\n");    scanf("%f",&(t->mark1));    printf("请输入英语成绩:\n");    scanf("%f",&(t->mark2));    printf("请输入体育成绩:\n");    scanf("%f",&(t->mark3));    getch();}/**//函数功能:在链表的结尾处增加一个节点@t*/void InsertOneNode(STUDENT *t){    STUDENT *p;    p=headLink;    while(p->next)    {        p=p->next;    }    p->next=t;//遍历链表,尾插法,知道P的下一位是空,p的下一位是t}void DesplayInfoBystudentName(void)//函数功能:根据用户输入的学生姓名显示该学生的信息{    system("cls");    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高数\t英语\t体育\t总成绩\t平均成绩\n\n");            DesplayOneNode(p);            flag=1;            break;        }        p=p->next;    }    if(!flag)        printf("对不起,不存在姓名为 %s 的学生\n",studentName);    getch();}void DesplayOneNode(STUDENT *t)//函数功能:输出一个结点的信息{    // system("cls");    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);}void DeleteNodeBystudentNumber(void)//函数功能:根据用户输入的学号删除该学生{    system("cls");    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");        getch();        return;    }    printf("成功删除\n");    getch();}void OutputInformation(void)//函数功能:显示所有学生的信息{    system("cls");    STUDENT *p;    p=headLink->next;    if(p==NULL)    {        printf("现在没有该学生信息,请先输入学生信息\n\n");        getch();        return;    }    printf("学号\t姓名\t班级\t高数\t英语\t体育\t总成绩\t平均成绩\n\n");    while(p)    {        DesplayOneNode(p);        p=p->next;    }    getch();}void ChangeMarkByName(void)//函数功能:根据输入的班级修改成绩{    system("cls");    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("请输入新的高数成绩:\n");            scanf("%f",&mark1);            printf("请输入新的英语成绩:\n");            scanf("%f",&mark2);            printf("请输入新的体育成绩:\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);    getch();}/*void ChangeMarkByNumber(void)//函数功能:根据输入的学期修改成绩{    system("cls");    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("请输入新的高数成绩:\n");            scanf("%f",&mark1);            printf("请输入新的英语成绩:\n");            scanf("%f",&mark2);            printf("请输入新的体育成绩:\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);    getch();}*/void SaveLinkToFile(void)//函数功能:保存链表数据到文件中{    system("cls");    STUDENT *p;    FILE *fp;    p=headLink->next;    if(p==NULL)    {        printf("现在没有学生信息,请先输入学生信息\n\n");        getch();        return;    }    fp=fopen("student.txt","w+");    if(!fp)    {        printf("文件不存在\n");        getch();        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);}void DesplayMarkSegment(void)//函数功能:不及格学生成绩{    system("cls");    STUDENT *p;    int count=0;    p=headLink->next;    printf("60分以下(不及格)的学生成绩如下:\n");    printf("学号\t姓名\t班级\t高数\t英语\t体育\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);    getch();}void CompositorByTotalMark(void)//函数功能:按平均成绩排序{    system("cls");    STUDENT exchange,*r,*p,*q;    r=headLink->next;    if(r==NULL)    {        printf("现在还没学生信息,请先输入学生信息\n");        getch();        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);//C语言风格字符串,用strcpy来交换    类似3个数交换                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->mark2;                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();}



头文件


#ifndef STUDENT_H_INCLUDED#define STUDENT_H_INCLUDEDtypedef struct STUDENT{char studentNumber[10];/*学生学号*/char studentName[20];/*学生姓名*/char className[20];/*班级名称*/char yearName[20];/*学期名称*/float mark1;/*高数成绩*/float mark2;/*英语成绩*/float mark3;/*体育    成绩*/struct STUDENT *next;}STUDENT;#endif // STUDENT_H_INCLUDED


运行结果



0 0
原创粉丝点击