一、项目要求:
本项目管理三种身份人员的信息:
-
管理员(仅一个):姓名:admin 密码:
-
教师(多个):姓名、密码、工号、性别、出生日期、
-
学生(多个):姓名、密码、学号、性别、出生日期、数学、语文、英语三门功课成绩
管理员登录后可以进行如下操作:
-
修改自身登录密码
-
添加新教师
-
查看所有教师
-
删除教师
-
修改教师信息
教师登录后可以进行如下操作:
1. 修改自身登录密码
2. 查阅自身信息
3. 添加新学生
4. 删除学生
5. 查阅指定学生信息
6. 修改学生信息(姓名、性别、出生日期、三门功课成绩)
7. 按学号从低到高查看所有学生信息
8. 按数学成绩从高到低查看所有学生信息
9. 按语文成绩从高到低查看所有学生信息
10. 按英语成绩从高到低查看所有学生信息
11. 按总分从高到低查看所有学生信息
学生登录后可以进行如下操作:
1. 修改自身登录密码
2. 查阅自身信息
二、项目思路
整体思路MCV模式
1. model模块包含管理员,教师以及学生
1)管理员模块里包含:
因为只需要一个,我用了个结构体数组来保存管理员数据
管理员角色数据类型:账号、密码
保存管理员数据到文件的函数:这里用了文件的读写操作来保存和加载数据
从文件中读取管理员数据的函数:同样这里用了文件的读写操作来保存和加载数据
2)教师模块里包含:
这里我采用了带头结点单向链表来管理多个教师角色
教师的数据类型
教师链表相关操作函数:
创建结点
增删改查等操作
释放整个链表等等
保存和加载教师数据函数
3)学生模块里包含:
这里我也采用了带头结点单向链表来管理多个学生角色
和教师模块类似
2.viewer模块
负责界面相关函数
3.Controller模块
调用Viewer模块和三个Model模块提供的函数串接成完整的最终程序
三、代码
1. .h文件
1)管理员模块
//定义管理员结构体信息
struct admin_info{
char admin_name[32];
char admin_pswd[18];
}a[1];
void admin_logon(struct admin_info a[]);
void admin_read(struct admin_info a[]);
void admin_read1(struct admin_info a[]);
void mod_admin_pswd(struct admin_info a[]);
void save_admin(struct admin_info a[]);
2) viewer界面
void first_menu();
void login_mode_menu();
void admin_menu();
void mod_tch_menu();
void tch_menu();
void mod_stu_menu();
void stu_menu();
void sec_menu();
3)密码模块
int admin_login(struct admin_info a[]);
int tch_login(struct tch_info *head1,int number);
int stu_login(struct stu_info *head2,int number);
4)学生模块
//定义学生结构体信息
struct stu_info{
char stu_name[32];
int stu_num;
char stu_pswd[18];
char stu_gender[5];
char stu_birth[20];
double math;
double chinese;
double english;
double total;
struct stu_info *next;
};
struct stu_info *create_stu_node();
void add_stu(struct stu_info *head2);
void save_stu(struct stu_info *head2);
void read_stu(struct stu_info *head2);
void show_stu(struct stu_info *head2,int key);
struct stu_info *search_stu(struct stu_info *head2,int number);
void del_stu(struct stu_info *head2);
void mod_stu(struct stu_info *head2);
void mod_stu_pswd(struct stu_info *head2,int number);
void show_self_info_stu(struct stu_info *head2,int number);
5)老师模块
//定义教师结构体信息
struct tch_info{
char tch_name[32];
int tch_num;
char tch_pswd[18];
char tch_gender[5];
char tch_birth[20];
struct tch_info *next;
};
struct tch_info *create_tch_node();
void add_tch(struct tch_info *head1);
void save_tch(struct tch_info *head1);
void read_tch(struct tch_info *head1);
void show_tch(struct tch_info *head1);
struct tch_info *search_tch(struct tch_info *head1,int num);
void del_tch(struct tch_info *head1);
void mod_tch(struct tch_info *head1);
void mod_tch_pswd(struct tch_info *head1,int number);
void show_self_info(struct tch_info *head1,int number);
2. .c文件
1)主函数部分
main函数,包含了项目的整体的框架。
管理员的登录操作——>选择登录方式——>管理员模式 or 老师模式 or 学生模式
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "../inc/menu.h"
#include "../inc/admin.h"
#include "../inc/teacher.h"
#include "../inc/student.h"
#include "../inc/pswd.h"
int main(){
struct tch_info *head1=NULL;
struct stu_info *head2=NULL;
head1=create_tch_node();
head2=create_stu_node();
int ret,ret1,ret2,choose,choose1,input,input1,input2,input3;
int flag=1;
//注册管理员账号or其他账号登录
first_menu();
scanf("%d",&choose);
while(getchar()!='\n');
switch(choose){
case 1:
//已有管理员账号,加载账号信息
admin_read(a);
break;
case 2:
//注册管理员账号
admin_read1(a);
//若账号已存在,用户选择 1--重置账号 2--进入下级菜单
if(strlen(a[0].admin_name)>0){
printf("账号已存在\n");
sec_menu();
scanf("%d",&choose1);
while(getchar()!='\n');
switch(choose1){
case 1:
admin_logon(a);
break;
default:
break;
}
}
else admin_logon(a);
break;
case 3:
//进入下级菜单 不加载管理员账号信息
break;
case 0:
exit(-1);
break;
default:
printf("无效参数\n");
exit(-1);
break;
}
//加载教师数据 不能放在while里循环加载
read_tch(head1);
//加载学生数据
read_stu(head2);
//选择登录模式
while(flag){
int flag1=1;
int flag2=1;
int flag3=1;
int number,number1,number2;
struct stu_info *psearch=NULL;
login_mode_menu();
scanf("%d",&input);
while(getchar()!='\n');
switch(input){
//管理员模式————————————————————————————————————————————————————————————————————
case 1:
//用户名密码判断
ret=admin_login(a);
if(ret==0){ //正确登录
while(flag1){
admin_menu();
scanf("%d",&input1);
while(getchar()!='\n');
switch(input1){
//修改密码
case 1:
mod_admin_pswd(a);
break;
//添加教师
case 2:
add_tch(head1);
break;
//查看教师
case 3:
show_tch(head1);
break;
//删除教师
case 4:
del_tch(head1);
break;
//修改教师信息
case 5:
mod_tch(head1);
break;
//返回上一层
case 0:
flag1=0;
//保存管理员密码
save_admin(a);
//保存教师数据
save_tch(head1);
break;
default:
printf("无效参数,请重新输入\n");
break;
}
}
}
break;
//老师模式———————————————————————————————————————————————————————————————————————
case 2:
printf("工号:");
scanf("%d",&number);
while(getchar()!='\n');
//判断教师密码
ret1=tch_login(head1,number);
if(ret1==0){ //成功登录
while(flag2){
tch_menu();
scanf("%d",&input2);
while(getchar()!='\n');
switch(input2){
//修改自身登录密码
case 1:
mod_tch_pswd(head1,number);
break;
//查阅自身信息
case 2:
show_self_info(head1,number);
break;
//添加学生
case 3:
add_stu(head2);
break;
//删除学生
case 4:
del_stu(head2);
break;
//查阅指定学生信息
case 5:
printf("请输入需要查找的学生学号:");
scanf("%d",&number1);
while(getchar()!='\n');
psearch=search_stu(head2,number1);
if(psearch==NULL)
printf("查找失败,无此学号\n");
else
printf("姓名:%s 学号:%d 性别:%s 出生日期:%s 数学成绩:%.1lf 语文成绩:%.1lf 英语成绩:%.1lf 总成绩:%.1lf\n",\
psearch->stu_name,psearch->stu_num,psearch->stu_gender,psearch->stu_birth,psearch->math,psearch->chinese,\
psearch->english,psearch->total);
break;
//修改学生信息
case 6:
mod_stu(head2);
break;
//按学号从低到高排序
case 7:
show_stu(head2,4);
break;
//按数学成绩从高到低排序
case 8:
show_stu(head2,1);
break;
//按语文成绩从高到低排序
case 9:
show_stu(head2,2);
break;
//按英语成绩从高到低排序
case 10:
show_stu(head2,3);
break;
//按总分成绩从高到低排序
case 11:
show_stu(head2,0);
break;
case 0:
flag2=0;
//保存教师密码数据
save_tch(head1);
//保存学生数据
save_stu(head2);
break;
default:
printf("无效参数,请重新输入\n");
break;
}
}
}
break;
//学生模式——————————————————————————————————————————————————————————————————————
case 3:
printf("学号:");
scanf("%d",&number2);
while(getchar()!='\n');
//判断学生密码
ret2=stu_login(head2,number2);
if(ret2==0){ //成功登录
while(flag3){
stu_menu();
scanf("%d",&input3);
while(getchar()!='\n');
switch(input3){
//修改密码
case 1:
mod_stu_pswd(head2,number2);
break;
//查看自身信息
case 2:
show_self_info_stu(head2,number2);
break;
//退出
case 0:
flag3=0;
//保存学生密码
save_stu(head2);
break;
default:
printf("无效参数,请重新输入\n");
break;
}
}
}
break;
//退出
case 0:
flag=0;
break;
default:
printf("无效参数,请重新输入\n");
break;
}
}
return 0;
}
2)viewer界面
#include <stdio.h>
//判断用户是否已有管理员账号
void first_menu(){
printf("——————————————————————————————————————————\n");
printf("|********欢迎登录学校信息管理系统********|\n");
printf("——————————————————————————————————————————\n");
printf("| 1.已有管理员账号 |\n");
printf("——————————————————————————————————————————\n");
printf("| 2.注册管理员账号 |\n");
printf("——————————————————————————————————————————\n");
printf("| 3.其他用户登录 |\n");
printf("——————————————————————————————————————————\n");
printf("| 0.退出系统 |\n");
printf("——————————————————————————————————————————\n");
printf("请输入:");
}
// 判断管理员账号是存在后的选择菜单
void sec_menu(){
printf("——————————————————————————————————————————\n");
printf("|********欢迎登录学校信息管理系统********|\n");
printf("——————————————————————————————————————————\n");
printf("| 1.重置账号 |\n");
printf("——————————————————————————————————————————\n");
printf("| 2.进入下级菜单 |\n");
printf("——————————————————————————————————————————\n");
printf("请输入:");
}
//选择登录身份
void login_mode_menu(){
printf("——————————————————————————————————————————\n");
printf("|********欢迎登录学校信息管理系统********|\n");
printf("——————————————————————————————————————————\n");
printf("| 1.管理员 |\n");
printf("——————————————————————————————————————————\n");
printf("| 2.教师 |\n");
printf("——————————————————————————————————————————\n");
printf("| 3.学生 |\n");
printf("——————————————————————————————————————————\n");
printf("| 0.退出系统 |\n");
printf("——————————————————————————————————————————\n");
printf("请输入:");
}
//管理员界面
void admin_menu(){
printf("——————————————————————————————————————————\n");
printf("|********欢迎登录学校信息管理系统********|\n");
printf("——————————————————————————————————————————\n");
printf("| 1.修改账号密码 |\n");
printf("——————————————————————————————————————————\n");
printf("| 2.添加新教师 |\n");
printf("——————————————————————————————————————————\n");
printf("| 3.查看所有教师信息 |\n");
printf("——————————————————————————————————————————\n");
printf("| 4.删除教师 |\n");
printf("——————————————————————————————————————————\n");
printf("| 5.修改教师信息 |\n");
printf("——————————————————————————————————————————\n");
printf("| 0.放回上一层 |\n");
printf("——————————————————————————————————————————\n");
printf("请输入:");
}
//修改教师信息的菜单
void mod_tch_menu(){
printf("——————————————————————————————————————————\n");
printf("|********欢迎登录学校信息管理系统********|\n");
printf("——————————————————————————————————————————\n");
printf("| 1.修改教师姓名 |\n");
printf("——————————————————————————————————————————\n");
printf("| 2.修改教师工号 |\n");
printf("——————————————————————————————————————————\n");
printf("| 3.修改教师性别 |\n");
printf("——————————————————————————————————————————\n");
printf("| 4.修改教师出生日期 |\n");
printf("——————————————————————————————————————————\n");
printf("| 0.放回上一层 |\n");
printf("——————————————————————————————————————————\n");
printf("请输入:");
}
//教师界面
void tch_menu(){
printf("——————————————————————————————————————————\n");
printf("|********欢迎登录学校信息管理系统********|\n");
printf("——————————————————————————————————————————\n");
printf("| 1.修改账号密码 |\n");
printf("——————————————————————————————————————————\n");
printf("| 2.查看账号信息 |\n");
printf("——————————————————————————————————————————\n");
printf("| 3.添加新学生 |\n");
printf("——————————————————————————————————————————\n");
printf("| 4.删除学生 |\n");
printf("——————————————————————————————————————————\n");
printf("| 5.按条件查找学生 |\n");
printf("——————————————————————————————————————————\n");
printf("| 6.修改学生信息 |\n");
printf("——————————————————————————————————————————\n");
printf("| 7.按学号从小到大排序查看 |\n");
printf("——————————————————————————————————————————\n");
printf("| 8.按数学成绩从高到低排序查看 |\n");
printf("——————————————————————————————————————————\n");
printf("| 9.按语文成绩从高到低排序查看 |\n");
printf("——————————————————————————————————————————\n");
printf("| 10.按英语成绩从高到低排序查看 |\n");
printf("——————————————————————————————————————————\n");
printf("| 11.按总分从高到低排序查看 |\n");
printf("——————————————————————————————————————————\n");
printf("| 0.返回上一层 |\n");
printf("——————————————————————————————————————————\n");
printf("请输入:");
}
//修改学生信息的菜单
void mod_stu_menu(){
printf("——————————————————————————————————————————\n");
printf("|********欢迎登录学校信息管理系统********|\n");
printf("——————————————————————————————————————————\n");
printf("| 1.修改学生姓名 |\n");
printf("——————————————————————————————————————————\n");
printf("| 2.修改学生学号 |\n");
printf("——————————————————————————————————————————\n");
printf("| 3.修改学生性别 |\n");
printf("——————————————————————————————————————————\n");
printf("| 4.修改学生出生日期 |\n");
printf("——————————————————————————————————————————\n");
printf("| 5.修改学生数学成绩 |\n");
printf("——————————————————————————————————————————\n");
printf("| 6.修改学生语文成绩 |\n");
printf("——————————————————————————————————————————\n");
printf("| 7.修改学生英语成绩 |\n");
printf("——————————————————————————————————————————\n");
printf("| 0.放回上一层 |\n");
printf("——————————————————————————————————————————\n");
printf("请输入:");
}
//学生界面
void stu_menu(){
printf("——————————————————————————————————————————\n");
printf("|********欢迎登录学校信息管理系统********|\n");
printf("——————————————————————————————————————————\n");
printf("| 1.修改账号密码 |\n");
printf("——————————————————————————————————————————\n");
printf("| 2.查看账号信息 |\n");
printf("——————————————————————————————————————————\n");
printf("| 0.返回上一层 |\n");
printf("——————————————————————————————————————————\n");
printf("请输入:");
}
3)管理员模块
管理员自身的密码管理
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <string.h>
#include "../inc/admin.h"
//注册账号
void admin_logon(struct admin_info a[]){
int choose;
FILE *fp=NULL;
fp=fopen("../file/user.txt","w");
if(fp==NULL){
perror("fopen");
return;
}
//注册管理员账号
printf("请输入管理员名:");
scanf("%s",a[0].admin_name);
while(getchar()!='\n');
printf("请输入密码:");
scanf("%s",a[0].admin_pswd);
while(getchar()!='\n');
fprintf(fp,"%s\t%s\n",a[0].admin_name,a[0].admin_pswd);
printf("账号注册成功\n");
fclose(fp);
return;
}
//加载账号
void admin_read(struct admin_info a[]){
FILE *fp=NULL;
fp=fopen("../file/user.txt","r");
if(fp==NULL){
perror("fopen");
exit(-1);
}
fscanf(fp,"%s\t%s\n",a[0].admin_name,a[0].admin_pswd);
if(strlen(a[0].admin_name)<=0){
printf("您无账号,请先注册\n");
fclose(fp);
exit(-1);
}
fclose(fp);
char buff[25];
memset(buff,'\0',25);
puts("加载中...");
for(int i=0;i<25;i++){
printf("%-24s[%d%%]\r",buff,(i+1)*4);
fflush(stdout);
buff[i]='.';
usleep(100000);
}
printf("\n");
return;
}
void admin_read1(struct admin_info a[]){
FILE *fp=NULL;
fp=fopen("../file/user.txt","r");
if(fp==NULL){
perror("fopen");
exit(-1);
}
fscanf(fp,"%s\t%s\n",a[0].admin_name,a[0].admin_pswd);
fclose(fp);
return;
}
//修改管理员密码
void mod_admin_pswd(struct admin_info a[]){
printf("请输入修改后的密码:");
scanf("%s",a[0].admin_pswd);
while(getchar()!='\n');
printf("密码修改成功\n");
return;
}
//保存数据
void save_admin(struct admin_info a[]){
FILE *fp=NULL;
fp=fopen("../file/user.txt","w");
if(fp==NULL){
perror("fopen");
exit(-1);
}
fprintf(fp,"%s\t%s\n",a[0].admin_name,a[0].admin_pswd);
fclose(fp);
return;
}
管理教师
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include "../inc/teacher.h"
#include "../inc/menu.h"
//创建结点
struct tch_info *create_tch_node(){
struct tch_info *pnew=NULL;
pnew=(struct tch_info *)malloc(sizeof(struct tch_info));
assert(pnew!=NULL);
pnew->next=NULL;
return pnew;
}
//保存数据
void save_tch(struct tch_info *head1){
FILE *fp=NULL;
fp=fopen("../file/tch.txt","w");
if(fp==NULL){
perror("fopen");
return;
}
int ret;
struct tch_info *p=head1->next;
while(p!=NULL){
ret=fprintf(fp,"%s\t%d\t%s\t%s\t%s\n",p->tch_name,p->tch_num,p->tch_pswd,p->tch_gender,p->tch_birth);
if(ret<0){
perror("fprintf");
fclose(fp);
return;
}
p=p->next;
}
fclose(fp);
return;
}
//加载数据
void read_tch(struct tch_info *head1){
FILE *fp=NULL;
fp=fopen("../file/tch.txt","r");
if(fp==NULL){
perror("fopen");
return;
}
int ret;
struct tch_info *pnew=head1->next;
while(1){
pnew=create_tch_node();
ret=fscanf(fp,"%s\t%d\t%s\t%s\t%s\n",pnew->tch_name,&pnew->tch_num,pnew->tch_pswd,pnew->tch_gender,pnew->tch_birth);
if(ret==EOF){
break;
}
//头插法
pnew->next=head1->next;
head1->next=pnew;
}
fclose(fp);
return;
}
//添加教师
void add_tch(struct tch_info *head1){
struct tch_info *pnew=head1->next;
struct tch_info *p=head1->next;
pnew=create_tch_node();
printf("请输入老师姓名:");
scanf("%s",pnew->tch_name);
while(getchar()!='\n');
printf("请输入老师工号:");
scanf("%d",&pnew->tch_num);
while(getchar()!='\n');
//判断工号是否重复
while(p!=NULL){
if(pnew->tch_num==p->tch_num){
printf("工号重复\n");
return;
}
p=p->next;
}
printf("请输入老师密码:");
scanf("%s",pnew->tch_pswd);
while(getchar()!='\n');
printf("请输入老师性别(男or女):");
scanf("%s",pnew->tch_gender);
while(getchar()!='\n');
printf("请输入老师出生日期(2000-9-10):");
scanf("%s",pnew->tch_birth);
while(getchar()!='\n');
//头插法
pnew->next=head1->next;
head1->next=pnew;
printf("添加成功\n");
return;
}
//根据工号升序排序
static void sort_tch_rise(struct tch_info *head1){
struct tch_info *headn=head1->next;
head1->next=NULL;
struct tch_info *p=NULL;
struct tch_info *pmax=NULL;
struct tch_info *new_head=NULL;
while(headn!=NULL){
//找到最大值
pmax=headn;
p=headn;
while(p!=NULL){
if(pmax->tch_num<p->tch_num){
pmax=p;
}
p=p->next;
}
//移走最大值
if(pmax==headn){
headn=headn->next;
}
else{
p=headn;
//找pmax前一位结点
while(p->next!=pmax){
p=p->next;
}
p->next=pmax->next;
}
pmax->next=NULL;
//将最大值添加到新链表
pmax->next=new_head;
new_head=pmax;
}
//将头与new_head连起来
head1->next=new_head;
}
//显示教师信息
void show_tch(struct tch_info *head1){
//显示前先排序
sort_tch_rise(head1);
if(head1->next==NULL){
printf("无教师信息\n");
return;
}
struct tch_info *p=head1->next;
printf("姓名\t工号\t性别\t出生日期\n");
while(p!=NULL){
printf("%s\t%d\t%s\t%s\n",p->tch_name,p->tch_num,p->tch_gender,p->tch_birth);
p=p->next;
}
return;
}
//根据工号查找教师
//成功返回查找的结点
//失败返回NULL
struct tch_info *search_tch(struct tch_info *head1,int num){
if(head1->next==NULL){
printf("无教师信息\n");
return NULL;
}
struct tch_info *p=head1->next;
while(p!=NULL){
if(p->tch_num==num){
return p;
}
p=p->next;
}
printf("无此工号\n");
return NULL;
}
//删除教师
void del_tch(struct tch_info *head1){
int num;
struct tch_info *pdel=NULL;
struct tch_info *p=head1;
printf("请输入待删除的教师的工号:");
scanf("%d",&num);
while(getchar()!='\n');
//根据工号查找到需要删除的结点
pdel=search_tch(head1,num);
//判断pdel的值,若为空则无此工号
if(pdel==NULL){
return;
}
//找到pdel前一个结点
while(p->next!=pdel){
p=p->next;
}
p->next=pdel->next;
free(pdel);
printf("删除成功\n");
return;
}
//修改教师信息
void mod_tch(struct tch_info *head1){
struct tch_info *pmod=NULL;
struct tch_info *p=head1->next;
int flag=1;
int choose,num,number;
printf("请输入待修改的教师的工号:");
scanf("%d",&num);
while(getchar()!='\n');
//根据工号查找到需要修改的结点
pmod=search_tch(head1,num);
if(pmod==NULL){
return;
}
while(flag){
mod_tch_menu();
scanf("%d",&choose);
while(getchar()!='\n');
switch(choose){
case 1:
//修改姓名
printf("请输入修改后的姓名:");
scanf("%s",pmod->tch_name);
while(getchar()!='\n');
printf("修改姓名成功\n");
break;
case 2:
//修改工号
printf("请输入修改后的工号:");
scanf("%d",&number);
while(getchar()!='\n');
//判断修改后的工号是否重复
while(p!=NULL){
if(p->tch_num==number){
printf("修改失败,已存在此工号\n");
return;
}
else p=p->next;
}
//若不重复则赋值给pmod->num
pmod->tch_num=number;
printf("修改工号成功\n");
break;
case 3:
//修改性别
printf("请输入修改后的性别(男or女):");
scanf("%s",pmod->tch_gender);
while(getchar()!='\n');
printf("修改性别成功\n");
break;
case 4:
//修改出生日期
printf("请输入修改后的出生日期(2000-1-1):");
scanf("%s",pmod->tch_birth);
while(getchar()!='\n');
printf("修改出生日期成功\n");
break;
case 0:
flag=0;
break;
default:
printf("无效参数,请重新输入\n");
break;
}
}
}
//修改教师密码
void mod_tch_pswd(struct tch_info *head1,int number){
struct tch_info *psearch=NULL;
//根据工号找到对应结点
psearch=search_tch(head1,number);
if(psearch==NULL){
return;
}
printf("请输入修改后的密码:");
scanf("%s",psearch->tch_pswd);
while(getchar()!='\n');
printf("密码修改成功\n");
return;
}
//查阅自身信息
void show_self_info(struct tch_info *head1,int number){
struct tch_info *psearch=NULL;
//根据工号找到对应结点
psearch=search_tch(head1,number);
if(psearch==NULL){
return;
}
printf("姓名:%s 工号:%d 性别:%s 出生日期:%s\n",\
psearch->tch_name,psearch->tch_num,psearch->tch_gender,psearch->tch_birth);
return;
}
4)教师及学生模块
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include "../inc/student.h"
#include "../inc/menu.h"
//创建结点
struct stu_info *create_stu_node(){
struct stu_info *pnew=NULL;
pnew=(struct stu_info *)malloc(sizeof(struct stu_info));
assert(pnew!=NULL);
pnew->next=NULL;
return pnew;
}
//添加学生
void add_stu(struct stu_info *head2){
struct stu_info *pnew=NULL;
pnew=create_stu_node();
struct stu_info *p=head2->next;
printf("请输入学生姓名:");
scanf("%s",pnew->stu_name);
while(getchar()!='\n');
printf("请输入学生学号:");
scanf("%d",&pnew->stu_num);
while(getchar()!='\n');
//判断学号是否重复
while(p!=NULL){
if(p->stu_num==pnew->stu_num){
printf("学号重复\n");
return;
}
p=p->next;
}
printf("请输入学生密码:");
scanf("%s",pnew->stu_pswd);
while(getchar()!='\n');
printf("请输入学生性别(男or女):");
scanf("%s",pnew->stu_gender);
while(getchar()!='\n');
printf("请输入学生出生日期(2000-1-1):");
scanf("%s",pnew->stu_birth);
while(getchar()!='\n');
printf("请输入学生数学成绩:");
scanf("%lf",&pnew->math);
while(getchar()!='\n');
printf("请输入学生语文成绩:");
scanf("%lf",&pnew->chinese);
while(getchar()!='\n');
printf("请输入学生英语成绩:");
scanf("%lf",&pnew->english);
while(getchar()!='\n');
pnew->total=pnew->math+pnew->chinese+pnew->english;
pnew->next=head2->next;
head2->next=pnew;
printf("添加成功\n");
return;
}
//保存学生数据
void save_stu(struct stu_info *head2){
FILE *fp=NULL;
fp=fopen("../file/stu.txt","wb");
if(fp==NULL){
perror("fopen");
return;
}
struct stu_info *p=head2->next;
int ret;
while(p!=NULL){
ret=fwrite(p,sizeof(struct stu_info),1,fp);
if(ret<0){
perror("fwrite");
fclose(fp);
return;
}
p=p->next;
}
fclose(fp);
printf("保存成功\n");
return;
}
//加载学生数据
void read_stu(struct stu_info *head2){
FILE *fp=NULL;
fp=fopen("../file/stu.txt","rb");
if(fp==NULL){
perror("fopen");
return;
}
int ret;
struct stu_info *pnew=NULL;
while(1){
pnew=create_stu_node();
ret=fread(pnew,sizeof(struct stu_info),1,fp);
if(ret==0){
break;
}
pnew->next=head2->next;
head2->next=pnew;
}
fclose(fp);
printf("加载成功\n");
return;
}
//按学号从小到大排序
static void sort_stu_by_num_rise(struct stu_info *head2){
struct stu_info *headn=head2->next;
head2->next=NULL;
struct stu_info *pmax=NULL;
struct stu_info *p=NULL;
struct stu_info *new_head=NULL;
while(headn!=NULL){
//找学号是最大的结点
pmax=headn;
p=headn;
while(p!=NULL){
if(pmax->stu_num<p->stu_num){
pmax=p;
}
p=p->next;
}
//移走最大值结点
if(headn==pmax){
headn=headn->next;
}
else{
p=headn;
while(p->next!=pmax){
p=p->next;
}
p->next=pmax->next;
}
pmax->next=NULL;
//添加最大值结点到新链表
pmax->next=new_head;
new_head=pmax;
}
//将头与new_head连接
head2->next=new_head;
return;
}
//按成绩来排序
static void sort_stu_by_score_fall(struct stu_info *head2,int key){
struct stu_info *headn=head2->next;
head2->next=NULL;
struct stu_info *pmin=NULL;
struct stu_info *p=NULL;
struct stu_info *new_head=NULL;
while(headn!=NULL){
//找数学成绩最小的结点
pmin=headn;
p=headn;
//key=1代表按数学成绩排序
if(key==1){
while(p!=NULL){
if(pmin->math>p->math){
pmin=p;
}
p=p->next;
}
}
//key=2代表按语文成绩排序
else if(key==2){
while(p!=NULL){
if(pmin->chinese>p->chinese){
pmin=p;
}
p=p->next;
}
}
//key=3代表按英语成绩排序
else if(key==3){
while(p!=NULL){
if(pmin->english>p->english){
pmin=p;
}
p=p->next;
}
}
//key=0代表按总成绩排序
else if(key==0){
while(p!=NULL){
if(pmin->total>p->total){
pmin=p;
}
p=p->next;
}
}
//移走最小值结点
if(headn==pmin){
headn=headn->next;
}
else{
p=headn;
while(p->next!=pmin){
p=p->next;
}
p->next=pmin->next;
}
pmin->next=NULL;
//添加最小值结点到新链表
pmin->next=new_head;
new_head=pmin;
}
//将头与new_head连接
head2->next=new_head;
return;
}
//显示学生信息
void show_stu(struct stu_info *head2,int key){
if(head2->next==NULL){
printf("无学生信息\n");
return;
}
//key=4代表按学号排序
if(key==4){
sort_stu_by_num_rise(head2);
}
//key=1代表按数学成绩排序
else if(key==1){
sort_stu_by_score_fall(head2,1);
}
//key=2代表按语文成绩排序
else if(key==2){
sort_stu_by_score_fall(head2,2);
}
//key=3代表按英语成绩排序
else if(key==3){
sort_stu_by_score_fall(head2,3);
}
//key=0代表按总成绩成绩排序
else if(key==0){
sort_stu_by_score_fall(head2,0);
}
struct stu_info *p=head2->next;
printf("姓名\t学号\t性别\t出生日期\t数学\t语文\t英语\t总成绩\n");
while(p!=NULL){
printf("%s\t%d\t%s\t%s\t%.1lf\t%.1lf\t%.1lf\t%.1lf\n",\
p->stu_name,p->stu_num,p->stu_gender,p->stu_birth,p->math,p->chinese,p->english,p->total);
p=p->next;
}
return;
}
//查阅学生
//成功返回对应结点
//失败返回NULL
struct stu_info *search_stu(struct stu_info *head2,int number){
if(head2->next==NULL){
printf("无学生信息\n");
return NULL;
}
struct stu_info *psearch=head2->next;
while(psearch!=NULL){
if(psearch->stu_num==number){
return psearch;
}
psearch=psearch->next;
}
printf("无此学号\n");
return NULL;
}
//删除学生
void del_stu(struct stu_info *head2){
int number;
struct stu_info *pdel=NULL;
struct stu_info *p=head2;
printf("请输入待删除的学生的学号:");
scanf("%d",&number);
while(getchar()!='\n');
//根据学号查找到需要删除的结点
pdel=search_stu(head2,number);
if(pdel==NULL){
return;
}
//找到pdel前一位结点
while(p->next!=pdel){
p=p->next;
}
p->next=pdel->next;
free(pdel);
printf("删除成功\n");
return;
}
//修改学生信息
void mod_stu(struct stu_info *head2){
struct stu_info *pmod=NULL;
struct stu_info *p=head2->next;
int number,choose,num;
int flag=1;
printf("请输入待修改的学生的学号:");
scanf("%d",&number);
while(getchar()!='\n');
//找到待修改的结点
pmod=search_stu(head2,number);
while(flag){
mod_stu_menu();
scanf("%d",&choose);
while(getchar()!='\n');
switch(choose){
//修改姓名
case 1:
printf("请输入修改后的姓名:");
scanf("%s",pmod->stu_name);
while(getchar()!='\n');
printf("修改姓名成功\n");
break;
//修改学号
case 2:
printf("请输入修改后的学号:");
scanf("%d",&num);
while(getchar()!='\n');
//判断修改后的学号是否重复
while(p!=NULL){
if(p->stu_num==num){
printf("修改失败,学号已存在\n");
return;
}
else p=p->next;
}
//若不重复则赋值
pmod->stu_num=num;
printf("修改学号成功\n");
break;
//修改性别
case 3:
printf("请输入修改后的性别(男or女):");
scanf("%s",pmod->stu_gender);
while(getchar()!='\n');
printf("修改性别成功\n");
break;
//修改出生日期
case 4:
printf("请输入修改后的出生日期(2000-1-1):");
scanf("%s",pmod->stu_birth);
while(getchar()!='\n');
printf("修改出生日期成功\n");
break;
//修改数学成绩
case 5:
printf("请输入修改后的数学成绩:");
scanf("%lf",&pmod->math);
while(getchar()!='\n');
printf("修改数学成绩成功\n");
break;
//修改语文成绩
case 6:
printf("请输入修改后的语文成绩:");
scanf("%lf",&pmod->chinese);
while(getchar()!='\n');
printf("修改语文成绩成功\n");
break;
//修改英语成绩
case 7:
printf("请输入修改后的英语成绩:");
scanf("%lf",&pmod->english);
while(getchar()!='\n');
printf("修改英语成绩成功\n");
break;
case 0:
//返回时更新下总成绩
pmod->total=pmod->math+pmod->chinese+pmod->english;
flag=0;
break;
default:
printf("无效参数,请重新输入\n");
break;
}
}
}
//学生模块
//学生修改密码
void mod_stu_pswd(struct stu_info *head2,int number){
struct stu_info *psearch=NULL;
//根据学号找到学生结点
psearch=search_stu(head2,number);
if(psearch==NULL){
return;
}
printf("请输入修改后的密码:");
scanf("%s",psearch->stu_pswd);
while(getchar()!='\n');
printf("密码修改成功\n");
return;
}
//查阅自身信息
void show_self_info_stu(struct stu_info *head2,int number){
struct stu_info *psearch=NULL;
//根据工号找到对应结点
psearch=search_stu(head2,number);
if(psearch==NULL){
return;
}
printf("姓名:%s 学号:%d 性别:%s 出生日期:%s 数学成绩:%.1lf 语文成绩:%.1lf 英语成绩:%.1lf 总成绩:%.1lf\n",\
psearch->stu_name,psearch->stu_num,psearch->stu_gender,psearch->stu_birth,psearch->math,psearch->chinese,\
psearch->english,psearch->total);
return;
}
6)密码模块
#include <stdio.h>
#include <string.h>
//#include <conio.h>
#include "../inc/admin.h"
#include "../inc/teacher.h"
//判断管理员登录操作
//登录成功返回0
//登录失败返回-1
int admin_login(struct admin_info a[]){
int i;
char name[32];
char pswd[18];
printf("管理员名:");
scanf("%s",name);
while(getchar()!='\n');
printf("密码:");
scanf("%s",pswd);
while(getchar()!='\n');
//判断用户名和密码是否正确
if(strcmp(a[0].admin_name,name)==0&&strcmp(a[0].admin_pswd,pswd)==0){
printf("登录成功\n");
return 0;
}
else{
printf("登录失败\n");
return -1;
}
}
//判断教师登录操作
//登录成功返回0
//登录失败返回-1
int tch_login(struct tch_info *head1,int number){
char pswd[18];
struct tch_info *psearch=NULL;
printf("密码:");
scanf("%s",pswd);
while(getchar()!='\n');
//根据工号找出对应结点
psearch=search_tch(head1,number);
//psearch为空,无此工号
if(psearch==NULL){
return -1;
}
//判断密码
if(strcmp(psearch->tch_pswd,pswd)==0){
printf("教师 %s 登录成功\n",psearch->tch_name);
return 0;
}
else{
printf("登录失败\n");
return -1;
}
}
//判断学生登录操作
//登录成功返回0
//登录失败返回-1
int stu_login(struct stu_info *head2,int number){
char pswd[18];
struct stu_info *psearch=NULL;
printf("密码:");
scanf("%s",pswd);
while(getchar()!='\n');
//根据学号查找对应结点
psearch=search_stu(head2,number);
if(psearch==NULL){
return -1;
}
//判断密码
if(strcmp(psearch->stu_pswd,pswd)==0){
printf("学生 %s 登陆成功\n",psearch->stu_name);
return 0;
}
else{
printf("登录失败\n");
return -1;
}
}
3.Makefile文件
src = $(wildcard ./*.c) #获取当前路径下所有的 .c文件
obj = $(patsubst %.c, %.o, $(src)) #将 .c 文件转换成 .o
target = SIMS
$(target): $(obj)
gcc $^ -o $@
%.o : %.c
gcc $^ -o $@ -c
clean:
rm -rf *.o $(target)
4.数据保存文件