目录标

  • 一、要实现的功能
    • 1.首次运行
    • 2. 成绩录入
    • 3. 显示录入的成绩
    • 4. 计算平均值
    • 5. 对平均分排序
    • 6. 查询学生成绩
    • 7. 清屏
    • 8. 显示帮助菜单
    • 9. 系统
  • 二、实现代码
    • (一)所有代码在一个文件(v1)
    • (二)分文件编写(v2)

本文章介绍了一个通过C语言实现的一个简单的学生管理系统,该系统要是使用结构体数组来管理学生成绩数据的,通过该系统的练习能够对结构体的相关知识有更好的理解,提高逻辑思维能力。

一、要实现的功能

1.首次运行

系统运行,打开如下界面。列出系统帮助菜单(即命令菜单),提示输入命令

开始时还没有录入成绩,所以输入命令 L 也无法列出成绩。应提示“成绩表为空!请先使用命令 T 录入学生成绩。” 同理,当输入其他的成绩处理命令时也作相应的处理。

2. 成绩录入

输入命令 T,调用Type子函数录入成绩。界面提示输入学生人数

输入3,提示输入3名学生的3门课成绩,列出成绩单的表头“学号 语文 数学 英语”,同时提示学号:1

输入1号学生的3门课成绩,用空格间隔,回车结束。提示学号:2

输入2号学生的3门课成绩,用空格间隔,回车结束。提示学号:3

输入3号学生的3门课成绩,用空格间隔,回车结束。Type子函数调用结束,返回。提示输入命令。

3. 显示录入的成绩

输入命令 L ,调用List子函数输出成绩表。List子函数调用结束,返回。提示输入命令。

4. 计算平均值

输入命令 A ,调用Average子函数计算平均分,提示“平均分已计算。请使用命令L查看。” Average子函数调用结束,返回。提示输入命令。

输入命令 L ,调用List子函数输出成绩表。List子函数调用结束,返回。提示输入命令

5. 对平均分排序

输入命令 P ,调用Sort子函数将各学生记录按平均分由高到低排序,提示“完成排序。请使用命令L查看。” Sort子函数调用结束,返回。提示输入命令。

输入命令 L ,调用List子函数输出成绩表。List子函数调用结束,返回。提示输入命令。

6. 查询学生成绩

输入命令 S ,调用Search子函数查询学生成绩,提示“输入要查询的学生学号”。

输入 2 找到2号学生的成绩并输出。Search子函数调用结束,返回。提示输入命令。

7. 清屏

输入命令C 执行清屏函数语句system(“clear”);

8. 显示帮助菜单

输入命令H 调用Help子函数显示帮助菜单。Help子函数调用结束,返回。提示输入命令。

9. 系统

输入命令Q 则退出系统。

二、实现代码

(一)所有代码在一个文件(v1)

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.19By 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终端清屏命令(实质是向上翻页)}

(二)分文件编写(v2)

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=gccCFLAGS=-c -gOBJS=help.o clear.o score.o main.oa.out:$(OBJS)$(CC) $(OBJS) -o $@$(OBJS):%.o:%.c$(CC) $(CFLAGS) $^ -o $@.PHONY:cleanclean:rm *.o a.out