C语言课程设计报告——教务管理系统.doc
. .功能说明:实现两种权限的身份登陆的教务管理系统*/#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 studentchar num10;/*学生学号*/char name10;/*学生XX*/uint scoresc_num;/*科目分数*/uint average;/*科目平均分*/stu *next;st;char gettemp=0;/*管理员身份识别构造*/typedef struct username user;struct usernamechar username20;/char password20;use;/*时间登录信息*/struct Logtimechar userlogin20;struct tm;char logc;/登录次数typedef struct Logtime logtime;/=/定义通讯协议/=#define mass_max200/定义信息量struct Massageint cont;/文件数量char username15;/发送人char massmass_max;/信息mas;typedef struct Massage massage;/=/=char userlogin10;char sc_namesc_num10;/*以上是学生信息*/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 name15;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);elseprintf("nn数据将重新初始化!n");printf("nn请输入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("nn第%d门科目名称 : ",i+1);scanf("%s",sc_namei);if(fwrite(sc_namei,sizeof(sc_namei),1,fp)!=1)printf("nntttt保存出错!n");getchar();exit(1);elseif(fp=NULL)printf("n文件错误!");fscanf(fp,"%s%s%s%s",sc_name0,sc_name1,sc_name2,sc_name3);fclose(fp);fp=fopen(share,"w");/为防止文件在后面翻开错误fclose(fp);fp=fopen(manager,"w");fclose(fp);fp=fopen(outmsg,"w");fclose(fp);doj=wele();if(j=1)system("cls");printf("tt欢迎进入学生用户中心系统!");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 username20;char userpass20;char i,wrong_cont=0,key=0,weling=1,back=0;char temp;system("color b5");while(weling)dosystem("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("nnn");printf("nnn");printf("您输入的命令为:t");i=getchar();if(i!='1')&&(i!='2')&&(i!='3')&&(i!='4')&&(i!='5')printf("n输入错误的指令!请按命令提示操作 1-3n");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("nt请输入用户名 :t");scanf("%s",username);printf("nt请输入学号 :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("nt学生成绩登录有效!");getchar();return 1;getchar();/=break;case '2':system("cls");memset(username,'0',sizeof(username);memset(userpass,'0',sizeof(userpass);printf("nt请输入用户名 :t");scanf("%s",username);printf("nt请输入学号 :t");scanf("%s",userpass);while(cheknum(userpass)!=1)printf("您的输入格式有误,请重新输入!n");printf("按回车键继续.n");getchar();memset(userpass,'0',sizeof(userpass);printf("nt请输入学号 :t");scanf("%s",userpass);if(newlogin(username,userpass)printf("nt注册成功!用户名:%st学号:%s",username,userpass);getchar();break;case '3':dosystem("cls");memset(username,'0',sizeof(username);memset(userpass,'0',sizeof(userpass);printf("nt请输入用户名 :t");scanf("%s",username);printf("nt请输入密码 :t");scanf("%s",userpass);if(usedcheckpass(username,userpass)=0)wrong_cont+;if(wrong_cont=3)printf("nt输入次数大于3次!请按回车键退出系统!n");getchar();weling=0;return 0;key=1;printf("nt按1选择返回主菜单nt按0继续输入用户验证码n");doback=getchar();if(back!='1')&&(back!='0')printf("nt输入错误!按回车键继续.");getchar();while(back!='1')&&(back!='0');if(back='1')key=0;else key=0;weling =0;system("cls");printf("nntt欢迎%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("nn请输入要录入的学生人数: ");scanf("%d",&stu_num);for(i=0;i<stu_num;i+)system("cls");p1->average=0;printf("nn请输入学生学号: ");scanf("%s",p1->num);while(!cheknum(p1->num)printf("nn输入格式错误!请重新输入学号 : ");scanf("%s",p1->num);printf("nn请输入学生XX : ");scanf("%s",p1->name);while(!chekname(p1->name)printf("nn输入格式出错!不能带数字或下划线!n");printf("nn请重新输入学生XX: ");scanf("%s",p1->name); do printf("nn请输入学生%s成绩 :",sc_namej); scanf("%d",&p1->scorej);while(100<p1->scorej)|(p1->scorej<0)printf("nn成绩格式出错!n ");getchar();printf("nn请重新输入学生成绩 : ");scanf("%d",&p1->scorej);p1->average+=p1->scorej;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'>numi)|('9'<numi)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'>namei)|('Z'<namei)&&('a'>namei)|('z'<namei)/if(namei<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("XXt学号t %st %st %st%st平均分 n",sc_name0,sc_name1,sc_name2,sc_name3);i+;printf("%st%st %dt %dt%dt%dt%dn",p1->name,p1->num,p1->score0,p1->score1,p1->score2,p1->score3,p1->average); p1=p1->next;getchar();elseprintf("ttt链表为空!nnn请按回车键继续.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("nn请输入要增加的学生学号: ");scanf("%s",p2->num);while(!cheknum(p2->num)printf("nn输入格式错误!请重新输入学号 : ");scanf("%s",p2->num);printf("nn请输入学生的XX : ");scanf("%s",p2->name);while(!chekname(p2->name)printf("nn输入格式出错!不能带数字或下划线!n");printf("nn请重新输入学生XX: ");scanf("%s",p2->name); do printf("nn请输入学生%s成绩 :",sc_namej); scanf("%d",&p2->scorej);while(100<p2->scorej)|(p2->scorej<0)printf("nn成绩格式出错!n ");getchar();printf("nn请重新输入学生成绩 : ");scanf("%d",&p2->scorej);p2->average+=p2->scorej;j+;while(j<sc_num);p2->average=p2->average/4;if(head->next=NULL)printf("n原链表为空!");getchar();head->next=p2;elsewhile(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("nn没有学生信息!t操作错误!n");return head;p1=head->next;p2=p1;while(p1!=NULL)if(strcmp(p1->name,stu_name)=0)printf("nn你所删除的学生XX为: %st学号为:%sn",p1->name,p1->num);printf("nn确定为:y,取消为nt:");i=getchar();while(!(i='y')|(i='Y')|(i='n')|(i='N')printf("nn输入错误!t请重新输入 :");i=getchar();if(i='y')|(i='Y')if(j=0)head->next=p1->next;/*删除头部接点*/