C语言学生成绩管理系统设计

程序运行结果截图示例如下各图。

1 程序运行目录界面

2 程序查询模块1界面

3 程序查询模块2界面

图4 程序查询模块3界面

图5 程序查询模块4界面

图6 程序查询模块5界面

图7 程序查询模块6界面

图8 程序更改模块1界面

图9 程序更改模块2界面

  10 程序更改模块3界面

图11 程序计算模块1界面

12 程序计算模块2界面

13 程序排序模块1界面

图14 程序排序模块2界面

15 程序输入错误界面

16 程序输入界面

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>

//菜单函数声明
int menu(void);
int printmenu();
int foundmenu();
int celemenu();
int revisemenu();
int rankmenu();
int infomenu();

//系统主菜单
int menu()
{

	int menusele;
	printf("\n\n");
    printf("\t ---------------------- \n");
	printf("\t*    学生成绩管理:    *\n");
	printf("\t ---------------------- \n");
	printf("\t*  1.录入学生信息      *\n");
	printf("\t ---------------------- \n");
	printf("\t*  2.计算总分和平均分  *\n");
	printf("\t ---------------------- \n");
	printf("\t*  3.按学生成绩排序    *\n");
	printf("\t ---------------------- \n");
	printf("\t*  4.查询学生信息      *\n");
	printf("\t ---------------------- \n");
	printf("\t*  5.更改学生信息      *\n");
	printf("\t ---------------------- \n");
	printf("\t*  0.退出              *\n");
	printf("\t ---------------------- \n");
	printf("\t请输入您的选择:");
	do
    {
        scanf("%d",&menusele);
        getchar();
        if(menusele>5||menusele<0)
        printf("输入错误请重新输入:");
    }while(menusele>5||menusele<0);

	return menusele;
}

//计算功能菜单
int celemenu()
{
    int menusele;
    printf("\n\n");
    printf("\t -------------------------------- \n");
    printf("\t*    计算                        *\n");
    printf("\t -------------------------------- \n");
    printf("\t*  1.计算每个学生的总分和平均分  *\n");
    printf("\t -------------------------------- \n");
	printf("\t*  2.计算各个科目的平均分        *\n");
	printf("\t -------------------------------- \n");
	printf("\t*  0.返回上一层菜单              *\n");
	printf("\t -------------------------------- \n");
	printf("\t请输入您的选择:");
	do
    {
        scanf("%d",&menusele);
        getchar();
        if(menusele>2||menusele<0)
        printf("输入错误请重新输入:");
    }while(menusele>2||menusele<0);
	return  menusele;
}

//排序功能菜单
int rankmenu()
{
    int menusele;
    printf("\n\n");
    printf("\t --------------------\n");
    printf("\t*    排序            *\n");
    printf("\t --------------------\n");
    printf("\t*  1.按学生总分排序  *\n");
    printf("\t --------------------\n");
    printf("\t*  2.按学生学号排序  *\n");
    printf("\t --------------------\n");
	printf("\t*  3.按学生姓名排序  *\n");
	printf("\t --------------------\n");
	printf("\t*  0.返回上一层菜单  *\n");
	printf("\t --------------------\n");
	printf("\t请输入您的选择:");
	do
    {
        scanf("%d",&menusele);
        getchar();
        if(menusele>3||menusele<0)
        printf("输入错误请重新输入:");
    }while(menusele>3||menusele<0);
	return  menusele;
}
//查询功能菜单
int foundmenu()
{
    int menusele;
    printf("\n\n");
    printf("\t --------------------------------------\n");
    printf("\t*    查询                              *\n");
    printf("\t --------------------------------------\n");
    printf("\t*  1.查询所有学生成绩                  *\n");
    printf("\t --------------------------------------\n");
	printf("\t*  2.查询某个学生成绩                  *\n");
	printf("\t --------------------------------------\n");
	printf("\t*  3.查询总分小于等于某值的学生信息    *\n");
	printf("\t --------------------------------------\n");
	printf("\t*  4.查询总分大于等于某值得学生信息    *\n");
	printf("\t --------------------------------------\n");
	printf("\t*  5.查询平均分小于等于某值得学生信息  *\n");
	printf("\t --------------------------------------\n");
	printf("\t*  6.查询平均分大于等于某值得学生信息  *\n");
	printf("\t --------------------------------------\n");
	printf("\t*  0.返回上一层菜单                    *\n");
	printf("\t --------------------------------------\n");
	printf("\t请输入您的选择:");
	do
    {
        scanf("%d",&menusele);
        getchar();
        if(menusele>6||menusele<0)
        printf("输入错误请重新输入:");
    }while(menusele>6||menusele<0);
	return  menusele;
}
//更改信息功能菜单
int revisemenu()
{
    int menusele;
    printf("\n\n");
    printf("\t --------------------\n");
    printf("\t*    更改            *\n");
    printf("\t --------------------\n");
    printf("\t*  1.增加学生信息    *\n");
    printf("\t --------------------\n");
	printf("\t*  2.删除某学生信息  *\n");
	printf("\t --------------------\n");
	printf("\t*  3.修改某学生信息  *\n");
	printf("\t --------------------\n");
	printf("\t*  0.返回上一层菜单  *\n");
	printf("\t --------------------\n");
	printf("\t请输入您的选择:");
	do
    {
        scanf("%d",&menusele);
        getchar();
        if(menusele>3||menusele<0)
        printf("输入错误请重新输入:");
    }while(menusele>3||menusele<0);
	return  menusele;
}

