本文章介绍了一个通过C语言实现的一个简单的学生管理系统,该系统要是使用结构体数组来管理学生成绩数据的,通过该系统的练习能够对结构体的相关知识有更好的理解,提高逻辑思维能力。
系统运行,打开如下界面。列出系统帮助菜单(即命令菜单),提示输入命令
开始时还没有录入成绩,所以输入命令 L 也无法列出成绩。应提示“成绩表为空!请先使用命令 T 录入学生成绩。” 同理,当输入其他的成绩处理命令时也作相应的处理。
输入命令 T,调用Type子函数录入成绩。界面提示输入学生人数
输入3,提示输入3名学生的3门课成绩,列出成绩单的表头“学号 语文 数学 英语”,同时提示学号:1
输入1号学生的3门课成绩,用空格间隔,回车结束。提示学号:2
输入2号学生的3门课成绩,用空格间隔,回车结束。提示学号:3
输入3号学生的3门课成绩,用空格间隔,回车结束。Type子函数调用结束,返回。提示输入命令。
输入命令 L ,调用List子函数输出成绩表。List子函数调用结束,返回。提示输入命令。
输入命令 A ,调用Average子函数计算平均分,提示“平均分已计算。请使用命令L查看。” Average子函数调用结束,返回。提示输入命令。
输入命令 L ,调用List子函数输出成绩表。List子函数调用结束,返回。提示输入命令
输入命令 P ,调用Sort子函数将各学生记录按平均分由高到低排序,提示“完成排序。请使用命令L查看。” Sort子函数调用结束,返回。提示输入命令。
输入命令 L ,调用List子函数输出成绩表。List子函数调用结束,返回。提示输入命令。
输入命令 S ,调用Search子函数查询学生成绩,提示“输入要查询的学生学号”。
输入 2 找到2号学生的成绩并输出。Search子函数调用结束,返回。提示输入命令。
输入命令C 执行清屏函数语句system(“clear”);
输入命令H 调用Help子函数显示帮助菜单。Help子函数调用结束,返回。提示输入命令。
输入命令Q 则退出系统。
main.c
#include
#include
struct student
{
int num;
float chinese;
float math;
float waiyu;
float average;
};
/**********函数声明*********/
void Help();//帮助菜单显示函数
void Type(struct student *pstu);//成绩录入
void List(struct student *pstu);//输出成绩表
void Averange(struct student *pstu);//平均分
void Sort(struct student *pstu);//按平均分由高到底排序
void Search(struct student *pstu); //查询学生成绩
void Clear(); //清屏
int manNum = 0;//学生数
int main()
{
char opt; //命令变量
Help();//首次运行显示帮助菜单
struct student stu[10];//定义结构体数组
while (1)
{
printf("\n");
printf("请输入命令=");
if(scanf("%c",&opt)){
//printf("scanf出现EOF错误!\n");
getchar();//吃掉空格
}
switch (opt)
{
case 'H':Help();break;//显示帮助菜单
case 'T':Type(stu);break;//成绩录入
case 'A':Averange(stu);;break;
case 'L':List(stu);break;//列出成绩表
case 'P':Sort(stu);break;//按平均成绩由高到低拍排序
case 'S':Search(stu);break;//按学号查询学生成绩
case 'C':Clear();break;//清屏
case 'Q':return 0;break; //退出系统
default:printf("输入命令有误!\n");break;
}
}
return 0;
}
void Help() //帮助菜单显示函数 H
{
printf("\n");
for(int i=1;i<=46;i++){
printf("*");
}
printf("\n");
printf(" * 学生成绩管理系统———帮助菜单 * \n");
for(int i=1;i<=46;i++){
printf("*");
}
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");
for(int i=1;i<=46;i++){
printf("*");
}
printf("\n");
printf(" * Copyright 2023.05.19 By Sunqk5665 * \n" );
for(int i=1;i<=46;i++){
printf("*");
}
printf("\n");
}
void Type(struct student *pstu)//成绩录入 T
{
printf("请输入学生人数:");
scanf("%d",&manNum);
printf("请输入%d名学生的三门课成绩:\n",manNum);
printf("学号 语文 数学 外语\n");
// for(int i = 0; i < manNum; i++){
// scanf("%d %f %f %f",&pstu[i].num,&pstu[i].chinese,&pstu[i].math,&pstu[i].waiyu);
// //getchar();
// }
for(int i = 0; i < manNum; i++){
pstu[i].num = i+1;
printf("%d ",pstu[i].num);
scanf("%f %f %f",&pstu[i].chinese,&pstu[i].math,&pstu[i].waiyu);
//getchar();
}
getchar();//吃最后一次输入后的回车
}
void List(struct student *pstu)//输出成绩表 L
{
if(manNum == 0){
printf("成绩为空!请先使用命令 T 录入学生成绩。\n");
return;//函数到此终止
}
printf("学号 语文 数学 外语 平均分\n");
for(int i=0; i<manNum; i++){
printf(" %d %.1f %.1f %.1f %.1f\n",pstu[i].num,pstu[i].chinese,pstu[i].math,pstu[i].waiyu,pstu[i].average);
}
}
void Averange(struct student *pstu)//平均分 A
{
if(manNum == 0){
printf("成绩为空!请先使用命令 T 录入学生成绩。\n");
return;//函数到此终止
}
for(int i=0; i<manNum; i++){
pstu[i].average = (pstu[i].chinese + pstu[i].math + pstu[i].waiyu)/3;
}
printf("平均分已计算完,请使用命令 L 查看。\n");
}
void Sort(struct student *pstu) //按平均分由高到底排序 P
{
if(manNum == 0){
printf("成绩为空!请先使用命令 T 录入学生成绩。\n");
return;//函数到此终止
}
struct student stTemp;//交换中转
for(int i = 1; i < manNum; i++){
for(int j = 0; j < manNum-i; j++){
if (pstu[j].average < pstu[j+1].average){
stTemp = pstu[j];
pstu[j] = pstu[j+1];
pstu[j+1] = stTemp;
}
}
}
printf("完成排序,请使用 L 查看。\n");
}
void Search(struct student *pstu) //按学号查询学生成绩 S
{
if(manNum == 0){
printf("成绩为空!请先使用命令 T 录入学生成绩。\n");
return;//函数到此终止
}
int stuNum;
printf("请输入要查询的学生学号:");
scanf("%d",&stuNum);
if(stuNum <= 0 || stuNum >=manNum){
printf("输入学号有误!\n");
}
getchar();
for(int i=0; i<manNum; i++){
if(pstu[i].num == stuNum){
printf("学号 语文 数学 外语 平均分\n");
printf(" %d %.1f %.1f %.1f %.1f\n",pstu[i].num,pstu[i].chinese,pstu[i].math,pstu[i].waiyu,pstu[i].average);
}
}
}
void Clear()//清屏 C
{
system("clear"); //"clear"为Linux终端清屏命令(实质是向上翻页)
}
main.c
#include
#include
#include "help.h"
#include "score.h"
#include "clear.h"
// int flag = 0;
int manNum = 0;//学生数
struct student stu[20]; //结构体数组定义
int main()
{
char opt; //命令
Help(); //首次运行显示帮助菜单
while (1)
{
printf("\n");
printf("请输入命令=");
if(scanf("%c",&opt)){
//printf("scanf出现EOF错误!\n");
getchar();//吃掉空格
}
switch (opt)
{
case 'H':Help();break; //显示帮助菜单
case 'T':Type(stu);break; //成绩录入
case 'A':Averange(stu);;break; //计算平均分
case 'L':List(stu);break; //列出成绩表
case 'P':Sort(stu);break; //按平均成绩由高到低拍排序
case 'S':Search(stu);break; //按学号查询学生成绩
case 'C':Clear();break; //清屏
case 'Q':return 0;break; //退出系统
default:
printf("输入命令有误!\n");break;
}
}
return 0;
}
help.h
#ifndef _SCORE_H_
#define __SCORE_H_
#include
/****函数声明***/
void Help();//帮助菜单显示函数
#endif
clear.h
#ifndef _CLEAR_H_
#define _CLEAR_H_
#include
/****函数声明***/
void Clear(); //清屏
#endif
score.h
#ifndef _SCORE_H_
#define _SCORE_H_
#include
#include
/****学生结构体***/
struct student
{
int num;
float chinese;
float math;
float waiyu;
float average;
};
/****函数声明***/
void Type(struct student *pstu);//成绩录入
void List(struct student *pstu);//输出成绩表
void Averange(struct student *pstu);//平均分
void Sort(struct student *pstu);//按平均分由高到底排序
void Search(struct student *pstu); //查询学生成绩
#endif
help.c
#include "help.h"
void Help()//帮助菜单显示函数 H
{
printf("\n");
for(int i=1;i<=46;i++){
printf("*");
}
printf("\n");
printf(" * 学生成绩管理系统———帮助菜单 * \n");
for(int i=1;i<=46;i++){
printf("*");
}
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");
for(int i=1;i<=46;i++){
printf("*");
}
printf("\n");
printf(" * Copyright 2023.05.19 By 孙启凯 * \n" );
for(int i=1;i<=46;i++){
printf("*");
}
printf("\n");
}
clear.c
#include "clear.h"
void Clear()//清屏 C
{
system("clear"); //"clear"为Linux终端清屏命令(实质是向上翻页)
}
score.c
#include "score.h"
extern int manNum;
void Type(struct student *pstu)//成绩录入 T
{
printf("请输入学生人数:");
scanf("%d",&manNum);
printf("请输入%d名学生的三门课成绩:\n",manNum);
printf("学号 语文 数学 外语\n");
for(int i = 0; i < manNum; i++){
pstu[i].num = i+1;
printf("%d ",pstu[i].num);
scanf("%f %f %f",&pstu[i].chinese,&pstu[i].math,&pstu[i].waiyu);
//getchar();
}
getchar();//吃最后一次输入后的回车
}
void List(struct student *pstu)//输出成绩表 L
{
if(manNum == 0){
printf("成绩为空!请先使用命令 T 录入学生成绩。\n");
return;//函数到此终止
}
printf("学号 语文 数学 外语 平均分\n");
for(int i=0; i<manNum; i++){
printf(" %d %.1f %.1f %.1f %.1f\n",pstu[i].num,pstu[i].chinese,pstu[i].math,pstu[i].waiyu,pstu[i].average);
}
}
void Averange(struct student *pstu)//平均分 A
{
if(manNum == 0){
printf("成绩为空!请先使用命令 T 录入学生成绩。\n");
return;//函数到此终止
}
for(int i=0; i<manNum; i++){
pstu[i].average = (pstu[i].chinese + pstu[i].math + pstu[i].waiyu)/3;
}
printf("平均分已计算完,请使用命令 L 查看。\n");
}
void Sort(struct student *pstu) //按平均分由高到底排序 P
{
if(manNum == 0){
printf("成绩为空!请先使用命令 T 录入学生成绩。\n");
return;//函数到此终止
}
struct student stTemp;//交换中转
for(int i = 1; i < manNum; i++){
for(int j = 0; j < manNum-i; j++){
if (pstu[j].average < pstu[j+1].average){
stTemp = pstu[j];
pstu[j] = pstu[j+1];
pstu[j+1] = stTemp;
}
}
}
printf("完成排序,请使用 L 查看。\n");
}
void Search(struct student *pstu) //按学号查询学生成绩 S
{
if(manNum == 0){
printf("成绩为空!请先使用命令 T 录入学生成绩。\n");
return;//函数到此终止
}
int stuNum;
printf("请输入要查询的学生学号:");
scanf("%d",&stuNum);
getchar();
if(stuNum>0 && stuNum<=manNum){
for(int i=0; i<manNum; i++){
if(pstu[i].num == stuNum){
printf("学号 语文 数学 外语 平均分\n");
printf(" %d %.1f %.1f %.1f %.1f\n",pstu[i].num,pstu[i].chinese,pstu[i].math,pstu[i].waiyu,pstu[i].average);
}
}
}
else{
printf("输入的学号非法,请仔细核对!!\n");
}
}
Makefile
CC=gcc
CFLAGS=-c -g
OBJS=help.o clear.o score.o main.o
a.out:$(OBJS)
$(CC) $(OBJS) -o $@
$(OBJS):%.o:%.c
$(CC) $(CFLAGS) $^ -o $@
.PHONY:clean
clean:
rm *.o a.out