#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "list.h"
#include "stu.h"
#include "common.h"
#include "menu.h"
/*
注: 一个链表结点中的dat,存放一个学生结构体中的所有信息,size相等
dat类型为void *, dat 指向 struct * stu;
*/
static int compare_id(void *,void *);
static int compare_pass(void *,void *);
struct student *sptr=NULL;
LIST *list_stu=NULL;
//比较学生学号和密码
static NODE *stu_compare(struct student *ptr,struct student *ptr1,struct student *ptr2,NODE *cur1,NODE *cur2)
{
int flag=0;
cur1=cur2=list_stu;
while(1)
{
cur1=list_find(cur1,ptr,compare_id);
//找到学号对应的学生
if (cur1!=NULL)
{
ptr1=cur1->dat;
cur2=cur1;
ptr2=cur2->dat;
if ( compare_id(ptr1,ptr)==0 && strcmp(ptr2->pass,ptr->pass)==0 )
{
//核对成功使标志位置1
flag=1;
break;
}
}
else
{
//print_err("核对失败!stu.dat文件没有学生数据!",3,10,31);
return NULL;
}
}
if (flag==1)
{
//核对成功返回学生学号对应结点
flag=0;
return cur1;
}
else
{
//核对失败返回NULL
return NULL;
}
}
//学生登录
int student_login()
{
struct student *ptr1,*ptr2=NULL;
NODE *cur1=NULL;
NODE *cur2=NULL;
sptr=malloc(sizeof(struct student));
ptr1=malloc(sizeof(struct student));
ptr2=malloc(sizeof(struct student));
print_err("欢迎学生登录!",3,10,31);
//清屏
printf("\033[2J");
//提示输入学生学号
printf("\033[5;10H\033[31m%s:\033[0m","ID");
scanf("%d",&(sptr->id));
getchar();
//提示输入密码
printf("\033[6;10H\033[31m%s:\033[0m","PASS");
scanf("%s",sptr->pass);
getchar();
if(stu_compare(sptr,ptr1,ptr2,cur1,cur2))
{
//学号和密码核对成功
return 0;
}
else
{
//学号和密码核对失败
return -1;
}
}
//学生登录后的处理
void student_proc()
{
int ret;
while(1)
{
ret=show_stumenu();
switch(ret)
{
case 1://显示学生自己信息
stu_lookinfo();
break;
case 2://修改学生自己信息
stu_modiinfo();
break;
case 3://退出
free(sptr);
return;
default://打印出错信息
print_err("请输入1-3之间的数字!",3,10,31);
break;
}
}
}
//显示学生自己的信息
void stu_lookinfo()
{
struct student *pptr,*ptr1,*ptr2=NULL;
NODE *cur,*cur1,*cur2=NULL;
int i=0;
ptr1=malloc(sizeof(struct student));
ptr2=malloc(sizeof(struct student));
cur=stu_compare(sptr,ptr1,ptr2,cur1,cur2);
if(cur!=NULL)
{
pptr=cur->dat;
//清屏
printf("\033[2J\033[3;10H学号\t姓名\t密码\t年龄\t性别\t班级\tC语言\t语文\t数学");
getchar();
printf("\033[%d;10H%d\t%s\t%s\t%d\t%s\t%d\t%d\t%d\t%d\n",i+4,
pptr->id,
pptr->name,
pptr->pass,
pptr->age,
(pptr->sex)==0?"男":"女",
pptr->grade,
pptr->cscore,
pptr->chinese,
pptr->mscore);
i++;
printf("\033[%d;10H-------------------------------------------------------------------------",i+4);
getchar();
}
return;
}
//修改学生自己的信息
void stu_modiinfo()
{
struct student *pptr,*ptr1,*ptr2=NULL;
NODE *cur,*cur1,*cur2=NULL;
char tp[20]={0};
ptr1=malloc(sizeof(struct student));
ptr2=malloc(sizeof(struct student));
cur=stu_compare(sptr,ptr1,ptr2,cur1,cur2);
if(cur!=NULL)
{
//修改老师的各种信息,如果输入的是ENTER,则为不修改
printf("\033[2J"); //清屏
pptr=cur->dat;
getstring("请输入新的名字:", pptr->name, sizeof(pptr->name), 3,10,0);
getstring("请输入新的密码:", pptr->pass, sizeof(pptr->pass), 4,10,0);
if(getstring("请输入新的年龄:", tp, sizeof(tp), 5,10,0)>0)
{
pptr->age=atoi(tp);
}
if(getstring("请输入新的班级:", tp, sizeof(tp), 6,10,0)>0)
{
pptr->grade=atoi(tp);
}
}
return ;
}
//学生初始化
int stu_init()
{
FILE *fp=NULL;
struct student stu={0};
//创建链表
list_stu=list_create(sizeof(struct student));
fp=fopen("stu.dat","r");
if (fp==NULL)
{
print_err("读取stu.dat文件失败",3,10,31);
return -1; //失败返回-1
}
while(1)
{
//从文件中读取内容到结构体中
fread(&stu,sizeof(stu),1,fp);
//文件读取结束或者文件读取失败
if ( feof(fp) || ferror(fp) )
{
fclose(fp);
break;
}
//从结构体读取内容到链表中
list_addtail(list_stu,&stu);
}
return 0; //成功返回0
}
//生成一个新学生
static int stu_new(struct student *ptr)
{
NODE *cur=NULL;
struct student *stu=NULL;
stu=malloc(sizeof(struct student));
int max_id=0;
//请屏
printf("\033[2J");
printf("\033[3;10H姓名:");
scanf("%s",ptr->name);
getchar();
printf("\033[4;10H密码:");
scanf("%s",ptr->pass);
getchar();
printf("\033[5;10H年龄:");
scanf("%d",&(ptr->age));
getchar();
printf("\033[6;10H性别:");
scanf("%d",&(ptr->sex));
getchar();
printf("\033[7;10H班级:");
scanf("%d",&(ptr->grade));
getchar();
printf("\033[8;10HC语言:");
scanf("%d",&(ptr->cscore));
getchar();
printf("\033[9;10H语文:");
scanf("%d",&(ptr->chinese));
getchar();
printf("\033[10;10H数学:");
scanf("%d",&(ptr->mscore));
getchar();
//生成一个学生的学号,最大的那个加1
for (cur=list_stu->next;cur!=list_stu;cur=cur->next)
{
stu=cur->dat;
if (stu->id > max_id)
{
max_id=stu->id;
}
}
ptr->id=max_id+1;
return 0;
}
//添加一个学生
int stu_add()
{
struct student stu;
stu_new(&stu);//生成一个学生
list_addtail(list_stu,&stu);//将学生添加到链表中
return 0;
}
//打印所有学生的信息
int stu_printall()
{
NODE *cur=NULL;
struct student *stu=NULL;
stu=malloc(sizeof(struct student));
int i=0;
//清屏
printf("\033[2J\033[3;10H学号\t姓名\t密码\t年龄\t性别\t班级\tC语言\t语文\t数学");
getchar();
for (cur=list_stu->next;cur!=list_stu;cur=cur->next)
{
stu=cur->dat;
printf("\033[%d;10H%d\t%s\t%s\t%d\t%s\t%d\t%d\t%d\t%d\n",i+4,
stu->id,
stu->name,
stu->pass,
stu->age,
(stu->sex)==0?"男":"女",
stu->grade,
stu->cscore,
stu->chinese,
stu->mscore);
i++;
}
printf("\033[%d;10H-------------------------------------------------------------------------",i+4);
getchar();
return 0;
}
//保存所有学生
void stu_save()
{
NODE *cur=NULL;
struct student *stu=NULL;
stu=malloc(sizeof(struct student));
FILE *fp=NULL;
fp=fopen("stu.dat","w");
if (fp==NULL)
{
print_err("文件stu.dat保存失败!",3,10,31);
getchar();
return;
}
for (cur=list_stu->next;cur!=list_stu;cur=cur->next)
{
//将链表中的学生写到学生的结构体中
stu=cur->dat;
//将学生结构体中的信息写入到文件中
fwrite(stu,sizeof(struct student),1,fp);
}
fclose(fp);
}
///////////////////////////////////////////////
//比较学生姓名
static int compare_name(void *dat1,void *dat2)
{
struct student *stu1=dat1;
struct student *stu2=dat2;
return strcmp(stu1->name,stu2->name);
}
//查找学生名字
int stu_findname(struct student *ptr)
{
NODE *cur=NULL;
cur=list_find(list_stu,ptr,compare_name);
if (cur=NULL)
{
print_err("没有这个学生!",3,10,31);
getchar();
return -1;
}
return 0;
}
//删除学生名字对应学生
int stu_delname()
{
struct student *stu=NULL;
stu=malloc(sizeof(struct student));
int ret=0;
//清屏
printf("\033[2J");
printf("\033[3;10H请输入要删除的学生姓名:");
scanf("%s",stu->name);
getchar();
ret=stu_findname(stu);
if (ret==0)
{
list_del(list_stu,stu,compare_name);
return 0;
}
else
{