/**********头文件**********/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#include<conio.h>
/************END***********/
/*****结构体与全局变量*****/
typedef struct studentdata
{
char institute[128];
char subject[128];
char name[128];
char sex[16];
char passw[256];
int ID;
double s[64],average,sum;
} STUD;
typedef struct teacherdata
{
char institute[128];
char subject[128];
char name[128];
char sex[16];
char passw[256];
int ID;
} TEAD;
typedef struct stumessage
{
int n,len;
STUD *a;
} STUM;
STUM student,curs;
typedef struct teamessage
{
int n,len;
TEAD *a;
} TEAM;
TEAM teacher,curt;
struct Subject
{
int num,subs;
char name[128],classname[64][128];
}sub[64];
char admin[128];
char apassw[256];
int kind=2,t=3,WHO=111,IDs=0,Subnum=0;
int END=0;
clock_t starttime;
FILE *in,*out;
/************END***********/
/********所有函数声明******/
char waitcommand();
char waitdecide();
int mygets(char str[]);
int myfgets(char str[],int len,FILE *in);
char stop(int len);
void adds(STUM *student,STUD s);
void addt(TEAM *teacher,TEAD t);
void inputscore();
void inserts(STUD s);
void insertt(TEAD t);
int strtoint(char num[]);
int strtofloat(double *s,char num[]);
void inputs();
void inputs();
int cmps(STUD a,STUD b,int t);
void mysorts(int p[],int l,int r,int t);
int cmpt(TEAD a,TEAD b,int t);
void mysortt(int p[],int l,int r,int t);
void delsub(int ids);
void dels(int id);
void delt(int id);
int finds(int id);
int findt(int id);
void changes();
void changet();
void erases();
void eraset();
void mymesss();
void mymesst();
int getIDs(char su[]);
void addsub();
void admingetmess();
void admininput();
void adminchange();
void adminerase();
void getmess();
void getmesst();
void mainwin();
void getpassw(char pass[]);
void passwerror(char pass[]);
void login();
void updatas();
void updatat();
void updataa();
void start();
void savesub();
void saves();
void savet();
/************END***********/
/********所有函数定义******/
char waitcommand()
{
char c='R';
while((c=getche())!='R'&&c!='r'&&c!='S'&&c!='s')printf("\b");
return c;
}
char waitdecide()
{
char c='N';
while((c=getche())!='Y'&&c!='y'&&c!='N'&&c!='n')printf("\b");
return c;
}
int mygets(char str[])
{
int i=0;
while((str[i]=getche())!=13&&str[i]!=EOF)
if(str[i]!=8)++i;else if(i>0)--i;
if(str[i]==EOF)return 0;
str[i]='\0';
printf("\n");
return 1;
}
int myfgets(char str[],int len,FILE *in)
{
if(!fgets(str,len,in))return 0;
str[strlen(str)-1]='\0';
return 1;
}
char stop(int len)
{
char c='R';
starttime=clock();
while(starttime+len>clock())
if(kbhit())if((c=getche())=='R'||c=='S'||c=='r'||c=='s')return c;
return c;
}
void adds(STUM *student,STUD s)
{
if(student->n>=student->len)
{
int i;
student->len<<=4;
STUD *b=(STUD*)malloc(sizeof(STUD)*student->len);
for(i=0; i<student->n; ++i)b[i]=student->a[i];
free(student->a);
student->a=b;
}
student->a[student->n++]=s;
}
void addt(TEAM*teacher,TEAD t)
{
if(teacher->n>=teacher->len)
{
int i;
teacher->len<<=4;
TEAD *b=(TEAD*)malloc(sizeof(TEAD)*teacher->len);
for(i=0; i<teacher->n; ++i)b[i]=teacher->a[i];
free(teacher->a);
teacher->a=b;
}
teacher->a[teacher->n++]=t;
}
void inputscore()
{
if(END)return;
system("cls");
int i,id,now;
char c,temp[128];
printf("您有权修改的账号如下\n");
printf("**************************************************************\n");
for(i=1;i<student.n;++i)
{
if(IDs!=getIDs(student.a[i].subject))continue;
printf("%10s%10s%8s%5s%10d\n",student.a[i].institute,student.a[i].subject,student.a[i].name,student.a[i].sex,student.a[i].ID);
}
printf("**************************************************************\n");
printf("\t输入该学生的学号:");
mygets(temp);
while(!(id=strtoint(temp))||!(now=finds(id))||(kind&&IDs!=getIDs(student.a[now].subject)))
{
printf("\t学号格式错误或学号不存在或者您无权操作该学生账号,按R退出,按S继续\n");
while((c=getche())!='R'&&c!='r'&&c!='S'&&c!='s')printf("\b");
printf("\b");
if(c=='R'||c=='r')return;
printf("\t重新输入: ");
mygets(temp);
}
printf("\t该学生的姓名是: %s \n",student.a[now].name);
printf("\t是否录入/修改成绩(Y/N)?");
c=waitdecide();
printf("\b\n\n");
if(c=='N'||c=='n'){mainwin();return;}
printf("\t以下每项要修改的输入更改后的值,不改变则输入N\n");
student.a[now].sum=0;
for(i=0; i<sub[IDs].subs; ++i)
{
printf("\t输入 %s 的成绩:",sub[IDs].classname[i]);
mygets(temp);
while(temp[0]!='N'&&temp[0]!='n'&&strtofloat(&student.a[now].s[i],temp))
{
printf("\t格式错误,请重新输入:");
mygets(temp);
}
student.a[now].sum=student.a[now].sum+student.a[now].s[i];
}
if(sub[IDs].subs)student.a[now].average=student.a[now].sum/sub[IDs].subs;
saves();
printf("\t%s同学的成绩录入完毕!!\n",student.a[now].name);
printf("\t是否继续录入/修改成绩(Y/N)?");
c=waitdecide();
if(c=='Y'||c=='y')inputscore();
}
void inserts(STUD s)
{
int i=student.n++,ids=getIDs(s.subject);
while(i>0&&student.a[i-1].ID>s.ID)
{
student.a[i]=student.a[i-1];
--i;
}
student.a[i]=s;
if(ids<0)
{
strcpy(sub[Subnum].name,s.subject);
sub[Subnum].num=1;
sub[Subnum].subs=0;
++Subnum;
}
else ++sub[ids].num;
}
void insertt(TEAD t)
{
int i=teacher.n++,ids=getIDs(t.subject);
while(i>0&&teacher.a[i-1].ID>t.ID)
{
teacher.a[i]=teacher.a[i-1];
--i;
}
teacher.a[i]=t;
if(ids<0)
{
strcpy(sub[Subnum].name,t.subject);
sub[Subnum].num=1;
sub[Subnum].subs=0;
++Subnum;
}
else ++sub[ids].num;
}
int strtoint(char num[])
{
int i,now=0;
for(i=0; num[i]; ++i)
if(num[i]>='0'&&num[i]<='9')now=now*10+num[i]-'0';
else return 0;
return now;
}
int strtofloat(double *s,char num[])
{
double now=0,be=10;
int i,point=0;
for(i=0; num[i]; ++i)
if(num[i]=='.')++point;
else if(num[i]<'0'||num[i]>'9')return 1;
if(point>1)return 1;
for(i=0; num[i]>='0'&&num[i]<='9'; ++i)now=now*10+num[i]-'0';
if(num[i]=='.')
for(++i;num[i]>='0'&&num[i]<='9'; ++i)
now=now+(num[i]-'0')/be,be=be*10;
*s=now;
return 0;
}
void inputs()
{
if(END)return;
system("cls");
STUD s;
free(curs.a);
curs.n=0;
curs.len=8;
curs.a=(STUD*)malloc(sizeof(STUD)*8);
printf("\n\n\n\n");
printf("\t现在开始创建新学生信息\n");
char c,temp[128];
int i,j;
while(1)
{
printf("\t输入学院名称:");
mygets(s.institute);
while(kind&&strcmp(s.institute,teacher.a[WHO].institute))
{
printf("\t您不能创建别的学院账号,\t请输入您的学院:");
mygets(s.institute);
}
printf("\t输入专业班级:");
mygets(s.subject);
while(kind&&strcmp(s.subject,teacher.a[WHO].subject))
{
printf("\t您不能创建别的专业账号,请输入您的专业:");
mygets(s.subject);
}
printf("\t输入学生姓名:");
mygets(s.name);
printf("\t输入学生性别:");
mygets(s.sex);
strcpy(s.passw,"432");
printf("\t输入学生学号(<9位):");
mygets(temp);
while(!(s.ID=strtoint(temp))||finds(s.ID)||strlen(temp)>8)
{
printf("\t格式错误或者学号已存在\n\t请重新输入:");
mygets(temp);
}
s.sum=0;
s.average=0;
memset(s.s,0,sizeof(s.s));
adds(&curs,s);
system("cls");
printf("\n\n\n\n");
printf("\t你现在已经新建%d个学生账号,是否继续(Y/N)?",curs.n);
c=waitdecide();
printf("\n");
if(c=='N'||c=='n')break;
}
system("cls");
printf("\n\n\n\n");
printf("\t你现在新建的学生账号如下\n");
for(i=0; i<curs.n; ++i)
{
printf("%10s%10s%8s%5s%10d\n",curs.a[i].institute,curs.a[i].subject,curs.a[i].name,curs.a[i].sex,curs.a[i].ID);
}
printf("\n\n\t所有初始密码均为666,是否保存这些账号(Y/N)?");
c=waitdecide();
printf("\n");
if(c=='N'||c=='n')return;
for(i=0; i<curs.n; ++i)inserts(curs.a[i]);
savesub();
saves();
}
void inputt()
{
if(END)return;
system("cls");
TEAD t;
free(curt.a);
curt.n=0;
curt.len=8;
curt.a=(TEAD*)malloc(sizeof(TEAD)*8);
printf("\n\n\n\n");
printf("\t现在开始创建新教师信息\n");
char c,temp[128];
int i,j;
while(1)
{
printf("\t输入教师学院:");
mygets(t.institute);
printf("\t输入教师班级:");
mygets(t.subject);
printf("\t输入教师姓名:");
mygets(t.name);
printf("\t输入教师性别:");
mygets(t.sex);
strcpy(t.passw,"432");
printf("\t输入教师工号(<9位):");
mygets(temp);
while(!(t.ID=strtoint(temp))||findt(t.ID)||strlen(temp)>8)
{
printf("\t格式错误或者工号已存在\n\t请重新输入:");
mygets(temp);
}
addt(&curt,t);
system("cls");
printf("\n\n\n\n");
printf("\t你现在已经新建%d个教师账号,是否继续(Y/N)?",curt.n);
c=waitdecide();
printf("\n");
if(c=='N'||c=='n')break;
}
system("cls");
printf("\n\n\n\n");
printf("\t你现在新建的教师账号如下\n");
for(i=0; i<curt.n; ++i)
printf("%10s%10s%10s%6s%10d\n",curt.a[i].institute,curt.a[i].subject,curt.a[i].name,curt.a[i].sex,curt.a[i].ID);
printf("\n\n\t所有初始密码均为666,是否保存这些账号(Y/N)?");
c=waitdecide();
printf("\n");
if(c=='N'||c=='n')return;
for(i=0; i<curt.n; ++i)insertt(curt.a[i]);
savesub();
savet();
}
int cmps(STUD a,STUD b,int t)
{
if(t==0)return 0;
if(t==1)return strcmp(a.institute,b.institute)<0;
if(t==2)return strcmp(a.subject,b.subject)<0;
if(t==3)return strcmp(a.name,b.name)<0;
if(t==4)return strcmp(a.sex,b.sex)<0;
if(t==5)return a.sum>b.sum;
if(t==6)return a.average>b.average;
return a.s[t-7]>b.s[t-7];
}
void mysorts(int p[],int l,int r,int t)
{
int i=l,j=r;
STUD m=student.a[p[(l+r)>>1]];
do
{
while(cmps(student.a[p[i]],m,t))++i;
while(cmps(m,student.a[p[j]],t))--j;
if(i<=j)
{
if(i<j)p[0]=p[i],p[i]=p[j],p[j]=p[0];
++i,--j;
}
}
while(i<=j);
if(i<r)mysorts(p,i,r,t);
if(l<j)mysorts(p,l,j,t);
}
int cmpt(TEAD a,TEAD b,int t)
{
if(t==0)return 0;
if(t==1)return strcmp(a.institute,b.institute)<0;
if(t==2)return strcmp(a.subject,b.subject)<0;
if(t==3)return strcmp(a.name,b.name)<0;
if(t==4)return strcmp(a.sex,b.sex)<0;
return 0;
}
void mysortt(int p[],int l,int r,int t)
{
int i=l,j=r;
TEAD m=teacher.a[p[(l+r)>>1]];
do
{
while(cmpt(teacher.a[p[i]],m,t))++i;
while(cmpt(m,teacher.a[p[j]],t))--j;
if(i<=j)
{
if(i<j)p[0]=p[i],p[i]=p[j],p[j]=p[0];
++i,--j;
}
}
while(i<=j);
if(i<r)mysortt(p,i,r,t);
if(l<j)mysortt(p,l,j,t);
}
void delsub(int ids)
{
int i;
if(IDs>ids)--IDs;
for(--Subnum,i=ids;i<Subnum;++i)sub[i]=sub[i+1];
savesub();
}
void dels(int id)
{
int i,ids=getIDs(student.a[id].subject);
if(--sub[ids].num==0)delsub(ids);
else savesub();
for(--student.n,i=id; i<student.n; ++i)student.a[i]=student.a[i+1];
saves();
}
void delt(int id)
{
int i,ids=getIDs(teacher.a[id].subject);
if(--sub[ids].num==0)delsub(ids);
else savesub();
for(--teacher.n,i=id; i<teacher.n; ++i)teacher.a[i]=teacher.a[i+1];
savet();
}
int finds(int id)
{
int l=1,r=student.n-1,m;
while(l<=r)
{
m=(l+r)>>1;
if(student.a[m].ID==id)return m;
if(student.a[m].ID>id)r=m-1;
else l=m+1;
}
return 0;
}
int findt(int id)
{
int l=1,r=teacher.n-1,m;
while(l<=r)
{
m=(l+r)>>1;
if(teacher.a[m].ID==id)return m;
if(teacher.a[m].ID>id)r=m-1;
else l=m+1;
}
return 0;
}
void changes()
{
if(END)return;
system("cls");
int i,id,now;
char c,temp[128];
printf("您有权修改的账号如下\n");
printf("**************************************************************\n");
for(i=1;i<student.n;++i)
{
if(kind&&IDs!=getIDs(student.a[i].subject))continue;
printf("%10s%10s%8s%5s%10d\n",student.a[i].institute,student.a[i].subject,student.a[i].name,student.a[i].sex,student.a[i].ID);
}
printf("**************************************************************\n");
printf("\t输入要修改学生的学号:");
mygets(temp);
while(!(id=strtoint(temp))||!(now=finds(id))||(kind&&IDs!=getIDs(student.a[now].subject)))
{
printf("\t学号格式错误或学号不存在或者您无权操作该学生账号,按R退出,按S继续\n");
while((c=getche())!='R'&&c!='r'&&c!='S'&&c!='s')printf("\b");
printf("\b");
if(c=='R'||c=='r')return;
printf("\t重新输入: ");
mygets(temp);
}
printf("\t该学生的姓名是: %s \n",student.a[now].name);
printf("\t是否修改(Y/N)?");
c=waitdecide();
printf("\b\n\n");
if(c=='N'||c=='n'){changes();return;}
printf("\t以下每项要修改的输入更改后的值,不改变则输入N\n");
printf("\t输入学院名称:");
mygets(temp);
if(temp[0]!='N'&&temp[0]!='n')strcpy(student.a[now].institute,temp);
printf("\t输入专业班级:");
mygets(temp);
if(temp[0]!='N'&&temp[0]!='n')
if(strcmp(student.a[now].subject,temp))
{
if(--sub[getIDs(student.a[now].subject)].num==0)delsub(getIDs(student.a[now].subject));
else savesub();
if(getIDs(temp)<0)
{
strcpy(sub[Subnum].name,temp);
sub[Subnum].num=1;
sub[Subnum].subs=0;
++Subnum;
savesub();
}
else ++sub[getIDs(temp)].num,savesub();
strcpy(student.a[now].subject,temp);
student.a[now].sum=0;
student.a[now].average=0;
memset(student.a[now].s,0,sizeof(student.a[now].s));
}
printf("\t输入学生姓名:");
mygets(temp);
if(temp[0]!='N'&&temp[0]!='n')strcpy(student.a[now].name,temp);
printf("\t输入学生性别:");
mygets(temp);
if(temp[0]!='N'&&temp[0]!='n')strcpy(student.a[now].sex,temp);
printf("\t是否重置密码:");
mygets(temp);
if(temp[0]!='N'&&temp[0]!='n')strcpy(student.a[now].passw,"432");
system("cls");
printf("\t修改完毕!!!\n");
printf("\t以下为新信息\n");
printf("%10s%10s%8s%5s%10d\n",student.a[now].institute,student.a[now].subject,student.a[now].name,student.a[now].sex,student.a[now].ID);
savesub();
saves();
printf("\n\t5秒钟后自动返回主界面\n");
printf("\t按S继续操作\n");
printf("\t按R返回主界面\n");
if((c=stop(5000))=='R'||c=='r')mainwin();
else changes();
}
void changet()
{
if(END)return;
system("cls");
int i,id,now;
char c,temp[256];
printf("您有权修改的账号如下\n");
printf("**************************************************************\n");
for(i=1;i<teacher.n;++i)
printf("%10s%10s%8s%5s%10d\n",teacher.a[i].institute,teacher.a[i].subject,teacher.a[i].name,teacher.a[i].sex,teacher.a[i].ID);
printf("**************************************************************\n");
printf("\t输入要修改教师的工号:");
mygets(temp);
while(!(id=strtoint(temp))||!(now=findt(id)))
{
printf("\t工号格式错误或工号不存,按R退出,按S继续\n");
c=waitcommand();
printf("\b");
if(c=='R'||c=='r')return;
printf("\t重新输入: ");
mygets(temp);
}
printf("\t该教师的姓名是: %s \n",teacher.a[now].name);
printf("\t是否修改(Y/N)?");
c=waitdecide();
printf("\b\n\n");
if(c=='N'||c=='n'){changet();return;}
printf("\t以下每项要修改的输入更改后的值,不改变则输入N\n");
printf("\t输入学院名称:");
mygets(temp);
if(temp[0]!='N'&&temp[0]!='n')strcpy(teacher.a[now].institute,temp);
printf("\t输入专业班级:");
mygets(temp);
if(temp[0]!='N'&&temp[0]!='n')
if(strcmp(teacher.a[now].subject,temp))
{
if(--sub[getIDs(teacher.a[now].subject)].num==0)delsub(getIDs(teacher.a[now].subject));
else savesub();
if(getIDs(temp)<0)
{
strcpy(sub[Subnum].name,temp);
sub[Subnum].num=1;
sub[Subnum].subs=0;
++Subnum;
savesub();
}
else ++sub[getIDs(temp)].num,savesub();
strcpy(teacher.a[now].subject,temp);
}
printf("\t输入教师姓名:");
mygets(temp);
if(temp[0]!='N'&&temp[0]!='n')strcpy(teacher.a[now].name,temp);
printf("\t输入教师性别:");
mygets(temp);
if(temp[0]!='N'&&temp[0]!='n')strcpy(teacher.a[now].sex,temp);
printf("\t是否重置密码:");
mygets(temp);
if(temp[0]!='N'&&temp[0]!='n')strcpy(teacher.a[now].passw,"432");
system("cls");
printf("\t修改完毕!!!\n");
printf("\t以下为新信息\n");
printf("%10s%10s%8s%5s%10d\n",teacher.a[now].institute,teacher.a[now].subject,teacher.a[now].name,teacher.a[now].sex,teacher.a[now].ID);
savesub();
savet();
printf("\n\t5秒钟后自动返回主界面\n");
printf("\t按S继续操作\n");
printf("\t按R返回主界面\n");
if((c=stop(5000))=='R'||c=='r')mainwin();
else changet();
}
void erases()
{
if(END)return;
system("cls");
int i,id,now;
char c,temp[128];
printf("您有权删除的账号如下\n");
printf("**************************************************************\n");
for(i=1;i<student.n;++i)
{
if(kind&&IDs!=getIDs(student.a[i].subject))continue;
printf("%10s%10s%8s%5s%10d\n",student.a[i].institute,student.a[i].subject,student.a[i].name,student.a[i].sex,student.a[i].ID);
}
printf("**************************************************************\n");
printf("\t输入要删除学生的学号:");
mygets(temp);
while(!(id=strtoint(temp))||!(now=finds(id))||(kind&&IDs!=getIDs(student.a[now].subject)))
{
printf("\t学号格式错误或学号不存在或者您无权操作该学生账号,按R退出,按S继续\n");
c=waitcommand();
printf("\b");
if(c=='R'||c=='r')return;
printf("\t重新输入: ");
mygets(temp);
}
printf("\t该学生的姓名是: %s \n",student.a[now].name);
printf("\t确认是否删除(Y/N):\n");
c=waitdecide();
printf("\b");
if(c=='Y'||c=='y')dels(now),printf("\t你已成功删除该账号,5秒钟后自动返回主界面\n");
else printf("\t你已取消删除,5秒钟后自动返回主界面\n");
printf("\t按S继续操作\n");
printf("\t按R返回主界面\n");
if((c=stop(5000))=='R'||c=='r')mainwin();
else erases();
}
void eraset()
{
if(END)return;
system("cls");
int i,id,now;
char c,temp[128];
printf("您有权删除的账号如下\n");
printf("**************************************************************\n");
for(i=1;i<teacher.n;++i)
printf("%10s%10s%8s%5s%10d\n",teacher.a[i].institute,teacher.a[i].subject,teacher.a[i].name,teacher.a[i].sex,teacher.a[i].ID);
printf("**************************************************************\n");
printf("\t输入要删除教师的工号:");
mygets(temp);
while(!(id=strtoint(temp))||!(now=findt(id)))
{
printf("\t工号格式错误或工号不存在,按R退出,按S继续\n");
c=waitcommand();
printf("\b");
if(c=='R'||c=='r')return;
printf("\t重新输入: ");
mygets(temp);
}
printf("\t该教师的姓名是: %s \n",teacher.a[now].name);
printf("\t确认是否删除(Y/N):\n");
c=waitdecide();
printf("\b");
if(c=='Y'||c=='y')delt(now),printf("\t你已成功删除该账号,5秒钟后自动返回主界面\n");
else printf("\t你已取消删除,5秒钟后自动返回主界面\n");
printf("\t按S继续操作\n");
printf("\t按R返回主界面\n");
if((c=stop(5000))=='R'||c=='r')mainwin();
else eraset();
}
void mymesss()
{
if(END)return;
system("cls");
printf("\n\n\n\n");
printf("\t你好%s同学,下面是你的信息\n",student.a[WHO].name);
printf("\t#=============================================#\n");
printf("\t* 学院: %s\n",student.a[WHO].institute);
printf("\t* 专业: %s\n",student.a[WHO].subject);
printf("\t* 学号: %d\n",student.a[WHO].ID);
printf("\t* 性别: %s\n",student.a[WHO].sex);
printf("\t* 总分: %.1lf 分\n",student.a[WHO].sum);
printf("\t* 平均分: %.1lf 分\n",student.a[WHO].average);
int i;
for(i=0; i<sub[IDs].subs; ++i)
printf("\t* %s: %.1lf 分\n",sub[IDs].classname[i],student.a[WHO].s[i]);
printf("\t#=============================================#\n");
printf("\t对以上信息如有疑问请联系所在专业老师或管理员!\n");
printf("\t按R返回主菜单\n");
waitcommand();
}
void mymesst()
{
if(END)return;
system("cls");
printf("\n\n\n\n");
printf("\t您好%s老师,下面是你的信息\n",teacher.a[WHO].name);
printf("\t#=============================================#\n");
printf("\t* 学院: %s\n",teacher.a[WHO].institute);
printf("\t* 专业: %s\n",teacher.a[WHO].subject);
printf("\t* 工号: %d\n",teacher.a[WHO].ID);
printf("\t* 性别: %s\n",teacher.a[WHO].sex);
printf("\t#=============================================#\n");
printf("\t对以上信息如有疑问请联系管理员!\n");
printf("\t按R返回主菜单\n");
waitcommand();
}
int getIDs(char su[])
{
int i;
for(i=0; i<Subnum; ++i)
if(strcmp(su,sub[i].name)==0)return i;
return -1;
}
void addsub()
{
if(END)return;
system("cls");
printf("\n\n\n\n");
printf("\t您好%s老师,现在要增加您所在专业课程\n",teacher.a[WHO].name);
printf("\t请输入课程名称: ");
mygets(sub[IDs].classname[sub[IDs].subs++]);
savesub();
saves();
mainwin();
}
void admingetmess()
{
if(END)return;
system("cls");
printf("\n\n\n\n");
printf("\t%s 管理员!\n",admin);
printf("\t您可以查找教师或学生信息\n");
printf("\t*************************************************\n");
printf("\t* 0. 学生信息\n");
printf("\t* 1. 教师信息\n");
printf("\t* 2. 返回主界面\n");
printf("\t*************************************************\n");
char c;
while((c=getche())<'0'||c>'2')printf("\b");
if(c=='0')getmess();
else if(c=='1')getmesst();
mainwin();
}
void admininput()
{
if(END)return;
system("cls");
printf("\n\n\n\n");
printf("\t%s 管理员!\n",admin);
printf("\t您可以新建教师或学生信息\n");
printf("\t*************************************************\n");
printf("\t* 0. 学生信息\n");
printf("\t* 1. 教师信息\n");
printf("\t* 2. 返回主界面\n");
printf("\t*************************************************\n");
char c;
while((c=getche())<'0'||c>'2')printf("\b");
if(c=='0')inputs();
else if(c=='1')inputt();
mainwin();
}
void adminchange()
{
if(END)return;
system("cls");
printf("\n\n\n\n");
printf("\t%s 管理员!\n",admin);
printf("\t您可以修改教师或学生信息\n");
printf("\t*************************************************\n");
printf("\t* 0. 学生信息\n");
printf("\t* 1. 教师信息\n");
printf("\t* 2. 返回主界面\n");
printf("\t*************************************************\n");
char c;
while((c=getche())<'0'||c>'2')printf("\b");
if(c=='0')changes();
else if(c=='1')changet();
mainwin();
}
void adminerase()
{
if(END)return;
system("cls");
printf("\n\n\n\n");
printf("\t%s 管理员!\n",admin);
printf("\t您可以删除教师或学生信息\n");
printf("\t*************************************************\n");
printf("\t* 0. 学生信息\n");
printf("\t* 1. 教师信息\n");
printf("\t* 2. 返回主界面\n");
printf("\t*************************************************\n");
char c;
while((c=getche())<'0'||c>'2')printf("\b");
if(c=='0')erases();
else if(c=='1')eraset();
mainwin();
}
void getmess()
{
if(END)return;
system("cls");
printf("\n\n\n\n");
int i,j;
if(kind)printf("\t%s 老师!\n",teacher.a[WHO].name);
else printf("\t%s 管理员!\n",admin);
printf("\t您可以使用下面方式排序,按每个选项前的数字使用该方式\n");
printf("\t*************************************************\n");
printf("\t* 0. 按学号排序\n");
printf("\t* 1. 按学院排序\n");
printf("\t* 2. 按专业排序\n");
printf("\t* 3. 按姓名排序\n");
printf("\t* 4. 按性别排序\n");
printf("\t* 5. 按总分排序\n");
printf("\t* 6. 按平均分排序\n");
if(kind)
{
for(i=0; i<sub[IDs].subs; ++i)
printf("\t* %d. 按%s排序\n",i+7,sub[IDs].classname[i]);
}
printf("\t* R. 返回上级菜单\n");
printf("\t*************************************************\n");
char c[16];
if(kind)
{
mygets(c);
while((strtoint(c)<0||strtoint(c)>sub[IDs].subs+6)&&c[0]!='R'&&c[0]!='r')mygets(c);
}
else
{
while(((c[0]=getche())<'0'||c[0]>'6')&&c[0]!='R'&&c[0]!='r')printf("\b");
c[1]='\0';
}
if(c[0]=='R'||c[0]=='r')
{
if(kind)mainwin();else admingetmess();
return;
}
system("cls");
int p[student.n];
for(i=0; i<student.n; ++i)p[i]=i;
if(strtoint(c)&&student.n>1)mysorts(p,1,student.n-1,strtoint(c));
printf("%10s%10s%8s%5s%10s%6s%6s", "学院","专业","姓名","性别","学号","总分","平均分");
if(kind)for(j=0; j<sub[IDs].subs; ++j)printf("%6s",sub[IDs].classname[j]);
printf("\n===============================================================");
for(i=1; i<student.n; ++i)
{
if(kind&&getIDs(student.a[p[i]].subject)!=IDs)continue;
printf("\n%10s%10s%8s%5s%10d%6.1lf%6.1lf",student.a[p[i]].institute,student.a[p[i]].subject,student.a[p[i]].name,student.a[p[i]].sex,student.a[p[i]].ID,student.a[p[i]].sum,student.a[p[i]].average);
if(kind)for(j=0; j<sub[IDs].subs; ++j)printf("%6.1lf",student.a[p[i]].s[j]);
}
char q;
printf("\n===============================================================\n");
printf("\t按R返回主菜单,按S返回排序");
q=waitcommand();
if(q=='R'||q=='r')mainwin();
else if(kind)getmess();
else admingetmess();
}
void getmesst()
{
if(END)return;
system("cls");
printf("\n\n\n\n");
int i;
char c;
printf("\t%s 管理员!\n",admin);
printf("\t您可以使用下面方式排序,按每个选项前的数字使用该方式\n");
printf("\t*************************************************\n");
printf("\t* 0. 按工号排序\n");
printf("\t* 1. 按学院排序\n");
printf("\t* 2. 按专业排序\n");
printf("\t* 3. 按姓名排序\n");
printf("\t* 4. 按性别排序\n");
printf("\t* R. 返回上级菜单\n");
printf("\t*************************************************\n");
while(((c=getche())<'0'||c>'4')&&c!='R'&&c!='r')printf("\b");
if(c=='R'||c=='r')
{
if(kind)mainwin();else admingetmess();
return;
}
system("cls");
int p[teacher.n];
for(i=0; i<teacher.n; ++i)p[i]=i;
if(c-'0'&&teacher.n>1)mysortt(p,1,teacher.n-1,c-'0');
printf("%10s%10s%8s%5s%10s", "学院","专业","姓名","性别","工号");
printf("\n===============================================================\n");
for(i=1; i<teacher.n; ++i)
printf("%10s%10s%8s%5s%10d\n",teacher.a[p[i]].institute,teacher.a[p[i]].subject,teacher.a[p[i]].name,teacher.a[p[i]].sex,teacher.a[p[i]].ID);
printf("===============================================================\n");
printf("\t按R返回主菜单,按S返回排序");
c=waitcommand();
if(c=='R'||c=='r')mainwin();
else admingetmess();
}
void mainwin()
{
if(END)return;
system("cls");
char c;
printf("\n\n\n\n");
if(kind==0)
{
printf("\t欢迎你%s 管理员!\n\n",admin);
printf("\t你可以使用下面的功能,按每个选项前的数字使用该功能\n");
printf("\t*************************************************\n");
printf("\t* 1. 查询所有信息\n");
printf("\t* 2. 新建账号\n");
printf("\t* 3. 修改账号\n");
printf("\t* 4. 删除账号\n");
printf("\t* 5. 更新管理员账号\n");
printf("\t* 6. 安全退出\n");
printf("\t* 7. 结束程序\n");
printf("\t*************************************************\n");
while((c=getche())<'1'||c>'7')printf("\b");
if(c=='1')admingetmess();
if(c=='2')admininput();
if(c=='3')adminchange();
if(c=='4')adminerase();
if(c=='5')updataa();
if(c=='6')login();
if(c=='7')
{
END=1;
return ;
}
}
else if(kind==1)
{
printf("\t%s 老师,欢迎使用学生信息管理系统!\n\n",teacher.a[WHO].name);
printf("\t您可以使用下面的功能,按每个选项前的数字使用该功能\n");
printf("\t*************************************************\n");
printf("\t* 1. 查询所有学生信息\n");
printf("\t* 2. 增加科目\n");
printf("\t* 3. 录入/修改学生成绩\n");
printf("\t* 4. 新建学生账号\n");
printf("\t* 5. 修改学生账号\n");
printf("\t* 6. 删除学生账号\n");
printf("\t* 7. 获取个人信息\n");
printf("\t* 8. 更改密码\n");
printf("\t* 9. 安全退出\n");
printf("\t* 0. 结束程序\n");
printf("\t*************************************************\n");
while((c=getche())<'0'||c>'9')printf("\b");
if(c=='1')getmess();
if(c=='2')addsub();
if(c=='3')inputscore();
if(c=='4')inputs();
if(c=='5')changes();
if(c=='6')erases();
if(c=='7')mymesst();
if(c=='8')updatat();
if(c=='9')login();
if(c=='0')
{
END=1;
return ;
}
}
else if(kind==2)
{
printf("\t%s 同学,欢迎使用学生信息管理系统!\n\n",student.a[WHO].name);
printf("\t你可以使用下面的功能,按每个选项前的数字使用该功能\n");
printf("\t*************************************************\n");
printf("\t* 1. 获取个人信息\n");
printf("\t* 2. 更改密码\n");
printf("\t* 3. 安全退出\n");
printf("\t* 4. 结束程序\n");
printf("\t*************************************************\n");
while((c=getche())<'1'||c>'4')printf("\b");
if(c=='1')mymesss();
if(c=='2')updatas();
if(c=='3')login();
if(c=='4')
{
END=1;
return ;
}
}
mainwin();
}
void getpassw(char pass[])
{
int i=0;
char c;
while((c=getch())!=13)
{
if(c!=8)pass[i]=c-i-2,++i,printf("*");
else if(i>0)--i,printf("\b");
}
printf("\n");
pass[i]='\0';
}
void passwerror(char pass[])
{
char temp[256];
do
{
system("cls");
printf("\n\n\n\n\n");
printf("\t两次密码不匹配请从新输入\n");
printf("\t输入密码:");
getpassw(pass);
printf("\t再输入密码:");
getpassw(temp);
}
while(strcmp(pass,temp));
}
void login()
{
if(END)return;
int id;
char pass[256],c,temp[256];
system("cls");
printf("\n\n\n\n\n");
printf("\t\t欢迎来到学生信息管理系统!\n");
printf("\t\t#=====================#\n");
printf("\t\t* 0. 管理员账号登入 *\n");
printf("\t\t* 1. 教师账号登入 *\n");
printf("\t\t* 2. 学生账号登入 *\n");
printf("\t\t* 3. 结束程序 *\n");
printf("\t\t#=====================#\n");
while((c=getche())<'0'||c>'3')printf("\b");
system("cls");
printf("\n\n\n\n\n");
if(c=='0')
{
if(t==0)
{
printf("\t你已经超过限定的输入次数,系统即将关闭\n ");
stop(5000);
END=1;
return;
}
printf("\t请输入帐号: ");
mygets(temp);
while(strcmp(admin,temp))
{
printf("\t账号错误,按R返回登入界面,按S继续\n",t);
c=waitcommand();
if(c=='R'||c=='r')break;
printf("\b\t请重新输入: ");
mygets(temp);
}
if(strcmp(admin,temp)==0)
{
printf("\t请输入密码: ");
getpassw(pass);
while(strcmp(apassw,pass))
{
if(--t==0)break;
printf("\t密码错误,你还有%d次机会,按R返回登入界面,按S继续\n",t);
c=waitcommand();
if(c=='R'||c=='r')
{
login();
return;
}
printf("\b\t请重新输入: ");
getpassw(pass);
}
if(t)kind=0,WHO=0,mainwin();
else
{
printf("\t你已经超过限定的输入次数,系统即将关闭\n ");
stop(5000);
END=1;
return;
}
}
else login();
}
else if(c=='1')
{
int now,id;
printf("\t请输入工号: ");
mygets(temp);
while(!(id=strtoint(temp))||!(now=findt(id)))
{
printf("\t工号格式错误或不存在,按R返回登入界面,按S继续\n",t);
c=waitcommand();
if(c=='R'||c=='r')break;
printf("\b\t请重新输入: ");
mygets(temp);
}
int ok=0;
if(id&&now)
{
printf("\t请输入密码: ");
getpassw(pass);
while(!(ok=(strcmp(teacher.a[now].passw,pass)==0)))
{
printf("\t密码错误,按R返回登入界面,按S继续\n",t);
c=waitcommand();
if(c=='R'||c=='r')break;
printf("\b\t请重新输入: ");
getpassw(pass);
}
}
if(ok)kind=1,WHO=now,IDs=getIDs(teacher.a[now].subject),mainwin();
login();
}
else if(c=='2')
{
int now,id;
printf("\t请输入学号: ");
mygets(temp);
while(!(id=strtoint(temp))||!(now=finds(id)))
{
printf("\t学号格式错误或不存在,按R返回登入界面,按S继续\n",t);
c=waitcommand();
if(c=='R'||c=='r')break;
printf("\b\t请重新输入: ");
mygets(temp);
}
int ok=0;
if(id&&now)
{
printf("\t请输入密码: ");
getpassw(pass);
while(!(ok=(strcmp(student.a[now].passw,pass)==0)))
{
printf("\t密码错误,按R返回登入界面,按S继续\n",t);
c=waitcommand();
if(c=='R'||c=='r')break;
printf("\b\t请重新输入: ");
getpassw(pass);
}
}
if(ok)kind=2,WHO=now,IDs=getIDs(student.a[now].subject),mainwin();
login();
}
else END=1;
}
void updatas()
{
system("cls");
char pass[256],temp[256];
printf("\n\n\n\n\n");
printf("\t现在修改你的密码\n");
printf("\t\t输入新密码:");
getpassw(temp);
printf("\t再输入新密码:");
getpassw(pass);
if(strcmp(temp,pass))passwerror(pass);
strcpy(student.a[WHO].passw,pass);
saves();
system("cls");
printf("\n\n\n\n\n");
printf("\t密码已更改,5秒钟自动返回主页面,按R直接返回\n");
stop(5000);
mainwin();
}
void updatat()
{
system("cls");
char pass[256],temp[256];
printf("\n\n\n\n\n");
printf("\t现在修改您的密码\n");
printf("\t输入新密码:");
getpassw(temp);
printf("\t再输入新密码:");
getpassw(pass);
if(strcmp(temp,pass))passwerror(pass);
strcpy(teacher.a[WHO].passw,pass);
savet();
system("cls");
printf("\n\n\n\n\n");
printf("\t密码已更改,5秒钟自动返回主页面,按R直接返回\n");
stop(5000);
mainwin();
}
void updataa()
{
system("cls");
char temp[256];
printf("\n\n\n\n\n");
printf("\t请设置管理员账号,并牢记\n");
printf("\t输入新账号:");
mygets(admin);
printf("\t输入新密码:");
getpassw(temp);
printf("\t再输入新密码:");
getpassw(apassw);
if(strcmp(temp,apassw))passwerror(apassw);
out=fopen("admin.in","w");
fprintf(out,"%s\n",admin);
fprintf(out,"%s\n",apassw);
fclose(out);
system("cls");
printf("\n\n\n\n\n");
printf("\t\t管理员账号已更改,账号: %s\n",admin);
printf("\t请牢好,5秒钟自动返回主页面,按R直接返回\n");
stop(5000);
kind=0,WHO=0,mainwin();
return;
}
void start()
{
free(student.a);
student.n=1;
student.len=8;
student.a=(STUD*)malloc(sizeof(STUD)*8);
free(teacher.a);
teacher.n=1;
teacher.len=8;
teacher.a=(TEAD*)malloc(sizeof(TEAD)*8);
if(in=fopen("admin.in","r"))
{
myfgets(admin,128,in);
myfgets(apassw,128,in);
fclose(in);
}
else
{
char temp[256];
system("cls");
printf("\n\n\n\n\n");
printf("\t这是你第一次使用本系统,请设置管理员账号,并牢记\n");
printf("\t输入账号:");
mygets(admin);
printf("\t输入密码:");
getpassw(temp);
printf("\t再输入密码:");
getpassw(apassw);
if(strcmp(temp,apassw))passwerror(apassw);
out=fopen("admin.in","w");
fprintf(out,"%s\n",admin);
fprintf(out,"%s\n",apassw);
fclose(out);
system("cls");
printf("\n\n\n\n\n");
printf("\t管理员账号建立,账号: %s\n",admin);
printf("\t请牢好,5秒钟自动返回主页面,按R直接返回\n");
stop(5000);
kind=0,WHO=0,mainwin();
}
if(in=fopen("datasub.in","r"))
{
int i,j;
fscanf(in,"%d",&Subnum);
fgetc(in);
for(i=0; i<Subnum; ++i)
{
myfgets(sub[i].name,128,in);
fscanf(in,"%d%d",&sub[i].subs,&sub[i].num);
fgetc(in);
for(j=0; j<sub[i].subs; ++j)myfgets(sub[i].classname[j],128,in);
}
fclose(in);
}
if(in=fopen("datas.in","r"))
{
STUD s;
int i,mm=0;
while(myfgets(s.institute,128,in))
{
if(!myfgets(s.subject,128,in))break;
if(!myfgets(s.name,128,in))break;
if(!myfgets(s.sex,128,in))break;
if(!myfgets(s.passw,256,in))break;
if(!fscanf(in,"%d",&s.ID))break;
if(!fscanf(in,"%lf",&s.sum))break;
if(!fscanf(in,"%lf",&s.average))break;
IDs=getIDs(s.subject);
for(i=mm=0;i<sub[IDs].subs; ++i)
if(!fscanf(in,"%lf",&s.s[i]))
{
mm=1;
break;
}
if(mm)break;
fgetc(in);
adds(&student,s);
}
fclose(in);
}
if(in=fopen("datat.in","r"))
{
TEAD t;
while(myfgets(t.institute,128,in))
{
if(!myfgets(t.subject,128,in))break;
if(!myfgets(t.name,128,in))break;
if(!myfgets(t.sex,128,in))break;
if(!myfgets(t.passw,128,in))break;
if(!fscanf(in,"%d",&t.ID))break;
fgetc(in);
addt(&teacher,t);
}
fclose(in);
}
}
void savesub()
{
if(out=fopen("datasub.in","w"))
{
int i,j;
fprintf(out,"%d\n",Subnum);
for(i=0; i<Subnum; ++i)
{
fprintf(out,"%s\n",sub[i].name);
fprintf(out,"%d %d\n",sub[i].subs,sub[i].num);
for(j=0; j<sub[i].subs; ++j)fprintf(out,"%s\n",sub[i].classname[j]);
}
}
fclose(out);
}
void saves()
{
out=fopen("datas.in","w");
int i,j;
for(i=1; i<student.n; ++i)
{
fprintf(out,"%s\n",student.a[i].institute);
fprintf(out,"%s\n",student.a[i].subject);
fprintf(out,"%s\n",student.a[i].name);
fprintf(out,"%s\n",student.a[i].sex);
fprintf(out,"%s\n",student.a[i].passw);
fprintf(out,"%d\n",student.a[i].ID);
fprintf(out,"%.1lf\n",student.a[i].sum);
fprintf(out,"%.1lf\n",student.a[i].average);
for(j=0; j<sub[getIDs(student.a[i].subject)].subs; ++j)fprintf(out,"%.1lf\n",student.a[i].s[j]);
}
fclose(out);
}
void savet()
{
out=fopen("datat.in","w");
int i,j;
for(i=1; i<teacher.n; ++i)
{
fprintf(out,"%s\n",teacher.a[i].institute);
fprintf(out,"%s\n",teacher.a[i].subject);
fprintf(out,"%s\n",teacher.a[i].name);
fprintf(out,"%s\n",teacher.a[i].sex);
fprintf(out,"%s\n",teacher.a[i].passw);
fprintf(out,"%d\n",teacher.a[i].ID);
}
fclose(out);
}
/************END***********/
/**********主函数***********/
int main()
{
start();
login();
return 0;
}
/************END***********/
恶心的学生信息管理系统,不解释。。。
最新推荐文章于 2024-04-20 20:51:17 发布