教务处管理信息系统
实践报告
姓 名:
院 系: 建筑工程系
专 业: 工程造价
学 号:
指导老师:
完成时间:20##年5月9日
信息社会的高科技,商品经济化的高效益,使计算机的应用已普及到经济和社会生活的各个领域。计算机虽然与人类的关系愈来愈密切,但是还有人由于计算机操作不方便继续用手工劳动。为了适应现代社会人们高度强烈的时间观念,随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。管理信息系统是一个不断发展的新型学科,任何一个单位要生存、要发展、要高效率地把内部活动有机地组织起来,就必须建立与自身特点相适应的管理信息系统。这对于正在迅速发展的各大高校而言,同样有着重要意义。
现如今高校为适应社会的需求以及自身办学的需要,扩建、扩招已在寻常不过。自然就会有更多的学生信息需要处理。如果只靠人力来完成,必然是一项非常繁琐、复杂的工作,而且还会出现很多意想不到的错误,这不仅会给教学及管理带来了很大的不便,也不益于学校全面快速发展的需要。众所周知,作为高校日常教学中的主要管理工作之一的教务管理,它涉及到院校、专业、师生等诸多方面。特别是目前国家的教育体制也正处在不断改革、创新的阶段,教育部门充分吸取国外优秀的教学模式,结合国内多年的办学经验,逐步探索出了适合中国特色的教学形式,国家教育部面向各级各类学校开展了全面学分制改革。同时,随着选课制的展开和深入,教务日常管理工作也日趋繁重、复杂,如何把教务工作信息化、模块化、便捷化便成为了现代高校发展的重点。所以总的来说,教务管理软件应实现教务信,集中管理,使传统的教务管理朝数字化、无纸化、智能化、综合化的方向发展,并为进一步实现完善的计算机教务管理系统和全校信息系统打下良好的基础。在高校中,教务管理工作具有举足轻重的地位,教学质量直接取决十教务管理水平。现如今教务管理信息系统的开发与实施可谓日新月异。在数字校园理论逐步应用的过程中,各高校一方面不断投资购建各种硬件、系统软件和网络,另一方面也不断开发实施了各类教学、科研、办公管理等应用系统,形成了一定规模的信息化建设体系。教务管理系统是一个庞大而复杂的系统,它包括对学生信息的注册、修改,学生选课及课程管理和学生的四六级考试及计算机等级考试的管理;对教师课程的管理以及对选课学生评分的管理;和管理员对教师、各类考试的综合管理等主要的功能。教务管理系统运行的状况将直接影响到学校里的主要工作,一旦此系统出错,不仅学校的教学进度安排会受到一定程度的影响,而且还会危及到每一个在校学生的切身利益。
所以设计一个功能相对完整、操作简单以及界面友好的教务管理系统变得非常重要。为了提高教务管理的工作效率和服务质量,降低出错率,精简人力、物力的投入,各个高校均建立了自己的教务管理信息系统,为学校的动态管理和分析决策带来了极大的便利。现在的学校的教务管理也逐步从手工转到计算机自动化信息处理阶段。通过这个系统,用户可以方便的对教师信息以及学生信息和学生成绩资料进行添加、修改和删除操作,还可以对学生资料和成绩进行查询操作。除此之外,对用户的添加和删除操作也很方便。教务管理系统是典型的信息管理系统(MIS),它能够实现整体规划教学资源(学生,教师,教室),评估教学质量,制定教学计划,检查教学进度,给学校的教务人员管理教务工作提供了极大的方便。以下以青岛农业大学教务信息系统为例进行分析:
一 、系统的目标
教务管理系统是一个庞大而复杂的系统,它包括对学生信息的注册、修改,学生选课及 课程管理和学生的四六级考试及计算机等级考试的管理;对教师课程的管理以及对选课学生评分的管理;和管理员对教师、各类考试的综合管理等主要的功能。教务管理系统运行的状况将直接影响到学校里的主要工作,一旦此系统出错,不仅学校的教学进度安排会受到一定程度的影响,而且还会危及到每一个在校学生的切身利益。所以设计一个功能相对完整、操作简单以及界面友好的教务管理系统变得非常重要。
为了提高教务管理的工作效率和服务质量,降低出错率,精简人力、物力的投入,各个高校均建立了自己的教务管理信息系统,为学校的动态管理和分析决策带来了极大的便利。现在的学校的教务管理也逐步从手工转到计算机自动化信息处理阶段。通过这个系统,用户可以方便的对教师信息以及学生信息和学生成绩资料进行添加、修改和删除操作,还可以对学生资料和成绩进行查询操作。除此之外,对用户的添加和删除操作也很方便。教务管理系统是典型的信息管理系统(MIS),它能够实现整体规划教学资源(学生,教师,教室),评估教学质量,制定教学计划,检查教学进度,给学校的教务人员管理教务工作提供了极大的方便。
二、系统的需求分析
通过对现行系统的详细调研,主要是从系统的角度理解用户的需要,确定新系统的综合要求,并提出这些需求的实现条件以及需求应达到的标准,也就是确定新系统要做什么,做到什么程度。这些需求包括:
(一)、功能需求
新系统应做什么?用户可以方便的对教师信息以及学生信息和学生成绩资料进行添加、修改和删除操作,还可以对学生资料和成绩进行查询操作。除此之外,对用户的添加和删除操作也很方便。
(二)、性能需求
给出新系统的技术性指标,包括存储容量限制、运行时间限制、安全保密性等因为系统存储学生信息,所以数据库系统应该具有备份和恢复功能,保证学生数据库的长期完整性和正确性。另一方面,作为系统的服务器应该能够长期无故障的运行,而且能够便于管理员的操作。安全性要求比较高,对业务逻辑必须封装,避免有人登陆他没权限的网页,避免黑客从数据流中截取敏感数据
(三)环境需求:
对系统运行环境以及所处环境的要求,如:在硬件方面采用什么机型、有什么硬件设备等;在软件方面,采用什么支持系统运行的系统软件(操作系统、数据库管理系统)
(四)未来需求:
将来随着外界环境的变化以及系统的发展可能会提出新的要求,所以在开发 过程中可对系统将来可能的扩展和修改做准备,一旦需要时就比较容易进行补充和修改了。
(五)普通用户的需求:对于只有查看权限的用户,一般是通过上网浏览学校网页来查看数据的。各部门管理员:能够对系统进行设置,以适应不同用户的需求。对不同系的管理员分配不同的权限,教务处系统管理员具有最高的管理权限。
三、系统的功能结构
教务处下属可以该五个部门为主,分别主要管理相应的部门,各司其职,共同推进学校的教学办公管理。
四、系统的流程
(一)学籍科
课程学分获得(业务流程图)
通过学生的考试成绩,确定学生的学分,以决定学生是通过考试,还是需要开学补考、重新学习还是延长学习年限。
学生退学业务流程图
学生退学(数据流程图)
通过退学子系统,可以让学生清楚得知道退学流程,并明确各部门的职责,提高办事效率,节省劳动力与时间。
(二)、教材科
教材征订发放结算(业务流程图)
5、教材征订发放结算(数据流程图)
通过教材征订发放子系统,可以节省劳动时间,将教材尽快发放到学生手中,提高办事效率。
(三)教学评价与督导科
学生毕业论文检测,处理流程(业务流程图)
学生毕业论文检测,处理流程数据流程图
学校通过对学生的实践报告进行评价与考察,可以看出学生是否认真参与实践,是否认真写实践报告,从而考量学生掌握的专业知识是否牢固,从而判定学生是否有毕业资格。
(四)、教务科
成绩查询(业务流程图)
成绩查询(数据流程图)
学生通过此系统,可以查处自己的成绩,并反映自己的意见,学校查实后进行修改,达到双方一致。充分体现了教学的民主性、公平性。
国家普通话水平测试(业务流程图)
国家普通话水平测试(数据流程图)
通过子系统,可以明确知道普通话考试与批阅的流程,明确各部门的职责,提高效率
第二篇:c语言信息管理系统实践报告
北 京 理 工 大 学 珠 海 学 院
实践题目:信息管理系统实验报告
学 院: 计算机学院
专业班级:计算机科学与技术(1)班
学 号: 120201011036
学生姓名: 骆庆东
指导老师: 郭素梅
2013年11月01日
目 录
一、实践目的与内容.........................02
二、任务内容分析...........................03
三、程序设计...............................04
四、程序代码...............................06
五、运行分析...............................31
六、实践总结...............................33
一、实践目的与内容
实践目的
《程序设计实训》是计算机科学与技术专业的一门实训课程。本课程通过具体案例,让学生巩固C语言的基础知识和规则,巩固程序设计基本算法和思路,并能够熟练运用C语言进行较为复杂的程序设计。旨在训练利用计算机处理问题的思维方法以及编写规范性的、可读性强的程序,解决具体问题为目的,为后续课程及各种实用程序开发奠定基础。本课程注重培养编程和调试等独立的实际操作能力。
实践内容
a) 初始化:设置超级用户和教师用户的用户名、初始密码(111111)和访问系统的权限。
b) 信息管理:
i. 学生基本信息管理:删除、添加、修改、排序和检索;
学生信息包括:学号、姓名、性别、年级、专业(或代号)
ii. 教师基本信息管理:添加、删除、修改、排序和检索;
教师信息包括:用户名、姓名、所属学院(或代号)
iii. 课程信息*:添加、删除、修改、排序和检索;
课程信息包括:课程名、课程代码、课时数
iv. 教师教学任务分配和管理*:
用户名、教师名、所授课目、科目实施期限、以及教师可以考核的学生。
v. 教师检索学生基本信息:检索、排序。
教师第一次登陆系统必须修改密码(密码要求:六位以上,须包含以下三种即大小写字母、数字和其他字符(*,_,#),不得以明文的形式存放在文件中),教师不能修改学生信息,只可检索学生信息。
vi. 信息保存形式:文件。
二、任务内容分析
题目要求完成一个学生和教师信息管理系统,要求能进行对学生和教师的信息录入、修改和删除,能查询学生和教师的信息,同时可以对学生和教师的信息进行排序。系统的使用,必须有权限的存在,即有超级用户和教师用户,且只有超级用户才能对学生和教师的信息进行操作。教师不能修改学生信息,只可检索学生信息。
要求实验环境为:Visual Studio 2010或VC++6.0,建议采用VS2010,编程语言为C/C++。
系统有以下几个功能性要求:
1. 学生/教师的信息录入:能够将学生/教师的信息进行录入,考虑到学生/教师的添加问题,加入新学生/教师的添加功能。
2. 学生/教师的信息修改:对学生/教师的错误信息进行修改。
3. 学生/教师的信息删除:能够删除指定的学生/教师的信息。
4. 学生/教师的信息查询:输入学号/用户名,查询对应学生/教师的信息。
5. 学生/教师的信息排序:对学生/教师的信息按指定的要求进行排序。
6. 权限验证:用户使用该系统,首先进行验证,分管理员用户和教师用户,验证成功,才能登入系统。
三、程序设计
程序一共有6个界面,分别是用户登录界面、管理员菜单界面、学生信息管理界面、教师信息管理界面、学生排序界面和教师菜单界面。
用户登录界面有管理员登录和教师用户登录两个选择,其中设置教师用户第一次登录时必须修改密码。
管理员菜单界面有学生信息管理、教师信息管理和修改管理密码三个选择。
学生信息管理界面有输入学生信息、添加学生信息、显示学生信息、输出学生信息、修改学生信息、删除学生信息、查询学生信息和排序学生信息八个选择。
教师信息管理界面有修改教师信息、查询教师信息、排序教师信息、删除教师信息、显示教师信息、教师任务分配和添加教师用户七个选择。
学生排序界面有按学号排序、按年级排序、按专业排序和按性别排序四个选择。
教师菜单界面有查询用户信息、修改用户密码、查询学生信息和显示学生信息四个选择。
流程图如下:
四、程序代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
#define LEN1 sizeof(struct student) /*宏定义*/
#define LEN2 sizeof(struct teacher)
int N; /*学生个数全局变量*/
int M; /*教师个数全局变量*/
struct student /*定义学生结构体类型*/
{
int number; /*学号*/
char name[10]; /*姓名*/
char sex[4]; /*性别*/
int grade; /*年级*/
char major[20]; /*专业*/
int subjectnumber[6]; /*课程代码,最多有6门课程*/
char subject[6][15]; /*课程*/
int lessontime[6]; /*课时数*/
struct student *next;
};
typedef struct student stu;
struct teacher /*定义教师结构体类型*/
{
int username; /*用户名*/
char PWD[20]; /*密码*/
char name[10]; /*姓名*/
char subject[15]; /*授课科目*/
int lessontime; /*实施期限*/
struct teacher *next;
};
typedef struct teacher tea;
int put(tea *p1) /*输出教师信息*/
{
FILE *fp;
int i;
if((fp=fopen("teacher.txt","w"))==NULL) return 0;
while(p1!=NULL)
{
for(i=0;p1->PWD[i]!='\0';i++)
{
p1->PWD[i]+=3;
}
fprintf(fp,"%d\t%s\t%s\t%s\t%d\t\n",p1->username,p1->PWD,
p1->name,p1->subject,p1->lessontime);
for(i=0;p1->PWD[i]!='\0';i++)
{
p1->PWD[i]-=3;
}
p1=p1->next;
}
fclose(fp);
return 0;
}
tea *add1(tea *head1,tea *te) /*添加教师用户*/
{
tea *p0,*p1,*p3;
int i;
p3=te=(tea *)malloc(LEN2);
repeat3:
printf("请输入要添加的教师的用户名,(用户名应大于0):");
scanf("%d",&te->username);
while(te->username<0)
{
printf("输入错误,请重新输入教师用户名:");
scanf("%d",&te->username);
}
if(te->username==0) goto end3; /*当输入的用户名为0时,转到末尾,结束添加*/
else
{
p3=head1;
if(M>0)
{
for(i=0;i<M;i++)
{
if(te->username!=p3->username) p3=p3->next;
else
{
printf("用户名重复,请重新输入.\n");
goto repeat3;
}
}
}
}
strcpy(te->PWD,"111111"); /*初始化用户密码111111*/
strcpy(te->name,"未知");
strcpy(te->subject,"未知");
te->lessontime=0;
p1=head1;
p0=te;
if(head1==NULL) /*当信息为空时,从首结点开始存放信息*/
{
head1=p0;
p0->next=NULL;
}
else /*当信息不为空时,把新结点链接到尾结点*/
{
while(p1->next!=NULL)p1=p1->next;
p1->next=p0;
p0->next=NULL;
}
put(head1); /* 保存教师信息*/
M=M+1;
end3:
printf("添加成功\n现在的教师用户数为:%d个\n",M);
return(head1);
}
tea *revise1(tea *head1) /*修改教师信息*/
{
int username;
tea *p1;
printf("请输入要修改的教师的用户名:");
scanf("%d",&username);
while(username!=0)
{
if(head1==NULL)
{
printf("\n没有任何教师信息\n");
return(head1); /*退出修改*/
}
p1=head1;
while(username!=p1->username&&p1->next!=NULL) p1=p1->next;/*查找输入的用户名*/
if(username==p1->username)
{
printf("请输入教师姓名:");
scanf("%s",p1->name);
put(head1); /* 保存教师信息*/
}
else printf("%d不存在此教师\n",username);
printf("请输入要修改的教师的用户名:");
scanf("%d",&username);
}
printf("退出修改\n");
return(head1);
}
void search1(tea *head1) /*查询教师信息*/
{
int username;
tea *p1;
printf("请输入要查询的教师的用户名:");
scanf("%d",&username);
while(username!=0)
{
if(head1==NULL)
{
printf("\n没有任何教师信息\n");
break; /*退出查询*/
}
p1=head1;
while(username!=p1->username&&p1->next!=NULL) p1=p1->next; /*查找输入的用户名*/
if(username==p1->username)
{
printf("\t\t\t------------------------------------\n");
printf("\t\t\t|用户名\t| 姓 名\t|授课科目|期限(周)|\n");
printf("\t\t\t------------------------------------\n");
printf("\t\t\t|%d\t|%s\t|%s\t|%d\t|\n",p1->username,
p1->name,p1->subject,p1->lessontime);
printf("\t\t\t------------------------------------\n");
}
else printf("%d不存在此教师\n",username);
printf("请输入要查询的教师的用户名:");
scanf("%d",&username);
}
printf("退出查询\n");
}
tea *del1(tea *head1) /*删除教师信息*/
{
tea *p1,*p2;
int i,username;
printf("请输入要删除的教师的用户名(输入0时退出):");
scanf("%d",&username);
while(username!=0)
{
if(head1==NULL)
{
printf("\n没有任何教师信息\n");
return(head1);
}
p1=head1;
while(username!=p1->username&&p1->next!=NULL) /*查找输入的用户名*/
{
p2=p1;
p1=p1->next;
}
if(username==p1->username)
{
printf("是否真的要删除%d的教师信息吗?1.是 2.否\n",username);
scanf("%d",&i);
if(i==2)break;
if(p1==head1) head1=p1->next;
else p2->next=p1->next;
printf("已删除:%d\n",username);
M=M-1;
put(head1); /*保存教师信息*/
}
else printf("%d不存在此教师\n",username);
printf("请输入要删除的教师的用户名:");
scanf("%d",&username);
}
printf("现在的教师数为:%d个\n",M);
return(head1);
}
void print1(tea *head1) /*显示教师信息*/
{
tea *p;
int i=0;
if(head1==NULL) printf("\n没有任何教师信息\n");
else
{
printf("共%d个教师信息\n",M);
p=head1;
printf("\t\t\t-----------------------------------\n");
printf("\t\t\t|用户名\t| 姓 名\t|授课科目|期限(周)|\n");
printf("\t\t\t-----------------------------------\n");
do
{
printf("\t\t\t|%d\t|%s\t|%s\t|%d\t|\n",p->username,
p->name,p->subject,p->lessontime);
printf("\t\t\t-----------------------------------\n");
p=p->next;
}while(p!=NULL);
}
}
tea *assignment(tea *head1) /*教师任务分配*/
{
int username;
tea *p1;
printf("请输入要分配任务的教师的用户名:");
scanf("%d",&username);
while(username!=0)
{
if(head1==NULL)
{
printf("\n没有任何教师信息\n");
return(head1);
}
p1=head1;
while(username!=p1->username&&p1->next!=NULL)p1=p1->next;
if(username==p1->username)
{
printf("请输入教师授课科目:");
scanf("%s",p1->subject);
printf("请输入科目实施期限(周):");
scanf("%d",&p1->lessontime);
put(head1); /*保存教师信息*/
}
else printf("%d不存在此教师\n",username);
printf("请输入要分配任务的教师的用户名:");
scanf("%d",&username);
}
printf("退出任务分配\n");
return(head1);
}
tea *sort1(tea *head1) /*教师信息排序*/
{
tea *p, *max;
int i,j,k;
char t[15];
if(head1==NULL)
{
printf("没有任何教师信息,请先添加教师用户!\n");
return (head1);
}
max=p=head1;
for(i=1;i<M;i++) /*冒泡法排序*/
{
for(j=i+1;j<=M;j++)
{
max=p;
p=p->next;
if(max->username>p->username)
{ /*交换两结点的值*/
k=max->username; /*交换用户名*/
max->username=p->username;
p->username=k;
strcpy(t,max->name); /*交换姓名*/
strcpy(max->name,p->name);
strcpy(p->name,t);
strcpy(t,max->subject); /*交换授课科目*/
strcpy(max->subject,p->subject);
strcpy(p->subject,t);
k=max->lessontime; /*交换实施期限*/
max->lessontime=p->lessontime;
p->lessontime=k;
}
}
max=head1; /*重新使max,p指向链表头*/
p=head1;
}
put(head1); /*保存教师信息*/
print1(head1); /*显示教师信息*/
return(head1);
}
stu *creat()/*创建学生链表*/
{
stu *head,*p1,*p2,*p3;
int i,j,k;
N=0;
head=NULL;
p1=p2=p3=(stu *)malloc(LEN1);
while(1)
{
printf("请输入学生信息,输入(0)返回\n");
repead1:
printf("请输入学生学号(学号应大于0):");
scanf("%d",&p1->number);
while(p1->number<0)
{
printf("输入错误,请重新输入学生学号:");
scanf("%d",&p1->number);
}
if(p1->number==0) goto endd; /*当输入的学号为0时,转到末尾,结束创建*/
else {
p3=head;
if(N>0)
{
for(i=0;i<N;i++)
{
if(p1->number!=p3->number)p3=p3->next;
else {
printf("学号重复,请重新输入.\n");
goto repead1; /*当输入的学号已经存在,返回前面重新输入*/
}
}
}
}
printf("请输入学生姓名:");
scanf("%s",p1->name);
printf("请输入学生性别:");
scanf("%s",p1->sex);
printf("请输入学生年级:");
scanf("%d",&p1->grade);
printf("请输入学生专业:");
scanf("%s",p1->major);
for(k=0;k<5;k++) /*循环输入学生课程*/
{
printf("请输入课程代码:");
scanf("%d",&p1->subjectnumber[k]);
printf("请输入学生课程:");
scanf("%s",p1->subject[k]);
printf("请输入课时数:");
scanf("%d",&p1->lessontime[k]); /*用于输出课程时判断是否输完*/
p1->subjectnumber[k+1]=1;
strcpy(p1->subject[k+1],"a");
p1->lessontime[k+1]=1;
printf("是否继续添加课程?1.是 2.否\n");
scanf("%d",&j);
if(j==2)break;
}
N=N+1;
if(N==1) head=p1; /*第1条学生信息作为首结点*/
else /*其余学生信息依次链接起来*/
{
p2->next=p1;
p2=p1;
}
p1=(stu *)malloc(LEN1);
}
endd:
p2->next=NULL;
return (head);
}
stu *add(stu *head,stu *st) /*添加学生信息*/
{
stu *p0,*p1,*p3;
int i,j,k;
p3=st=(stu *)malloc(LEN1);
printf("请输入要添加的学生的信息\n");
repeat4:
printf("请输入学生学号,(学号应大于0):");
scanf("%d",&st->number);
while(st->number<0)
{
printf("输入错误,请重新输入学生学号:");
scanf("%d",&st->number);
}
if(st->number==0) goto end2; /*当输入的学号为0时,转到末尾,结束添加*/
else
{
p3=head;
if(N>0)
{
for(i=0;i<N;i++)
{
if(st->number!=p3->number)
p3=p3->next;
else
{
printf("学号重复,请重新输入.\n");
goto repeat4; /*当输入的学号已经存在,返回前面重新输入*/
}
}
}
}
printf("请输入学生姓名:");
scanf("%s",st->name);
printf("请输入学生性别:");
scanf("%s",st->sex);
printf("请输入学生年级:");
scanf("%d",&st->grade);
printf("请输入学生专业:");
scanf("%s",st->major);
for(k=0;k<5;k++) /*循环输入学生课程*/
{
printf("请输入课程代码:");
scanf("%d",&st->subjectnumber[k]);
printf("请输入学生课程:");
scanf("%s",st->subject[k]);
printf("请输入课时数:");
scanf("%d",&st->lessontime[k]); /*用于输出课程时判断是否输完*/
st->subjectnumber[k+1]=1;
strcpy(st->subject[k+1],"a");
st->lessontime[k+1]=1;
printf("是否继续添加课程?1.是 2.否\n");
scanf("%d",&j);
if(j==2)break;
}
p1=head;
p0=st;
if(head==NULL) /*当信息为空时,从首结点开始存放信息*/
{
head=p0;
p0->next=NULL;
}
else
{
while(p1->next!=NULL)
p1=p1->next;
p1->next=p0;
p0->next=NULL;
}
N=N+1;
end2:
printf("现在的学生数为:%d个\n",N);
return(head);
}
stu *load(stu *head) /*从文件读入学生信息*/
{
stu *p1,*p2;
int i,m=0;
FILE *fp;
if((fp=fopen("student.txt","r"))==NULL) return (head); /*打开失败,结束读入*/
head=NULL;
p1=p2=(stu *)malloc(LEN1);
do
{
i=0;
fscanf(fp,"%d\t%s\t%s\t%d\t%s\t\n",&p1->number, /*读入学生基本信息*/
p1->name,p1->sex,&p1->grade,p1->major);
do
{
fscanf(fp,"%d\t%s\t%d\t\n",&p1->subjectnumber[i], /*读入学生课程信息*/
p1->subject[i],&p1->lessontime[i]);
i++;
}while(p1->subjectnumber[i-1]!=1); /*判断是否读完一个学生的课程*/
while(i<6)
{
strcpy(p1->subject[i],"");
i++;
}
m=m+1;
if(m==1)head=p1;
else
{
p2->next=p1;
p2=p1;
}
p1=(stu *)malloc(LEN1);
}while(!feof(fp));
p2->next=NULL;
fclose(fp); /*结束读入,关闭文件*/
N=m; /*学生信息数赋给全局变量M*/
return(head);
}
void search(stu *head) /*查询学生信息*/
{
int i,number;
stu *p1;
printf("请输入要查询的学生的学号:");
scanf("%d",&number);
while(number!=0)
{
if(head==NULL)
{
printf("\n没有任何学生信息\n");
break; /*没有学生信息,结束查询*/
}
p1=head;
while(number!=p1->number&&p1->next!=NULL) /*查找要查询的学生*/
p1=p1->next;
if(number==p1->number)
{
printf("\t\t-----------------------------------------\n");
printf("\t\t|学号\t| 姓 名\t|性别\t|年级\t| 专 业\t|\n");
printf("\t\t-----------------------------------------\n");
printf("\t\t|%d\t|%s\t|%s\t|%d\t|%s\t|\n",p1->number,
p1->name,p1->sex,p1->grade,p1->major);
printf("\t\t=========================================\n");
printf("\t\t|课程代码|\t| 课 程\t|\t|课时数\t|\n");
printf("\t\t-----------------------------------------\n");
for(i=0;p1->subjectnumber[i]!=1;i++) /*判断是否输完课程信息*/
{
printf("\t\t|%d\t|\t|%s\t|\t|%d\t|\n",p1->subjectnumber[i],
p1->subject[i],p1->lessontime[i]);
printf("\t\t=========================================\n");
}
}
else printf("%d不存在此学生\n",number);
printf("请输入要查询的学生的学号:");
scanf("%d",&number);
}
printf("退出查询\n");
}
stu *revise(stu *head) /*修改学生信息*/
{
int j,k,number;
stu *p1;
printf("请输入要修改的学生的学号:");
scanf("%d",&number);
while(number!=0)
{
if(head==NULL)
{
printf("\n没有任何学生信息\n");
return(head); /*没有学生信息,结束修改*/
}
p1=head;
while(number!=p1->number&&p1->next!=NULL) /*查找要修改信息的学生*/
p1=p1->next;
if(number==p1->number)
{
printf("请输入学生姓名:");
scanf("%s",p1->name);
printf("请输入学生性别:");
scanf("%s",p1->sex);
printf("请输入学生年级:");
scanf("%d",&p1->grade);
printf("请输入学生专业:");
scanf("%s",p1->major);
for(k=0;k<5;k++) /*循环输入课程信息*/
{
printf("请输入课程代码:");
scanf("%d",&p1->subjectnumber[k]);
printf("请输入学生课程:");
scanf("%s",p1->subject[k]);
printf("请输入课时数:");
scanf("%d",&p1->lessontime[k]);
p1->subjectnumber[k+1]=1; /*用于输出课程时判断是否输完*/
strcpy(p1->subject[k+1],"a");
p1->lessontime[k+1]=1;
printf("是否继续添加课程?1.是 2.否\n");
scanf("%d",&j);
if(j==2)break;
}
}
else printf("%d不存在此学生\n",number);
printf("请输入要修改的学生的学号:");
scanf("%d",&number);
}
printf("退出修改\n");
return(head);
}
void save(stu *p1)/*把学生信息输出到文件*/
{
FILE *fp;
char filepn[20];
int i;
printf("请输入保存的文件路径及文件名:");
scanf("%s",filepn);
if((fp=fopen(filepn,"w"))==NULL)
{
printf("不能打开文件\n"); /*输出失败,结束输出*/
return;
}
while(p1!=NULL)
{
i=0;
fprintf(fp,"%d\t%s\t%s\t%d\t%s\t\n",p1->number,
p1->name,p1->sex,p1->grade,p1->major);
do
{
fprintf(fp,"%d\t%s\t%d\t\n",p1->subjectnumber[i],
p1->subject[i],p1->lessontime[i]);
i++;
} while(p1->subjectnumber[i-1]!=1); /*判断是否输完一个学生课程*/
p1=p1->next;
}
fclose(fp); /*输出完成,关闭文件*/
printf("文件已经保存\n");
}
stu *del(stu *head)/*删除学生信息*/
{
stu *p1,*p2;
int i,number;
printf("请输入要删除的学生的学号(输入0时退出):");
scanf("%d",&number);
while(number!=0)
{
if(head==NULL)
{
printf("\n没有任何学生信息\n");
return(head);
}
p1=head;
while(number!=p1->number&&p1->next!=NULL) /*查找要删除的学生*/
{
p2=p1;
p1=p1->next;
}
if(number==p1->number)
{
printf("是否真的要删除%d的学生信息吗?1.是 2.否\n",number);
scanf("%d",&i);
if(i==2)break;
if(p1==head)
head=p1->next;
else p2->next=p1->next;
printf("已删除:%d\n",number);
N=N-1;
}
else printf("%d不存在此学生\n",number);
printf("请输入要删除的学生的学号:");
scanf("%d",&number);
}
printf("现在的学生数为:%d个\n",N);
return(head);
}
void print(stu *head) /*显示学生信息*/
{
stu *p;
int i=0;
if(head==NULL)printf("\n没有任何学生信息\n");
else
{
printf("共%d个学生信息\n",N);
p=head;
do
{
printf("\n\t\t-----------------------------------------\n");
printf("\t\t|学号\t| 姓 名\t|性别\t|年级\t| 专 业\t|\n");
printf("\t\t-----------------------------------------\n");
printf("\t\t|%d\t|%s\t|%s\t|%d\t|%s\t|\n",p->number,
p->name,p->sex,p->grade,p->major);
printf("\t\t=========================================\n");
printf("\t\t|课程代码|\t| 课 程\t|\t|课时数\t|\n");
printf("\t\t-----------------------------------------\n");
for(i=0;p->subjectnumber[i]!=1;i++) /*判断是否显示完一个学生的课程*/
{
printf("\t\t|%d\t|\t|%s\t|\t|%d\t|\n",p->subjectnumber[i],
p->subject[i],p->lessontime[i]);
printf("\t\t=========================================\n");
}
p=p->next;
}while(p!=NULL);
}
}
void swap(stu *max,stu *p1) /*交换两个学生的结点值*/
{
int i,k;
char t[20],s[15];
k=max->number; /*交换学号*/
max->number=p1->number;
p1->number=k;
strcpy(t,max->name); /*交换姓名*/
strcpy(max->name,p1->name);
strcpy(p1->name,t);
k=max->grade; /*交换年级*/
max->grade=p1->grade;
p1->grade=k;
strcpy(t,max->sex); /*交换性别*/
strcpy(max->sex,p1->sex);
strcpy(p1->sex,t);
strcpy(t,max->major); /*交换专业*/
strcpy(max->major,p1->major);
strcpy(p1->major,t);
for(i=0;i<6;i++) /*交换课程代码*/
{
k=max->subjectnumber[i];
max->subjectnumber[i]=p1->subjectnumber[i];
p1->subjectnumber[i]=k;
}
for(i=0;i<6;i++)
{
strcpy(s,max->subject[i]); /* 交换课程*/
strcpy(max->subject[i],p1->subject[i]);
strcpy(p1->subject[i],s);
}
for(i=0;i<6;i++) /*交换课时数*/
{
k=max->lessontime[i];
max->lessontime[i]=p1->lessontime[i];
p1->lessontime[i]=k;
}
}
stu *sort(stu *head) /*学生信息排序*/
{
stu *p, *max;
int i,j,x;
if(head==NULL)
{
printf("没有任何学生信息,请先建立链表!\n");
return head;
}
max=p=head;
for(i=0;i<80;i++)
printf("=");
printf("\n\t\t\t1.按学号排序 \t2.按年级排序\n");
printf("\t\t\t3.按专业排序 \t4.按性别排序\n\n");
for(i=0;i<80;i++)
printf("=");
printf("请输入您的选择:");
scanf("%d",&x);
switch(x) /*冒泡法排序*/
{
case 1: /*按学号排序*/
for(i=1;i<N;i++)
{
for(j=i+1;j<=N;j++)
{
max=p;
p=p->next;
if(max->number>p->number)
swap(max,p); /*调用函数*/
}
max=head;
p=head;
}
print(head);break;
case 2: /*按年级排序*/
for(i=1;i<N;i++)
{
for(j=i+1;j<=N;j++)
{
max=p;
p=p->next;
if(max->grade>p->grade)
swap(max,p); /*调用函数*/
}
max=head;
p=head;
}
print(head);break;
case 3: /*按专业排序*/
for(i=1;i<N;i++)
{
for(j=i+1;j<=N;j++)
{
max=p;
p=p->next;
if(strcmp(max->major,p->major)>0)
swap(max,p); /*调用函数*/
}
max=head;
p=head;
}
print(head);break;
case 4: /*按性别排序*/
for(i=1;i<N;i++)
{
for(j=i+1;j<=N;j++)
{
max=p;
p=p->next;
if(strcmp(max->sex,p->sex)>0)
swap(max,p); /*调用函数*/
}
max=head;
p=head;
}
print(head);break;
}
return(head);
}
void user(tea *p1) /*教师查询用户信息*/
{
printf("\t\t-------------------------------------\n");
printf("\t\t|用户名\t| 姓 名\t|授课科目|期限(周)|\n");
printf("\t\t-------------------------------------\n");
printf("\t\t|%d\t|%s\t| %s| %d\t|\n",p1->username,
p1->name,p1->subject,p1->lessontime);
printf("\t\t-------------------------------------\n");
}
tea *user1(tea *head1,int username) /*查询用户信息*/
{
tea *p1;
p1=head1;
while(username!=p1->username&&p1->next!=NULL)p1=p1->next;
return(p1);
}
tea *load1(tea *head1) /*读入教师信息*/
{
tea *p1,*p2;
int i,m=0;
FILE *fp;
if((fp=fopen("teacher.txt","r"))==NULL) return 0;
head1=NULL;
p1=p2=(tea *)malloc(LEN2);
do
{
fscanf(fp,"%d\t%s\t%s\t%s\t%d\t\n",&p1->username,p1->PWD,
p1->name,p1->subject,&p1->lessontime);
for(i=0;p1->PWD[i]!='\0';i++)
{
p1->PWD[i]-=3;
}
m=m+1; /*记录教师个数*/
if(m==1) head1=p1;
else
{
p2->next=p1;
p2=p1;
}
p1=(tea *)malloc(LEN2);
}while(!feof(fp));
p2->next=NULL;
fclose(fp);
M=m;
return(head1);
}
changpwd(tea *head1,tea *p1) /*修改用户密码*/
{
int i,a,b,c,k;
char pwd[20],pwd1[20],pwd2[20],ch;
do
{
i=0;
printf("\n请输入旧密码:");
while((ch=getche())!='\r') /*输入密码,不显示明文*/
{
pwd[i++]=ch;
printf("\b*");
}
pwd[i]='\0';
if(strcmp(pwd,p1->PWD)==0) break; /*判断密码是否正确*/
printf("\n密码不正确,请重新输入\n");
}while(1);
do
{
i=0,a=0,b=0,c=0;
printf("\n请输入新密码(六位以上,须包含大小写字母、数字和*、_、#):\n");
while((ch=getche())!='\r') /*输入密码,不显示明文*/
{
pwd1[i++]=ch;
printf("\b*");
}
pwd1[i]='\0';
i=0;
printf("\n请再次输入新密码:");
while((ch=getche())!='\r') /*输入密码,不显示明文*/
{
pwd2[i++]=ch;
printf("\b*");
}
pwd2[i]='\0';
if(strcmp(pwd1,pwd2)==0); /*判断两次输入的密码是否一致*/
else
{
printf("\n两次输入的密码不一致,请重新输入\n");
continue;
}
if(strlen(pwd1)<6)
{
printf("\n密码长度不正确,请重新输入\n");
continue;
}
for(i=0;i<19;i++) /*判断密码是否含有大小写字母、数字和*、_、#*/
{
if(pwd1[i]>='A'&&pwd1[i]<='Z'||pwd1[i]>='a'&&pwd1[i]<='z') a=1;
if(pwd1[i]>='0'&&pwd1[i]<='9') b=1;
if(pwd1[i]=='*'||pwd1[i]=='_'||pwd1[i]=='#') c=1;
}
k=a+b+c;
if(k==3)
{
strcpy(p1->PWD,pwd1); /*密码符合要求,用新密码替换旧密码*/
put(head1); /*保存*/
printf("\n密码修改成功,请记住新密码!\n");
break;
}
else printf("\n密码过于简单,请重新输入\n");
}while(1);
}
int PWD(int k) /*登陆验证*/
{
int i,n=0,username;
char pwd[20],ch;
tea *head1=NULL, *p1;
head1=load1(head1); /*读入教师信息*/
do
{
i=0;
if(n)printf("输入的用户名或密码错误,请重新输入!\n");
printf("请输入用户名:");
scanf("%d",&username);
if(k==10000) /*判断是否是管理员*/
username=10000; /*指定管理员的用户名*/
printf("请输入密码:");
while((ch=getche())!='\r') /*输入密码,不显示明文*/
{
pwd[i++]=ch;
printf("\b*");
}
pwd[i]='\0';
p1=head1;
while(username!=p1->username&&p1->next!=NULL) /*查找用户信息*/
p1=p1->next;
if(username==p1->username)
{
if(strcmp(pwd,p1->PWD)==0)
{
if(strcmp(pwd,"111111")==0) /*判断密码是否为初始密码*/
{
printf("\n您是第一次登陆系统,请修改您的密码\n");
changpwd(head1,p1); /*修改密码*/
}
break;
}
}
n++;
}while(1);
return(username); /*登录成功,返回当前登录的教师用户名*/
}
void Teachermenu(int username) /*教师菜单*/
{
int i,k;
tea *head1=NULL,*p1;
stu *head=NULL;
head=load(head); /*读入学生信息*/
head1=load1(head1); /*读入教师信息*/
p1=user1(head1,username); /*获取当前登录的用户信息*/
while(1)
{
for(i=0;i<80;i++)
printf("=");
printf("\n\t\t\t1.查询用户信息 \t2.修改用户密码\n");
printf("\t\t\t3.查询学生信息 \t4.显示学生信息\n\n");
for(i=0;i<80;i++)
printf("=");
printf("请输入您的选择(选择(0)退出):");
scanf("%d",&k);
if(k==0)break;
switch(k) /*教师操作调用函数*/
{
case 1: user(p1);break; /*查询用户信息*/
case 2: changpwd(head1,p1);break; /*修改密码*/
case 3: search(head);break; /*查询学生信息*/
case 4: print(head);break; /*学生*/
default : printf("输入错误,请重试!\n:");
}
}
}
int Administratormenu(int username) /*管理员菜单*/
{
int i,k,m,n;
stu *head=NULL,*st=0;
tea *head1=NULL,*te=0,*p1;
head1=load1(head1); /*读入教师信息*/
head=load(head); /*读入学生信息*/
p1=user1(head1,username); /*获取管理员信息*/
while(1)
{
for(i=0;i<80;i++)
printf("=");
printf("\n\t\t\t1.学生信息管理 \t2.教师信息管理\n");
printf("\t\t\t3.修改管理密码 \n\n");
for(i=0;i<80;i++)
printf("=");
printf("请输入您的选择(选择(0)退出):");
scanf("%d",&k);
if(k==0)break;
switch(k)
{
case 1: while(1)
{ for(i=0;i<80;i++) printf("=");
printf("\n\t\t\t1.输入学生信息 \t2.添加学生信息\n");
printf("\t\t\t3.显示学生信息 \t4.输出学生信息\n");
printf("\t\t\t5.修改学生信息 \t6.删除学生信息\n");
printf("\t\t\t7.查询学生信息 \t8.排序学生信息\n\n");
for(i=0;i<80;i++) printf("=");
printf("请输入您的选择(选择(0)返回):");
scanf("%d",&n);
if(n==0)break;
switch(n) /*学生信息管理函数调用*/
{
case 1: head=creat();break; /*输入*/
case 2: head=add(head,st);break; /*添加*/
case 3: print(head);break; /*显示*/
case 4: save(head);break; /*输出到文件*/
case 5: head=revise(head);break; /*修改*/
case 6: head=del(head);break; /*删除*/
case 7: search(head);break; /*查询*/
case 8: sort(head);break; /*排序*/
default : printf("输入错误,请重试!\n:");
}
}break;
case 2: while(1)
{ for(i=0;i<80;i++)
printf("=");
printf("\n\t\t\t1.修改教师信息 \t2.查询教师信息\n");
printf("\t\t\t3.排序教师信息 \t4.删除教师信息\n");
printf("\t\t\t5.显示教师信息 \t6.教师任务分配\n");
printf("\t\t\t7.添加教师用户 \n\n");
for(i=0;i<80;i++)
printf("=");
printf("请输入您的选择(选择(0)返回):");
scanf("%d",&m);
if(m==0)break;
switch(m) /*教师信息管理函数调用*/
{
case 1: head1=revise1(head1);break; /*修改*/
case 2: search1(head1);break; /*查询*/
case 3: head1=sort1(head1);break; /*排序*/
case 4: head1=del1(head1);break; /*删除*/
case 5: print1(head1);break; /*显示*/
case 6: head1=assignment(head1);break;/*任务分配*/
case 7: head1=add1(head1,te);break; /*添加用户*/
default : printf("输入错误,请重试!\n:");
}
}break;
case 3: changpwd(head1,p1);break; /*修改密码*/
default : printf("输入错误,请重试!\n:");
}
}
return 0;
}
int main() /*主函数*/
{
int i,k,username; /*username用户名*/
while(1)
{
printf("\n\t\t\t\t学生信息管理系统\n\n");
for(i=0;i<80;i++)
printf("=");
printf("\t\t\t\t 用户登录 \n\n");
printf("\t\t\t1.管理员 \t2.教师用户\n\n");
for(i=0;i<80;i++)
printf("=");
printf("欢迎进入学生信息管理系统,请选择您的类型:");
scanf("%d",&k);
switch(k)
{
case 1: PWD(10000); /*验证管理员密码,指定管理员的用户名为10000*/
Administratormenu(10000);break; /*调用管理员菜单函数*/
case 2: username=PWD(1); /*验证登陆的教师用户*/
Teachermenu(username);break; /*调用教师菜单函数*/
default: printf("输入错误,请重试!\n");
}
}
return 0;
}
五、运行分析
程序总体运行稳定,界面友好,总体上基本满足实践要求。
登录界面
学生信息管理界面
教师信息管理界面
学生信息排序界面
教师用户第一次登录必须修改密码
教 师 菜 界 面
六、实践总结
实践课刚开始时,我就被程序的题目吓呆了,这么“高难度”的程序是我这种水平的人可以编写得出来的吗,我当时就觉得自己可能要挂科了。但后来经过老师的前期课程讲解和后期的实践指导,其实这个程序并没有想象中的那么困难,只要认真地去编写,一步一步地去攻克,这个程序还是能够被我们编写出来的。通过这次实训,我发现了自己许多的不足,对基础知识不够扎实,许多知识点理解得不够透彻,如数组的使用、函数的定义和调用、结构体的初始化、文件的输入和输出、链表的创建与排序等等。但同时我从其中也学习到了许多有用东西,加深了对知识点的理解,认识到自己所学的知识是那么的渺小,需要不断地去学习,争取获得更大的进步!