int infomenu()
{
	int menusele;
	printf("\n\n");
	printf("\t --------------\n");
	printf("\t*  1.学生学号  *\n");
	printf("\t --------------\n");
	printf("\t*  2.学生姓名  *\n");
	printf("\t --------------\n");
	printf("\t*  3.大学语文  *\n");
	printf("\t --------------\n");
	printf("\t*  4.高等数学  *\n");
	printf("\t --------------\n");
	printf("\t*  5.大学英语  *\n");
	printf("\t --------------\n");
	printf("\t*  6.总分      *\n");
	printf("\t --------------\n");
	printf("\t*  7.平均分    *\n");
	printf("\t --------------\n");
	printf("\t*  0.退出      *\n");
	printf("\t --------------\n");
	printf("\t请输入您的选择:");
	do
    {
        scanf("%d",&menusele);
        getchar();
        if(menusele>7||menusele<0)
        printf("输入错误请重新输入:");
    }while(menusele>7||menusele<0);

	return menusele;
}

//定义结构体
typedef struct student
{
	//数据域
	char num[20];
	char name[20];
	float score1;
	float score2;
	float score3;
	float total;
	float ave;
	//指针域
	struct student *next;
}STUDENT;
STUDENT *readList(int n);
void celestu(STUDENT *head);
STUDENT *celesbj(STUDENT *head);
STUDENT *foundstu(STUDENT *head);
STUDENT *revise(STUDENT *head,int c);
STUDENT printList(STUDENT *head,int c);

