一、实现功能
1.系统运行,打开如下界面。列出系统帮助菜单(即命令菜单),提示输入命令。
2.开始时还没有录入成绩,所以输入命令 L 也无法列出成绩。应提示“成绩表为空!请先使用命令 T 录入学生成绩。”
同理,当输入其他的成绩处理命令时也作相应的处理
3.输入命令 T,调用T函数录入成绩。
界面提示输入学生人数
输入3 提示输入3名学生的3门课成绩,列出成绩单的表头“学号 语文 数学 英语”,
提示学号:1
输入1号学生的3门课成绩,用空格间隔,回车结束。提示学号:2
输入2号学生的3门课成绩,用空格间隔,回车结束。提示学号:3
输入3号学生的3门课成绩,用空格间隔,回车结束。T函数调用结束,返回。提示输入命令。
4.输入命令 L ,调用List子函数输出成绩表。List子函数调用结束,返回。提示输入命令。
5.输入命令 A ,调用aver函数计算平均分,提示“平均分已计算。请使用命令L查看。” aver函数调用结束,返回。提示输入命令。
6.输入命令 P ,调用Sort函数将各学生记录按平均分由低到高排序,提示“完成排序。请使用命令L查看。” Sort子函数调用结束,返回。提示输入命令。
7.输入命令 Ssearch子函数查询学生成绩,提示“输入要查询的学生学号”。
8。输入命令C 执行清屏函数语句system(“clear”);
9输入命令H 调用meau函数显示帮助菜单。提示输入命令
10.输入命令Q ¿ 则退出系统。
可以用exit(0);
二、设计思路
采用分文件管理方式进行编写,main函数中主要包含一个菜单函数与输入函数,菜单函数即是进入程序的界面,封装输入函数包括各种功能函数如输入学生成绩、求平均值等功能;在头文件中定义一“学生”的结构体,与一个一级该结构体指针,通过makefile进行多文件管理。
1.main函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| #include <stdio.h> #include "head.h" int main() { menu(); Input(); return 0; }
2.菜单函数 #include "head.h" void menu() { 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> 2025.03.01 By ZMH * \n"); printf("**********************************************\n"); printf("\n"); }
|
3.输入函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| #include "head.h" #include <stdlib.h> extern int n; void Input() { while(1) {
printf("请输入命令:\n"); char choose; scanf("%c",&choose); if(n==0&&choose!='T') { printf("成绩表为空!请先使用命令T录入学生成绩\n"); getchar(); continue; } switch (choose) { case 'H': menu(); break; case 'T': T(); break; case 'L': List(); break; case 'A': aver(); break; case 'P': sort(); break; case 'S': search(); break; case 'C': system("clear"); break; case 'Q': exit(0); break;
} getchar(); }
}
|
4.makefile函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| CC=gcc CFLAGS= -c -g OBJS=main.o T.o Input.o menu.o List.o aver.o sort.o search.o main:$(OBJS) $(CC) $^ -o $@ %.o:%.c $(CC) $(CFLAGS) $< -o $@ .PHONY:clean clean: $(RM) *.o main
5.录入学生成绩 #include "head.h" #include <stdlib.h> int n; void T() { printf("请输入学生人数:\n"); scanf("%d",&n); s=(struct student*)malloc(sizeof(struct student)*n); printf("请输入%d名学生的三门课成绩:\n",n); printf("学号 语文 数学 外语\n"); for(int i=0;i<n;i++) { s[i].idcard = i+1; printf("%d\t",s[i].idcard); scanf("%f %f %f",&s[i].chinese,&s[i].math,&s[i].english);
}
}
|
5.将学生成绩列表
1 2 3 4 5 6 7 8 9 10 11 12
| #include <stdio.h> #include "head.h" extern int n; void List() { printf("学生成绩如下:\n"); printf("学号 语文 数学 外语 平均分\n"); for(int i=0;i<n;i++) { printf("%d %.2f %.2f %.2f %.2f\t\n",s[i].idcard,s[i].chinese,s[i].math,s[i].english,s[i].average); } }
|
6.求平均值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| #include <stdio.h> #include "head.h" extern int n; void aver() { int sum=0; for(int i=0;i<n;i++) { sum=(s[i].chinese+s[i].math+s[i].english); s[i].average=sum/3; sum=0; } printf("平均分已计算完毕,请使用命令L查看"); }
|
7.根据平均值排序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| #include <stdio.h> #include "head.h" extern int n; void sort() { struct student p; for(int i=0;i<n-1;i++ ) { for(int j=0;j<n-1-i;j++) { if(s[j].average>s[j+1].average) { p=s[j]; s[j]=s[j+1]; s[j+1]=p; }
} } printf("排序完毕,请使用命令L查看"); }
|
8.根据学号查找学生成绩
1 2 3 4 5 6 7 8 9 10
| #include <stdio.h> #include "head.h" extern int n; void search() { printf("请输入要查询的学生学号:"); scanf("%d",&n); printf("%d %.2f %.2f %.2f %.2f\t\n",s[n-1].idcard,s[n-1].chinese,s[n-1].math,s[n-1].english,s[n-1].average);
}
|
9.清屏函数,退出函数
清屏函数,退出函数通过直接引用函数system(“clear”)与函数exit(0)即可,切记引用头文件#include <stdlib.h>进行声明。
相关链接(侵删)
- C语言——学生成绩管理系统
=================我是分割线=================
欢迎到公众号来唠嗑: