设计要求: 此项目没有商业价值,练习学习过的知识点。 仅限于C语言知识。 学生: 姓名 性别 学号 密码 语文 数学 英语 1、第一次登录强制修改密码。 2、查询成绩 排名 不显示姓名和学号。 平均分 最高分 所有学生单科和总分 最低分 3、修改密码 4、查看个人信息 5、三次密码错误锁定帐号,由教师解锁
教师: 姓名 性别 工号 密码 1、第一次登录强制修改密码。 2、添加学生(学生的学号自动生成) 单个添加 从文件批量导入 3、删除学生 输入两次学号确定 删除的学生要记录保存在已退学的文件中 4、查找学生 按姓名查找 按学号查找 5、修改学生信息 修改学生基础信息 修改学生成绩 6、录入学生成绩 单个录入 批量导入 7、重置学生密码 8、解锁学生 9、显示所有在校学生信息 10、显示所有退出学生信息 11、三次密码错误锁定帐号,由校长解锁
校长: admin 1、第一次登录强制修改密码。 2、能重置自己的密码 3、能重置教师密码 4、添加教师 5、删除教师 6、解锁老师 7、显示所有在职教师 8、显示所有离职教师
以下代码实现在Linux ubuntu main.c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include "tool.h"
#include "teacher.h"
#include "student.h"
#include "admin.h"
#include "file.h"
#include "land.h"
int main(int argc,const char* argv[])
{
s=calloc(1000,sizeof(Students));
stu_e=calloc(100,sizeof(Students));
tea=calloc(100,sizeof(Teachers));
dtea=calloc(100,sizeof(Teachers));
file_scanf();
while(1)
{
system("clear");
printf("\033[01;34m");
puts("欢迎使用学生成绩管理系统!");
puts("1.进入学生菜单.");
puts("2.进入教师菜单.");
puts("3.进入校长菜单.");
puts("4.退出并保存.");
printf("\033[00m");
switch(get_cmd('1','4'))
{
case '1': land_student();break;
case '2': land_teacher();break;
case '3': land_choose();break;
case '4': file_save();return 0 ;
}
}
return 0;
}
tools.h
#ifndef TOOL_H
#define TOOL_H
#include <getch.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
typedef struct Teacher
{
char name[10];
char sex[4];
char key[10];
char lock;
int id;
}Teachers;
Teachers* tea;
Teachers* dtea;
typedef struct Student{
char name[10];
char sex[4];
int id;
float Chinese;
float Math;
float English;
char key[10];
char lock;
}Students;
Students *s;
Students *stu_e;
int count_stu,count_stu_e,iD;
int count_tea,count_dtea;
int cur;
int get_cmd(char start,char end);
char* get_str(char* str,size_t size);
void anykey_continue(void);
char* get_password(char* password, size_t len,bool isshow);
#endif
tools.c
#include <stdio.h>
#include "tool.h"
int count_stu=0,count_stu_e=0,iD;
int count_tea=0,count_dtea=0;
int cur=0;
int get_cmd(char start,char end)
{
puts("------------------");
printf("请输入指令:");
for(;;)
{
char cmd = getch();
if(start <= cmd && cmd <= end)
{
printf("%c\n",cmd);
return cmd;
}
}
}
char* get_str(char* str,size_t size)
{
fgets(str,size,stdin);
size_t len = strlen(str);
if('\n' == str[len-1])
{
str[len-1] = '\0';
}
else
{
stdin->_IO_read_ptr = stdin->_IO_read_end;
}
return str;
}
void anykey_continue(void)
{
stdin->_IO_read_ptr = stdin->_IO_read_end;
puts("按任意键继续...");
getch();
stdin->_IO_read_ptr = stdin->_IO_read_end;
}
char* get_password(char* password, size_t len,bool isshow)
{
int i = 0;
while (i < len - 1)
{
char ch = getch();
if (127 == ch)
{
if (i > 0)
{
i--;
printf("\b \b");
}
continue;
}
if ('\n' == ch)
{
break;
}
if(true==isshow)
{
printf("*");
}
else
{
printf("%c",ch);
}
password[i++] = ch;
}
password[i] = '\0';
return password;
}
land.h
#include <stdio.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include "tool.h"
#include "teacher.h"
#include "student.h"
#include "admin.h"
#ifndef PASSWORD_H
#define PASSWORD_H
void land_student(void);
void land_teacher(void);
void land_admin(void);
#endif
land.c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include "tool.h"
#include "teacher.h"
#include "student.h"
#include "admin.h"
#include "land.h"
void land_student(void)
{
printf("请输入学号:\n");
int ID = 0;
int flaa=0;
char password[10]={0};
int cnt1=3;
while(1)
{
scanf("%d",&ID);
stdin->_IO_read_ptr = stdin->_IO_read_end;
for(int a=0;a<count_stu;a++)
{
if(ID==s[a].id)
{
cur=a;
flaa=1;
break;
}
}
if(!flaa)
printf("未查询到该学号,请重新输入!\n");
else
break;
}
if(1==s[cur].lock)
{
printf("帐号已锁定!\n");
anykey_continue();
return;
}
if(0==strcmp(s[cur].key,"000000"))
{
printf("首次登录请重置密码,且不能为初始化密码:000000\n");
get_password(password,sizeof(password),false);
printf("\n");
while(0==strcmp(password,"000000"))
{
printf("请重新初始化密码!\n");
get_password(password,sizeof(password),false);
printf("\n");
}
strcpy(s[cur].key,password);
printf("密码修改成功!\n");
sleep(1);
menu_student();
return;
}
else
{
while(cnt1)
{
printf("请输入密码:\n");
get_password(password,sizeof(password),true);
printf("\n");
if (0 == strcmp(password,s[cur].key))
{
printf("验证通过!\n");
sleep(1);
menu_student();
return;
}
else
{
cnt1--;
printf("\033[01;31m");
printf("验证失败三次将冻结帐号,还有%d次机会!\n",cnt1);
printf("\033[00m");
}
}
if(!cnt1)
{
printf("帐号已锁定,请寻求老师解锁并初始化密码!\n");
s[cur].lock='1';
anykey_continue();
return;
}
}
}
void land_teacher(void)
{
printf("请输入工号:\n");
int ID = 0;
int flgg=0;
char password[10]={0};
int cnt1=3;
while(1)
{
scanf("%d",&ID);
stdin->_IO_read_ptr = stdin->_IO_read_end;
for(int a=0;a<count_tea;a++)
{
if(ID==tea[a].id)
{
cur=a;
flgg=1;
break;
}
}
if(!flgg)
printf("未查询到该工号,请重新输入!\n");
else
break;
}
if(1==tea[cur].lock)
{
printf("帐号已锁定!\n");
anykey_continue();
return;
}
if(0==strcmp(tea[cur].key,"000000"))
{
printf("首次登录请重置密码,且不能为初始化密码:000000\n");
get_password(password,sizeof(password),false);
printf("\n");
while(0==strcmp(password,"000000"))
{
printf("请重新初始化密码!\n");
get_password(password,sizeof(password),false);
printf("\n");
}
strcpy(tea[cur].key,password);
printf("密码修改成功!\n");
sleep(1);
teacher();
return;
}
else
{
while(cnt1)
{
printf("请输入密码:\n");
get_password(password,sizeof(password),true);
printf("\n");
if (0 == strcmp(password,tea[cur].key))
{
printf("验证通过!\n");
sleep(1);
teacher();
return;
}
else
{
cnt1--;
printf("\033[01;31m");
printf("验证失败三次将冻结帐号,还有%d次机会!\n",cnt1);
printf("\033[00m");
}
}
if(!cnt1)
{
printf("帐号已锁定,请寻求校长解锁并初始化密码!\n");
tea[cur].lock='1';
anykey_continue();
return;
}
}
}
void land_admin(void)
{
char password[10]={0};
if(0==strcmp(apd,"000000"))
{
printf("首次登录请重置密码,且不能为初始化密码:000000\n");
get_password(password,sizeof(password),false);
printf("\n");
while(0==strcmp(password,"000000"))
{
printf("请重新初始化密码!\n");
get_password(password,sizeof(password),false);
printf("\n");
}
strcpy(apd,password);
printf("密码修改成功!\n");
sleep(2);
admin();
return ;
}
else
{
while(1)
{
printf("请输入密码:\n");
get_password(password,sizeof(password),true);
printf("\n");
if (0 == strcmp(password,apd))
{
printf("验证通过!\n");
sleep(2);
admin();
return ;
}
else
{
printf("\033[01;31m");
printf("密码错误!\n");
printf("\033[00m");
sleep(2);
return;
}
}
}
}
file.h
#ifndef FILE_H
#define FILE_H
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#include "tool.h"
#include "teacher.h"
#include "student.h"
#include "admin.h"
void file_scanf(void);
void file_save(void);
#endif
file.h
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include "tool.h"
#include "teacher.h"
#include "student.h"
#include "admin.h"
#include "file.h"
void file_scanf(void)
{
FILE* F=fopen("admin.txt","r");
if (NULL == F)
{
printf("admin文件打开失败!\n");
return ;
}
char jm[10]="12345678";
char buf[4096];
int ret=0;
ret=fread(buf,1,4096,F);
fclose(F);
FILE* F1=fopen("admin.txt","w");
size_t len=strlen(jm);
while (ret>0)
{
for(int i=0;i<ret;i++)
{
buf[i]=buf[i]^jm[i%len];
}
fwrite(buf,1,ret,F1);
fclose(F1);
break;
}
FILE* F2=fopen("admin.txt","r");
fscanf(F2,"%s",apd);
fclose(F2);
FILE* fp1= fopen("stu.txt", "r");
if (NULL == fp1)
{
printf("stu文件打开失败!");
return ;
}
while (0<fscanf(fp1, "姓名:%s 性别:%s 学号:%d 语文:%f 数学:%f 英语:%f 密码:%s lock:%c\n",s[count_stu].name,(s[count_stu].sex),&(s[count_stu].id),&(s[count_stu].Chinese), &(s[count_stu].Math), &(s[count_stu].English),(s[count_stu].key),&(s[count_stu].lock)))
{
count_stu++;
}
if(0==count_stu)
iD=202110000;
else
iD=s[count_stu-1].id;
fclose(fp1);
FILE* fp2= fopen("stu_e.txt", "r");
if (NULL == fp2)
{
printf("stu_e文件打开失败!");
return ;
}
while (0<fscanf(fp2, "姓名:%s 性别:%s 学号:%d 语文:%f 数学:%f 英语:%f\n",stu_e[count_stu_e].name,(stu_e[count_stu_e].sex),&(stu_e[count_stu_e].id),&(stu_e[count_stu_e].Chinese), &(stu_e[count_stu_e].Math), &(stu_e[count_stu_e].English)))
{
count_stu_e++;
}
fclose(fp2);
FILE* fp3=fopen("tea.txt","r");
if (NULL == fp3)
{
printf("tea文件打开失败!\n");
return ;
}
while (0<fscanf(fp3, "姓名:%s 性别:%s 工号:%d 密码:%s lock:%c\n",tea[count_tea].name,(tea[count_tea].sex),&(tea[count_tea].id),(tea[count_tea].key),&(tea[count_tea].lock)))
{
count_tea++;
}
fclose(fp3);
FILE* fp4=fopen("dtea.txt","r");
if (NULL == fp4)
{
printf("dtea文件打开失败!");
return ;
}
while (0<fscanf(fp4, "姓名:%s 性别:%s 工号:%d\n",dtea[count_dtea].name,dtea[count_dtea].sex,&(dtea[count_dtea].id)))
{
count_dtea++;
}
fclose(fp4);
}
void file_save(void)
{
FILE* F2=fopen("admin.txt","w");
if (NULL == F2)
{
printf("admin文件打开失败!\n");
return ;
}
fprintf(F2,"%s",apd);
fclose(F2);
FILE* F=fopen("admin.txt","r");
char jm[10]="12345678";
char buf[4096];
int ret=0;
ret=fread(buf,1,4096,F);
fclose(F);
FILE* F1=fopen("admin.txt","w");
size_t len=strlen(jm);
while (ret>0)
{
for(int i=0;i<ret;i++)
{
buf[i]=buf[i]^jm[i%len];
}
fwrite(buf,1,ret,F1);
fclose(F1);
break;
}
FILE* file1=fopen("stu.txt","w");
if (NULL == file1)
{
printf("stu文件打开失败!");
return ;
}
for(int i=0;i<count_stu;i++)
{
fprintf(file1,"姓名:%s 性别:%s 学号:%d 语文:%f 数学:%f 英语:%f 密码:%s lock:%c\n",((s+i)->name),((s+i)->sex),((s+i)->id),((s+i)->Chinese),((s+i)->Math),((s+i)->English),((s+i)->key),((s+i)->lock));
}
fclose(file1);
FILE* file2=fopen("stu_e.txt","w");
if (NULL == file2)
{
printf("stu_e文件打开失败!");
return ;
}
for(int i=0;i<count_stu_e;i++)
{
fprintf(file2,"姓名:%s 性别:%s 学号:%d 语文:%f 数学:%f 英语:%f\n",((stu_e+i)->name),((stu_e+i)->sex),((stu_e+i)->id),((stu_e+i)->Chinese),((stu_e+i)->Math),((stu_e+i)->English));
}
fclose(file2);
FILE* file3=fopen("tea.txt","w");
if (NULL == file3)
{
printf("tea文件打开失败!");
return ;
}
for(int i=0;i<count_tea;i++)
{
fprintf(file3, "姓名:%s 性别:%s 工号:%d 密码:%s lock:%c\n",tea[i].name,tea[i].sex,tea[i].id,tea[i].key,tea[i].lock);
}
fclose(file3);
FILE* file4=fopen("dtea.txt","w");
if (NULL == file4)
{
printf("dtea文件打开失败!");
return ;
}
for(int i=0;i<count_dtea;i++)
{
fprintf(file4, "姓名:%s 性别:%s 工号:%d\n",dtea[i].name,dtea[i].sex,dtea[i].id);
}
fclose(file4);
}
student.h
#ifndef STUDENT_H
#define STUDENT_H
#include <stdio.h>
#include<stdlib.h>
void check_score(void);
void change_passward(void);
void show_information(void);
void menu_student(void);
#endif
student.c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include "tool.h"
#include "student.h"
#include "teacher.h"
#include "land.h"
void check_score(void)
{
float sum_max=s[0].Chinese+s[0].Math+s[0].English, sum_min=s[0].Chinese+s[0].Math+s[0].English;
float max_c=s[0].Chinese, max_m=s[0].Math, max_e=s[0].English;
float min_c=s[0].Chinese, min_m=s[0].Math, min_e=s[0].English;
int cnt_c=1,cnt_m=1,cnt_e=1,cnt_sum=1;
for(int i=0;i<count_stu;i++)
{
sum_max=sum_max > (s[i].Chinese+s[i].Math+s[i].English) ? sum_max:(s[i].Chinese+s[i].Math+s[i].English);
sum_min=sum_min < (s[i].Chinese+s[i].Math+s[i].English) ? sum_min:(s[i].Chinese+s[i].Math+s[i].English);
if(s[i].Chinese > max_c)
max_c=s[i].Chinese;
if(s[i].Math > max_m)
max_m=s[i].Math;
if(s[i].English > max_e)
max_e=s[i].English;
if(s[i].Chinese < min_c)
min_c=s[i].Chinese;
if(s[i].Math < min_m)
min_m=s[i].Math;
if(s[i].English < min_e)
min_e=s[i].English;
if((s[i].Chinese+s[i].Math+s[i].English) > (s[cur].Chinese+s[cur].Math+s[cur].English))
cnt_sum++;
if(s[i].Chinese > s[cur].Chinese)
cnt_c++;
if(s[i].Math > s[cur].Math)
cnt_m++;
if(s[i].English > s[cur].English)
cnt_e++;
}
printf(" \t语文\t数学\t英语\t\t 总分\n");
printf("单科最高分:\t%.2f\t%.2f\t%.2f\t最高总分:%.2f\n",max_c,max_m,max_e,sum_max);
printf("单科最低分:\t%.2f\t%.2f\t%.2f\t最低总分:%.2f\n",min_c,min_m,min_e,sum_min);
printf(" 你的成绩 :\t%.2f\t%.2f\t%.2f\t\t %.2f\t平均分:%.2f\n",s[cur].Chinese,s[cur].Math,s[cur].English,s[cur].Chinese+s[cur].Math+s[cur].English,(s[cur].Chinese+s[cur].Math+s[cur].English)/3);
printf(" 你的排名 :\t%d\t%d\t%d\t\t %d\n",cnt_c,cnt_m,cnt_e,cnt_sum);
anykey_continue();
}
void change_password(void)
{
char KEY[2][10]={0};
printf("当前密码为:%s,请输入新密码,长度10以内:\n",s[cur].key);
get_password(KEY[0],sizeof(KEY[0]),true);
printf("\n");
puts("请再次输入新密码!\n");
get_password(KEY[1], sizeof(KEY[1]) ,true);
printf("\n");
if(0 == strcmp(KEY[0],KEY[1]))
{
printf("修改成功!\n");
strcpy(s[cur].key,KEY[1]);
sleep(1);
}
else
{
printf("\033[01;31m");
printf("修改失败!\n");
printf("\033[00m");
sleep(1);
}
}
void show_information(void)
{
printf("姓名:%s 性别:%s 学号:%d 语文:%.2f 数学:%.2f 英语:%.2f 密码:%s lock:%c\n",s[cur].name,s[cur].sex,s[cur].id, s[cur].Chinese, s[cur].Math, s[cur].English,s[cur].key,s[cur].lock);
anykey_continue();
}
void menu_student(void)
{
while(1)
{
printf("\033[01;32m");
system("clear");
puts("欢迎进入学生菜单!");
puts("1.查询成绩.");
puts("2.修改密码.");
puts("3.查看个人信息.");
puts("4.退出.");
printf("\033[00m");
switch(get_cmd('1','4'))
{
case '1': check_score(); break;
case '2': change_password(); break;
case '3': show_information(); break;
case '4': return;
}
}
}
teacher.h
#ifndef TEACHER_H
#define TEACHER_H
#include <stdlib.h>
#include <strings.h>
#include <string.h>
#include <getch.h>
int cntt;
void change_key(void);
void menu_teacher(void);
void add_student(void);
void del_student(void);
void find(void);
void change_information(void);
void change_information_sorce(void);
void add_sorce(void);
void show_student(void);
void teacher(void);
#endif
teacher.c
#include <stdio.h>
#include "tool.h"
#include "admin.h"
#include "teacher.h"
#include "land.h"
void menu_teacher(void)
{
printf("\033[01;32m");
printf("--%s正在使用\n",tea[cur].name);
puts("1-修改密码");
puts("2-添加学生");
puts("3-删除学生");
puts("4-学生查询 信息(密码)修改 学生解锁");
puts("5-录入学生成绩");
puts("6-显示学生信息");
puts("0-退出");
printf("\033[00m");
}
void change_key(void)
{
char ch;
char KEY[3][10];
puts("是否修改? y or n");
scanf("%c",&ch);
stdin->_IO_read_ptr = stdin->_IO_read_end;
if('y'==ch)
{
puts("请输入旧密码");
get_str(KEY[2],10);
if(0 == strcmp(KEY[2],tea[cur].key))
{
for(;;)
{
puts("请输入新密码");
get_str(KEY[0],10);
puts("请确认新密码");
get_str(KEY[1],10);
if(0 == strcmp(KEY[0],KEY[1]))
{
strcpy(tea[cur].key,KEY[0]);
break;
}
else
puts("两次密码不一致,重新输入");
anykey_continue();
}
}
}
else
{
printf("\033[01;31m");
puts("密码修改失败");
printf("\033[00m");
anykey_continue();
}
}
void add_student(void)
{
puts("1-单个添加");
puts("2-从文件添加");
char st1[10]="000000";
if('1' == get_cmd('1','2'))
{
while(1)
{
puts("开始添加");
puts("输入姓名,性别");
get_str(s[count_stu].name,10);
get_str(s[count_stu].sex,4);
s[count_stu].id=iD+1;
s[count_stu].lock='0';
iD++;
strcpy((s+count_stu)->key,st1);
printf("姓名:%s 性别:%s 学号:%d 语文:%.2f 数学:%.2f 英语:%.2f 密码:%s lock:%c\n",(s+count_stu)->name,(s+count_stu)->sex,(s+count_stu)->id,(s+count_stu)->Chinese,(s+count_stu)->Math,(s+count_stu)->English,(s+count_stu)->key,(s+count_stu)->lock);
count_stu++;
puts("添加成功!");
puts("1-继续添加\n2-退出\n");
switch(get_cmd('1','2'))
{
case '1':break;
case '2':return;
}
}
}
else
{
FILE* file=fopen("stu_add.txt","r");
if (NULL == file)
{
printf("stu_add文件打开失败!");
return ;
}
while(0 < fscanf(file,"姓名:%s 性别:%s\n",((s+count_stu)->name),((s+count_stu)->sex)))
{
s[count_stu].id=iD+1;
s[count_stu].lock='0';
iD++;
strcpy((s+count_stu)->key,st1);
count_stu++;
}
fclose(file);
puts("添加成功!");
}
anykey_continue();
}
void del_student(void)
{
int ID[2];
int flag=0;
puts("输入学生学号");
scanf("%d",&ID[0]);
stdin->_IO_read_ptr = stdin->_IO_read_end;
puts("再次输入");
scanf("%d",&ID[1]);
stdin->_IO_read_ptr = stdin->_IO_read_end;
if(ID[0] == ID[1])
{
for(int i=0; i<count_stu; i++)
{
if(ID[0] == s[i].id)
{
puts("---");
*(stu_e+count_stu_e)=*(s+i);
count_stu_e++;
bzero(s+i,sizeof(Students));
for(int j=i;j<count_stu-1;j++)
{
*(s+j)=*(s+j+1);
bzero(s+j+1,sizeof(Students));
}
count_stu--;
flag=1;
puts("删除成功!");
break;
}
}
if(0==flag)
puts("查无此人");
}
else
{
printf("\033[01;31m");
puts("两次输入不一致");
printf("\033[00m");
}
anykey_continue();
return;
}
void find(void)
{
char ch;
int flag=0;
puts("1-学号查询");
puts("2-姓名查询");
switch(get_cmd('1','2'))
{
case '1':{
int ID;
puts("输入学号");
scanf("%d",&ID);
for(int i=0; i<count_stu; i++)
{
if(ID == s[i].id)
{
printf("姓名:%s 性别:%s 学号:%d 语文:%.2f 数学:%.2f 英语:%.2f 密码:%s lock:%c\n",(s+i)->name,(s+i)->sex,(s+i)->id,(s+i)->Chinese,(s+i)->Math,(s+i)->English,(s+i)->key,(s+i)->lock);
flag=1;
cntt=i;
break;
}
}
if(0==flag)
{
puts("查无此人");
anykey_continue();
}
}break;
case '2':{
char NAME[10];
puts("输入姓名");
get_str(NAME,10);
for(int i=0; i<count_stu; i++)
{
if(0 == strcmp(NAME,s[i].name))
{
printf("姓名:%s 性别:%s 学号:%d 语文:%.2f 数学:%.2f 英语:%.2f 密码:%s lock:%c\n",(s+i)->name,(s+i)->sex,(s+i)->id,(s+i)->Chinese,(s+i)->Math,(s+i)->English,(s+i)->key,(s+i)->lock);
flag=1;
cntt=i;
break;
}
}
if(0 == flag)
{
puts("查无此人");
anykey_continue();
}
}break;
}
if(1==flag)
{
puts("1-修改学生信息/密码 解锁学生");
puts("2-继续查询");
puts("3-退出");
switch(get_cmd('1','3'))
{
case '1': change_information();break;
case '2': find();break;
case '3': return;
}
}
else
{
puts("继续查询 y or n");
scanf("%c",&ch);
stdin->_IO_read_ptr = stdin->_IO_read_end;
if('y' == ch)
find();
else
return;
}
}
void change_information(void)
{
while(1)
{
puts("1-姓名\n2-性别\n3-学号\n4-密码\n5-成绩\n6-解锁学生\n0-退出");
switch(get_cmd('0','6'))
{
case '0': return;
case '1': get_str(s[cntt].name,10);break;
case '2': get_str(s[cntt].sex,4);break;
case '3': scanf("%d",&s[cntt].id);break;
case '4': get_str(s[cntt].key,10);break;
case '5': change_information_sorce();break;
case '6': {
if('1'==s[cntt].lock)
s[cntt].lock='0';
}break;
}
puts("操作成功");
}
}
void change_information_sorce(void)
{
for(;;)
{
puts("1-语文 2-数学 3-英语 4-所有 5-退出\n");
switch(get_cmd('1','5'))
{
case '1': scanf("%f",&s[cntt].Chinese);break;
case '2': scanf("%f",&s[cntt].Math);break;
case '3': scanf("%f",&s[cntt].English);break;
case '4':{
puts("按顺序输入语 数 英:");
scanf("%f %f %f",&s[cntt].Chinese,&s[cntt].Math,&s[cntt].English);
}break;
case '5': return;
}
stdin->_IO_read_ptr = stdin->_IO_read_end;
puts("修改成功");
}
}
void add_sorce(void)
{
int i=0;
int arr_id;
FILE* sorce=fopen("stu_cj.txt","r");
if (NULL == sorce)
{
printf("stu_sorce文件打开失败!");
return ;
}
fscanf(sorce,"学号 语 数 英");
while(i < count_stu)
{
printf("录入%s的成绩 语 数 英:",s[i].name);
fscanf(sorce,"%d %f %f %f\n",&arr_id,&s[i].Chinese,&s[i].Math,&s[i].English);
printf("%.2f %.2f %.2f\n",s[i].Chinese,s[i].Math,s[i].English);
i++;
}
fclose(sorce);
anykey_continue();
}
void show_student(void)
{
puts("1-在校学生\n2-退校学生\n3-返回");
switch(get_cmd('1','3'))
{
case '1':{
for(int i=0; i<count_stu; i++)
{
printf("姓名:%s 性别:%s 学号:%d 语文:%.2f 数学:%.2f 英语:%.2f 密码:%s lock:%c\n",(s+i)->name,(s+i)->sex,(s+i)->id,(s+i)->Chinese,(s+i)->Math,(s+i)->English,(s+i)->key,(s+i)->lock);
}
}break;
case '2':{
for(int i=0; i<count_stu_e; i++)
{
printf("退 姓名:%s 性别:%s 学号:%d 语文:%.2f 数学:%.2f 英语:%.2f\n",(stu_e+i)->name,(stu_e+i)->sex,(stu_e+i)->id,(stu_e+i)->Chinese,(stu_e+i)->Math,(stu_e+i)->English);
}
}break;
case '3': return;
}
anykey_continue();
}
void teacher(void)
{
while(1)
{
system("clear");
menu_teacher();
switch (get_cmd('0','6'))
{
case '0': return;
case '1': change_key();break;
case '2': add_student();break;
case '3': del_student();break;
case '4': find();break;
case '5': add_sorce();break;
case '6': show_student();break;
}
}
}
admin.h
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#include <getch.h>
#ifndef ADMIN_H
#define ADMIN_H
int ID;
char* man_num;
char apd[10];
void admin(void);
void menu_admin(void);
void land_choose(void);
void menu_land(void);
void add_teacher(void);
void del_teacher(void);
void reset(void);
void oplock(void);
#endif
admin.c
#include <stdio.h>
#include <stdbool.h>
#include <string.h>
#include <getch.h>
#include <stdlib.h>
#include "admin.h"
#include "teacher.h"
#include "tool.h"
#include "land.h"
char* man_num="thl520";
int ID = 20210001;
void land_choose(void)
{
for(;;)
{
menu_land();
switch(get_cmd('1','3'))
{
case '1': land_admin(); break;
case '2': reset(); break;
case '3':return;
}
}
}
void menu_land(void)
{
system("clear");
printf("\033[01;35m");
puts("*****欢迎登入校长平台*****");
puts("1、登入后台");
puts("2、重置密码");
puts("3、退出");
printf("\033[00m");
}
void reset(void)
{
char str[10];
int key=0;
printf("请输入管理员令牌:");
get_password(str,sizeof(str),true);
printf("\n");
if(0 == strcmp(str,man_num) )
{
printf("重置本人密码按 1\n");
printf("重置老师密码按 2\n");
switch(get_cmd('1','2'))
{
case '1':
printf("请输入本人的重置密码:");
get_str(apd,10);
puts("重置成功!");
sleep(2);
break;
case '2':
printf("请输入要重置密码的老师工号:");
scanf("%d",&key);
; for(int i=0; i<count_tea; i++)
{
if(key==tea[i].id && tea[i].id)
{
printf("%s %s %s %d\n",tea[i].name,tea[i].sex,tea[i].key,tea[i].id);
puts("请重新输入重置密码:");
get_str(tea[i].key,10);
puts("重置成功!");
printf("%s %s %s %d\n",tea[i].name,tea[i].sex,tea[i].key,tea[i].id);
sleep(2);
return;
}
else
{
printf("\033[01;31m");
puts("找不到该老师!\n");
printf("\033[00m");
return;
}
}break;
}
}
else
{
printf("\033[01;31m");
printf("令牌错误!\n");
printf("\033[00m");
sleep(1);
}
}
void add_teacher(void)
{
int i=0;
while(tea[i].id)i++;
printf("请输入姓名:");
get_str(tea[i].name,10);
printf("请输入性别:");
get_str(tea[i].sex,4);
if(!strcmp(tea[i].sex,"男") || !strcmp(tea[i].sex,"女"))
{
strcpy(tea[i].key,"000000");
tea[i].lock='0';
if(0 == i )
{
tea[i].id=ID;
}
else
{
tea[i].id=tea[i-1].id+1;
}
count_tea++;
printf("%s %s %d 添加成功!\n",tea[i].name,tea[i].sex,tea[i].id);
sleep(2);
}
else
{
puts("性别输入有问题");
getch();
}
}
void del_teacher(void)
{
char key[10];
int j=0;
printf("请输入要删除的老师姓名:");
get_str(key,10);
for(int i=0; i<count_tea; i++)
{
if(tea[i].id && !strcmp(key,tea[i].name))
{
while(dtea[j].id)j++;
dtea[j]=tea[i];
count_dtea++;
printf("姓名:%s 性别:%s 工号:%d 删除老师成功!\n",dtea[j].name,dtea[j].sex,dtea[j].id);
for(int k=i;k<count_tea;k++)
{
tea[k]=tea[k+1];
}
count_tea--;
sleep(2);
return;
}
}
printf("\033[01;31m");
printf("未找到老师,删除失败!\n");
printf("\033[00m");
sleep(1);
}
void list(void)
{
printf("在职老师名单:\n");
for(int i=0; i<count_tea; i++)
{
if(tea[i].id)
{
printf("姓名:%s 性别:%s 工号:%d\n",tea[i].name,tea[i].sex,tea[i].id);
}
}
printf("离职老师名单:\n");
for(int i=0; i<count_dtea; i++)
{
if(0!=dtea[i].id)
{
printf("姓名:%s 性别:%s 工号:%d \n",dtea[i].name,dtea[i].sex,dtea[i].id);
}
}
anykey_continue();
}
void oplock(void)
{
char key[10];
printf("请输入要解锁的老师姓名:");
get_str(key,10);
for(int i=0; i<count_tea; i++)
{
if(tea[i].id && !strcmp(key,tea[i].name))
{
tea[i].lock='0';
puts("解锁成功");
sleep(2);
}
}
}
void menu_admin(void)
{
system("clear");
printf("\033[01;35m");
puts("*****欢迎登入管理中心*****");
puts("1、添加老师");
puts("2、删除老师");
puts("3、解锁老师");
puts("4、显示在职,离职老师");
puts("5、重置密码");
puts("6、退出");
printf("\033[00m");
}
void admin(void)
{
for(;;)
{
menu_admin();
switch(get_cmd('1','6'))
{
case '1': add_teacher(); break;
case '2': del_teacher(); break;
case '3': oplock();break;
case '4': list();break;
case '5': reset();break;
case '6': return ;
}
}
}
makefile
CC=gcc
FLAG=-Werror -Wall
OBJS=main.o student.o teacher.o admin.o tool.o file.o land.o
TARGE=manage
all:$(OBJS)
$(CC) $(OBJS) -o $(TARGE) && ./$(TARGE)
#%.o:%.c
# $(CC) $(FLAG) -c $<
clean:
rm -rf *.h.gch
rm -rf $(OBJS) $(TARGE)
tool.o:tool.c tool.h
$(CC) $(FLAG) -c tool.c
main.o:main.c tool.h student.h teacher.h admin.h land.h file.h
$(CC) $(FLAG) -c main.c
student.o:student.c student.h teacher.h tool.h land.h
$(CC) $(FLAG) -c student.c
teacher.o:teacher.c student.h teacher.h admin.h tool.h land.h
$(CC) $(FLAG) -c teacher.c
admin.o:admin.c admin.h teacher.h tool.h land.h
$(CC) $(FLAG) -c admin.c
file.o:file.c file.h admin.h teacher.h tool.h
$(CC) $(FLAG) -c file.c
land.o:land.c land.h student.h teacher.h tool.h
$(CC) $(FLAG) -c land.c
|