//输入
//输入所有学生信息
STUDENT *readList(int n)
{
    int i;
	STUDENT *head,*p,*t;
	//创建头结点
	head=(STUDENT *)malloc(sizeof(STUDENT));
	//检验头结点是否创建成功
	if(head==NULL)
	{
		printf("头结点创建失败\n");
		exit(0);
	}
	//输入头结点数据
	head->next=NULL;
	p=head;
	//创建新的节点
	for(i=1;i<=n;i++)
	{
	t=(STUDENT *)malloc(sizeof(STUDENT));
	//检验新结点是否创建成功
	if(t==NULL)
	{
		printf("该结点创建失败");
		exit(0);
	}
	//输入新结点的数据
	printf("请按顺序输入第%d位学生的学号、姓名、语文成绩、数学成绩、英语成绩:",i);
	scanf("%s%s%f%f%f",t->num,t->name,&t->score1,&t->score2,&t->score3);
	//将该新结点接入链表
	t->next=NULL;
	p->next=t;
	p=t;
	}

	return(head);//返回链表头指针
}
//计算
//计算每个学生的总分和平均分
void celestu(STUDENT *head)
{
    STUDENT *t;
    t=head;
    while(t->next!=NULL)
    {
        t=t->next;
        t->total=t->score1+t->score2+t->score3;
        t->ave=t->total/3;
    }
}
//计算各个科目的平均分
STUDENT *celesbj(STUDENT *head)
{
    STUDENT *t,*p;
    int k=0;
    t=(STUDENT *)malloc(sizeof(STUDENT));//新增结点用于存储各科平均分
    if(t==NULL)
	{
		printf("头结点创建失败\n");
		exit(0);
	}
	p=head;
    strcpy(t->name,"平均分");
    strcpy(t->num,"     \\\\ ");
    t->score1=t->score2=t->score3=0;
    while(p->next!=NULL)
    {
        p=p->next;
        t->score1=t->score1+p->score1;
        t->score2=t->score2+p->score2;
        t->score3=t->score3+p->score3;
        k++;
    }
    t->score1=t->score1/k;
    t->score2=t->score2/k;
    t->score3=t->score3/k;
    t->total=0;
    t->ave=0;
    return (t);
}


//排序

    STUDENT *rank(STUDENT *head,int c)
    {
        STUDENT *f=NULL,*t=NULL,*max=NULL,*maxbf=NULL,*p,*h;
        float m;
        h=head->next;
        while(h!=NULL)
        {
            for(p=h,max=h;p->next!=NULL;p=p->next)
            {
                if(c==32)
                    m=strcmp(max->num,p->next->num);//按学号排序
                else if(c==33)
                    m=strcmp(max->name,p->next->name);//按姓名排序
                else if(c==31||c==131)
                    m=p->next->total-max->total;
                if(m>0)
                {
                    maxbf=p;
                    max=p->next;
                }
            }
            if(f==NULL)
            {
                f=max;
                t=max;
            }
            else
            {
                t->next=max;
                t=max;
            }
            if(max==h)
            {
                h=t->next;
            }
            else
            {
                maxbf->next=max->next;
            }
        }
        t->next=NULL;
        head->next=f;
        return head;
    }

//查询
//查询某个学生成绩
STUDENT *foundstu(STUDENT *head)
{
    int c=1;
    STUDENT *t;
    char num[20];
    printf("请输入该学生学号:");
    scanf("%s",num);
    t=head;
    while(t->next!=NULL)
    {
        t=t->next;
        c=strcmp(num,t->num);//比较学号
        if(c==0)
        {
            return (t);
        }
    }
    if(c!=0)
        {
            printf("找不到该学生信息\n");
            return NULL;
        }
}

