今天,我来分享我写的一个简易的学生管理系统。
学生管理系统主要包括学生成绩输入、列出成绩表、计算平均分、按平均分排序、按学号搜索和菜单模块。采用make工具来管理文件,make工具的好处就是它可以根据文件更新的时间戳来查找到更改的文件,且只对修改的文件进行编译,可以大大减少编译的时间。
下面的代码是学生管理系统的主函数,运行程序后,程序中并没有存储学生的相关信息,所以当输入别的命令,都会提示需要先输入命令‘T’来录入学生的成绩。当录入成绩后,就可以执行其他的模块了。
#include<stdio.h>
#include<stdlib.h>
#include"common.h"
#include"Average.h"
#include"Help.h"
#include"List.h"
#include"Search.h"
#include"Sort.h"
#include"Type.h"
int n=0;//全局变量n来表示录入成绩学生的人数
int main(int argc, char const *argv[])
{
struct student stu[32]={};
char order;
printf("***********************************\n");
printf("* 学生成绩管理系统————帮助菜单 *\n");
printf("***********************************\n");
printf("* H=显示帮助菜单 *\n");
printf("* T=成绩录入 *\n");
printf("* A=计算学生平均分 *\n");
printf("* L=列出成绩表 *\n");
printf("* P=按平均成绩由高到低排序 *\n");
printf("* S=按学号查询学生成绩 *\n");
printf("* C=清屏 *\n");
printf("* Q=退出系统 *\n");
printf("***********************************\n");
printf("* Copyright <c> 2023.02.12 By sun*\n");
printf("***********************************\n");
printf("\n");
while(1)
{
printf("请输入命令:");
scanf(" %c",&order);
if(n==0&&order!='T')
{
printf("成绩表为空!请先使用命令T录入学生成绩。\n");
}
switch(order)
{
case 'H':Help();break;//帮助菜单
case 'T':Type(stu);break;//录入成绩
case 'A':Average(stu);break;//计算平均分
case 'L':List(stu);break;//输出成绩
case 'P':Sort(stu);break;//平均分由高到低排序
case 'S':Search(stu);break;//查询学生成绩
case 'C':system("clear");break;//清屏
case 'Q':return 0;break;
default:printf("输入错误!\n");break;
}
}
return 0;
}
接下来将介绍录入学生的信息,分别有学生ID、语文成绩、数学成绩、外语成绩、平均分。具体请看下图。
#ifndef __COMMON_H__
#define __COMMON_H__
struct student
{
int Id;
int Chinese;
int Math;
int English;
float Aver;
};
#endif
然后是录入成绩模块,此系统学生的ID是按顺序自动生成的,输入时不需要输入ID和平均分。
#include<stdio.h>
#include"common.h"
extern int n;
void Type(struct student *p)//录入成绩
{
int i,num;
int a;
printf("请输入学生人数:");
scanf("%d",&num);
printf("请输入%d名学生的三门课成绩:\n",num);
printf("学号 语文 数学 外语\n");
for(i=0;i<num;i++)
{
a=n+i+1;
printf("%d ",a);
(p+n+i)->Id=a;
scanf("%d %d %d",&((p+n+i)->Chinese),&((p+n+i)->Math),&((p+n+i)->English));
}
n=num+n;
}
列出成绩表模块:
#include<stdio.h>
#include"common.h"
extern int n;
void List(struct student *p)//输出成绩
{
int i;
printf("学生成绩如下:\n");
printf("学号 语文 数学 外语 平均分\n");
for(i=0;i<n;i++)
{
printf("%d %d %d %d %.1f \n",(p+i)->Id,(p+i)->Chinese,(p+i)->Math,(p+i)->English,(p+i)->Aver);
}
}
计算平均分模块:
#include<stdio.h>
#include"common.h"
void Average(struct student *p)//计算平均分
{
int i=0;
while((p+i)->Id!=0)
{
((p+i)->Aver)=((p+i)->Chinese+(p+i)->Math+(p+i)->English)/3;
i++;
}
printf("平均分已计算。请使用命令L查看。\n");
}
接下来是按照平均分进行由高到低进行排序:
#include<stdio.h>
#include"common.h"
extern int n;
void Sort(struct student *p)//平均分由高到低排序
{
int i,j;
for(i=0;i<n-1;i++)
{
for(j=0;j<n-1-i;j++)
{
if((p+j)->Aver<(p+j+1)->Aver)
{
*(p+31)=*(p+j);
*(p+j)=*(p+j+1);
*(p+j+1)=*(p+31);
}
}
}
printf("完成排序。请使用命令L查看。\n");
}
按ID进行搜索模块:
#include<stdio.h>
#include"common.h"
extern int n;
void Search(struct student *p)//根据学号查询学生成绩
{
int a;
printf("请输入要查询的学生学号:");
scanf("%d",&a);
printf("学号 语文 数学 外语 平均分\n");
for(int i=0;i<n;i++){
if((p+i)->Id==a)
printf("%d %d %d %d %.1f \n",(p+i)->Id,(p+i)->Chinese,(p+i)->Math,(p+i)->English,(p+i)->Aver);
}
}
菜单模块:
#include<stdio.h>
void Help()//帮助菜单
{
printf("***********************************\n");
printf("* 学生成绩管理系统————帮助菜单 *\n");
printf("***********************************\n");
printf("* H=显示帮助菜单 *\n");
printf("* T=成绩录入 *\n");
printf("* A=计算学生平均分 *\n");
printf("* L=列出成绩表 *\n");
printf("* P=按平均成绩由高到低排序 *\n");
printf("* S=按学号查询学生成绩 *\n");
printf("* C=清屏 *\n");
printf("* Q=退出系统 *\n");
printf("***********************************\n");
printf("* Copyright <c> 2023.02.12 By sun*\n");
printf("***********************************\n");
printf("\n");
}
Makefile文件:
CC=gcc
OBJS=main.o Average.o Help.o List.o Search.o Sort.o Type.o
CFLAGS=-c -g -O
go:$(OBJS)
$(CC) $(OBJS) -o $@
$(OBJS):%.o:%.c
$(CC) $(CFLAGS) $^ -o $@
.PHONY:clean
clean:
rm *.o
下图即为测试运行的部分结果: