#include
#include
#include
#include
#define max 20
typedef struct student //学生
{
char sno[max]; // 学号
char sname[max]; //姓名
char sex[max]; //性别
char age[max]; //年龄
char depart[max]; //系
char classs[max]; //班
char grade[max]; //年级
struct student* next;
} student;
student* head;
int LogOn() //登录模块,已实现输入密码不回显,如果中途发现输错某几位,可退格键重输
{
char username[max],password[max];
printf("n请输入用户名:");
scanf("%s",username);
printf("n请输入密码(最多15位):");
//开始以不回显且支持退格方式获取输入密码
int i=0;
while((i>=0)&&(password[i++]=getch())!=13)//条件i>=0是用于限制退格的范围
{
if(password[i-1]=='b')//对退格键的处理
{
printf("%c%c%c",'b','0','b');
i=i-2;
}
else
printf("*");
}
password[--i]='0';
//已获取密码。验证用户身份
if(!strcmp(username,"zhang")&&!strcmp(password,"8147086"))
{
printf("n登录成功!");
return 1;
}
else
return 0;
}
void regist()
{
char ch;
student *s,*ptr; //s用来建新结点,ptr用来暂存头结点
do
{
s=(student*)malloc(sizeof(student)); // 新建一个学生结点
printf("n开始注册..."); //开始注册
printf("n请输入该学生的学号:");
scanf("%s",s->sno);
printf("n请输入该学生的姓名:");
scanf("%s",s->sname);
printf("n请输入该学生的性别:");
scanf("%s",s->sex);
printf("n请输入该学生的年龄:");
scanf("%s",s->age);
printf("n请输入该学生的系:");
scanf("%s",s->depart);
printf("n请输入该学生所在的班:");
scanf("%s",s->classs);
printf("n请输入该学生所在的年级");
scanf("%s",s->grade);
ptr=head;
head=s;//将新结点插入队头
s->next=ptr;
fflush(stdin);
printf("n请问是否继续注册?(Y/N)");
scanf("%c",&ch);
}while(ch=='Y'||ch=='y');
return;
}
void ElePrint(char str[]) //输出单个元素
{
if(str==NULL) exit(0);
printf("%s",str);
for(unsigned int i=0;i<12-strlen(str);i++) printf(" ");//为了对齐输出,需插入一些空格
return;
}
int LinePrint(student *ptr) //输出一行
{
if(ptr==NULL) //检查传进来的指针
return 0;
printf("n");
ElePrint(ptr->sno);
ElePrint(ptr->sname);
ElePrint(ptr->age);
ElePrint(ptr->sex);
ElePrint(ptr->depart);
ElePrint(ptr->classs);
ElePrint(ptr->grade);
return 1;
}
void print() //输出全部学生信息
{
student *ptr=head;
printf("n学号 姓名 年龄 性别 系 班 年级 ");
while(ptr)
{
LinePrint(ptr);
ptr=ptr->next;
}
printf("n");
return;
}
void search()//查询模块
{
int method;//查询方式
char no[max],name[max],departm[max],clss[max],grades[max]; //用来接收查询关键字
while(1)
{
printf("n请选择查询方式");
printf("n1.按学号查询");
printf("n2.按姓名查询");
printf("n3.按所在系查询");
printf("n4.按所在班级查询");
printf("n5.按所在年级查询");
printf("n6.打印全部学生信息");
printf("n7.返回主菜单n");
scanf("%d",&method);
student *p=head,*temp;
switch(method)
{
case 1:
printf("n请输入要查询的学号:");
scanf("%s",no);
while(p)
{
if(!strcmp(p->sno,no))
break;
else
{
temp=p;
p=p->next;
}
}
printf("n学号 姓名 年龄 性别 系 班 年级 ");
LinePrint(p);
break;
case 2:
printf("n请输入要查询的姓名:");
scanf("%s",name);
printf("n学号 姓名 年龄 性别 系 班 年级 ");
while(p)
{
if(!strcmp(p->sname,name))
LinePrint(p);
p=p->next;
}
break;
case 3:
printf("n请输入学生所在的系:");
scanf("%s",departm);
printf("n学号 姓名 年龄 性别 系 班 年级 ");
while(p)
{
if(!strcmp(p->depart,departm))
LinePrint(p);
p=p->next;
}
break;
case 4:
printf("n请输入学生所在的班:");
scanf("%s",clss);
printf("n请输入学生所在的年级:");
scanf("%s",grades);
printf("n学号 姓名 年龄 性别 系 班 年级 ");
while(p)
{
if(!strcmp(p->classs,clss)&&!strcmp(p->grade,grades))
LinePrint(p);
p=p->next;
}
break;
case 5:
printf("n请输入学生所在的年级:");
scanf("%s",grades);
printf("n学号 姓名 年龄 性别 系 班 年级 ");
while(p)
{
if(!strcmp(p->grade,grades))
LinePrint(p);
p=p->next;
}
break;
case 6:
print();
break;
case 7:
return;
default:
printf("很抱歉,暂无此查询方式!");
break;
}
}
}
void modify()//修改学生信息
{
char num[max];
student *p=head;
printf("n请输入要修改的学生的学号:");
scanf("%s",num);
while(p)
{
if(!strcmp(p->sno,num))
break;
else
p=p->next;
}
if(p==NULL)
{
printf("n错误:没有此学生的信息!n");
return;
}
LinePrint(p);
printf("n请输入要修改的该学生的信息:");
printf("n1.姓名");
printf("n2.性别");
printf("n3.年龄");
printf("n4.所在的系");
printf("n5.所在的班");
printf("n6.所在的年级");
char name1[max],sex1[max],age1[max],depart1[max],class1[max],grade1[max];
int select;
fflush(stdin);
scanf("%d",&select);
printf("n请输入新的信息:");
switch(select)
{
case 1:
scanf("%s",name1);
strcpy(p->sname,name1);
break;
case 2:
scanf("%s",sex1);
strcpy(p->sex,sex1);
break;
case 3:
scanf("%s",age1);
strcpy(p->age,age1);
break;
case 4:
scanf("%s",depart1);
strcpy(p->depart,depart1);
break;
case 5:
scanf("%s",class1);
strcpy(p->classs,class1);
break;
case 6:
scanf("%s",grade1);
strcpy(p->grade,grade1);
break;
default:
printf("nError!");
break;
}
LinePrint(p);
return;
}
void del()// 删除某学生的信息
{
student *p=head,*temp=head,*s;
char num1[max];
printf("n请输入要删除的学生的学号:");
scanf("%s",num1);
while(p)//查找该学生所在的结点
{
if(!strcmp(p->sno,num1))
break;
else
{
temp=p;
p=p->next;
}
}//while
if(!p)
{
printf("n不存在此学生的信息.");
return;
}
LinePrint(p);//输出该学生的信息
printf("n请问真的要删除该学生的信息吗?(Y/N)");
char ch;
fflush(stdin);
scanf("%c",&ch);
if(ch=='Y'||ch=='y')
{
s=p->next;
temp->next=s;
free(p);
printf("n已经删除该学生的信息.");
}
return;
}
void sort() //排序模块。将学生记录按学号从小到大排列。用起泡排序算法实现
{
student *ptr,*s=head,*p;
int count=0,count1;
while(s)//统计链表结点个数
{
count++;
s=s->next;
}
for(int i=1;i<count;i++)
{
ptr=head;
p=NULL;
count1=count-i; //用来控制每轮起泡排序的终点,即每次把学号最小的结点移到倒数第i个结点
while(ptr&&ptr->next&&(count1--))
{
if(strcmp(ptr->sno,ptr->next->sno)>0)
{
s=ptr->next;
ptr->next=s->next;
if(p==NULL) //ptr处于队头时
head=s;
else
p->next=s;
s->next=ptr;
p=s;
}
else
{
ptr=ptr->next;
if(p==NULL) //ptr处于队头时
p=head;
else
p=p->next;
}
}
}
return;
}
void quit()
{
char ch;
printf("n真的要退出?(Y/N)");
fflush(stdin);
scanf("%c",&ch);
if(ch=='Y'||ch=='y')
exit(0);
return;
}
int main()
{
int option;
printf("nCopyright@2005 KongXinCai All rights reserved.");
printf("n欢迎使用学生信息管理系统!n");
//登录模块
int icheck=0;
while(icheck<3)
{
if(LogOn()==0)
icheck++;
else
break;
}
if(icheck==3)
{
printf("n连续登录三次不成功,退出!");
exit(0);
}
//系统界面
while(1)
{
printf("nn请选择需要的服务:");
printf("n1.注册");
printf("n2.查询");
printf("n3.修改");
printf("n4.删除");
printf("n5.排序");
printf("n7.求平均");
printf("n6.退出n");
scanf("%d",&option);
switch(option)
{
case 1:
regist();
break;
case 2:
search();
break;
case 3:
modify();
break;
case 4:
del();
break;
case 5:
sort();
break;
case 6:
quit();
break;
}
}
return 0;
}
5.6 学生模块的实现
学生登录系统之后可以拥有一些信息修改和查看的能力,可以对个人信息进行修改。学生可以查看自己所有的成绩,如图5-13所示。
图5-13 学生成绩查看
学生成绩查看部分功能代码:
学生登录后可以点击选课信息管理按钮,点击选课列表,学生可以查看自己的选课信息,如图5-14所示。
图5-14 选课查看
选课查看功能部分代码如下:
学生账号登录后,点击个人信息中的修改学=学生信息按钮,学生可以对自己的个人信息(性别、姓名、电话、QQ、班级)进行修改操作,具体如图5-15所示。
图5-15 学生信息修改
6 系统测试
(System Testing)是对整个系统的测试,将硬件、软件、操作人员看作一个整体,检验它是否有不符合系统说明书的地方。这种测试可以发现系统分析和设计中的错误。如安全测试是测试安全措施是否完善,能不能保证系统不受非法侵入。再例如,压力测试是测试系统在正常数据量以及超负荷量(如多个用户同时存取) 等情况下是否还能正常地工作。主要目的是尽可能多的发现已编程序中存在的错误。
在学生信息管理系统设计开发完成后,需要对其进行测试分析,为了检验学生信息管理系统的可实施性以及各方面还有可能存在的问题。学生信息管理系统测试由测试的主要内容和分析构成。
6.1 用户登入功能测试
用户登入功能测试主要测试是否只有数据库中存在的用户在输入正确密码的前提下才能登入系统,用户登入功能测试用例如表6-1所示
表6-1 用户登入测试
测试的名称 用户登入测试
测试的目的 检查该系统的用户登录界面的功能是否存在问题
前置的条件 使用三种不同的身份进行登录
测试的步骤 使用前置条件中的存在的和不存在的管理员用户名和密码登录
预期的结果 只有在数据库中已经存在了的用户名和对应的正确密码才可以成功登录该系统
测试的结果 通过
测试的名称用户登入测试
测试的目的检查该系统的用户登录界面的功能是否存在问题
前置的条件使用三种不同的身份进行登录
测试的步骤使用前置条件中的存在的和不存在的管理员用户名和密码登录
预期的结果只有在数据库中已经存在了的用户名和对应的正确密码才可以成功登录该系统
测试的结果通过
根据表中步骤进行测试,没有出现问题,成功通过测试用户登入功能,符合设计的目的和要求。
6.2 各项信息的管理功能测试
各项信息管理功能测试需要测试用户登入,是否学生、老师、管理员可以使用各自的信息的添加删除和修改信息的功能。修改各项信息的管理功能测试用例如表6-2所示
表6-2 各项信息的管理功能测试
测试的名称 各项信息管理功能测试
测试的目的 检查不同用户各项信息管理功能中的添加修改和删除功能是否相互对应
前置的条件 分别使用三种系统数据库中已经存在上网不同的身份进行登录(老师、学生、管理员)
测试的步骤 (1)使用学生用户登录系统,分别进行修改密码和添加、删除个人信息操作。
(2)使用教师用户登录系统,分别进行修改密码、添加和删除学生信息操作。
(3)使用管理员身份登录系统,分别进行对老师和学生的添加修改和删除操作。
预期的结果 不同的身份登录可以对应不同的身份所拥有的权限(添加、删除和修改功能)
测试的结果 通过
测试的名称各项信息管理功能测试
测试的目的检查不同用户各项信息管理功能中的添加修改和删除功能是否相互对应
前置的条件分别使用三种系统数据库中已经存在上网不同的身份进行登录(老师、学生、管理员)
测试的步骤 (1)使用学生用户登录系统,分别进行修改密码和添加、删除个人信息操作。
(2)使用教师用户登录系统,分别进行修改密码、添加和删除学生信息操作。
(3)使用管理员身份登录系统,分别进行对老师和学生的添加修改和删除操作。
预期的结果不同的身份登录可以对应不同的身份所拥有的权限(添加、删除和修改功能)
测试的结果通过
根据表中步骤进行测试,没有出现问题,成功通过各项信息管理功能,符合设计的目的和要求。
6.3 Excel导出学生成绩表功能测试
导出学生成绩功能测试需要测试用户登入后进行学生成绩的导出操作,检验是否可以正常导出学生成绩表的功能。Excel导出学生成绩表功能测试用例如表6-3所示。
表6-3 学生信息管理功能测试
测试名称 Excel导出学生成绩表功能测试
测试目的 检查导出学生成绩表功能是否达到要求
前置条件 使用数据库中存在的老师、管理员用户信息登录系统
测试步骤 点击成绩信息管理,点击成绩列表,点击导出操作,选择导出目录,导出学生成绩表。
预期结果 能正常导出学生成绩表功能
测试结果 通过
测试名称 Excel导出学生成绩表功能测试
测试目的检查导出学生成绩表功能是否达到要求
前置条件使用数据库中存在的老师、管理员用户信息登录系统
测试步骤点击成绩信息管理,点击成绩列表,点击导出操作,选择导出目录,导出学生成绩表。
预期结果能正常导出学生成绩表功能
测试结果通过
根据表中步骤进行测试,没有出现问题,成功通过Excel学生成绩导出功能,符合设计的目的和要求。
总结
该系统主要实现了管理员模块,老师模块以及学生模块,主要实现了管理员对于系统中教师,学生以及课程数据的增删改查操作;以及教师对于学生相关信息的管理,例如学生的成绩和考勤信息等;以及学生对于个人信息的修改以及选课信息和课程成绩的查看等功能。由于使用的功能基本相同,所以跳转页面也几乎一致,不同的是点击事件和功能。节省了好多繁琐的跳转的不同页面,设计和实现界面设计的简洁化,更加节省了代码的繁琐程度。
本文虽然设计了信息化的学生信息管理系统,然而由于本人个人能力的不足以及时间的问题,本系统的设计并没有非常完善,系统设计中还存在着一些不足。由于对Java和数据库的掌握还未到炉火纯青的地步,有些比较难以实现的功能尚未完成。我会加强对Java和数据库的理解和学习,之后将会学习比较主流的SpringBoot框架对系统的开发流程进行简化,以及加入一些例如Redis之类的中间件,提高系统的健壮性。
致谢
光阴飞逝,现在蓦然回首,已在南信院学习三年了。依稀记得当年的懵懂小伙,仰望南信校门的情景。第一次走进学校,还是一个转业都分不清的无知者,四年后,我们专业知识已经过硬。这都得益于老师们的辛勤耕耘,无私奉献。"捧着一颗心来, 不带走半根草”。感谢我的南信院的老师们!是你们引领我走向了学术的殿堂,是你们引领我遨游在知识的海洋。在老师的谆教诲之下,我开阔了视野,深邃了思想,丰富了知识。尤其在毕业论文的指导上,老师更是不敢稍微懈怠。从论文选题开始,老师便倾入了大量的心血。得益于老师的启发我选择了研究沉没成本效应。这片浩瀚论文书海之中,我一个人感觉很是无助。但由于老师的指导和帮助,我不再害怕,我鼓足勇气耐心地完成我的毕设。
然后感谢我的论文指导老师蒋理老师,他认真负责的态度以及细心的指导,使我获益匪浅。耐心地指导让我感到万分感谢。感谢南京信息职业技术学院为我提供了这样的学习机会,此次使我感受颇深,并对软件开发技术的掌握也进一步加强了然后,也感谢我的舍友们,在我不懂的时候给予热心的帮助,让我不必一直纠结于哪一个问题,放松了很多。最后,感谢和我一起走过这三年的每一个人,因为有你们,生活变得美好,学习变得快乐。
参考文献
1 史健.海南体育职业技术学院训练竞赛管理系统开发与应用[J].当代体
育科技,2017.
2 张应辉,饶云波.计算机文化基础[M].北京航空航天大学出版社,20
(09).
3 赵文艳,康健.移动 web前端开发.北京理工大学出版社,2018,(09).
4 宋协栋.Dreamweaver网页设计与制作.北京理工大学出版社,2017,(07).
5 万征,刘喜平,骆斯文,万常选.面向计算思维的大学计算机基础.北京高等教育出版社,2015,(02).
6 万征,刘喜平,骆斯文,万常选.数据库系统原理与设计第 3版.北京清华大学出版社,2017,(09).
7 张聪.一种复合模式的仓储式物流配送管理系统设计[J].商场现代化,2017,(07):86-87.
8 余海伟.手工艺品企业的管理系统的设计与实现[D].厦门大学,2017.
9 方银斌. 基于移动物联网的大数据平台设计与实现[D].电子科技大学,2014.
10 DINO ESPOSITO.Social Authentication in ASP.NET MVC 4[J].MSDN magazine, 2013, 28(5):6-10.
数 据 库 技 术
实
验
报
告
学 校 河南科技大学
专 业 会计电算化
年 级
学 号
姓 名
年 月 日
一、实验名称
学生信息管理系统数据库设计
参考教材第一章1.2建立数据库和基本表
二、实验目的
数据库技术是一个理论和实际紧密联系的技术,在学习过程中,除了解数据模型、数据库系统结构、数据库应用方法等知识外,还应通过实验对相关技术加深认识,加强实践能力。上机实验的主要目标如下:
(1)通过上机操作,加深对数据库系统理论知识的理解。
(2)通过使用具体的DBMS,了解一种实际的数据库管理系统并掌握其操作技术。
(3)通过上机实验,提高动手能力,提高分析问题和解决问题的能力。
三、实验内容及步骤
说明本次实验的主要内容,及完成实验的主要步骤。
定义四个表:Student、 Depts、Course、Reports
实验一:
1.设计如上系统的表结构,定义每个表的主键和外键,为每个属性选择合适的数据类型,定义每个属性是否允许空值,是否有默认值等
2.在企业管理器中创建你设计的表,指定表的关键字,创建约束
3.将你设计的表和约束用SQL语句表达
4.使用SQL语句,在你设计的每个表中插入至少10条数据,要求记录满足数据约束要求,且尽量真实可信
实验二:
针对实验一建立的表,使用SQL语句完成:
1.从每个表中删除1条数据
2.在每个表中修改1条数据
3.每一个表中增加1条数据
4.查询计算机系的全体学生姓名
5.查询张三的所在的系名
6.查询李四所选课程名称
7.查询所有年龄在18-22岁之间的学生姓名
8.查询每个学生的学号、姓名、选修的课程名、成绩
1 delete from Students where sname=’张三’
delete from Depts where Dnam=’计算机系’
2 update Students set sname=’李四’ where sname=’张三’
3 insert into Depts values(‘d01’,’计算机系’)
4 select s.sname as 姓名 from Students s,Depts d where d.Dname='计算机系' and s.Dno=d.Dno
5 select d.Dname from Students s,Depts d where s.Sname='张三' and s.Dno=d.Dno
6 select c.cname from Course c,Students s,Reports r where s.sname=’李四’ and r.Cno=c.Cno and r.Sno=s.sno
7 select sname from Students where Sage between 18 and 22
8 select s.sno,s.sname,c.cname,r.grade from Reports r,Students s,Course c where r.Cno=c.Cno and r.Sno=s.Sno
四、实验分析
建表语句
CREATE TABLE [dbo].[Reports](
[Sno] [char](5) NOT NULL,
[Cno] [char](6) NOT NULL,
[Grade] [int] NULL,
ConSTRAINT [PK_Reports] PRIMARY KEY CLUSTERED
(
[Sno] ASC,
[Cno] ASC
) ON [PRIMARY]
) ON [PRIMARY]
CREATE TABLE [dbo].[Depts](
[Dno] [char](5) NOT NULL,
[Dname] [char](20) NOT NULL,
ConSTRAINT [PK_Depts] PRIMARY KEY CLUSTERED
(
[Dno] ASC
) ON [PRIMARY]
) ON [PRIMARY]
CREATE TABLE [dbo].[Course](
[Cno] [char](6) NOT NULL,
[Cname] [char](20) NULL,
ConSTRAINT [PK_Course] PRIMARY KEY CLUSTERED
(
[Cno] ASC) ON [PRIMARY]
CREATE TABLE [dbo].[Students](
[Sno] [char](5) NOT NULL,
[Sname] [char](20) NOT NULL,
[Ssex] [char](2) NULL,
[Sage] [int] NULL,
[Dno] [char](5) NULL,
ConSTRAINT [PK_Students] PRIMARY KEY CLUSTERED
(
[Sno] ASC
) ON [PRIMARY]
) ON [PRIMARY]
) ON [PRIMARY]
五、实验结论
这次实验报告持续了好一段时间,现在终于结束了。这次数据库技术实验报告是对我之前学习的总结,使我的专业知识和实际应用的紧密结合起来。通过这次实验报告使我对数据库理论有了较深刻的认识,并且对信息系统方面的设计理论和开发过程也有了深刻的了解,在这一阶段的学习中,我基本上掌握了JSP和SQL SEREVER2000的基本炒作和编程方法。
这次实验报告的过程涉及之前的基础课和专业课程的很多理论知识,但是在实际应用方面涉及很少,而数据库技术实践报告是把这些知识融会贯通起来,综合运用,所以通过这次实验报告我的认识问题、分析问题、解决问题的能力都有了很大的提高。
老师给的模版,自己随便整理了一下,仅供参考