//更改
STUDENT *revise(STUDENT *head,int c)
{
    STUDENT *t,*p;
    float *m;char *q;
    int n;
    char num[13]="1";
    if(c==51)//增加学生信息
    {
        printf("请输入需要增加的学生人数:");
        scanf("%d",&n);
        t=readList(n);
        p=t;
        while(p->next!=NULL)
        {
            p=p->next;
        }
        p->next=head->next;
        head->next=t->next;
    }
    else if(c==52||c==53||c==153||c==152)//修改和删除学生信息
    {
        t=head;
        p=head;

        while(1)
        {
            if(c==53)
            printf("请输入需要修改信息的学生学号");
            else if(c==52)
            printf("请输入需要删除信息的学生学号");
            printf("(输入0退出更改):");
            scanf("%s",num);//录入需要操作的学生学号
            if(strcmp(num,"0")==0)
                break;
            while(t->next!=NULL)
            {
                t=t->next;
                if(strcmp(num,t->num)==0)//按学号搜索学生信息
                {
                    if(c==52)//删除
                    {
                        p->next=t->next;
                        free(t);//释放被删除学生信息的内存
                    }
                    else if(c==53||c==153)//修改
                    {
                        c=c+200;
                        printList(t,c);
                        printf("以下为项目的序号:\n");
                        n=infomenu();
                        switch(n)
                        {
                            case 1:
                                q=t->num;
                                break;
                            case 2:
                                q=t->name;
                                break;
                            case 3:
                                m=&t->score1;
                                break;
                            case 4:
                                m=&t->score2;
                                break;
                            case 5:
                                m=&t->score3;
                                break;
                            case 6:
                                m=&t->total;
                                break;
                            case 7:
                                m=&t->ave;
                                break;
                            case 0:
                                break;
                        }
                        printf("请输入修改后的信息:");
                        if(n!=0)
                        {
                            if(n==1||n==2)
                            {
                                scanf("%s",p);
                                getchar();
                            }
                            else if(n>2)
                            {
                                scanf("%f",m);
                                getchar();
                            }
                            printf("修改后该学生信息如下:\n");
                            printList(t,c);
                        }
                        else if(n==0)
                            break;
                    }
                }
                p=p->next;
            }
        }

    }
    return head;
}
//输出
STUDENT printList(STUDENT *head,int c)
{
    STUDENT *t;
    t=head;
    int n=0;
    //输出所有学生信息
    if(c==11||c==21||c==41||c==32||c==33||c==51||c==52||c==53)
    {
        t=head;
        printf("学生学号\t学生姓名\t大学语文\t高等数学\t大学英语\n");
        while(t->next!=NULL)
        {
            t=t->next;
            printf("%8s\t%8s\t%8.1f\t%8.1f\t%8.1f\n",t->num,t->name,t->score1,t->score2,t->score3);
        }
    }
    else if(c==121||c==122||c==31||c==132||c==133||c==141||c==152||c==153)
    {
        t=head;
        printf("学生学号\t学生姓名\t大学语文\t高等数学\t大学英语\t    总分\t  平均分\n");
        while(t->next!=NULL)
        {
            t=t->next;
            printf("%8s\t%8s\t%8.1f\t%8.1f\t%8.1f\t%8.1f\t%8.1f\n",t->num,t->name,t->score1,t->score2,t->score3,t->total,t->ave);
        }
    }
    //输出某一学生信息
    else if(c==22||c==42||c==241||c==253)
    {//未计算总分平均分
     if(c!=241)printf("学生学号\t学生姓名\t大学语文\t高等数学\t大学英语\n");
     printf("%8s\t%8s\t%8.1f\t%8.1f\t%8.1f\n",t->num,t->name,t->score1,t->score2,t->score3);
    }
    else if(c==42||c==53||c==142||c==353)
    {//已计算总分平均分
        printf("学生学号\t学生姓名\t大学语文\t高等数学\t大学英语\t    总分\t  平均分\n");
        printf("%8s\t%8s\t%8.1f\t%8.1f\t%8.1f\t%8.1f\t%8.1f\n",t->num,t->name,t->score1,t->score2,t->score3,t->total,t->ave);
    }
    //输出总分或平均分在某一范围内的学生信息
    else if(c==43||c==44||c==45||c==46||c==143||c==144||c==145||c==146)
    {
        int X;
        printf("请输入X的值:");
        scanf("%d",&X);
        printf("学生学号\t学生姓名\t大学语文\t高等数学\t大学英语\t    总分\t  平均分\n");
        if(c==43||c==44||c==45||c==46)
            celestu(head);
        t=head;
        while(t->next!=NULL)
        {
            t=t->next;
            if(c==43||c==143)//输出总分小于某值得学生信息
            {
                if(t->total<=X)
                {
                    n++;
                    printf("%8s\t%8s\t%8.1f\t%8.1f\t%8.1f\t%8.1f\t%8.1f\n",t->num,t->name,t->score1,t->score2,t->score3,t->total,t->ave);
                }
            }
            else if(c==44||c==144)//输出总分大于某值得学生信息
            {
                if(t->total>=X)
                {
                    n++;
                    printf("%8s\t%8s\t%8.1f\t%8.1f\t%8.1f\t%8.1f\t%8.1f\n",t->num,t->name,t->score1,t->score2,t->score3,t->total,t->ave);
                }

            }
            else if(c==45||c==145)//输出平均分小于某值得学生信息
            {
                if(t->ave<=X)
                {
                    n++;
                    printf("%8s\t%8s\t%8.1f\t%8.1f\t%8.1f\t%8.1f\t%8.1f\n",t->num,t->name,t->score1,t->score2,t->score3,t->total,t->ave);
                }

            }
            else if(c==46||c==146)//输出平均分大于某值得学生信息
            {
                if(t->ave>=X)
                {
                    printf("%8s\t%8s\t%8.1f\t%8.1f\t%8.1f\t%8.1f\t%8.1f\n",t->num,t->name,t->score1,t->score2,t->score3,t->total,t->ave);
                }

            }
        }

    }
}

