资源描述
. .
功能说明:实现两种权限的身份登陆的教务管理系统
*/
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "time.h"
#include "memory.h"
#define share "d:\\share.dat" //定义地址
#define manager "d:\\manager.dat" //定义管理员地址
#define outmsg "d:\\outmsg.dat" //定义公告地址
#define logtimemsg "d:\\used login time.dat" //定义用户登录时间信息
#define star_stu "d:\\stu_same.dat" //定义学生起始文件信息
#define stu_msg "d:\\stu.dat" //定义学生成绩信息地址
#define mass_key "3110008758" //定义文件头部密码
typedef struct student stu;
#define sc_num 4 //只设定4门科目,不允许改动
#define uint unsigned int
/*学生成绩管理系统构造*/
struct student
{
char num[10]; /*学生学号*/
char name[10]; /*学生XX*/
uint score[sc_num]; /*科目分数*/
uint average; /*科目平均分*/
stu *next;
}st;
char gettemp=0;
/*管理员身份识别构造*/
typedef struct username user;
struct username
{
char username[20];//
char password[20];
}use;
/*时间登录信息*/
struct Logtime
{
char userlogin[20];
struct tm;
};
char logc;//登录次数
typedef struct Logtime logtime;
//==========================================================
//定义通讯协议
//==========================================================
#define mass_max 200 //定义信息量
struct Massage
{
int cont; //文件数量
char username[15]; //发送人
char mass[mass_max];//信息
}mas;
typedef struct Massage massage;
//==========================================================
//==========================================================
char userlogin[10];
char sc_name[sc_num][10];
/*以上是学生信息*/
char wele(void);/*用户界面,返回0,那么表示退出系统*/
/*
====================================================================
学生信息操作
====================================================================
*/
stu*creat();/*建立链表*/
void display(stu *head);/*显示用户信息*/
void insert(stu *head);/*增加学生信息*/
stu* delname(stu*head,char *stu_name);/*根据学生XX删除用户信息*/
stu* delnum(stu *head,char *stu_num);/*根据学生学号删除用户信息*/
stu* checkname(stu *head,char *stu_name);/*输出指定学生的信息*/
stu* checknum(stu *head,char *stu_num);/*输出指定学生学号的学生信息*/
void changsc_name(stu *head,char *name);/*修改用户成绩*/
void changsc_num(stu *head,char *num);/*修改用户成绩*/
void waring(void);/*产生警告信息*/
char cheknum(char *num);/*检查学生学号是否符合格式*/
char chekname(char *name);/*检查学生XX是否符合格式*/
char chekscore(char score);/*检查学生分数是否符合格式*/
stu* sortscore(stu *head);/*学生按平均成绩排序*/
stu* sortnum(stu *head);/*学生信息按学号排序*/
/*
====================================================================
学生用户登录
====================================================================
*/
char stulogin(void);/*进入普通用户登录界面*/
char stucheck(char *nam,char *stnum);/*查找是否存在该学生信息*/
char newlogin(char *nam,char *stnum);/*注册学生信息*/
void disnewst(void);/*获得学生信息*/
/*
====================================================================
系统管理选择,管理员权限
====================================================================
*/
void stu_system(void);/*对各种操作集中管理*/
void sentmsg(void);/*发送公告*/
char readmsg(void);/*浏览信息*/
char delemsg(void);//删除信息
void chagesbject(void);/*修改课程信息*/
/*
====================================================================
用户登录信息
====================================================================
*/
void setlogintime(void);/*记录用户登录时间*/
void dislogintime(void);/*显示用户登录信息*/
void setused(void);/*注册新用户资料*/
char usedcheckname(char *name);/*用户信息检查,假设存在用户,那么返回1,否那么返回0*/
char usedcheckpass(char *name,char *password);/*查看用户名密码是否符合*/
/*
====================================================================
存储操作
====================================================================
*/
char save(stu *head);/*保存用户数据*/
char disload();/*显示用户信息*/
stu* load(void);/*加载用户数据*/
void clrtxt(char *str);/*去除文本信息*/
char* creat_txt(char *username);/*根据用户名,创立一个用户文件*/
FILE* chekuser(char *username);/*根据用户名,查找是否有此用户信息,假设无,返回NULL*/
/*
====================================================================
---------------main函数----------
====================================================================
*/
void main()
{
FILE *fp;
char i,j;
char name[15];
system("color b5");
memset(name,'\0',sizeof(name));
if((fp=fopen(star_stu ,"r+"))==NULL)
{
printf("将新建文件!\n");
fp=fopen(star_stu ,"w+");
}
fread(name,sizeof(name),1,fp);
if(strcmp(name,mass_key)!=0)
{
printf("文件载入出错!\t N为退出回车键继续...:");
i=getchar();
if((i=='n')||(i=='N'))
{
fclose(fp);
exit(1);
}
else
{
printf("\n\n数据将重新初始化!\n");
printf("\n\n请输入4门科目名称\n");
memset(name,'\0',sizeof(name));
fwrite(name,sizeof(name),5,fp);
strcpy(name,mass_key);
rewind(fp);
fwrite(name,sizeof(name),1,fp);
for(i=0;i<sc_num;i++)
{
printf("\n\n第%d门科目名称 : ",i+1);
scanf("%s",sc_name[i]);
if(fwrite(sc_name[i],sizeof(sc_name[i]),1,fp)!=1)
{
printf("\n\n\t\t\t\t保存出错!\n");
getchar();
exit(1);
}
}
}
}
else
{
if(fp==NULL)
printf("\n文件错误!");
fscanf(fp,"%s%s%s%s",sc_name[0],sc_name[1],sc_name[2],sc_name[3]);
}
fclose(fp);
fp=fopen(share,"w"); //为防止文件在后面翻开错误
fclose(fp);
fp=fopen(manager,"w");
fclose(fp);
fp=fopen(outmsg,"w");
fclose(fp);
do
{
j=wele();
if(j==1)
{
system("cls");
printf("\t\t欢迎进入学生用户中心系统!");
setlogintime();
j=stulogin();
}
else if(j==2)
{
setlogintime();
stu_system();
}
}while(j!=0);
fp=fopen(share,"w"); //为防止文件未关闭,倒置文件容丧失
fclose(fp);
fp=fopen(manager,"w");
fclose(fp);
fp=fopen(outmsg,"w");
fclose(fp);
fp=fopen(logtimemsg,"w");
fclose(fp);
fp=fopen(star_stu,"w");
fclose(fp);
fp=fopen(stu_msg,"w");
fclose(fp);
}
/*
====================================================================
---------------------------初始化用户界面---------------------------
====================================================================
*/
//返回1,那么进入stu用户界面
//返回0,那么表示退出
//返回2,那么表示进入管理员界面
char wele(void)
{
char username[20];
char userpass[20];
char i,wrong_cont=0,key=0,weling=1,back=0;
char temp;
system("color b5");
while(weling)
{
do{
system("cls");
printf("\t*********************欢迎进入教务管理系统********************\n");
printf("\t* *\n");
printf("\t* 1.用户登录 *\n");
printf("\t* *\n");
printf("\t* 2.用户注册 *\n");
printf("\t* *\n");
printf("\t* 3.管理员登陆 *\n");
printf("\t* *\n");
printf("\t* 4.管理员注册 *\n");
printf("\t* *\n");
printf("\t* 5.退出系统 *\n");
printf("\t* *\n");
printf("\t=============================================================\n");
printf("\t 请按命令提示操作\n");
printf("\n\n\n");
printf("\n\n\n");
printf("您输入的命令为:\t");
i=getchar();
if((i!='1')&&(i!='2')&&(i!='3')&&(i!='4')&&(i!='5'))
{
printf("\n输入错误的指令!请按命令提示操作 1-3\n");
getchar();
}
}while((i!='1')&&(i!='2')&&(i!='3')&&(i!='4')&&(i!='5'));
switch(i)
{
case '1':
{
system("cls");
memset(username,'\0',sizeof(username));
memset(userpass,'\0',sizeof(userpass));
printf("\n\t请输入用户名 :\t");
scanf("%s",username);
printf("\n\t请输入学号 :\t");
scanf("%s",userpass);
temp=stucheck(username,userpass);
if(temp==0)
{
printf("没有学生档案信息!请注册...\n");
getchar();
break;
}
else if(temp==1)
{
memset(userlogin,'\0',sizeof(userlogin));
strcpy(userlogin,username);
printf("\n\t学生成绩登录有效!");
getchar();
return 1;
}
getchar();
//=======================
break;
}
case '2':
{
system("cls");
memset(username,'\0',sizeof(username));
memset(userpass,'\0',sizeof(userpass));
printf("\n\t请输入用户名 :\t");
scanf("%s",username);
printf("\n\t请输入学号 :\t");
scanf("%s",userpass);
while(cheknum(userpass)!=1)
{
printf("您的输入格式有误,请重新输入!\n");
printf("按回车键继续...\n");
getchar();
memset(userpass,'\0',sizeof(userpass));
printf("\n\t请输入学号 :\t");
scanf("%s",userpass);
}
if(newlogin(username,userpass))
printf("\n\t注册成功!用户名:%s\t学号:%s",username,userpass);
getchar();
break;
}
case '3':
{
do
{
system("cls");
memset(username,'\0',sizeof(username));
memset(userpass,'\0',sizeof(userpass));
printf("\n\t请输入用户名 :\t");
scanf("%s",username);
printf("\n\t请输入密码 :\t");
scanf("%s",userpass);
if(usedcheckpass(username,userpass)==0)
{
wrong_cont++;
if(wrong_cont==3)
{
printf("\n\t输入次数大于3次!请按回车键退出系统!\n");
getchar();
weling=0;
return 0;
}
key=1;
printf("\n\t按1选择返回主菜单\n\t按0继续输入用户验证码\n");
do
{
back=getchar();
if((back!='1')&&(back!='0'))
{
printf("\n\t输入错误!按回车键继续...");
getchar();
}
}while((back!='1')&&(back!='0'));
if(back=='1')
key=0;
}
else
{
key=0;
weling =0;
system("cls");
printf("\n\n\t\t欢迎%s进入学生管理系统\n",username);
memset(userlogin,'\0',sizeof(userlogin));
strcpy(userlogin,username); //记录用户登录信息
return 2;
}
}while(key);
back=0;
weling=1;
break;
return 2;
}
case '4':
{
setused();/*注册新管理员资料*/
weling=1;
break;
}
case '5':
{
weling=0;
return 0;
}
}
}
return 1;
}
/*
====================================================================
---------------建立链表----------
====================================================================
*/
stu*creat()/*建立链表*/
{
char i,j;
char stu_num;
stu *p1, *p2;
stu *head;
FILE *fp;
fp=fopen(stu_msg,"w+");
head=(stu*)malloc(sizeof(stu));
head->next=NULL;
p1=p2=(stu*)malloc(sizeof(stu));
i=0,j=0;
system("cls");
printf("\n\n请输入要录入的学生人数: ");
scanf("%d",&stu_num);
for(i=0;i<stu_num;i++)
{
system("cls");
p1->average=0;
printf("\n\n请输入学生学号: ");
scanf("%s",p1->num);
while(!cheknum(p1->num))
{
printf("\n\n输入格式错误!请重新输入学号 : ");
scanf("%s",p1->num);
}
printf("\n\n请输入学生XX : ");
scanf("%s",p1->name);
while(!chekname(p1->name))
{
printf("\n\n输入格式出错!不能带数字或下划线!\n");
printf("\n\n请重新输入学生XX: ");
scanf("%s",p1->name);
}
do
{
printf("\n\n请输入学生%s成绩 :",sc_name[j]);
scanf("%d",&p1->score[j]);
while((100<p1->score[j])||(p1->score[j]<0))
{
printf("\n\n成绩格式出错!\n ");
getchar();
printf("\n\n请重新输入学生成绩 : ");
scanf("%d",&p1->score[j]);
}
p1->average+=p1->score[j];
j++;
}while(j<sc_num);
j=0;
p1->average=p1->average/4;
if(i==0)
{
head->next=p1; /*分清楚是head->next=p还是head=p*/
p2=p1;
p1->next=NULL;
}
else
{
p2->next=p1;
p2=p1;
p2->next=NULL; /*产生新的节点*/
}
fwrite(p1,sizeof(stu),1,fp);
p1=(stu*)malloc(sizeof(stu));
}
display(head);
getchar();
fclose(fp);
return head;
}
/*
====================================================================
检查学生学号是否符合格式,假设正确,那么返回1,否那么返回0
====================================================================
*/
char cheknum(char *num)/*检查学生学号是否符合格式*/
{
char i; /*获取字符串长度*/
char j=strlen(num);
for(i=0;i<j;i++)
{
if(('0'>num[i])||('9'<num[i]))
{
return 0;
exit(1);
}
}
return 1;
}
/*
====================================================================
检查学生XX是否符合格式,假设正确,那么返回1,否那么返回0
====================================================================
*/
char chekname(char *name)/*检查学生XX是否符合格式*/
{
char i;
for(i=0;i<strlen(name);i++)
{
/*if(('A'>name[i])||(('Z'<name[i])&&('a'>name[i]))||('z'<name[i]))
/if(name[i]<18)
{
return 0;
exit(1);
}*/
}
return 1;
}
/*
====================================================================
显示学生成绩情况
====================================================================
*/
void display(stu *head)/*显示用户信息*/
{
stu *p1;
char i=0;
p1=head->next;
system("cls");
if(p1!=NULL)
{
while(p1!=NULL)
{
if(i==0)
{
printf("XX\t学号\t %s\t %s\t %s\t%s\t平均分 \n",sc_name[0],sc_name[1],sc_name[2],sc_name[3]);
i++;
}
printf("%s\t%s\t %d\t %d\t%d\t%d\t%d\n",\
p1->name,p1->num,p1->score[0],p1->score[1],p1->score[2],p1->score[3],p1->average);
p1=p1->next;
}
getchar();
}
else
{
printf("\t\t\t链表为空!\n\n\n请按回车键继续...\n");
getchar();
}
}
/*
====================================================================
插入学生信息
====================================================================
*/
void insert(stu *head)/*增加学生信息*/
{
stu *p1,*p2;
char j=0;
p1=head->next;
p2=(stu*)malloc(sizeof(stu)); /*创立新的学生信息*/
p2->average=0;
system("cls");
printf("\n\n请输入要增加的学生学号: ");
scanf("%s",p2->num);
while(!cheknum(p2->num))
{
printf("\n\n输入格式错误!请重新输入学号 : ");
scanf("%s",p2->num);
}
printf("\n\n请输入学生的XX : ");
scanf("%s",p2->name);
while(!chekname(p2->name))
{
printf("\n\n输入格式出错!不能带数字或下划线!\n");
printf("\n\n请重新输入学生XX: ");
scanf("%s",p2->name);
}
do
{
printf("\n\n请输入学生%s成绩 :",sc_name[j]);
scanf("%d",&p2->score[j]);
while((100<p2->score[j])||(p2->score[j]<0))
{
printf("\n\n成绩格式出错!\n ");
getchar();
printf("\n\n请重新输入学生成绩 : ");
scanf("%d",&p2->score[j]);
}
p2->average+=p2->score[j];
j++;
}while(j<sc_num);
p2->average=p2->average/4;
if(head->next==NULL)
{
printf("\n原链表为空!");
getchar();
head->next=p2;
}
else
{
while(p1->next!=NULL)
p1=p1->next;
p1->next=p2;
p2->next=NULL;
}
display(head);
getchar();
}
/*
====================================================================
删除学生信息
====================================================================
*/
stu* delname(stu*head,char *stu_name)/*根据学生XX删除用户信息*/
{
stu *p1,*p2;
char i,j=0;
system("cls");
if(head->next==NULL)
{
printf("\n\n没有学生信息!\t操作错误!\n");
return head;
}
p1=head->next;
p2=p1;
while(p1!=NULL)
{
if(strcmp(p1->name,stu_name)==0)
{
printf("\n\n你所删除的学生XX为: %s\t学号为:%s\n",p1->name,p1->num);
printf("\n\n确定为:y,取消为n\t:");
i=getchar();
while(!((i=='y')||(i=='Y')||(i=='n')||(i=='N')))
{
printf("\n\n输入错误!\t请重新输入 :");
i=getchar();
}
if((i=='y')||(i=='Y'))
{
if(j==0)
{
head->next=p1->next;/*删除头部接点*/
}
展开阅读全文