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

本文详细介绍了进行课程设计时如何构建一个学生成绩管理系统,涵盖了系统的需求分析、功能模块设计以及关键代码实现,旨在帮助读者理解此类系统的设计思路和技术要点。
摘要由CSDN通过智能技术生成

问题描述及代码:

/********************************************** 
*版权所有 (C)2016,masai
* 
*文件名称:学生成绩管理系统 
*文件标识:无 
*内容摘要:实现学成成绩的输入、插入、删除、修改、排序和输出 
*其他内容:无 
*当前版本:Microsoft Visual C++ 6.0
*作者:马赛
*完成日期:2016.12.29
* 
*修改记录: 
*修改日期:20161229
*版本号:Microsoft Visual C++ 6.0
*修改人:马赛
*修改内容:添加创建成绩单 
*************************************************/ 
头文件:

//第一门成绩即为语文成绩  
//第二门成绩即为数学成绩  
//第三门成绩即为英语成绩  
  
#include<stdio.h>  
#include<conio.h>  
#include<malloc.h>  
#include<string.h>  
#include<string>  
#include<windows.h>  
#include<iostream> 
using namespace std;  
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 SaveLinkToFile(void);  //保存链表数据到文件中 
void DesplayMarkSegment(void);  //显示不及格学生成绩信息 
void CompositorByTotalMark(void);//按平均成绩排序 
各个函数的代码:

#include"mama.h" 
int choose;/*用于接受用户的选择*/  
/*主函数*/  
void welcome()//登录考试报名管理系统  
{    
    printf("\n");  
    printf("\n");  
    printf("\n");  
    printf("\n");  
    printf("\n");  
   printf("********************************************************************************\n");  
   printf("〓〓〓〓〓〓〓〓〓〓  ☆   学 生 成 绩 管 理 系  统     ☆  〓〓〓〓〓〓〓〓〓〓\n");   
   printf("〓〓〓〓〓〓〓★★★★★         ★★★★★★★         ★★★★★〓〓〓〓〓〓〓\n");   
    char username[20];  
    string passward;  
    printf("\n");  
    printf("\t\t\t请输入管理员姓名: ");  
	cin>>username;
    printf("\n");  
    printf("\t\t\t请输入您的密码:");  
    cin>>passward;  
    //  gets(passward);  
    while(passward!="123456")  
    {  
        printf("密码错误,请重新输入:\n");  
        cin>>passward;  
    }  
    system("cls");  
    printf("\n");  
    printf("\n");  
    printf("\n");  
    printf("\n");  
    printf("\n");  
    printf("\t\t*************************************\n");  
    printf("\t\t*  密码正确,请稍候... *\n");  
    printf("\t\t*************************************\n");  
    Sleep(3000);  
    system("cls");  
}  
  
void main()  
{  
    CreateHeadLink();  
    ReadInfoFormFile();  
    DesplayMenu();  
}  
  
  
/************************************ 
函数功能:从文件中读学生信息到链表中 
************************************/  
  
void ReadInfoFormFile(void)  
{  
    welcome();  
    FILE *fp;  
    STUDENT *p;  
    fp=fopen("student.txt","r");  
    if(!fp)  
    {  
        printf("文件不存在\n");  
        return;  
    }  
    p=MallocNode();  
    while(fscanf(fp,"%s%s%s%s%f%f%f",p->studentNumber,p->studentName,p->className,p->yearName,&(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("  〓〓〓〓〓〓〓〓〓★  ☆  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("           ****************************************************\n");   
    printf(">>请输入选择:");  
    scanf("%d",&choose);/*取得用户的选择*/  
    printf("\n");  
    switch(choose)  
    {  
	case 1:  
        p=MallocNode();/*先申请一个新结点*/  
        GetInformation(p);/*要求用户输入信息到新结点中*/  
        InsertOneNode(p);/*将新结点加到链表中*/  
        break; 
	case 2:  
        OutputInformation();/*显示学生的信息*/  
        break; 
	case 3:  
        DesplayInfoBystudentName(); /*查找学生信息*/ 
        break;  
    case 4:  
        ChangeMarkByName();/*根据用户输入的姓名修改学生成绩*/  
        break;  
    case 5:  
        SaveLinkToFile();/*保存数据*/  
        break; 
	case 6:  
        DeleteNodeBystudentNumber();/*根据用户输入的学号删除该学生*/  
        break;  
    case 7:  
        DesplayMarkSegment();/*显示不及格的学生成绩*/  
        break;  
    case 8:  
        CompositorByTotalMark();/*按平均成绩排序*/  
        break;  
    case 9:  
        SaveLinkToFile();/*保存数据后再退出*/  
        free(headLink);  
        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';  
    for(i=0;i<20;i++)  
        p->yearName[i]='\0';  
    p->mark1=0.0;  
    p->mark2=0.0;  
    p->mark3=0.0;  
    p->next=NULL;  
    return p;  
}  
  
/************************************ 
函数功能:取得用户输入的学生信息 
************************************/  
  
void GetInformation(STUDENT *t)  
{  
    printf("请输入学生学号:");  
    scanf("%s",t->studentNumber);  
    printf("请输入学生姓名:");  
    scanf("%s",t->studentName);  
    printf("请输入该生所在班级:");  
    scanf("%s",t->className);  
    printf("请输入学期:");  
    scanf("%s",t->yearName);  
    printf("请输入第1门课成绩:");  
    scanf("%f",&(t->mark1));         
    printf("请输入第2门课成绩:");  
    scanf("%f",&(t->mark2));  
    printf("请输入第3门课成绩:");  
    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("请输入学生姓名:");  
    scanf("%s",studentName);  
    while(p)  
    {  
        if(strcmp(p->studentName,studentName)==0)  
        {  
            printf("学号\t姓名\t班级\t学期\t成绩1\t成绩2\t成绩3\t总成绩\t平均成绩\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("%s\t",t->yearName);  
    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班级\t学期\t成绩1\t成绩2\t成绩3\t总成绩\t平均成绩\n");  
    while(p)  
    {  
        DesplayOneNode(p);  
        p=p->next;  
    }  
}  
  
/************************************ 
函数功能:根据输入的姓名修改成绩 
************************************/  
  
void ChangeMarkByName(void)  
{  
    STUDENT *p;    
    char studentName[20];  
    char flag=0;  
    float mark1,mark2,mark3;  
    p=headLink->next;  
    printf("请输入学生姓名:");  
    scanf("%s",studentName);  
    while(p)  
    {  
        if(strcmp(p->studentName,studentName)==0)  
        {  
            printf("请输入新的第1门成绩:");  
            scanf("%f",&mark1);  
            printf("请输入新的第2门成绩:");  
            scanf("%f",&mark2);  
            printf("请输入新的第3门成绩:");  
            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 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 %s %f %f %f\n",p->studentNumber,p->studentName,p->className,p->yearName,p->mark1,p->mark2,p->mark3);  
        p=p->next;  
    }  
    fclose(fp);  
    printf("学生信息保存成功!\n");  
}  
  
  
  
/************************************ 
函数功能:显示不及格学生成绩信息 
************************************/  
  
void DesplayMarkSegment(void)  
{  
    STUDENT *p;  
    int count=0;  
    p=headLink->next;  
    printf("60分以下(不及格)的学生成绩如下:\n");  
    printf("学号\t姓名\t班级\t学期\t成绩1\t成绩2\t成绩3\t总成绩\t平均成绩\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)/*实现排序*/  
    {  
        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();  
}  
运行结果:










评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值