void main()
{
    int ch,ch1,c=0,d=0;
    STUDENT *head=NULL,*t=NULL,*least=NULL,*p=NULL;
    int n;
    printf("\t\t\t\t\t******************************\n");
    printf("\t\t\t\t\t*                            *\n");
    printf("\t\t\t\t\t*    欢迎进入学生管理系统    *\n");
    printf("\t\t\t\t\t*                            *\n");
    printf("\t\t\t\t\t******************************\n");
    printf("请输入学生总人数:");
    scanf("%d",&n);
    getchar();
    while(1)
    {
        ch=menu();
        switch(ch)
        {
        case 1:
            printf("输入\n");
            head=readList(n);
            break;
        case 2:
            ch1=celemenu();
            switch(ch1)
            {
            case 1:
                printf("计算每个学生的总分和平均分\n");
                celestu(head);
                c=100;
                printList(head,ch*10+ch1+c);
                break;
            case 2:
                printf("计算各个科目的平均分\n");
                least=celesbj(head);
                if(least!=NULL)printList(least,ch*10+ch1);
                break;
            case 0:
                break;
            }
            break;
        case 3:

            ch1=rankmenu();
            switch(ch1)
            {
            case 1:
                printf("按学生总分排序\n");
                if(c==0)
                {
                    celestu(head);
                    c=100;
                }
                head=rank(head,ch*10+ch1+c);
                printList(head,ch*10+ch1);
                break;
            case 2:
                printf("按学生学号排序\n");
                head=rank(head,ch*10+ch1);
                printList(head,ch*10+ch1+c);
                break;
            case 3:
                printf("按学生姓名排序\n");
                head=rank(head,ch*10+ch1);
                printList(head,ch*10+ch1+c);
                break;
            case 0:
                break;
            }
            break;
        case 4:
            printf("查询\n");
            ch1=foundmenu();
            switch(ch1)
            {
            case 1:
                printf("查询所有学生成绩\n");
                printList(head,ch*10+ch1+c);
                if(least!=NULL)
                    printList(least,ch*10+ch1+200);
                break;
            case 2:
                printf("查询某个学生成绩\n");
                t=foundstu(head);
                if(t!=NULL)printList(t,ch*10+ch1+c);
                t=NULL;
                break;
            case 3:
                printf("查询总分小于等于某值的学生信息\n");
                printList(head,ch*10+ch1+c);
                break;
            case 4:
                printf("查询总分大于等于某值的学生信息\n");
                printList(head,ch*10+ch1+c);
                break;
            case 5:
                printf("查询平均分小于等于某值的学生信息\n");
                printList(head,ch*10+ch1+c);
                break;
            case 6:
                printf("查询平均分大于等于某值的学生信息\n");
                printList(head,ch*10+ch1+c);
                break;
            case 0:
                break;
            }
            break;
        case 5:
            printf("更改\n");
            ch1=revisemenu();
            switch(ch1)
            {
            case 1:
                printf("增加学生信息\n");
                head=revise(head,ch*10+ch1);
                printList(head,ch*10+ch1);
                c=0;
                break;
            case 2:
            	
                printf("删除学生信息\n");
                head=revise(head,ch*10+ch1+c);
                printList(head,ch*10+ch1+c);
                break;
            case 3:
                printf("修改学生信息\n");
                head=revise(head,ch*10+ch1+c);
                break;
            case 0:
                break;
            }
            break;
        case 0:
            printf("退出\n");
            exit(0);
            break;
        }
    }
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值