1.明确教务系统实现功能
系统角色有学生,教师,和管理员
学生有姓名,学号,年龄,班级信息,能够查询多科成绩,查询成绩排名
教师具有姓名,年龄,班级信息,能够查询学生信息,录入多科成绩,查询多科成绩,查询成绩排名操作
管理员可以对学生和老师的信息进行录入,删除和修改
2.定义学生和教师的信息结构
#include<stdio.h>
#include<string.h>
#include<stdlib.h>#define MAX 100
#define MAX_NAME 20
#define MAX_ID 12
#define MAX_SUBJECTS 5
typedef struct Student{
char name[MAX_NAME];
char ID[MAX_ID];
int age;
int Class;
int scores[MAX_SUBJECTS];
char* subjects[MAX_SUBJECTS];
int totalScores;
}Student;
typedef struct Teacher{
char name[MAX_NAME];
int age;
int Class;
}Teacher;
typedef struct Admin{
Student stuDate[MAX];
Teacher teacherDate[MAX];
int stuCount;
int teacherCount;
}Admin;
void Initsystem(Admin* pc){
pc->stuCount=0;
pc->teacherCount=0;
memset(pc->stuDate, 0, sizeof(pc->stuDate));
memset(pc->teacherDate, 0, sizeof(pc->teacherDate));
}
//初始化学科
void initializeStudent(Student* student) {
student->subjects[0] = "Chinese";
student->subjects[1] = "Math";
student->subjects[2] = "English";
student->subjects[3] = "Physics";
student->subjects[4] = "Chemistry";
}
这里并未定义账号和密码,而是采用了写入文件的方法,最好预先创建对应的txt文本,否则会导致验证学生和教师时失败,下文将会提到如何实现
3.分块解决问题
定义需要的辅助函数
验证身份的函数
int checkAdmin(){
char username[50];
char password[50];
printf("请输入用户名:\n");
scanf("%s", username);
printf("请输入密码:\n");
scanf("%s", password);
if (strcmp(username, "admin") == 0 && strcmp(password, "123456") == 0) {
printf("登录成功!\n");
return 1;
}else{
printf("用户名或密码错误!\n");
return 0;
}
}
//验证学生和教师登录
int checkstudent() {
char username[50];
char password[50];
char stored_username[50];
char stored_password[50];
printf("请输入用户名:\n");
scanf("%s", username);
printf("请输入密码:\n");
scanf("%s", password);
FILE *file = fopen("student.txt", "r");
if (file == NULL) {
printf("无法打开文件!\n");
return 0;
}
while (fscanf(file, "%s%s", stored_username, stored_password) != EOF) {
if (strcmp(username, stored_username) == 0 && strcmp(password, stored_password) == 0) {
printf("登录成功!\n");
fclose(file);
return 1;
}
}
printf("用户名或密码错误!\n");
fclose(file);
return 0;
}
//检查教师登录
int checkteacher() {
char username[50];
char password[50];
char stored_username[50];
char stored_password[50];
printf("请输入用户名:\n");
scanf("%s", username);
printf("请输入密码:\n");
scanf("%s", password);
FILE *file = fopen("teacher.txt", "r");
if (file == NULL) {
printf("无法打开文件!\n");
return 0;
}
while (fscanf(file, "%s%s", stored_username, stored_password) != EOF) {
if (strcmp(username, stored_username) == 0 && strcmp(password, stored_password) == 0) {
printf("登录成功!\n");
fclose(file);
return 1;
}
}
printf("用户名或密码错误!\n");
fclose(file);
return 0;
}
写入账号密码的函数
//写入学生账号密码
int writeStudent() {
char username[50];
char password[50];
char stored_username[50];
char stored_password[50];
printf("请输入要写入的用户名:\n");
scanf("%s", username);
printf("请输入要写入的密码:\n");
scanf("%s", password);
FILE *file = fopen("student.txt", "r");
if (file != NULL) {
while (fscanf(file, "%s%s", stored_username, stored_password) != EOF) {
if (strcmp(username, stored_username) == 0) {
printf("用户名已存在,不再写入!\n");
fclose(file);
return 0;
}
}
fclose(file);
}
file = fopen("student.txt", "a");
if (file == NULL) {
printf("无法打开文件!\n");
return 1;
}
fprintf(file, "%s\n%s\n", username, password);
fclose(file);
printf("用户名和密码已写入文件!\n");
}
//写入教师账号密码
int writeTeacher() {
char username[50];
char password[50];
char stored_username[50];
char stored_password[50];
printf("请输入要写入的用户名:\n");
scanf("%s", username);
printf("请输入要写入的密码:\n");
scanf("%s", password);
FILE *file = fopen("teacher.txt", "r");
if (file != NULL){
while (fscanf(file, "%s%s", stored_username, stored_password) != EOF) {
if (strcmp(username, stored_username) == 0) {
printf("用户名已存在,不再写入!\n");
fclose(file);
return 0;
}
}
fclose(file);
}
file = fopen("teacher.txt", "a");
if (file == NULL) {
printf("无法打开文件!\n");
return 1;
}
fprintf(file, "%s %s\n", username, password);
fclose(file);
printf("用户名和密码已写入文件!\n");
}
菜单函数
//学生的菜单
void menuStudent(){
printf("**************************************\n");
printf("****** 1.查询指定学生信息 ******\n");
printf("****** 2.查询学生单科排名 ******\n");
printf("****** 3.查询学生的总成绩排名******\n");
printf("****** 0.退出 ******\n");
printf("**************************************\n");
}
//老师的菜单
void menuTeacher(){
printf("**************************************\n");
printf("****** 1.查询指定学生信息 ******\n");
printf("****** 2.展示学生各科成绩 ******\n");
printf("****** 3.输入学生单科成绩 ******\n");
printf("****** 4.输入学生全科成绩 ******\n");
printf("****** 5.学生单科成绩排序 ******\n");
printf("****** 6.学生的总成绩排序 ******\n");
printf("****** 7.查询学生单科排名 ******\n");
printf("****** 8.查询学生的总成绩排名******\n");
printf("****** 0.退出 ******\n");
printf("**************************************\n");
}
//管理员菜单
void menuAdmin(){
printf("**************************************\n");
printf("****** 1.增加学生信息 *****\n");
printf("****** 2.修改学生信息 *****\n");
printf("****** 3.删除学生信息 *****\n");
printf("****** 4.增加教师信息 *****\n");
printf("****** 5.修改教师信息 *****\n");
printf("****** 6.删除教师信息 *****\n");
printf("****** 7.展示所有信息 *****\n");
printf("****** 0.退出 ******\n");
printf("**************************************\n");
}
//选择身份的菜单
void menu(){
printf("请选择登录的身份\n1.管理员\n2.教师\n3.学生\n0.退出\n");
}
//学科菜单
void menuSubject(){
printf("**************************************\n");
printf("****** 1.语文 *******\n");
printf("****** 2.数学 *******\n");
printf("****** 3.英语 *******\n");
printf("****** 4.物理 *******\n");
printf("****** 5.化学 *******\n");
printf("**************************************\n");
}
管理员实现增删查改学生基本信息
录入学生信息
//输入学生信息
void enterStudent(Admin *pc) {
if(pc->stuCount==MAX){
printf("数据库已存满\n");
return;
}
printf("添加学生信息\n");
printf("\n请输入姓名: ");
scanf("%s",pc->stuDate[pc->stuCount].name);
printf("\n请输入ID: ");
scanf("%s",pc->stuDate[pc->stuCount].ID);
printf("\n请输入年龄:");
scanf("%d",&(pc->stuDate[pc->stuCount].age));
printf("\n请输入班级: ");
scanf("%d",&(pc->stuDate[pc->stuCount].Class));
if(writeStudent()){
pc->stuCount++;
printf("添加成功\n");
}
}
删除学生信息
想要删除学生信息,首先需要查找该学生,这里用名字作为关键词索引
//按名字索引学生
int Findstuname(Admin* pc,char name[]){
for(int i=0;i<pc->stuCount;i++){
if(strcmp(pc->stuDate[i].name,name)==0){
return i;
}
}
return -1;
}
然后实现删除功能(这里同时删除了该学生对应的账号密码)
//删除学生信息
void deleteStudent(Admin* pc){
char name[MAX_NAME];
printf("请输入删除学生的姓名:");
scanf("%s",name);
//先查找
int num=Findstuname(pc,name);
if(num==-1){
printf("该学生信息不存在\n");
return;
}
//再删除(覆盖达到删除目的)
for(int i=num;i<pc->stuCount-1;i++){
pc->stuDate[i]=pc->stuDate[i+1];
}
pc->stuCount--;
// 删除对应的账号密码
FILE* oldFile = fopen("student.txt", "r");
FILE* newFile = fopen("temp.txt", "w");
char line[1000];
int i = 0;
while (fgets(line, sizeof(line), oldFile)) {
if (i != num) {
fputs(line, newFile);
}
i++;
}
fclose(oldFile);
fclose(newFile);
remove("student.txt");
rename("temp.txt", "student.txt");
printf("删除成功\n");
}
修改学生信息
不再修改账号密码,想要修改账号密码可以参照删除信息的函数
void modifyStudent(Admin* pc){
if(pc->stuCount==0){
printf("数据已被清空\n");
return;
}
char name[MAX_NAME];
printf("请输入修改学生的姓名:");
scanf("%s",name);
//先查找
int num=Findstuname(pc,name);
if(num==-1){
printf("该学生信息不存在\n");
return;
}
printf("\n请输入姓名: ");
scanf("%s",pc->stuDate[num].name);
printf("\n请输入ID: ");
scanf("%s",pc->stuDate[num].ID);
printf("\n请输入年龄:");
scanf("%d",&(pc->stuDate[num].age));
printf("\n请输入班级: ");
scanf("%d",&(pc->stuDate[num].Class));
printf("修改成功\n");
}
实现教师的信息操作
与学生类似,不再赘述
//输入教师信息
void enterTeacher(Admin *pc) {
if(pc->teacherCount==MAX){
printf("数据库已存满\n");
return;
}
printf("添加教师信息\n");
printf("\n请输入姓名: ");
scanf("%s",pc->teacherDate[pc->teacherCount].name);
printf("\n请输入年龄:");
scanf("%d",&(pc->teacherDate[pc->teacherCount].age));
printf("\n请输入班级: ");
scanf("%d",&(pc->teacherDate[pc->teacherCount].Class));
if(writeTeacher()){
pc->teacherCount++;
printf("添加成功\n");
}
}
//查询指定的教师
int FindTeachername(Admin* pc,char name[]){
for(int i=0;i<pc->teacherCount;i++){
if(strcmp(pc->teacherDate[i].name,name)==0){
return i;
}
}
return -1;
}
//删除教师信息
void deleteTeacher(Admin* pc) {
if(pc->teacherCount==0){
printf("数据已被清空\n");
return;
}
char name[MAX_NAME];
printf("请输入删除教师的姓名:");
scanf("%s",name);
//先查找
int num=FindTeachername(pc,name);
if(num==-1){
printf("该教师信息不存在\n");
return;
}
//再删除(覆盖达到删除目的)
for(int i=num;i<pc->teacherCount-1;i++){
pc->teacherDate[i]=pc->teacherDate[i+1];
}
pc->teacherCount--;
// 删除对应的账号密码
FILE* oldFile = fopen("teacher.txt", "r");
FILE* newFile = fopen("temp.txt", "w");
char line[1000];
int i = 0;
while (fgets(line, sizeof(line), oldFile)) {
if (i != num) {
fputs(line, newFile);
}
i++;
}
fclose(oldFile);
fclose(newFile);
remove("teacher.txt");
rename("temp.txt", "teacher.txt");
printf("成功删除\n");
}
//修改教师信息
void ModifyTeacher(Admin* pc){
char name[MAX_NAME];
printf("请输入被修改教师的姓名:");
scanf("%s",name);
int num=FindTeachername(pc,name);
if(num==-1){
printf("该教师信息不存在\n");
return;
}
printf("\n请输入姓名: ");
scanf("%s",pc->teacherDate[num].name);
printf("\n请输入年龄:");
scanf("%d",&(pc->teacherDate[num].age));
printf("\n请输入班级: ");
scanf("%d",&(pc->teacherDate[num].Class));
printf("修改成功\n");
}
展示所有录入的信息
//展示录入的信息
void ShowAll(Admin* pc){
printf("学生信息\n%-10s\t%-3s\t%-6s\t%-20s\n","姓名","ID","年龄","班级");
for(int i=0;i<pc->stuCount;i++){
printf("%-10s\t%-3s\t%-6d\t%-20d\n",pc->stuDate[i].name,
pc->stuDate[i].ID,
pc->stuDate[i].age,
pc->stuDate[i].Class);
}
printf("\n教师信息\n%-10s\t%-3s\t%-6s\n","姓名","年龄","班级");
for(int i=0; i<pc->teacherCount; i++){
printf("%-10s\t%-3d\t%-6d\n", pc->teacherDate[i].name,
pc->teacherDate[i].age,
pc->teacherDate[i].Class);
}
}
实现教师及学生的操作的函数
查询指定学生信息
//查询指定学生信息
void queryStudentInfo(Admin* admin) {
char student_id[50];
printf("请输入学生ID:\n");
scanf("%s", student_id);
for (int i = 0; i < admin->stuCount; i++){
if (strcmp(admin->stuDate[i].ID, student_id) == 0) {
printf("%-10s\t%-3s\t%-6s\t%-20s\n","姓名","ID","年龄","班级");
printf("%-10s\t%-3s\t%-6d\t%-20d\t\n",admin->stuDate[i].name,
admin->stuDate[i].ID,
admin->stuDate[i].age,
admin->stuDate[i].Class);
printf("学生 %s 的各科成绩如下:\n", student_id);
for (int j = 0; j < MAX_SUBJECTS; j++){
printf("%s: %d\n", admin->stuDate[i].subjects[j], admin->stuDate[i].scores[j]);
}
return;
}
}
printf("未找到对应的学生\n");
}
录入学生单科成绩
//录入学生单科成绩
void entersingleScores(Admin* admin) {
char subject[50];
char student_id[50];
int score;
printf("请输入学科名:\n");
scanf("%s", subject);
printf("请输入学生ID:\n");
scanf("%s", student_id);
printf("请输入成绩:\n");
scanf("%d", &score);
for (int i = 0; i < admin->stuCount; i++) {
if (strcmp(admin->stuDate[i].ID, student_id) == 0) {
for (int j = 0; j < MAX_SUBJECTS; j++) {
if (strcmp(admin->stuDate[i].subjects[j], subject) == 0) {
admin->stuDate[i].scores[j] = score;
printf("成绩已录入\n");
printf("学生 %s 的各科成绩如下:\n", student_id);
for (int k = 0; k < MAX_SUBJECTS; k++) {
printf("%s: %d\n", admin->stuDate[i].subjects[k], admin->stuDate[i].scores[k]);
}
return;
}
}
printf("未找到对应的学科\n");
return;
}
}
printf("未找到对应的学生\n");
}
一次性录入学生成绩
//一次性录入学生成绩
void enterAllScores(Admin* admin) {
char student_id[50];
int scores[MAX_SUBJECTS];
printf("请输入学生ID:\n");
scanf("%s", student_id);
for (int i = 0; i < admin->stuCount; i++) {
if (strcmp(admin->stuDate[i].ID, student_id) == 0) {
for (int j = 0; j < MAX_SUBJECTS; j++) {
printf("请输入 %s 的成绩:\n", admin->stuDate[i].subjects[j]);
scanf("%d", &scores[j]);
admin->stuDate[i].scores[j] = scores[j];
}
printf("成绩已录入\n");
printf("学生 %s 的各科成绩如下:\n", student_id);
for (int k = 0; k < MAX_SUBJECTS; k++) {
printf("%s: %d\n", admin->stuDate[i].subjects[k], admin->stuDate[i].scores[k]);
}
return;
}
}
printf("未找到对应的学生\n");
}
显示所有学生的成绩
//显示所有学生的成绩
void displayAllScores(Admin* admin) {
for (int i = 0; i < admin->stuCount; i++) {
printf("学生 %s 的各科成绩如下:\n", admin->stuDate[i].name);
for (int j = 0; j < MAX_SUBJECTS; j++) {
printf("%s: %d\n", admin->stuDate[i].subjects[j], admin->stuDate[i].scores[j]);
}
printf("\n");
}
}
查询指定学生总排名
//查询指定学生总排名
void findRankBy_Tatalscores(Admin* pc){
for(int i=0;i<pc->stuCount;i++){
for(int j=0;j<MAX_SUBJECTS;j++){
pc->stuDate[i].totalScores+=pc->stuDate[i].scores[j];
}
}
//从高到低冒泡排序
for (int i = 0; i < pc->stuCount - 1; i++){
for (int j = 0; j < pc->stuCount - i - 1; j++){
if (pc->stuDate[j].totalScores < pc->stuDate[j+1].totalScores){
Student temp = pc->stuDate[j];
pc->stuDate[j] = pc->stuDate[j + 1];
pc->stuDate[j + 1] = temp;
}
}
}
//输入要索引的对象的姓名
char name[100];
printf("请输入要查找的学生的姓名:");
scanf("%s",name);
// 遍历排序后的学生列表,找到指定的学生
for (int i = 0; i < pc->stuCount; i++) {
if (strcmp(pc->stuDate[i].name, name) == 0) {
// 打印学生的排名,注意排名是从1开始的,所以这里要加1
printf("学生 %s 总成绩的排名是:%d\n", name, i + 1);
return;
}
}
// 如果没有找到指定的学生,打印错误信息
printf("没有找到名字为 %s 的学生\n", name);
}
查询指定学生单科成绩排名
//查询指定学生单科成绩排名
void findRankBy_Subject(Admin* admin){
// 先按照指定的学科对学生进行排序
menuSubject();
printf("请输入索引的学科");
int subjectIndex;
scanf("%d",&subjectIndex);
//从高到低冒泡排序
for (int i = 0; i < admin->stuCount - 1; i++){
for (int j = 0; j < admin->stuCount - i - 1; j++){
if (admin->stuDate[j].scores[subjectIndex] < admin->stuDate[j + 1].scores[subjectIndex]){
Student temp = admin->stuDate[j];
admin->stuDate[j] = admin->stuDate[j + 1];
admin->stuDate[j + 1] = temp;
}
}
}
//输入要索引的对象的姓名
char name[100];
printf("请输入要查找的学生的姓名:");
scanf("%s",name);
// 遍历排序后的学生列表,找到指定的学生
for (int i = 0; i < admin->stuCount; i++) {
if (strcmp(admin->stuDate[i].name, name) == 0) {
// 打印学生的排名,注意排名是从1开始的,所以这里要加1
printf("学生 %s 的 %s 的排名是:%d\n", name, admin->stuDate->subjects[subjectIndex+1],i + 1);
return;
}
}
// 如果没有找到指定的学生,打印错误信息
printf("没有找到名字为 %s 的学生\n", name);
}
所有学生按单科成绩排序
//所有学生按单科成绩排序
void sort_Students_By_Singal_Subject(Admin* admin){
menuSubject();
printf("请输入排序的学科");
int subjectIndex;
scanf("%d",&subjectIndex);
subjectIndex+=1;
if(subjectIndex <= 0 || subjectIndex > MAX_SUBJECTS) {
printf("Invalid subject index\n");
return;
}
//从高到低冒泡排序
for (int i = 0; i < admin->stuCount - 1; i++){
for (int j = 0; j < admin->stuCount - i - 1; j++){
if (admin->stuDate[j].scores[subjectIndex] < admin->stuDate[j + 1].scores[subjectIndex]){
Student temp = admin->stuDate[j];
admin->stuDate[j] = admin->stuDate[j + 1];
admin->stuDate[j + 1] = temp;
}
}
}
// 打印排序后的学生及其对应学科的名字
printf("按照 %s 成绩排序的学生列表:\n", admin->stuDate[0].subjects[subjectIndex]);
for (int i = 0; i < admin->stuCount; i++) {
printf("学生名字:%s,%s 成绩:%d\n", admin->stuDate[i].name, admin->stuDate[i].subjects[subjectIndex], admin->stuDate[i].scores[subjectIndex]);
}
}
所有学生按总成绩排序
//所有学生按总成绩排序
void sort_Students_By_All_Subject(Admin* pc){
for(int i=0;i<pc->stuCount;i++){
for(int j=0;j<MAX_SUBJECTS;j++){
pc->stuDate[i].totalScores+=pc->stuDate[i].scores[j];
}
}
//从高到低冒泡排序
for (int i = 0; i < pc->stuCount - 1; i++){
for (int j = 0; j < pc->stuCount - i - 1; j++){
if (pc->stuDate[j].totalScores < pc->stuDate[j+1].totalScores){
Student temp = pc->stuDate[j];
pc->stuDate[j] = pc->stuDate[j + 1];
pc->stuDate[j + 1] = temp;
}
}
}
// 打印排序后的学生
for (int i = 0; i < pc->stuCount; i++) {
printf("学生名字:%s, 总成绩:%d\n", pc->stuDate[i].name, pc->stuDate[i].totalScores);
}
}
文件操作函数
//导入已存在的信息
void loadData(Admin* admin) {
FILE* stuFile = fopen("stusource.txt", "r");
FILE* teaFile = fopen("teasource.txt", "r");
//使用w模式可以每次打开时重置txt为空
FILE* stuAccountFile = fopen("student.txt", "w");
FILE* teaAccountFile = fopen("teacher.txt", "w");
if (stuFile == NULL || teaFile == NULL || stuAccountFile == NULL || teaAccountFile == NULL) {
printf("无法打开文件\n");
return;
}
char account[MAX_NAME];
char password[MAX_NAME];
// 读取学生数据
while (fscanf(stuFile, "%s %s %d %d", admin->stuDate[admin->stuCount].name, admin->stuDate[admin->stuCount].ID, &admin->stuDate[admin->stuCount].age, &admin->stuDate[admin->stuCount].Class) != EOF) {
for (int i = 0; i < MAX_SUBJECTS; i++) {
fscanf(stuFile, "%d", &admin->stuDate[admin->stuCount].scores[i]);
}
fscanf(stuFile, "%s %s", account, password);
fprintf(stuAccountFile, "%s %s\n", account, password);
initializeStudent(&admin->stuDate[admin->stuCount]);
admin->stuCount++;
}
// 读取教师数据
while (fscanf(teaFile, "%s %d %d", admin->teacherDate[admin->teacherCount].name, &admin->teacherDate[admin->teacherCount].age, &admin->teacherDate[admin->teacherCount].Class) != EOF) {
fscanf(teaFile, "%s %s", account, password);
fprintf(teaAccountFile, "%s %s\n", account, password);
admin->teacherCount++;
}
fclose(stuFile);
fclose(teaFile);
fclose(stuAccountFile);
fclose(teaAccountFile);
printf("成功导入已有信息\n");
}
// 从文件中读取账号和密码
void readCredentials(const char* filename, char credentials[MAX][2][MAX_NAME]) {
FILE* file = fopen(filename, "r");
if (file == NULL) {
printf("无法打开文件 %s\n", filename);
return;
}
int i = 0;
while (fscanf(file, "%s %s", credentials[i][0], credentials[i][1]) != EOF && i < MAX) {
i++;
}
fclose(file);
}
//所有信息并写入存储本次操作的文件
void WriteToFile(Admin* admin){
char studentCredentials[MAX][2][MAX_NAME];
char teacherCredentials[MAX][2][MAX_NAME];
readCredentials("student.txt", studentCredentials);
readCredentials("teacher.txt", teacherCredentials);
FILE* studentFile = fopen("store_stu.txt", "w");
FILE* teacherFile = fopen("store_tea.txt", "w");
//和写入学生信息
for (int i = 0; i < admin->stuCount; i++){
fprintf(studentFile, "%s %s %d %d ", admin->stuDate[i].name, admin->stuDate[i].ID, admin->stuDate[i].age, admin->stuDate[i].Class);
for (int j = 0; j < MAX_SUBJECTS; j++){
fprintf(studentFile, "%d ", admin->stuDate[i].scores[j]);
}
fprintf(studentFile, "%s %s\n", studentCredentials[i][0], studentCredentials[i][1]);
}
//写入教师信息
for (int i = 0; i < admin->teacherCount; i++){
fprintf(teacherFile, "%s %d %d %s %s\n", admin->teacherDate[i].name, admin->teacherDate[i].age, admin->teacherDate[i].Class, teacherCredentials[i][0], teacherCredentials[i][1]);
}
fclose(studentFile);
fclose(teacherFile);
}
文件数据
teasource.txt
liulei 30 1 liulei 123456
chenyang 31 2 chenyang 123456
yanglin 32 3 yanglin 123456
zhangyang 33 4 zhangyang 123456
wanglei 34 5 wanglei 123456
zhaobo 35 6 zhaobo 123456
sunpeng 36 7 sunpeng 123456
zhoulai 37 8 zhoulai 123456
wuyang 38 9 wuyang 123456
zhenglin 39 10 zhenglin 123456
stusource.txt
lihua 001 18 1 80 90 85 88 92 lihua 123456
zhangming 002 19 1 85 92 88 90 85 zhangming 123456
wangqiang 003 18 2 88 85 92 90 88 wangqiang 123456
zhaoli 004 19 2 90 88 85 92 90 zhaoli 123456
sunfei 005 18 3 92 90 88 85 92 sunfei 123456
zhoujie 006 19 3 85 92 90 88 85 zhoujie 123456
wulan 007 18 4 88 85 92 90 88 wulan 123456
zhengfeng 008 19 4 90 88 85 92 90 zhengfeng 123456
fengdong 009 18 5 92 90 88 85 92 fengdong 123456
chendong 010 19 5 85 92 90 88 85 chendong 123456
定义函数指针数组
增加了代码的可读性
// 定义管理员函数指针数组
void (*Admin_func_ptr[7])(Admin *) = {enterStudent, modifyStudent, deleteStudent, enterTeacher, ModifyTeacher, deleteTeacher, ShowAll};
//定义教师函数指针数组
void (*Teacher_func_ptr[8])(Admin *) = {queryStudentInfo, displayAllScores, entersingleScores, enterAllScores, sort_Students_By_Singal_Subject, sort_Students_By_All_Subject, findRankBy_Subject, findRankBy_Tatalscores};
//定义学生函数指针数组
void (*Student_func_ptr[3])(Admin *) = {queryStudentInfo, findRankBy_Subject, findRankBy_Tatalscores};
主函数实现所有功能
//主函数开始执行
int main(){
int Identify;
Admin con;
Initsystem(&con);
loadData(&con);
menu();
scanf("%d",&Identify);
while(Identify){
switch (Identify) {
case 1:
if(checkAdmin()==1){
int input;
do{
menuAdmin();
printf("请进行操作: ");
scanf("%d",&input);
if(input>0&&input<8)
Admin_func_ptr[input-1](&con);
}while(input);
}
break;
case 2:
if(checkteacher()==1){
int input;
do{
menuTeacher();
printf("请进行操作: ");
scanf("%d",&input);
Teacher_func_ptr[input-1](&con);
}while(input);
}
break;
case 3:
if(checkstudent()==1){
int input;
do{
menuStudent();
printf("请进行操作: ");
scanf("%d",&input);
Student_func_ptr[input-1](&con);
}while(input);
}
break;
default:
printf("输入错误,重新输入\n");
break;
}
menu();
printf("请输入新的操作码: ");
scanf("%d",&Identify);
}
WriteToFile(&con);
return 0;
}
到这里,我们已经完成了既定的所有要求,如有不妥之处,请在评论区留下您的宝贵建议,如果觉的不错,点个赞呗