本次团队合作完成学生管理系统使得我的编程能力得到了很大提升,而在这次合作之前我们花了很长时间统一结构体和各个函数命名,这对我们后期整合和调试有莫大裨益,避免了很多问题,比如重定义之类。
.c文件名(以及内部函数):
admin.c 判断登陆者逻辑文件
main.c 主函数
manager.c 管理员功能主函数
add_teacher
del_teacher
change_teacher
reset_teacher
unlock_teacher
find_teacher
view_on_teacher
view_off_teacher
change_password
batch_add_teacher
menuc.c 所有菜单
student.c 学生功能主函数
find_news
find_all_rank
find_one_rank
change_stu_password
supermanager.c 超级管理员主函数
add_manager
del_manager
reset_manager
unlock_manager
teacher.c 老师登陆主函数
change_tea_password
teacher_info.c 老师录入学生信息主函数
add_student
del_student
change_student
view_on_student
view_off_student
find_studnet
reset_studnet
unlock_studnet
batch_add_studnet
teacher_score.c 老师录入学生成绩主函数
add_score
change_score
find_score
rank_score
rank_all
rank_chinese
rank_math
rank_english
batch_add_score
tool.c 任意键返回、显示信息n秒、获取按键、隐藏密码等功能函数
struct.h内三个主结构体
学生结构体
typedef struct student
{
}student;
老师结构体
typedef struct teacher
{
}teacher;
管理员结构体
typedef struct manager
{
}manager;
而在本次项目中,我负责学生和成绩显示部分
#include "student.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <getch.h>
#include "struct.h"
#include "tool.h"
//学生操作函数
//显示自己基本信息
void find_news(int* str)
{
int i=* str;
system("clear");
printf("姓名%s 学号%.8d 性别%c 年龄%d 语文:%d 数学:%d 英语:%d 平均分:%f 总分:%d\n",stu[i].name,stu[i].num,stu[i].sex,stu[i].age,stu[i].chinese,stu[i].math,stu[i].english,stu[i].avg,stu[i].sum);
anykey_continue();
}
//列出自己所有成绩排名
void find_all_rank(int* str)
{
int i=* str;
system("clear");
puts("总分排名为:");
printf("%d\n",stu[i].rank_all);
anykey_continue();
}
//显示每科成绩排名
void find_one_rank(int* str)
{
int i=*str;
system("clear");
puts("单科排名为:");
printf("语文:第%d名\n",stu[i].rank_chinese);
printf("数学:第%d名\n",stu[i].rank_math);
printf("英语:第%d名\n",stu[i].rank_english);
anykey_continue();
}
//修改自己登录密码
void change_stu_password(int* str)
{
char new[10]={};
char sure[10]={};
while(1)
{
system("clear");
printf("请修改您的密码\n");
hide(new);
printf("请再次输入您的密码\n");
hide(sure);
if(strcmp(new,sure)==0)
{
strcpy(stu[*str].password,new);
printf("修改成功\n");
anykey_continue();
return;
}
printf("前后输入不同,新密码修改失败,请再次输入\n");
getch();
}
}
排名部分
//排名函数
void rank_score(void)
{
for(int i=0;i<stu_count;i++)
{
stu[i].sum=stu[i].chinese+stu[i].math+stu[i].english;
stu[i].avg=stu[i].sum/3;
}
for(int i=0;i<stu_count;i++)
{
stu[i].rank_all=stu_count;
stu[i].rank_chinese=stu_count;
stu[i].rank_math=stu_count;
stu[i].rank_english=stu_count;
for(int j=0;j<stu_count;j++)
{
if(stu[i].sum>=stu[j].sum && stu[i].num!=stu[j].num)
{
stu[i].rank_all--;
}
if(stu[i].chinese>=stu[j].chinese && stu[i].num!=stu[j].num)
{
stu[i].rank_chinese--;
}
if(stu[i].math>=stu[j].math && stu[i].num!=stu[j].num)
{
stu[i].rank_math--;
}
if(stu[i].english>=stu[j].english && stu[i].num!=stu[j].num)
{
stu[i].rank_english--;
}
}
}
}
//显示总分排名
void rank_all(void)
{
for(int i=0;i<stu_count;i++)
{
for(int j=0;j<stu_count;j++)
{
if(i+1==stu[j].rank_all && stu[j].index==0)
{
printf("姓名:%s 学号:%.8d 分数:%d 名次:%d\n",stu[j].name,stu[j].num,stu[j].sum,i+1);
}
}
}
anykey_continue();
}
//显示语文成绩排名
void rank_chinese(void)
{
for(int i=0;i<stu_count;i++)
{
for(int j=0;j<stu_count;j++)
{
if(i+1==stu[j].rank_chinese && stu[j].index==0)
{
printf("姓名:%s 学号:%.8d 分数:%d 名次:%d\n",stu[j].name,stu[j].num,stu[j].chinese,i+1);
}
}
}
anykey_continue();
}
//显示数学成绩排名
void rank_math(void)
{
for(int i=0;i<stu_count;i++)
{
for(int j=0;j<stu_count;j++)
{
if(i+1==stu[j].rank_math && stu[j].index==0)
{
printf("姓名:%s 学号:%.8d 分数:%d 名次:%d\n",stu[j].name,stu[j].num,stu[j].math,i+1);
}
}
}
anykey_continue();
}
//显示英语成绩排名
void rank_english(void)
{
for(int i=0;i<stu_count;i++)
{
for(int j=0;j<stu_count;j++)
{
if(i+1==stu[j].rank_english && stu[j].index==0)
{
printf("姓名:%s 学号:%.8d 分数:%d 名次:%d\n",stu[j].name,stu[j].num,stu[j].english,i+1);
}
}
}
anykey_continue();
}
我的思路是先用for循环计算出所有的总分、平均分,然后将所有人的名次置为最低,然后开始遍历,遇到一个比自己分数低并且不是自己的便提升一位名次,相同的同样+2,解决分数相同名次的问题。然后在之后的函数,在教师界面显示出所有的排名。然而,在大师兄启示下,我们这样遍历结构体的效率似乎并不是很高,正在寻求新的解决方案。