1、 精选范本 目 录 摘 要 2 第1章 绪论 3 第2章 系统分析 4 2.1设计目的 4 2.2需求分析 4 2.3、系统模块的实现 5 第3章 数据库设计 6 3.1. 设计原则 6 3.2 数据库组成 6 3.1 面向对象数据库设计方法 6 第4章 系统设计 7 4.1 登录界面设计 7 4.2菜单设计 11 第五章总结与展望 41 致 谢 42 摘 要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在
2、技术上已逐步成熟。管理信息系统是一个不断发展的新型学科,任何一个单位要生存要发展,要高效率地把内部活动有机地组织起来,就必须建立与自身特点相适应的管理信息系统。 学生管理系统是典型的信息管理系统 (MIS),其开发主要包括后台数据库的建立和维护以及前端应用程序的开发两个方面。对于前者要求建立起数据一致性和完整性强、数据安全性好的库。而对于后者则要求应用程序功能完备,易使用等特点。经过分析,我采用微软公司的Microsoft Visual C++ 6.0.中的c语言平台开发,后台建立在文件的读取基础上,尤其是数据窗口能方便而简洁操纵数据库的智能化对象,首先在短时间内建立系统应用原型,然后,对初
3、始原型系统进行需求迭代,不断修正和改进,直到形成高可行性系统。通过对计算机硬件和软件方面的了解,来论证本系统的解决方案。另外对学校等领域进行调研和分析,参照相关各种资料进行数据库编程实践。在指导老师的大力帮助下,基本上完成了设计任务书的要求。 用户模块和管理员模块。对于用户模块来说,只能浏览属于本用户(学生)的相关信息;而管理员模块,则可以添加、查询、修改、删除、查看所有学生的信息,并且可以对班级信息、课程信息、学生成绩和教师信息进行简单的管理。 关键字:MIS 数据库 C语言 模块 Microsoft Visual C++
4、6.0. 第1章 绪论 1.1设计思想 本系统主要用于学校学生信息管理,总体任务是实现学生信息关系的系统化、规范化和自动化,其主要任务是用计算机对学生各种信息进行日常管理,如查询、修改 、增加、删除,针对这些要求设计了学生信息管理系统本系统主要用于学校学生信息管理,总体任务是实现学生信息关系的系统化、规范化和自动化,其主要任务是用计算机对学生各种信息进行日常管理,如查询、修改 、增加、删除,针对这些要求设计了学生信息管理系统 1.2 数据库种类选择 C语言中可以调用数据库,但是想到数据库的复杂性,我们采用C语言用的文件的读取,与存储,用文件把数据存入记事本用,在调用记
5、事本用的数据,记事本就相当于一个数据库,完成数据的存储与读取。 1.3 程序语言简介 1、C语言把高级语言的基本结构和语句与低级语言的实用性结合起来。C 语言可以像汇编语言一样对位、字节和地址进行操作,而这三者是计算机最基本的工作单元。 2、结构式语言的显著特点是代码及数据的分隔化,即程序的各个部分除了必要的信息交流外彼此独立。这种结构化方式可使程序层次清晰,便于使用、维护以及调试。C 语言是以函数形式提供给用户的,这些函数可方便的调用,并具有多种循环、条件语句控制程序流向,从而使程序完全结构化。[15] 3、C语言功能齐全:具有各种各样的数据类型,并引入了指针概念,可使程序
6、效率更高。而且计算功能、逻辑判断功能也比较强大,可以实现决策目的的游戏。[15] 4、C语言适用范围大:适合于多种操作系统,如Windows、DOS、UNIX等等;也适用于多种机型。C语言对编写需要硬件进行操作的场合,优于其它高级语言,有一些大型 应用软件也是用C语言编写的。[15] 5、C语言应用指针:可以直接进行靠近硬件的操作,但是C的指针操作不做保护,也给它带来了很多不安全的因素。C++在这方面做了改进,在保留了指针操作的同时又增强了安全性,受到了一些用户的支持,但是,由于这些改进增加语言的复杂度,也为另一部分所诟病。Java则吸取了C++的教训,取消了指针操作,也取消了C+
7、改进中一些备受争议的地方,在安全性和适合性方面均取得良好的效果,但其本身解释在虚拟机中运行,运行效率低于C++/C。一般而言,C,C++,java被视为同一系的语言,它们长期占据着程序使用榜的前二名。 第2章 系统分析 2.1 设计目的 作为C课程结课设计,验证自身的学习效果,同时希望利用所学的基本知识和技能,进行简单程序设计。希望通过项目实践,熟悉巩固所学知识,以使自身达到熟练掌握C的基本知识和技能,基本掌握面向过程程序开发的基本思路和方法,了解C语言的文件读取和储存开发基本知识,为今后的进一步深入学习,奠定基础。 2.2 需求分析 学生管理系统的开发目的是
8、为了实现学生课程、学籍的信息化管理。本系统需要完成的功能有:学籍基本信息、 班级信息、课程基本信息、 学生成绩信息以及系统管理员才具有的教师管理和用户管理。 1. 学籍基本信息:可对学生基本信息进行添加、删除、修改、查找等功能,学籍基本信息有:学号、姓名、性别、出生日期、民族、电话、政治面貌、健康情况、身高、专业、班级、籍贯、毕业学校、家庭住址、特长、备注等属性。 2. 班级信息:可对班级信息进行添加、删除、修改、查找和报表输出等功能,班级信息:班级名,年级、专业、辅导员、备注属性。 3. 课程基本信息:可对课程进行添加、删除、修改、查找和报表输出等功能,课程基本信息:科目编号、课程名称
9、修课性质、考核性质、开课学期、开课单位、专业名称等属性。 4. 学生成绩信息:可对每一个学生成绩信息进行添加、删除、修改、查找和报表输出等功能,学生成绩信息有:学号、专业名称、科目编号、成绩属性。 5. 系统用户表:可对系统设置权限,分为老师和学生权限,分别完成不同的工作,成绩属性有:用户名、密码、权限属性。 2.3 系统模块的实现 在系统中包括以下功能:学籍基本信息、班级信息、课程基本信息、学生成绩息系统用户表。系统各模块关系如图所示: 第3章 数据库设计 3.1 设计原则 1.密码管理:学生修改学生查询密码;教师可以修改查询密码。 2.每个教师可以
10、查看所有学生的成绩,包括每门课程的成绩、每门课程的平均成绩、每个分数段的成绩。 3.学生根据自己的学号查询本人的成绩。 4.教师可以登记、修改、查询自己所讲授课程的学生的成绩、该课程的总分、平均成绩、各分数段成绩人数统计、不及格学生的名单、成绩等等。 3.2 数据库组成 数据表3个: 学生表(5个字段: xh, xm, xb, csrq, bj),其中有各班学生的记录 课程表(4个字段:kch,kcm, js, xf),其中有课程的记录; 成绩表(3个字段:xh, kch, cj),其中有学生成绩的记录。 登录表(2个字段,tt,ss)有用户名, 密码 3.1 面
11、向对象数据库设计方法 1)考虑对象的静态和动态属性 对象属性决定了数据库或包含具有相同类型对象的表的内容。 2)描述数据实体及其属性 包含所有静态属性的单个对象被称作数据实体。每个单独的数据实体必须唯一,这样可以与其他实体区分。包含在数据实体中的对象的性质被称作为属性。(attribute) 3)用方法来说明对象的行为 关系数据库对象的行为决定了数据对象参与事务的特征。事务的发生对应着事件,通过使用响应事件的方法来实现事务。 4)在单个表中合并不同实体 可以在单个表中包含不同对象类型的说明,只要可以按照相同方式描述 属性和行为,以及区分不同对象类型即可。
12、 第4章 系统设计 4.1 登录界面设计 (1)功能描述 登录界面是学生信息管理系统的入口,它可以使学生、教师和管理员以不同权限登录管理系统。其结构如图6所示: 图6 登录界面结构图 (2)源代码设计 登录界面是利用C技术的窗口创建工具生成登录窗体 void langing() { int password1,i,t,aa=1,bb,y; char teacher[2][5]; system("cls");
13、 printf("\n\n"); printf("*******************************欢迎进入学生管理系统*****************************"); while(1) { printf("请选择你的身份:老师------1,学生---------0\n"); scanf("%d",&i); if(i==0||i==1) break; printf("输入的代号不正确,请重新输入\n"); } printf("这是第1次输入
14、\n"); for(aa=1;;aa++) { printf("请输入你的账号:"); scanf("%s",teacher[0]); printf("请输入你的密码:"); for ( y=0; y<80; y++) { teacher[1][y] = getch(); /*逐次赋值,但不回显*/ if(teacher[1][y]=='\b')//important,,e { print
15、f("\b"); putch(' '); printf("\b"); y--; continue; } if (teacher[1][y] == '\x0d')/*回车则终止循环*/ { teacher[1][y]='\0'; break; } printf("*");
16、 /*以星号代替字符个数*/ } printf("\n"); load1(debark,fname2); if( i==1&&strcmp(teacher[0],debark[0].password)==0&&strcmp(teacher[1],debark[0].user)==0 ) { printf("是否修改密码1------修改,任意键--------不修改\n"); scanf("%d",&password1); if(password1==1) {
17、 correct1(); } printf("请选择要完成的操作:1-学籍信息 2-班级基本信息 3-课程基本信息 4-学生成绩信息\n"); scanf("%d",&differentiate); switch(differentiate) { case 1: menu ();break; case 2: menu2();break; case 3: menu3();break; case 4:
18、 menu4();break; } } else { for(t=1;t<6;t++) if( i==0&&strcmp(teacher[0],debark[t].password)==0&&strcmp(teacher[1],debark[t].user)==0 ) { printf("是否修改密码1------修改,任意键--------不修改\n"); scanf("%d",&password1); if(pas
19、sword1==1) { correct1(); } printf("请选择要完成的操作:1-学籍信息 2-班级基本信息 3-课程基本信息 4-学生成绩信息\n"); scanf("%d",&differentiate); studentboundary(); switch(differentiate) {case 1: search (student,Global);bre
20、ak; case 2: search2 (ClassInfo,Global2);break; case 3: search3 (d,Global3); break; case 4: search4(StuGrade,Global4);break; } } } bb=aa+1; if(aa==3) { printf("输入错误,将退出程序\n"); exit(0); } p
21、rintf("输入有错,请重新输入,超过三次将退出,这是第%d次输入\n",bb ); } } void main() { langing(); } 4.2菜单设计 登陆成功之后就开始进入要查找的信息的窗口,分为学籍信息、班级基本信息、课程基本信息、学生成绩信息窗口,选过之后就开始进入菜单窗口,分为8个选项,分别完成为输入信息、显示、查找信息、删除、添加、修改、返回主菜单、退出。 截屏如下: 代码如下: void menu()//菜单函数 { void langing(); char n; printf("请按任意键
22、进入系统。\n"); getch(); while(1) { treachboundary(); scanf("%c",&n); if(n>='1'&&n<='7') { switch(n) { case '1': import(student,30);break; case '2': display(student);break; case '3':search(student,Global);break; case '4':del(st
23、udent,Global);break; case '5':insert(student,20);break; case '6':correct();break; case '7':langing(); break; case '8':out();break; } } } } void menu2() { void langing(); char n; printf("请按任意键进入系统。\n"); getch(); while(1) { trea
24、chboundary(); scanf("%c",&n); if(n>='1'&&n<='7') { switch(n) { case '1': import2(ClassInfo,30);break; case '2': display2(ClassInfo);break; case '3':search2(ClassInfo,Global2);break; case '4':del2(ClassInfo,Global2);break; case '5'
25、insert2(ClassInfo,20);break; case '6':correct2();break; case '7':langing();break; case '8':out();break; } } } } void menu3() { void langing(); char n; printf("请按任意键进入系统。\n"); getch(); while(1) { treachboundary(); scanf("%c",
26、n); if(n>='1'&&n<='7') { switch(n) { case '1': import3(d,30);break; case '2': display3(d);break; case '3':search3(d,Global3);break; case '4':del3(d,Global3);break; case '5':insert3(d,20);break; case '6':correct3();break;
27、 case '7':langing();break; case '8':out();break; } } } } void menu4() { void langing(); char n; printf("请按任意键进入系统。\n"); getch(); while(1) { treachboundary(); scanf("%c",&n); if(n>='1'&&n<='7') { switch(n
28、) { case '1': import4(StuGrade,30);break; case '2': display4(StuGrade);break; case '3':search4(StuGrade,Global4);break; case '4':del4(StuGrade,Global4);break; case '5':insert4(StuGrade,20);break; case '6':correct4();break; case '7':langing();break; case '
29、8':out();break;
}
}
}
}
下面的输入信息、显示、查找信息、删除、添加、修改、返回主菜单、退出的代码如下
void save(aa f[],char fn[100])//保存数据
{
int i;
FILE *fp;
if((fp=fopen(fn,"wb"))==NULL)
{
printf("文件打开失败!系统将结束,欢迎再次使用\n");
exit(0);
}
for(i=0;i 30、aa),1,fp);
fclose(fp);
printf("保存成功!\n");
printf("按任意键将继续");
getch();
}
void save1(bb f[],char fn[100])//保存数据
{
int i;
FILE *fp;
if((fp=fopen(fn,"wb"))==NULL)
{
printf("文件打开失败!系统将结束,欢迎再次使用\n");
exit(0);
}
for(i=0;i<6;i++)
fwrit 31、e(&f[i],sizeof(bb),1,fp);
fclose(fp);
printf("保存成功!\n");
printf("按任意键将继续\n");
getch();
}
void save2(cc f[],char fn[100])//保存数据
{
int i;
FILE *fp;
if((fp=fopen(fn,"wb"))==NULL)
{
printf("文件打开失败!系统将结束,欢迎再次使用\n");
exit(0);
}
for(i=0;i 32、l2;i++)
fwrite(&f[i],sizeof(cc),1,fp);
fclose(fp);
printf("保存成功!\n");
printf("按任意键将继续\n");
getch();
}
void save3(dd f[],char fn[100])//保存数据
{
int i;
FILE *fp;
if((fp=fopen(fn,"wb"))==NULL)
{
printf("文件打开失败!系统将结束,欢迎再次使用\n");
exit(0);
33、 }
for(i=0;i 34、再次使用\n");
exit(0);
}
for(i=0;i 35、/////////////////////////
////////////////////////////////////////////////////////////////////
//从文件中提取数据
void load(aa f[],char fn[100])//下载数据
{
int i=0;
FILE *fp;
if((fp=fopen(fn,"rb"))==NULL)
{
printf("文件打开失败!系统将结束,欢迎再次使用\n");
exit(0);
}
36、 for(i=0;i<6;i++)
if(fread(&student[i],sizeof(aa),1,fp)!=1)//1.用于接收数据的地址(指针)(buffer) //2.单个元素的大小(size) :单位是字节而不是位,例如读取一个int型数据就是4个字节 //3.读取size个字节的次数(count) // 4.提供数据的文件指针(stream)
{
fclose(fp);
Global=i;
return;
}
fclose(fp);
}
void load1(b 37、b f[],char fn[100])//下载数据
{
int i=0;
FILE *fp;
if((fp=fopen(fn,"rb"))==NULL)
{
printf("文件打开失败!系统将结束,欢迎再次使用\n");
exit(0);
}
for(i=0;i<20;i++)
if(fread(&debark[i],sizeof(bb),1,fp)!=1)//1.用于接收数据的地址(指针)(buffer) //2.单个元素的大小(size) :单位是字节而不是位, 38、例如读取一个int型数据就是4个字节 //3.读取size个字节的次数(count) // 4.提供数据的文件指针(stream)
{
fclose(fp);
Global1=i;
return;
}
fclose(fp);
}
void load2(cc f[],char fn[100])//下载数据
{
int i=0;
FILE *fp;
if((fp=fopen(fn,"rb"))==NULL)
{
printf("文件打开失败!系统将结束,欢迎 39、再次使用\n");
exit(0);
}
for(i=0;i<20;i++)
if(fread(&ClassInfo[i],sizeof(cc),1,fp)!=1)//1.用于接收数据的地址(指针)(buffer) //2.单个元素的大小(size) :单位是字节而不是位,例如读取一个int型数据就是4个字节 //3.读取size个字节的次数(count) // 4.提供数据的文件指针(stream)
{
fclose(fp);
Global2=i;
40、 return;
}
fclose(fp);
}
void load3(dd f[],char fn[100])//下载数据
{
int i=0;
FILE *fp;
if((fp=fopen(fn,"rb"))==NULL)
{
printf("文件打开失败!系统将结束,欢迎再次使用\n");
exit(0);
}
for(i=0;i<20;i++)
if(fread(&d[i],sizeof(dd),1,fp)!=1)//1.用于接收数据 41、的地址(指针)(buffer) //2.单个元素的大小(size) :单位是字节而不是位,例如读取一个int型数据就是4个字节 //3.读取size个字节的次数(count) // 4.提供数据的文件指针(stream)
{
fclose(fp);
Global3=i;
return;
}
fclose(fp);
}
void load4(ee f[],char fn[100])//下载数据
{
int i=0;
FILE *fp;
if((fp=fopen(fn," 42、rb"))==NULL)
{
printf("文件打开失败!系统将结束,欢迎再次使用\n");
exit(0);
}
for(i=0;i<20;i++)
if(fread(&StuGrade[i],sizeof(ee),1,fp)!=1)//1.用于接收数据的地址(指针)(buffer) //2.单个元素的大小(size) :单位是字节而不是位,例如读取一个int型数据就是4个字节 //3.读取size个字节的次数(count) // 4.提供数据的文件指针(stream)
43、{
fclose(fp);
Global4=i;
return;
}
fclose(fp);
}
////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////
///////// 44、///////////////////////////////////////////////////////////////////////////////////////
//输出到显示器上
void shuchu(aa student[])
{
int i,c;
for(i=0;i 45、 %s\n 电话: %s\n 政治面貌: %s\n 健康情况: %s\n 身高: %s\n 专业: %s\n 班级: %s\n 籍贯: %s\n 毕业学校: %s\n 家庭住址: %s\n 特长: %s\n 备注: %s\n", student[i].ID,student[i].name,student[i].sex, student[i].birthdate ,student[i].notion, student[i].telephone,student[i].politics,student[i].healthy, student[i].height,student[i].profes 46、sion, student[i].classes,student[i].native,student[i].school,student[i].home,student[i].speciality,student[i].remark);
}
}
void shuchu2(cc ClassInfo[])
{
int i,c;
for(i=0;i 47、s\n 年级: %s\n 专业: %s\n 辅导员: %s\n 备注: %s\n", ClassInfo[i].class_name,ClassInfo[i].grade,ClassInfo[i].major, ClassInfo[i].instructor,ClassInfo[i].remark);
}
}
void shuchu3(dd a[])
{
int i,c;
for(i=0;i 48、c);
printf(" 科目编号:%s\n 课程名称: %s\n 修课性质: %s\n 考核性质: %s\n 开课学期: %s\n 开课单位: %s\n 专业名称: %s\n ", a[i].a1,a[i].a2,a[i].a3, a[i].a4 ,a[i].a5, a[i].a6,a[i].a7);
}
}
void shuchu4(ee a[])
{
int i,c;
for(i=0;i 49、的信息\n",c);
printf(" 学号:%s\n 专业名称: %s\n 科目编号: %s\n 成绩: %s\n ", StuGrade[i].ID_1,StuGrade[i].a7_1,StuGrade[i].a1_1, StuGrade[i].result);
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////// 50、////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//把数据输入到文件中
void import(aa f[],int n)//输出
{ int number,i,c,t;






