1.项目介绍:
该项目总共分为4大功能模块1个显示模块,其中教师功能模块因为要求功能比较多,分成了学生基本信息管理以及学生成绩管理2个子模块,主要实现以学生身份的查询自己各科成绩以及排名,修改自身密码等功能,以教师身份实现对学生基本信息以及成绩信息的增删该查等有关功能,以管理员身份对教师进行增删改查,以超级管理员身份对管理员进行增删等功能
流程图:
2.前期准备:
在做此项目前,先根据要求书,确立了功能要求的函数命名,结构体内的信息以及全局变量的定义。如下:
1.学生.教师.管理员都有信息,需要结构体定义,定义在全局变量stu[n],tea[n],adm[n]。
Student{
Char stu_id[20];
Char stu_pass_word[20];
Char name[20];
Int sex;
Int age;
Int ach_chi;
Int ach_mat;
Int ach_eng;
Int ach_sco;
double ach_avg;
Int ach_rank;
Int is_study; //1在读,2离校
Int is_lock; //1锁
Int is_first; // 0为第一次进去,需要先改密码
Int has_ach; //是否有成绩
Int chi_rank; //语文排名
Int mat_rank; //数学排名
Int eng_rank; //英语排名
Int sco_rank; //总分排名
Int is_display; //是否成绩已打印
}
Teacher{
Char tea_id[20];
Char tea_pass_word[20];
Char name[20];
Int sex;
Int age;
Int work_age;
Int is_work; //是否在职
Int is_lock; //是否账户被锁住
Int is_first; //是否第一次登陆
}
Administrator{
Char adm_id[20];
Char adm_pass_word[20];
Int is_alive;
Int is_lock;
Int is_first;
}
2.学生功能主要实现(student):
A.改变自己密码stu_cha_pass()
B.查看自己信息inf_my()
C.查看指定单科排名,或则总成绩排名;
D.退出,回到登陆界面quit().
3.教师功能主要实现(teach):
1.实现学生信息管理系统,主要功能如下。
A.添加学生add_stu();
B.删除学生,删除后的学生记作退学delet_stu();
C.修改学生基本信息 mod_stu();
D.重置学生密码 res_stu_pass();
E.解锁学生账户 unlock_stu_acc();
F.根据学生姓名查找学生 sea_stu();
G.显示所有在读学生 dis_stu();
H.显示所有退学学生 dis_drop_stu();
2.实现学生成绩管理,主要功能如下
A.录入成绩 add_stu_ach();
B.修改成绩 mod_stu_ach();
C.根据学号或姓名查询学生成绩 sea_ach();
D.按各科分数排序 ach_sort();
3.修改登录密码 tea_cha_pass().
4.退出,回到登陆界面quit();
4.管理员主要实现功能(adm):
A.添加老师 add_tea();
B.删除老师,删除记作离职del_tea();
C.修改老师基本信息mod_tea();
D.重置老师密码res_tea_pass();
E.解锁老师账号 unlock_tea_acc();
F.根据姓名查询教师信息 sear_tea();
G.显示所有在职教师 dis_tea();
H.显示所有离职教师 dis_quit_tea();
I.修改密码 adm_cha_pass();
J.退出,回到登陆界面 quit();
5.超级管理员主要实现功能(super_adm):
A.添加管理员 add_adm();
B.删除管理员 del_adm();
C.重置管理员密码 res_adm_pass();
D.解锁管理员账号 unlock_stu_acc();
E.显示所有管理员 dis_all_adm();
具体实现略有改动。
3.项目代码
学生模块
#include<stdio.h>
#include<stdlib.h>
#include<getch.h>
#include<string.h>
#include<time.h>
#include "student.h"
#include "stu_tea_adm_struct.h"
#include "get_cmd.h"
#include "display.h"
extern Student stu[500];
extern Teacher tea[50];
extern Administrator adm[10];
//修改密码
void stu_cha_pass(int i)
{
printf("请输入新的密码:");
scanf("%s",stu[i].stu_pass_word);
puts("修改成功!");
sleep(1);
stu[i].is_first=1;
}
//显示个人信息
void inf_my(int i)
{
printf("姓名:%s 语文:%d 数学:%d 英语:%d 平均分:%.2lf 总分%d\n",stu[i].name,
stu[i].ach_chi,stu[i].ach_mat,stu[i].ach_eng,stu[i].ach_avg,stu[i].ach_sco);
printf("请按任意键返回...");
getch();
}
//总分排名
void sco_rank(int i)
{
printf("您的总分排名是%d\n",stu[i].sco_rank);
printf("按任意键返回...");
getch();
}
//数学成绩排名
void mat_rank(int i)
{
printf("您的数学排名是%d\n",stu[i].mat_rank);
printf("按任意键返回...");
getch();
}
//英语成绩排名显示
void eng_rank(int i)
{
printf("您的英语排名是%d\n",stu[i].eng_rank);
printf("按任意键返回...");
getch();
}
//语文成绩排名显示
void chi_rank(int i)
{
printf("您的语文排名是%d\n",stu[i].chi_rank);
printf("按任意键返回...");
getch();
}
//在查询成绩排名时选择科目
void switch_course(int i)
{
printf("请选择你要查询的项目:");
printf("1.数学");
printf("2.英语");
printf("3.语文");
printf("4.总分");
printf("5.返回");
switch(get_cmd('1','5'))
{
case '1':mat_rank(i);break;
case '2':eng_rank(i);break;
case '3':chi_rank(i);break;
case '4':sco_rank(i);break;
case '5':return;
}
}
int student_use(int x)
{
//判断是否第一次登录,是则要求修改
if(0==stu[x].is_first)
{
stu_display();
puts("您使用的是默认密码,请修改密码:");
scanf("%s",stu[x].stu_pass_word);
puts("修改成功!");
stu[x].is_first=1;
sleep(1);
}
while(1)
{
stu_display();
//根据输入1~4选择功能
switch(get_cmd('1','4'))
{
case '1':stu_cha_pass(x);break;
case '2':inf_my(x);break;
case '3':switch_course(x);break;
case '4':return 0;break;
}
}
}
教师模块
教师操作方式
#include <stdio.h>
#include "stu_tea_adm_struct.h"
#include <stdlib.h>
#include <getch.h>
#include <string.h>
#include "teacher.h"
#include "display.h"
#include "get_cmd.h"
#include "tea_inf_func.h"
#include "tea_ach_func.h"
extern Teacher tea[50];
int stu_num = 0; //当前学生数
int add_ach = 0; //一次导入的学生量
//修改教师密码模块
//*****************************************************************
void tea_cha_pass(int i){
printf("请输入修改后的密码:");
scanf("%s",tea[i].tea_pass_word);
printf("修改成功\n");
sleep(1);
}
//学生信息操作模块
//*****************************************************************
void inf_key(int i){
while(1){
tea_inf_func_display(i);
switch(get_cmd('1','9')){ //输入1 ~ 9进行相应操作
case '1':stu_num = add_stu(stu_num);
break;
case '2':delet_stu();
break;
case '3':mod_stu();
break;
case '4':res_stu_pass();
break;
case '5':unlock_stu_acc();
break;
case '6':sea_stu();
break;
case '7':dis_stu();
break;
case '8':dis_drop_stu();
break;
case '9':return;
}
}
}
//学生成绩操作模块
//*****************************************************************
void ach_key(int i){
while(1){
tea_ach_func_display(i);
switch(get_cmd('1','5')){ //输入1 ~ 5进行相应操作
case '1':add_stu_ach();
break;
case '2':mod_stu_ach();
break;
case '3':sea_ach();
break;
case '4':ach_sort();
break;
case '5':return;
}
}
}
//学生操作模块
//*****************************************************************
void teacher_func(int i){
tea_display(i);
if(tea[i].is_first == 0){ //判断该账号是否为第一次登录
printf("请更改登录密码:");
scanf("%s",tea[i].tea_pass_word); //是则输入修改后的密码
printf("更改成功\n");
tea[i].is_first = 1;
sleep(1);
}
while(1){
tea_display(i);
switch(get_cmd('1','4')){ //输入1 ~ 4进行相关操作
case '1':inf_key(i);
break;
case '2':ach_key(i);
break;
case '3':tea_cha_pass(i);
break;
case '4':return;
}
}
}
学生基本信息管理
#include <stdio.h>
#include "stu_tea_adm_struct.h"
#include <stdlib.h>
#include <getch.h>
#include <string.h>
#include "teacher.h"
#include "display.h"
#include "tea_ach_func.h"
#include "tea_inf_func.h"
extern Student stu[500];
extern Teacher tea[50];
extern Administrator adm[10];
//当前学生数
extern int stu_num;
//一次导入的学生量
extern int add_ach;
//信息管理
//添加学生模块
int add_stu(int stu_num){
int is_samename = 0;
int a = stu_num;
int add_pat = 0;
printf("请输入导入方式(1:单个输入,2:批量导入):\n");
//判断导入方式,1为单个添加,2为多个导入
while(1){
scanf("%d",&add_pat);
if(add_pat == 1 || add_pat == 2){
break;
}else{
printf("输入有误,请输入1或者2");
}
}
//单个添加
//***************************************************
if(add_pat == 1){
if(!(a < 500)){
printf("-----------学生已满----------\n");
sleep(1);
return a;
}else{
printf("请输入学号:");
do{
//输入学号
scanf("%s",stu[a].stu_id);
for(int i = 0;i < a;i++){
//判断是否重名或退学
if((stu[i].is_study == 1 || stu[i].is_study == 2) &&
strcmp(stu[i].stu_id,stu[a].stu_id) == 0){
if(stu[i].is_study == 1){
printf("学号以存在,请重新输入:\n");
}else if(stu[i].is_study == 2){
printf("该学生虽以退学,但学号依然存在,请输入新的学号:\n");
}
is_samename = 1;
break;
}else{
is_samename = 0;
}
}
//没有重名或者退学,则跳出
}while(is_samename);
printf("请输入姓名:");
scanf("%s",stu[a].name);
printf("请输入性别(1:男,2:女):");
scanf("%d",&stu[a].sex);
printf("请输入年龄:");
scanf("%d",&stu[a].age);
printf("录入成功\n");
stu[a].is_study = 1;
strcpy(stu[a].stu_pass_word,"88888888");
sleep(1);
//返回当前存在的学生数
return ++a;
}
}
//多个导入
//***************************************************************
else if(add_pat == 2){
int count = 500 - stu_num;
int i = stu_num;
char fname[20];
int n = 0;
int want_add_num = 0;
printf("请输入想要导入的文件:\n");
//输入想要导入的文件名
scanf("%s",fname);
printf("请输入想导入的人数:\n");
//输入想要导入的人数
scanf("%d",&want_add_num);
FILE *frp = fopen(fname,"r");
if(NULL == frp)
{
perror("fopen");
sleep(1);
return 0;
}
//从第i个学生开始导入,到想要添加的人数位置
while(i < want_add_num + stu_num ){
fscanf(frp,"%s %s %d %d %d\n",
stu[i].stu_id,stu[i].name,&stu[i].sex,&stu[i].age,&stu[i].is_study);
strcpy(stu[i].stu_pass_word,"88888888");
i++;
if(feof(frp)){
break;
}
}
fclose(frp);
printf("成功导入%d个学生信息\n",i - stu_num);
add_ach = i - stu_num;
sleep(1);
//返回目前的学生数
return i;
}
}
//删除学生模块
//*****************************************************************
void delet_stu(){
int n = stu_num;
char want_delet_id[20];
printf("请输入要删除的学生的学号:");
scanf("%s",want_delet_id);
//输入想要删除的学号
for(int i = 0;i < n;i++){
//查找是否存在该学号
if(strcmp(stu[i].stu_id,want_delet_id) == 0){
//判断是否在读
if(stu[i].is_study == 1){
//在读,则把标志位置为2
stu[i].is_study = 2;
printf("删除成功\n");
}else{
printf("该学号已经是退学的的学生了\n");
}
sleep(1);
//修改完毕后返回调用处
return;
}
}
printf("不存在该学号\n");
sleep(1);
}
//学生信息修改模块
//**************************************************************************
void mod_stu(){
int flag = 0;
int is_sameid = 0;
int n = stu_num;
char want_mod_stu_id[20];
printf("请输入要修改信息的学生学号:");
//输入想要修改的学号
scanf("%s",want_mod_stu_id);
for(int i = 0;i < n;i++){
//查找是否存在该学号
if(strcmp(want_mod_stu_id,stu[i].stu_id) == 0){
flag = i;
printf("请输入更改后的学号:");
//判断是否有重名
do{
scanf("%s",stu[i].stu_id);
for(int a = 0;a < n;a++){
if((stu[a].is_study == 1 || stu[a].is_study == 2) &&
strcmp(stu[a].stu_id,stu[i].stu_id) == 0 && flag != a ){
printf("学号以存在,请重新输入:\n");
is_sameid = 1;
break;
}else{
is_sameid = 0;
}
}
//没有重名则跳出循环
}while(is_sameid);
printf("请输入更改后的姓名:");
scanf("%s",stu[flag].name);
printf("请输入更改后的性别(1:男,2:女):");
scanf("%d",&stu[flag].sex);
printf("请输入更改后的年龄:");
scanf("%d",&stu[flag].age);
printf("更改信息成功\n");
break;
}else if(i == n - 1){
printf("不存在该学号\n");
}
}
sleep(1);
}
//重置学生登录密码模块i
//*******************************************************************
void res_stu_pass(){
int n = stu_num;
char want_res_stu_id[20];
printf("请输入要重置密码的学号:");
//输入想要重置密码的学号
scanf("%s",want_res_stu_id);
for(int i = 0;i < n;i++){
//判断是否存在该学号
if(strcmp(want_res_stu_id,stu[i].stu_id) == 0){
//存在则把密码改为默认密码
strcpy(stu[i].stu_pass_word,"88888888");
//把是否第一次登录标志位置为0
stu[i].is_first = 0;
printf("重置密码成功\n");
sleep(1);
return ;
}
}
printf("不存在该学号\n");
sleep(1);
}
//解锁学生账户模块
//*****************************************************************
void unlock_stu_acc(){
int n = stu_num;
char want_unlock_stu_id[20];
printf("请输入想要解锁的学号:");
//输入想要解锁的账户
scanf("%s",want_unlock_stu_id);
for(int i = 0;i < n;i++){
//判断是否存在该学号
if(strcmp(want_unlock_stu_id,stu[i].stu_id) == 0){
stu[i].is_lock = 0;
printf("解锁成功\n");
sleep(1);
//解锁成功返回调用处
return;
}
}
printf("不存在该学号\n");
sleep(1);
}
//查找学生信息模块
//*****************************************************************
void sea_stu(){
int is_one = 0;
int n = stu_num;
char want_know_stu[20];
printf("请输入姓名:");
//输入姓名
scanf("%s",want_know_stu);
system("clear");
for(int i = 0;i < n;i++){
//判断是否存在该姓名
if(strcmp(want_know_stu,stu[i].name) == 0){
printf("学号 姓名 性别 年龄 状态\n");
printf("%-5s %-5s %-2s %-3d %-2s\n",stu[i].stu_id,stu[i].name,
stu[i].sex == 1 ? "男":"女",stu[i].age,stu[i].is_study == 1 ? "在读":"退学");
is_one = 1;
}else if((i == n - 1) && is_one == 0){
printf("不存在该学生\n");
}
}
if(n == 0){
printf("不存在该学生\n");
}
printf("* * * * * 按1键返回 * * * * *\n");
while(1){
if(getch() == '1')
break;
}
}
//显示在读学生信息
//*****************************************************************
void dis_stu(){
system("clear");
int n = stu_num;
printf("学号 姓名 性别 年龄\n");
for(int i = 0;i < n;i++){
//判断是否在读
if(stu[i].is_study == 1){
printf("%-5s %-5s %-5s %-5d\n",stu[i].stu_id,
stu[i].name,stu[i].sex == 1 ? "男":"女",stu[i].age);
}
}
printf("* * * * * 按任意键返回 * * * * *");
getch();
}
//显示退学学生信息
//*****************************************************************
void dis_drop_stu(){
system("clear");
int n = stu_num;
printf("学号 姓名 性别 年龄\n");
for(int i = 0;i < n;i++){
//判断是否离校
if(stu[i].is_study == 2){
printf("%-5s %-5s %-5s %-5d\n",stu[i].stu_id,
stu[i].name,stu[i].sex == 1 ? "男":"女",stu[i].age);
}
}
printf("* * * * * 按任意键返回 * * * * *");
getch();
}
学生成绩管理
#include <stdio.h>
#include <stdlib.h>
#include <getch.h>
#include "tea_ach_func.h"
#include "teacher.h"
#include "stu_tea_adm_struct.h"
#include <string.h>
extern Student stu[500];
extern Teacher tea[50];
extern Administrator adm[10];
extern int stu_num;//表示当前的学生数
extern int add_ach;//表示想添加的学生数
int stu_num_cur = 0;
//学生成绩录入模块
//*****************************************************
void add_stu_ach(){
int have_stu = 0;
int n = stu_num;
int add_pat = 0;
char want_add_ach_id[20];
printf("请输入导入方式(1:单个输入,2:批量导入):\n"); //选择录入方式,1为单个输入,2为多个导入
while(1){
scanf("%d",&add_pat);
if(add_pat == 1 || add_pat == 2)
break;
printf("输入有误,请重新输入:");
}
//*****************************************************
if(add_pat == 1){
printf("请输入想要录入成绩的学号:");
scanf("%s",want_add_ach_id); //输入想要录入成绩的学号
for(int i = 0;i < n; i++){
if((stu[i].is_study == 1 || stu[i].is_study == 2)&&
strcmp(want_add_ach_id,stu[i].stu_id) == 0){ //判断该学号是否在读或离校
if(stu[i].is_study == 1){
if(stu[i].has_ach == 1){ //判断该在校生是否已有成绩
printf("该学号已有成绩\n");
break;
}else{
printf("请输入语文成绩:");
scanf("%d",&stu[i].ach_chi);
printf("请输入数学成绩:");
scanf("%d",&stu[i].ach_mat);
printf("请输入英语成绩:");
scanf("%d",&stu[i].ach_eng);
stu[i].ach_sco = stu[i].ach_chi + stu[i].ach_mat + stu[i].ach_eng;
stu[i].ach_avg = stu[i].ach_sco / 3.0;
printf("录入成绩成功\n");
stu[i].has_ach = 1;
break;
}
}else if(stu[i].is_study == 2){ //该学生为退学学生
printf("该学生已退学");
}
}else if(i == n - 1){
printf("不存在该学号\n");
}
}
}
//批量导入成绩
//***************************************************
else if(add_pat == 2){
int flag = 0;
int i = stu_num_cur; //i为当前学生数
char fname[20];
printf("请输入想要导入的文件:\n");
scanf("%s",fname);
FILE *frp_ach = fopen(fname,"r");
if(NULL == frp_ach) //判断该文件是否存在
{
perror("fopen");
sleep(1);
return;
}
while(i < add_ach + stu_num_cur ){ //根据add_ach导入成绩
fscanf(frp_ach,"%d %d %d %d\n",
&stu[i].ach_chi,&stu[i].ach_mat,&stu[i].ach_eng,&stu[i].has_ach);
stu[i].ach_sco = stu[i].ach_chi + stu[i].ach_mat + stu[i].ach_eng;
stu[i].ach_avg = stu[i].ach_sco / 3.0;
i++;
}
fclose(frp_ach);
//flag为导入成绩之前的学生人数与导入成绩之后的学生人数之差,即已有成绩的学生增长量
flag = i - stu_num_cur;
stu_num_cur = i;
printf("成功导入%d个学生信息\n",flag);
}
sleep(1);
}
//修改学生成绩模块
//***************************************************
void mod_stu_ach(){
int sub_flag = 0;
char want_mod_ach_id[20];
int n = stu_num;
printf("请输入想要修改成绩的学号");
scanf("%s",want_mod_ach_id); //输入想要修改的成绩学号
for(int i = 0;i < n;i++){
if((stu[i].is_study == 1 || stu[i].is_study == 2) && stu[i].has_ach == 1 &&
strcmp(want_mod_ach_id,stu[i].stu_id) == 0){//判断该学号是否有成绩或者是否在读或者退学
printf("请输入想修改的成绩(1.语文2.数学3.英语):");
while(1){ //输入想修改的成绩
scanf("%d",&sub_flag);
if(sub_flag == 1 || sub_flag == 2 || sub_flag == 3)
break;
printf("输入有误,请重新输入");
}
if(sub_flag == 1){
printf("请输入修改后的语文成绩:");
scanf("%d",&stu[i].ach_chi);
}else if(sub_flag == 2){
printf("请输入修改后的数学成绩:");
scanf("%d",&stu[i].ach_mat);
}else if(sub_flag == 3){
printf("请输入修改后的英语成绩:");
scanf("%d",&stu[i].ach_eng);
}
printf("修改完成\n");
//修改后的总分修改
stu[i].ach_sco = stu[i].ach_chi + stu[i].ach_mat + stu[i].ach_eng;
//修改后的平均分修改
stu[i].ach_avg = stu[i].ach_sco / 3.0;
break;
}else if(stu[i].is_study != 1 && stu[i].is_study != 2 && stu[i].has_ach == 0 &&
strcmp(want_mod_ach_id,stu[i].stu_id)){
printf("该学生还没有录入成绩,无法修改");
}
}
if(n == 0){
printf("不存在该学号");
}
sleep(1);
}
//查找成绩模块
//***************************************************
void sea_ach(){
int have_stu = 0;
int n = stu_num;
char want_sea_ach[20];
printf("请输入学号或姓名查询成绩");
scanf("%s",want_sea_ach); //输入想查找的名字或者学号
for(int i = 0;i < n;i++){
//判断是否存在该学号或者姓名
if(strcmp(want_sea_ach,stu[i].stu_id) == 0 || strcmp(want_sea_ach,stu[i].name) == 0)
{
printf("学号 姓名 语文 数学 英语 总分 平均分\n");
printf("%-5s %5s %-2d %-2d %-2d %-2d %-2.2lf\n",
stu[i].stu_id,stu[i].name,stu[i].ach_chi,stu[i].ach_mat,stu[i].ach_eng,
stu[i].ach_sco,stu[i].ach_avg);
have_stu = 1;
}else if(i == n - 1 && have_stu == 0){
printf("查无此人\n");
}
}
if(n == 0){
printf("查无此人\n");
}
printf("* * * * * 按1键返回 * * * * *\n");
while(1){
if(getch() == '1')
break;
}
}
//成绩排名模块
//***************************************************
void ach_sort(){
int flag = 0;
int n = stu_num;
int ach_num[500] = {};
int want_sort_sub = 0;
printf("请输入要排序的科目(1.语文 2.数学 3.英语 4.总分):");
scanf("%d",&want_sort_sub); //输入想要的科目排名
for(int i = 0;i < n;i++){
stu[i].is_display = 0;
}
//语文排序
//***************************************************
if(want_sort_sub == 1){
for(int i = 0;i < n; i++){ //把每个学生成绩拿出来放在一个数组中
ach_num[i] = stu[i].ach_chi;
}
for(int j = 0;j < n - 1;j++){ //用冒泡排序法,让数组内的成绩依次从大到小排列
for(int i = 0;i < n - 1;i++){
if(ach_num[i] < ach_num[i + 1]){
flag = ach_num[i + 1];
ach_num[i + 1] = ach_num[i];
ach_num[i] = flag;
}
}
}
//拿数组的每一位数来跟学生的成绩比较,该数所在的数组位置,即使学生的排名成绩-1;
for(int i = 0;i < n;i++){
for(int j = 0;j < n;j++){
if(stu[i].ach_chi == ach_num[j]){
stu[i].chi_rank = j + 1;
break;
}
}
}
printf("学号 姓名 语文成绩 排名\n");
for(int i = 0 ;i < n;i++){
for(int j = 0; j < n;j++){
//依次从大到小按照降序打印出在读生的成绩
if(ach_num[i] == stu[j].ach_chi && stu[j].is_display == 0 &&
stu[j].is_study == 1)
{
printf("%-5s %-5s %-2d %-2d\n",
stu[j].stu_id,stu[j].name,stu[j].ach_chi,stu[j].chi_rank);
stu[j].is_display = 1;
break;
}
}
}
printf("排序成功!\n");
//数学排序
//***************************************************
}else if(want_sort_sub == 2){
for(int i = 0;i < n; i++){
ach_num[i] = stu[i].ach_mat;
}
for(int j = 0;j < n -1;j++){
for(int i = 0;i < n - 1;i++){
if(ach_num[i] < ach_num[i + 1]){
flag = ach_num[i + 1];
ach_num[i + 1] = ach_num[i];
ach_num[i] = flag;
}
}
}
for(int i = 0;i < n;i++){
for(int j = 0;j < n;j++){
if(stu[i].ach_mat == ach_num[j]){
stu[i].mat_rank = j + 1;
break;
}
}
}
printf("学号 姓名 数学成绩 排名\n");
for(int i = 0 ;i < n;i++){
for(int j = 0; j < n;j++){
if(ach_num[i] == stu[j].ach_mat && stu[j].is_display == 0 &&
stu[j].is_study == 1)
{
printf("%-5s %-5s %-2d %-2d\n",
stu[j].stu_id,stu[j].name,stu[j].ach_mat,stu[j].mat_rank);
stu[j].is_display = 1;
break;
}
}
}
printf("排序成功!\n");
//英语排序
//***************************************************
}else if(want_sort_sub == 3){
for(int i = 0;i < n; i++){
ach_num[i] = stu[i].ach_eng;
}
for(int j = 0;j < n - 1;j++){
for(int i = 0;i < n - 1;i++){
if(ach_num[i] < ach_num[i + 1]){
flag = ach_num[i + 1];
ach_num[i + 1] = ach_num[i];
ach_num[i] = flag;
}
}
}
for(int i = 0;i < n;i++){
for(int j = 0;j < n;j++){
if(stu[i].ach_eng == ach_num[j]){
stu[i].eng_rank = j + 1;
break;
}
}
}
printf("学号 姓名 英语成绩 排名\n");
for(int i = 0 ;i < n;i++){
for(int j = 0; j < n;j++){
if(ach_num[i] == stu[j].ach_eng && stu[j].is_display == 0 &&
stu[j].is_study == 1)
{
printf("%-5s %-5s %d %-2d\n",
stu[j].stu_id,stu[j].name,stu[j].ach_eng,stu[j].eng_rank);
stu[j].is_display = 1;
break;
}
}
}
printf("排序成功!\n");
//总分排序
//***************************************************
}else if(want_sort_sub == 4){
for(int i = 0;i < n; i++){
ach_num[i] = stu[i].ach_sco;
}
for(int j = 0;j < n - 1;j++){
for(int i = 0;i < n -1;i++){
if(ach_num[i] < ach_num[i + 1]){
flag = ach_num[i + 1];
ach_num[i +1 ] = ach_num[i];
ach_num[i] = flag;
}
}
}
for(int i = 0;i < n;i++){
for(int j = 0;j < n;j++){
if(stu[i].ach_sco == ach_num[j]){
stu[i].sco_rank = j + 1;
break;
}
}
}
printf("学号 姓名 总成绩 平均分 排名\n");
for(int i = 0;i < n;i++){
for(int j = 0;j < n;j++){
if(ach_num[i] == stu[j].ach_sco &&stu[j].is_display == 0 &&
stu[j].is_study == 1)
{
printf("%-5s %-5s %d %-2.2lf %-2d\n",
stu[j].stu_id,stu[j].name,stu[j].ach_sco,stu[j].ach_avg,stu[j].sco_rank);
stu[j].is_display = 1;
break;
}
}
}
printf("排序成功!\n");
}
printf("* * * * * 输1键返回 * * * * *");
while(1){
if(getch() == '1')
break;
}
}
管理员模块
#include<stdio.h>
#include<getch.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
#include"adm.h"
#include"super_adm.h"
#include"get_cmd.h"
#include "display.h"
#include "stu_tea_adm_struct.h"
extern Student stu[500];
extern Teacher tea[50];
extern Administrator adm[10];
extern int stu_num;
int count=0;
//该位置是否有教师
int b[50];
//教师添加模块
int add_tea(void)
{
int x=0,y=0;
if(count >= 50) {printf("老师个数已满,无法添加\n");return 0;}
//******************************
//判断按得键
while(1)
{
scanf("%d",&y);
if(1==y||2==y)
{
break;
}
printf("输入错误,输入1或2!");
continue;
}
//*****************************
//单个添加教师
if(1==y)
{
for(int i=count ; i<50 ; i++)
{
if(0 == b[i])
{
printf("请输入工号:");
scanf("%s",tea[i].tea_id);
if(-1!=find_tea_id(tea[i].tea_id))
{
x=find_tea_id(tea[i].tea_id);
if(1==tea[x].is_work)
{
puts("工号重复,添加失败!");
return 0;
}
else if(2==tea[x].is_work)
{
puts("虽已离职,工号依旧存在,添加失败!");
return 0;
}
}
strcpy(tea[i].tea_pass_word,"88888888");
printf("请输入姓名:");
scanf("%s",tea[i].name);
printf("请输入性别(1、男 2、女):");
scanf("%d",&tea[i].sex);
printf("请输入年龄:");
scanf("%d",&tea[i].age);
printf("请输入工龄:");
scanf("%d",&tea[i].work_age);
tea[i].is_work=1;
b[i]=1;
puts("添加成功");
count++;
return 0;
}
}
}
//*******************************
//文件导入模块
else if(2==y)
{
char fname[20];
int fnum=0;
printf("请输入你想导入的文件:\n");
scanf("%s",fname);
printf("请输入你要添加的人数:\n");
scanf("%d",&fnum);
FILE *frp = fopen(fname,"r");
if(NULL==frp)
{
perror("fopen");
sleep(1);
return -1;
}
while(count < fnum )
{
fscanf(frp,"%s %s %d %d %d %d\n",
tea[count].tea_id,tea[count].name,&tea[count].sex,
&tea[count].age,&tea[count].work_age,&tea[count].is_work);
strcpy(tea[count].tea_pass_word,"88888888");
b[count]=1;
count++;
}
fclose(frp);
puts("导入成功!");
sleep(1);
return count;
}
//******************************
}
//查找是否有相同教师工号
int find_tea_id(char* str)
{
for(int i=0;i<50;i++)
{
if(0==strcmp(str,tea[i].tea_id)&&b[i])
{
return i;
}
}
return -1;
}
//查找教师信息
void sear_tea(void)
{
puts("请输入工号:");
char key[20];
gets(key);
int i=find_tea_id(key);
if(-1!=i)
{
puts("工号 姓名 性别 年龄 工龄");
printf("%-s %-s %-s %-d %-d\n",
tea[i].tea_id,tea[i].name,tea[i].sex == 1 ?"男":"女",tea[i].age,tea[i].work_age);
puts("按任意键返回!");
getch();
}
else
{
puts("工号不存在,查询失败!");
puts("按任意键返回!");
getch();
}
}
//修改教师信息
void mod_tea(void)
{
puts("请输入工号:");
char key[20];
gets(key);
int i=find_tea_id(key);
if(-1!=i)
{
printf("请输入姓名:");
gets(tea[i].name);
printf("请输入性别:");
scanf("%d",&tea[i].sex);
printf("请输入年龄:");
scanf("%d",&tea[i].age);
printf("请输入工龄:");
scanf("%d",&tea[i].work_age);
puts("修改完成!");
puts("按任意键返回!");
getch();
}
else
{
puts("工号不存在,修改失败!");
puts("按任意键返回!");
getch();
}
}
//重置教师密码
void res_tea_pass(void)
{
puts("请输入工号:");
char key[20];
gets(key);
int i=find_tea_id(key);
if(-1!=i)
{
strcpy(tea[i].tea_pass_word,"88888888");
puts("重置密码成功!");
tea[i].is_first=1;
puts("按任意键返回!");
getch();
}
else
{
puts("工号不存在,重置失败!");
puts("按任意键返回!");
getch();
}
}
//解锁已锁定的教师账号
void unlock_tea_acc(void)
{
puts("请输入工号:");
char key[20];
gets(key);
int i=find_tea_id(key);
if(-1!=i)
{
tea[i].is_lock=0;
puts("解锁成功!");
puts("按任意键返回!");
getch();
}
else
{
puts("工号不存在,解锁失败!");
puts("按任意键返回!");
getch();
}
}
//删除教师记为离职
void del_tea(void)
{
puts("请输入工号:");
char key[20];
gets(key);
int i=find_tea_id(key);
if(-1!=i)
{
b[i]=1;
tea[i].is_work=2;
puts("删除成功!");
return;
}
else
{
puts("工号不存在,删除失败");
}
}
//显示在职教师
void dis_tea(void)
{
puts("工号 姓名 性别 年龄 工龄");
for(int i=0;i<50;i++)
{
if(1==tea[i].is_work)
{
printf("%-s %-s %-s %-d %-d\n",
tea[i].tea_id,tea[i].name,tea[i].sex == 1 ?"男":"女",tea[i].age,tea[i].work_age);
}
}
puts("按任意键返回!");
getch();
}
//显示离职教师
void dis_quit_tea(void)
{
puts("工号 姓名 性别 年龄 工龄");
for(int i=0;i<50;i++)
{
if(2==tea[i].is_work)
{
printf("%-s %-s %-s %-d %-d\n",
tea[i].tea_id,tea[i].name,tea[i].sex == 1 ?"男":"女",tea[i].age,tea[i].work_age);
}
}
puts("按任意键返回!");
getch();
}
//修改密码
void adm_cha_pass(int i)
{
char pass[20];
puts("请输入你的旧密码:");
gets(pass);
if(0==strcmp(pass,adm[i].adm_pass_word))
{
puts("请输入你的新密码:");
gets(pass);
strcpy(adm[i].adm_pass_word,pass);
adm[i].is_first=1;
puts("新密码设定成功!");
puts("按任意键返回!");
getch();
}
}
void nor_adm(int i)
{
//**************************************
nor_adm_display();
//第一次登陆修改密码
if(0==adm[i].is_first)
{
puts("修改登录密码");
puts("输入你的新密码:");
scanf("%s",adm[i].adm_pass_word);
adm[i].is_first=1;
puts("修改成功!");
sleep(1);
nor_adm_display();
}
//***********************************
while(1)
{
nor_adm_display();
//功能选择模块
switch(get_cmd('0','9'))
{
case '1':puts("按1为单个添加教师,按2多个添加");add_tea();
sleep(1);nor_adm_display;break;
case '2':del_tea();sleep(1);break;
case '3':mod_tea();sleep(1);break;
case '4':res_tea_pass();break;
case '5':unlock_tea_acc();break;
case '6':sear_tea();break;
case '7':dis_tea();break;
case '8':dis_quit_tea();break;
case '9':adm_cha_pass(i);break;
case '0':return;
}
}
}
超级管理员模块
#include <stdio.h>
#include <string.h>
#include <getch.h>
#include <stdlib.h>
#include"adm.h"
#include"super_adm.h"
#include "stu_tea_adm_struct.h"
#include<time.h>
#include "display.h"
#include "get_cmd.h"
extern Student stu[500];
extern Teacher tea[50];
extern Administrator adm[10];
extern int stu_num;
int super_count=0;
char a[10];
//**********************************
//查找管理员id是否存在
int find_adm_id(char* str)
{
for(int i=0;i<10;i++)
{
if(0==strcmp(str,adm[i].adm_id)&&a[i])
{
return i;
}
}
return -1;
}
//*********************************
//添加管理员
int add_adm(void)
{
int y=0;
if(super_count>=10)
{
printf("管理员个数已满,无法添加\n");
return 0;
}
printf("请输入导入方式,1为单导,2为多导");
while(1)
{
scanf("%d",&y);
if(y == 1 || y == 2)
break;
printf("输入有误,请重新输入");
}
if(y==1)
{
for(int i=2;i<10;i++)
{
if(0==a[i])
{
printf("请输入管理员账号:");
scanf("%s",adm[i].adm_id);
if(-1!=find_adm_id(adm[i].adm_id))
{
puts("账号重复,输入失败!");
return 0;
}
strcpy(adm[i].adm_pass_word,"88888888");
puts("管理员添加成功");
adm[i].is_alive=1;
a[i]=1;
super_count++;
return 0;
}
}
}
//文件导入模块
else if(2==y)
{
int add = 10 - super_count;
int i = super_count;
char fname[20];
printf("请输入你想导入的文件:\n");
scanf("%s",fname);
FILE *frp = fopen(fname,"r");
if(NULL==frp)
{
perror("fopen");
sleep(1);
return -1;
}
while(i < add )
{
fscanf(frp,"%s %d\n",adm[i].adm_id,&adm[i].is_alive);
strcpy(adm[i].adm_pass_word,"88888888");
a[i]=1;
i++;
}
fclose(frp);
puts("导入成功!");
sleep(1);
return i;
}
}
//********************************
//删除管理员
void del_adm(void)
{
puts("请输入管理员帐号:");
char key[20];
gets(key);
int i=find_adm_id(key);
if(-1!=i)
{
adm[i].is_alive=0;
puts("删除成功!");
a[i]=0;
super_count--;
return;
}
else puts("账号不存在");
}
//*******************************
//重置管理员密码
void res_adm_pass(void)
{
puts("请输入管理员帐号:");
char key[20];
gets(key);
int i=find_adm_id(key);
if(-1!=i)
{
strcpy(adm[i].adm_pass_word,"88888888");
puts("重置密码成功");
adm[i].is_first=0;
puts("按任意键返回!");
getch();
}
else
{
puts("账号不存在,重置失败!");
puts("按任意键返回!");
getch();
}
}
//****************************
//解锁锁定的管理员帐号
void unlock_adm_acc(void)
{
puts("请输入管理员帐号:");
char key[20];
gets(key);
int i=find_adm_id(key);
if(-1!=i)
{
adm[i].is_lock=0;
puts("解锁成功!");
puts("按任意键返回!");
getch();
}
else
{
puts("账号不存在,解锁失败!");
puts("按任意键返回!");
getch();
}
}
//**************************
//显示所有管理员
void dis_all_adm(void)
{
puts("管理员id");
for(int i=0;i<10;i++)
{
if(1==adm[i].is_alive)
{
printf(" %s\n",adm[i].adm_id);
}
}
puts("按任意键返回!");
getch();
}
//*********************************
void super_adm(void)
{
while(1)
{
sup_adm_display();
//选择功能模块
switch(get_cmd('1','6'))
{
case '1':add_adm();sleep(1);break;
case '2':del_adm();sleep(1);break;
case '3':res_adm_pass();break;
case '4':unlock_adm_acc();break;
case '5':dis_all_adm();break;
case '6':return;break;
}
}
}
密码登陆模块
#include "password.h"
#include "stu_tea_adm_struct.h"
#include "student.h"
#include "teacher.h"
#include "adm.h"
#include "super_adm.h"
#include "get_cmd.h"
#include "display.h"
extern Student stu[500];
extern Teacher tea[50];
extern Administrator adm[10];
//教师登录
void tea_username_and_password(void)
{
char id[20];
int tea_cur = 0;
char str[10];
int n = 3;
puts("请输入工号:");
{
int flag = 1;
while(flag){
scanf("%s",id);
for(int i = 0;i < 50;i++ ){
//输入的id存在且该id在职
if(0 == strcmp(tea[i].tea_id,id) && tea[i].is_work == 1){
//若被锁定则显示
if(tea[i].is_lock == 1){
printf("该工号被锁定!请向上一级(管理员)申诉\n");
sleep(1);
return;
//否则,退出循环,记录是第a个人
}else{
flag = 0;
tea_cur = i;
break;
}
//输入id存在但离职或不存在,显示不存在
}else if((0 == strcmp(tea[i].tea_id,id) && tea[i].is_work == 2) || (i == 49)){
printf("该工号不存在\n");
sleep(1);
return;
}
}
}
}
puts("请输入密码:");
do{
n--;
scanf("%s",str);
//输入的密码与该账号密码不相同,则进入
if(0 != strcmp(tea[tea_cur].tea_pass_word,str)){
//n记录剩余次数
if(n > 0){
printf("密码错误,请重新输入(还有%d次)\n",n);
}else{
printf("工号被锁定!请向上一级(管理员)申诉\n");
tea[tea_cur].is_lock=1;
sleep(1);
return;
}
}
//如果相同则进入教师模块
else{
//传参内容:第a个教师
teacher_func(tea_cur);
n = 0;
}
}while(n);
}
//学生登录
void stu_username_and_password(void)
{
char id[20];
int stu_cur = 0;
char str[10];
int n = 3;
puts("请输入学号:");
int flag = 1;
while(flag){
scanf("%s",id);
for(int i = 0;i < 500;i++ ){
if(0 == strcmp(stu[i].stu_id,id) && stu[i].is_study ==1){
if(stu[i].is_lock == 1){
printf("该学号被锁定!请向上一级(教师)申诉\n");
sleep(1);
return;
}else{
flag = 0;
stu_cur = i;
break;
}
}
else if((0 == strcmp(stu[i].stu_id,id) && stu[i].is_study ==2) ||(i == 499)){
printf("该学号不存在\n");
sleep(1);
return;
}
}
}
puts("请输入密码:");
do{
n--;
scanf("%s",str);
if(0 != strcmp(stu[stu_cur].stu_pass_word,str)){
if(n > 0){
printf("密码错误,请重新输入(还有%d次)\n",n);
}else{
printf("学号被锁定!请向上一级(教师)申诉\n");
stu[stu_cur].is_lock=1;
sleep(1);
return;
}
}
else{
student_use(stu_cur);
n = 0;
}
}while(n);
}
//管理员登录
void adm_username_and_password(void)
{
char id[20];
char id_flag[20];
int adm_cur = 0;
char str[10];
int n = 3;
puts("请输入管理号ID:");
int flag = 1;
while(flag){
scanf("%s",id);
for(int i = 0;i < 10;i++ ){
if(0 == strcmp(id,adm[i].adm_id) && adm[i].is_alive == 1){
if(adm[i].is_lock == 1){
printf("该管理员ID被锁定!请向上一级(超级管理员)申诉\n");
sleep(1);
return;
}else{
flag = 0;
adm_cur = i;
break;
}
}else if((0 == strcmp(id,adm[i].adm_id) && adm[i].is_alive) || (i == 9)){
printf("该管理员不存在\n");
sleep(1);
return;
}
}
}
puts("请输入密码:");
do{
n--;
scanf("%s",str);
if(0 != strcmp(adm[adm_cur].adm_pass_word,str)){
if(n > 0){
printf("密码错误,请重新输入(还有%d次)\n",n);
}else{
printf("管理员ID被锁定!请向上一级(超级管理员)申诉\n");
adm[adm_cur].is_lock=1;
sleep(1);
return;
}
}
else{
nor_adm(adm_cur);
n = 0;
}
}while(n);
}
//超级管理员登录
void super_password(void)
{
char str[20]="888888";
char *super_pass;
puts("请输入密码:");
while(1)
{
//getpass不显示输入内容
super_pass = getpass("");
if(0 == strcmp(super_pass,str))
{
//若相同进入超级管理员模块,否则继续输入
super_adm();
break;
}
}
}
显示模块
#include <stdio.h>
#include "display.h"
#include "stu_tea_adm_struct.h"
#include <stdlib.h>
extern Teacher tea[50];
void stu_display(void)
{
system("clear");
puts("***学生信息管理***");
puts("选择序号进行操作:");
puts("1.改变自己的密码");
puts("2.查看自己的成绩");
puts("3.查看成绩排名");
puts("4.退出,回到登录界面");
puts("----------------------");
puts("请输入指令:");
}
void sup_adm_display(void)
{
system("clear");
puts("____________O(∩_∩)O____________");
puts("|❤ ❤ ❤ 欢迎您,超级管理员❤ ❤ ❤ |");
puts("|☺ ☺ ☺ ☺ ☺ ☺ ☺ ☺ ☺ ☺ ☺ ☺ ☺ ☺ ☺ |");
puts("| 1、添加管理员 |");
puts("| 2、删除管理员 |");
puts("| 3、重置管理员密码 |");
puts("| 4、解锁管理员帐号 |");
puts("| 5、显示所有管理员 |");
puts("| 6、退出 |");
puts("|______________________________|");
puts("请输入指令:");
}
void nor_adm_display(void)
{
system("clear");
puts(" ❀ ❀ ❀ 欢迎您,管理员!❀ ❀ ❀ ");
puts("| 1、添加教师 |");
puts("| 2、删除教师 |");
puts("| 3、修改教师信息 |");
puts("| 4、重置教师密码 |");
puts("| 5、解锁教师账号 |");
puts("| 6、查询教师信息 |");
puts("| 7、显示在职教师 |");
puts("| 8、显示离职教师 |");
puts("| 9、修改登录密码 |");
puts("| 0、退出 |");
puts("|~~~~~~~~~~~~~~~~~~~~~~~~~~~|");
}
void menu_display(void)
{
system("clear");
puts("♪♪♪♪欢迎使用学生成绩管理系统♪♪♪♪");
puts("| |");
puts("| 1、学生 |");
puts("| |");
puts("| 2、教师 |");
puts("| |");
puts("| 3、管理员 |");
puts("| |");
puts("| 4、超级管理员 |");
puts("| |");
puts("| 5、退出 |");
puts("|______________________________|");
puts("请输入您的身份(输入相应数字):");
}
void tea_display(int i){
system("clear");
printf("———————————————————————————————————————————\n");
printf(" 欢迎登录学生管理系统,%s \n",tea[i].name);
printf("| 输入1进入学生信息系统 |\n");
printf("| 输入2进入学生成绩系统 |\n");
printf("| 输入3修改密码 |\n");
printf("| 输入4退出学生管理系统 |\n");
printf("|_________________________________________|\n");
}
void tea_inf_func_display(int i){
system("clear");
printf("———————————————————————————————————————————————————————————\n");
printf(" 欢迎使用学信息管理理系统,%s \n",tea[i].name);
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("| 输入9退出学生信息管理系统 |\n");
printf("|__________________________________________________________|\n");
}
void tea_ach_func_display(int i){
system("clear");
printf("———————————————————————————————————————————————————————————\n");
printf(" 欢迎使用学生成绩管理系统,%s \n",tea[i].name);
printf("| 输入1录入成绩(语文,数学,英语) |\n");
printf("| 输入2修改成绩 |\n");
printf("| 输入3根据学号或姓名查询学生成绩 |\n");
printf("| 输入4按各科成绩排名 |\n");
printf("| 输入5退出学生成绩管理系统 |\n");
printf("|__________________________________________________________|\n");
}
main
#include <stdio.h>
#include <getch.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#include "stu_tea_adm_struct.h"
#include "student.h"
#include "teacher.h"
#include "adm.h"
#include "super_adm.h"
#include "get_cmd.h"
#include "display.h"
#include "password.h"
Student stu[500];
Teacher tea[50];
Administrator adm[10];
void main()
{
while(1){
menu_display();
switch(get_cmd('1','5'))
{
case '1':stu_username_and_password();break;
case '2':tea_username_and_password();break;
case '3':adm_username_and_password();break;
case '4':super_password();break;
case '5':puts("退出成功!");return;
}
}
}
4.遇到的问题
1.教师模块的成绩排序:
解决:将学生结构体中的成绩依次取出放于一个成绩数组中,对成绩数组进行排序,成绩在数组中相应的位置即是该学生的排名。
2.批量导入:
解决:采用读写指定文件,从已有的文件里读取想要的人数,但该文件必须按照格式排列好。
5.思考与总结
1.该项目进一步提高了我对c语言的基础的了解。
2.该项目提高了我对项目各个环节的了解,以及如何进行整合。
3.我会吸取这次项目中的一些教训,比如命名时重复,为下一次的项目打下了一些基础。
4.该项目做的很粗糙,仅仅是为了完成要求的功能,在曾经的我看来,能完成功能要求就好,现在看来,并不是,也深深体会到了"代码无错便是优?"这句话的涵义了。
5.总的来说,这个我人生中第一个项目带给我的经验很多,比如代码的格式,代码的注释,一些比较重要的代码规范,以及如何考虑排序的效率问题,我相信在之后的项目中我会做的更好。
最后引用大师兄的一句话:越简单的项目,越难做,因为大家都会,关键的在于,你对于该项目有什么新的创新,是别人没有的,那就是你的竞争力,就像是比拼厨艺,最简单的菜,才能比出高低!