第一篇:数据结构CAI系统项目手册
数据结构
项目书
项目经理: 产品经理: 测试经理:
北京工业大学数据结构课程设计项目书
一、问题描述:
以数据结构教材中树和图的内容为例,设计数据结构的CAI(计算机辅助教学)系统,用菜单的形式选择各项功能。用图形化界面的形式显示算法的执行过程。
二、程序分析:
二叉树的遍历算法演示中,首先定义一个TREE的结构体,里面存放的数据类型分别是char,两个TREE类型指针*lchild(左孩子),*rchild(右孩子),两个int分别是x和y,分别代表了树的x坐标和y坐标。再建立一个名称为OUTPUT的结构体里面存放了三种遍历的x坐标和y坐标。通过对Tree *CreatTree();函数的调用生成二叉树再通过void Preorder(Tree *t);void Midorder(Tree *t);void Posorder(Tree *t);这三个函数进行前中后的遍历来判断左右孩子是否存在。
三、程序设计:
1、结构化函数设计
北京工业大学数据结构课程设计项目书
2、设计工具
Win-TC, c文件
3、编码
头文件:
#include
结构体:
typedef struct TREE {
char data;
/*树的结点数据*/
struct TREE *lchild;
struct TREE *rchild;
int x;
/*树的x坐标*/
int y;
/*树的y坐标*/ }Tree;
struct OUTPUT {
int x;
/*三种遍历的x坐标*/
int y;
/*三种遍历的y坐标*/
int num;}s;
函数:
·函数名称:void DrawTree(Tree *t);·函数描述:用图形显示创建好的树
·函数名称:void Preorder(Tree *t);·函数描述:前序遍历
·函数名称:void Midorder(Tree *t);·函数描述:中序遍历
·函数名称:void Posorder(Tree *t);·函数描述:后序遍历
北京工业大学数据结构课程设计项目书
·函数名称:void DrawNode(Tree *t,int color);
·函数描述:遍历时显示每个结点的过程
·函数名称:void ClrScr();
·函数描述:清空树的区域
·函数名称:void Close(void);·函数描述:图形模式结束
四、测试与调试:
1、调试报告
一开始的调试中,我们就碰到了很严重的问题,图形化的界面一直无法正常的显示出来,运行之后,都是一闪即逝,为此,我们上网查阅了很多信息。加了getch(); 也加了system(“plause”);,这些基本的解决方法毫无用处;又有说要把Egavga.bgi这个文件和生成的exe文件放在一起,起初使用TC3.0时也无法正常显示图形界面。多番尝试无果之后打算试试Win-TC,结果莫名其妙的成功了。并且发现Egavga.bgi的确要和exe文件放在同一个文件夹,不在一起时无法进入图形界面,这是在一次另存为把文件保存到其他文件夹时发现的。还有最开始时,对于一些需要用到的函数所需的头文件不是很了解,不过通过网络的搜索之后,都一一得到解答。但是直到目前为止,依然有个比较大的问题,就是系统自动生成二叉树的时候,经常会出现重复字母的结点,我们想的是能不能一个节点之后就在26个字母之中把这个结点用到的字母抽出去,然后剩下的位置就从剩下的字母中选取,可是二叉树是一下子全部显示出来,好像没有明显的先后顺序,最后还是不会。
2、测试结果
A:主界面---选择生成树的方式(自动/手动)
北京工业大学数据结构课程设计项目书
B:选择1后
C:选择2后
D:按任意键后,进入二叉树的演示初始界面---图形化界面的初始化
北京工业大学数据结构课程设计项目书
E:按任意键后开始遍历,并输出遍历结果
五、主要算法分析:
(一)二叉树的生成
Tree *InitTree(int h,int t,int w){
char ch;
int n;
/*自动建立时随机赋值判断是否是NULL的标志*/
Tree *node;
if(way=='2')
/*手动建立需要自己输入*/
scanf(“%c”,&ch);
else
/*自动建立的赋值*/
{
n=random(5);
if(n==0&&nodeNUM>=3)
/*随机赋值时候确保自动建立的二叉树有三个结点*/
ch=' ';
else
ch=65+random(25);
}
if(ch==' ')
/*输入空格代表NULL*/
return NULL;
北京工业大学数据结构课程设计项目书
else
{
if(h==6||nodeNUM==26)/*如果树的层次已经到5或者结点树到达26个就自动返回NULL*/
return NULL;
node=(Tree*)malloc(sizeof(Tree));
node->data=ch;
node->x=t;
/*树的x坐标是传递过来的横坐标*/
node->y=h*50;/*树的y坐标与层次大小有关*/
nodeNUM++;
node->lchild=InitTree(h+1,t-w,w/2);
node->rchild=InitTree(h+1,t+w,w/2);
}
return node;} 功能:实现二叉树的生成功能,用于构建二叉树
(二)图形化显示二叉树
void DrawTree(Tree *t){ if(t!=NULL){ setcolor(BLACK);setfillstyle(SOLID_FILL,BLACK);fillellipse(t->x,t->y,9,9);setcolor(WHITE);circle(t->x,t->y,10);/*画圆*/ sprintf(str,“%c”,t->data);/*将内容转换成字符串输出*/ outtextxy(t->x-3,t->y-2,str);if(t->lchild!=NULL)
/*左子树*/ { line(t->x-5,t->y+12,t->lchild->x+5,t->lchild->y-12);DrawTree(t->lchild);} if(t->rchild!=NULL)
/*右子树*/ { line(t->x+5,t->y+12,t->rchild->x-5,t->rchild->y-12);DrawTree(t->rchild);} } } 功能:利用坐标实现图形化输出二叉树的功能,用于图形化演示
北京工业大学数据结构课程设计项目书
六、心得体会:
项目经理-肖毅:
刚开始拿到课设的题目时,浏览一遍之后发现毫无头绪,不知从何下手。从大一接触C语言开始,到后来学习C++,到现在的数据结构,学到现在,面对大型完整程序的编写,依然感觉很是无力。最后我们选择了数据结构CAI系统,因为觉得可以直接从所学的一些算法中直接完成,已经学过现成的算法,有了明确的目标,我们要做的就是将这些算法图形化的演示出来,不会毫无思路。虽然的确有些思路了,但是也并没有我们想象的那么简单,从最开始的计划完成3个算法的演示到最后只完成了一个二叉树的三种遍历的演示。另外我们觉得选择这个也能够帮助我们复习数据结构的一些知识,对于即将到来的数据结构考试也是有所帮助的,虽然查找和排序并没有完成,但是我们也翻阅数据结构课本仔细研究了书上关于那些部分的算法,这也是一种复习,排序和查找也是数据结构中很重要的一部分。
确定完题目之后,就要开始着手编写了,我们组成员的整体水平虽然不是很高,但我们依然能够凭借自己的努力来完成程序,遇到不会的问题,我们会向其他同学请教,并且自己上网搜索相关信息,不得不再次感叹网络的强大,网络确实是现代生活中不可缺少的一部分。这次课设中我和池璐主要负责程序的编写,我们也是边写程序边学习,我主要负责程序中二叉树图形化输出和二叉树的生成等部分,图形化输出需要用到坐标,我们要将想要输出的东西放到屏幕上正确的部分,需要经过多次尝试之后才能最后确定坐标。同时也让其他几位成员参与编写并学习,对于一些我会的地方,也会跟他们讲解,为了让他们更好的理解程序,并完成后期PPT的制作。团队协作能力也是考校一个计算机专业学生的一个很重要的因素。
通过这次课设,对于数据结构基本功的知识是一种强化,更扎实了数据结构的基本功,并学习到了很多课堂上没有学到过的知识,对于计算机知识的学习之路,光靠课堂所学是远远不够的。实际程序的编写也是很重要的,每一个完整的程序对于自己都是一次历练,这对于以后的学习和未来的工作都是很有帮助的。
项目经理-池璐:
在忙碌了一个星期之后,课设终于结束了。“实践出真知”,编出一些有用的程序更是对数据结构这门课程学习的最好检验。正是这次的检验,让我受益良多。
我们设计的是一款教学CAI辅助程序,用直观便于理解的动态图示为学生展现的是二叉树的3种遍历方式。我主要负责的是界面设计和3种遍历。界面上我设计的比较简洁,用一些特殊符号构成了框架。为了方便老师,我设计了2种方式,一种为计算机自动分配二叉树,另一种是认为输入。3种不同的遍历方式主要看的是根节点的位置。例如先序遍历的根节点最先被访问。在算法的设计中我也参与了进去,与项目经理进行了探讨,最终完成了整个程序。
当然,编程之路并非一帆风顺。其间我们也遇到了许多问题。比如菜单的编程问题,编程环境的影响一记图形函数的应用。在查阅资料后,大部分问题得到了解决,我也学到了之前不太了解的问题。另外,我计划还设计一款二分法的CAI程序,由于知识水平有限,我便看书试图解决这个问题。但是最后没有能够解决。课设虽然结束了,但是学习的脚步还没有就此停下。更多的实践等着我把
北京工业大学数据结构课程设计项目书
数据结构这么课在学习生活中运用的更加娴熟,理解的更加透彻。这才是学好这门课的意义。
产品经理-黄友鹏:
通过本次课设,我学到很多。首先必须承认,我的基础很差,本来对编一大段程序就很头疼,但是这次以小组方式进行,使我能够向他人学习,就算是大家都不会的问题我们也可以分工上网寻找解决的办法,总之,第一次觉得学习也可以变得很轻松。
而且,通过这次课设,我也懂得了好多专业的名词,如路演,CAI系统...这些都是我以前没有接触过的。
本次课设我担任产品经理的职位,这不只是一个小小的虚衔,这是让我们提早感受社会,事实上我也是这么努力的,我自己做了路演PPT,而且目的就是让别人接收我们的产品,虽然还有很多的不足,但我们努力了,我也很有成就感。
总之,在这次课设中我学到了很多,也感觉进步了很大。
测试经理-于连明:
这次课设给了我很大的锻炼,使我进一步理解数据结构的重要性。我们小组设计的是CAI(Computer Assisted Instruction),也就是计算机辅助教学。目前我们所学的数据结构计算机专业一门重要的专业技术基础课程,有人概括过这样一个公式:程序=算法+数据结构,要设计好的程序,除了要设计好的算法之外,还必须采用合适的数据结构。所以数据结构的知识对设计和实现计算机系统软件如操作系统、编译程序和数据库管理系统等是十分重要的;它对于编写应用软件的人来说也是必不可少的。
然而学习这门课程有一些困难:
(1)内容丰富,学习量大,给学习带来困难。
(2)贯穿的动态链表存储结构和递归技术是学习中的重点也是难点;
(3)所用到的技术多,而在此之前的各门课程中所介绍的专业性知识又不多,因而加大了学习难度;在解答问题时出会因此而困难重重。
因此我们小组为了解决数据结构学起来困难的麻烦,设计了CAI系统。这是一种崭新的教学方式,它可以代替教师模拟教学过程,是通过学生与计算机之间的交互活动达到教学的目的。其图文并茂,灵活方便的众多特点,可以激发我们学生的学习兴趣,且发挥学生的学生积极性,提高教学质量。CAI可以将某些非顺序信息呈现出来,可以包括一门课程或与某个对象有关的全部知识。我们即可以浏览所有知识,也可以按自己的需要获取其中任意所感兴趣的一部分,学生可以控制学习内容和进度。
但是我们设计的CAI系统缺乏网络支持。它是运行在单机下环境下的。无法利用网络在知识更新上的方便与快捷的优势。这样的CAI课件一旦生产完成就再也无法对教学的内容进行更新和维护,因而是没有生命力的,将随着时间的发展而逐步被淘汰。这类弊端有待研究解决。
这次课设也使我明白团队的合作是非常重要的,团结就是胜利。
北京工业大学数据结构课程设计项目书
七、分工协作:
项目经理:肖毅 池璐
职责:负责整个项目小组的人员管理、进度管理,主要攻克软件产品技术环节的问题,负责路演环节技术问题的答辩,负责项目手册中的核心算法部分的书写及整个项目手册的整理定稿。负责进行项目中期汇报及与指导教师的沟通。
产品经理:黄友鹏
职责:负责整个产品的框架设计、外观设计和功能模块的升级设计,主要负责产品的需求分析及性能改良,负责手册中产品外观和框架及需求的书写,负责路演环节PPT的制作。
测试经理:于连明
职责:负责整个产品的功能模块部分的设计与最终产品测试环节,建立产品所需的数据资源库,负责路演环节产品使用的答辩,负责项目手册中功能模块及算法的书写。
八、附录:源代码
/********二叉树的三种遍历算法演示********/ #include
typedef struct TREE {
char data;
/*树的结点数据*/
struct TREE *lchild;
struct TREE *rchild;
int x;
/*树的x坐标*/
int y;
/*树的y坐标*/ }Tree;
struct OUTPUT {
int x;
/*三种遍历的x坐标*/
int y;
/*三种遍历的y坐标*/
int num;}s;
int nodeNUM=0;/*统计当前的结点数字,最多26个*/ char way;
/*自动建立树和手动建立树的标志,2手动,1自动*/ char str[3];
/*显示结点数据的字符串*/
北京工业大学数据结构课程设计项目书
void Init();
/*图形初始化*/ void Close();/*图形关闭*/ Tree *CreatTree();
/*文本模式下创建树的过程*/ Tree *InitTree(int h,int t,int w);/*创建树,h层次,t横坐标,w树之间的宽度,n树的建立方式*/ void DrawTree(Tree *t);/*用图形显示创建好的树*/ void Preorder(Tree *t);/*前序遍历*/ void Midorder(Tree *t);/*中序遍历*/ void Posorder(Tree *t);/*后序遍历*/ void DrawNode(Tree *t,int color);
/*遍历时显示每个结点的过程*/ void ClrScr();
/*清空树的区域*/
void main(){
Tree *root;
randomize();
root=CreatTree();/*创建树*/
Init();
DrawTree(root);
/*每次遍历前显示白色的树*/
sleep(1);
s.x=100;s.y=300;s.num=1;/*每次遍历前设置显示遍历顺序显示的x,y坐标*/
Preorder(root);
/*前序遍历*/
getch();
ClrScr();
DrawTree(root);
sleep(1);
s.x=100;
s.y=350;
s.num=1;
Midorder(root);
/*中序遍历*/
getch();
ClrScr();
DrawTree(root);
sleep(1);
s.x=100;
s.y=400;
s.num=1;
Posorder(root);
/*后序遍历*/
Close();}
/*清空树的区域*/ void ClrScr(){
setcolor(BLACK);
北京工业大学数据结构课程设计项目书
setfillstyle(SOLID_FILL,BLACK);
bar(0,20,640,280);}
/*树的创建*/ Tree *CreatTree(){
Tree *root;
clrscr();
printf(“n”);
printf(“n”);
printf(“
Binary tree traversal
n”);
printf(“
----------------------------n”);
printf(“
**********Please input '1' OR '2' to choose********** n”);
printf(“
*
* n”);
printf(“
*
1.Computer creat
* n”);
printf(“
*
* n”);
printf(“
*
2.People creat
* n”);
printf(“
*
* n”);
printf(“
***************************************************** n”);
way=getch();/*输入创建树的方法,1电脑自动建立,2人工手动建立*/
if(way!='2')
way='1';
/*其他数字默认自动建立*/
if(way=='2')/*手动建立提示输入结点,例abc de f g
*/
printf(“
Please creat the tree:
n”);
root=InitTree(1,320,150);
system(“pause”);
return root;}
/*生成二叉树,h表示层次,t表示横坐标,w表示结点左右子树的宽度,随机数n确定结点是空或非空,如n为0,则为空,但要限定确保结点数不少于三个*/ Tree *InitTree(int h,int t,int w){
char ch;
int n;
/*自动建立时随机赋值判断是否是NULL的标志*/
Tree *node;
if(way=='2')
/*手动建立需要自己输入*/
scanf(“%c”,&ch);
else
/*自动建立的赋值*/
{
n=random(5);
if(n==0&&nodeNUM>=3)
/*随机赋值时候确保自动建立的二叉树有三个结点*/
ch=' ';
北京工业大学数据结构课程设计项目书
else
ch=65+random(25);
}
if(ch==' ')
/*输入空格代表NULL*/
return NULL;
else
{
if(h==6||nodeNUM==26)/*如果树的层次已经到5或者结点树到达26个就自动返回NULL*/
return NULL;
node=(Tree*)malloc(sizeof(Tree));
node->data=ch;
node->x=t;
/*树的x坐标是传递过来的横坐标*/
node->y=h*50;/*树的y坐标与层次大小有关*/
nodeNUM++;
node->lchild=InitTree(h+1,t-w,w/2);
node->rchild=InitTree(h+1,t+w,w/2);
}
return node;}
/*用图形显示创建好的树*/ void DrawTree(Tree *t){
if(t!=NULL)
{
setcolor(BLACK);
setfillstyle(SOLID_FILL,BLACK);
fillellipse(t->x,t->y,9,9);
setcolor(WHITE);
circle(t->x,t->y,10);/*画圆*/
sprintf(str,“%c”,t->data);/*将内容转换成字符串输出*/
outtextxy(t->x-3,t->y-2,str);
if(t->lchild!=NULL)
/*左子树*/
{
line(t->x-5,t->y+12,t->lchild->x+5,t->lchild->y-12);
DrawTree(t->lchild);
}
if(t->rchild!=NULL)
/*右子树*/
{
line(t->x+5,t->y+12,t->rchild->x-5,t->rchild->y-12);
DrawTree(t->rchild);
}
}
北京工业大学数据结构课程设计项目书
}
/*遍历时显示每个结点的过程*/ void DrawNode(Tree *t,int color){
setcolor(RED);
setfillstyle(SOLID_FILL,RED);
fillellipse(t->x,t->y,10,10);
setcolor(YELLOW);
sprintf(str,“%c”,t->data);/*将内容转换成字符串输出*/
outtextxy(t->x-3,t->y-2,str);
setcolor(color);
outtextxy(s.x,s.y,str);
setcolor(YELLOW);
sprintf(str,“%d”,s.num);
/*将遍历次序用数字显示在树的结点上*/
outtextxy(t->x-3,t->y-20,str);
s.num++;
sleep(1);}
/*前序遍历*/ void Preorder(Tree *t){
if(t!=NULL)
{
s.x+=15;
DrawNode(t,YELLOW);
Preorder(t->lchild);
Preorder(t->rchild);
} }
/*中序遍历*/ void Midorder(Tree *t){
if(t!=NULL)
{
Midorder(t->lchild);
s.x+=15;
DrawNode(t,WHITE);
Midorder(t->rchild);
} }
北京工业大学数据结构课程设计项目书
/*后序遍历*/ void Posorder(Tree *t){
if(t!=NULL)
{
Posorder(t->lchild);
Posorder(t->rchild);
s.x+=15;
DrawNode(t,GREEN);
} }
/*图形初始化*/ void Init(){
int gd=DETECT,gm;
initgraph(&gd,&gm,“c: c”);
cleardevice();/*清除图形屏幕*/
setcolor(YELLOW);
outtextxy(225,10,“Press anykey to continue”);
setcolor(RED);
outtextxy(20,300,“preorder”);
outtextxy(20,350,“midorder”);
outtextxy(20,400,“posorder”);
getch();}
/*关闭图形*/ void Close(){
getch();
closegraph();}
九、参考书目
《数据结构(c语言版)》.The Internet.
第二篇:学籍系统手册
学籍系统升级结束。本次系统升级内容: 1 待办业务提示
用户登录时,在首页弹出窗口,提示本单位各主要业务的待办数量,用户可通过链接直接访问对应处理功能。2 问题学籍处理
2.1 L、G字头学籍号学生均可进行佐证 一组问题学籍,同时存在正式学籍号和临时学籍号的学籍时,临时学籍号学籍可以申请佐证。双G问题学籍时,两方G学籍号都可以进行佐证。2.2 G字头学籍号学生可删除
一组问题学籍中,正式学籍号问题学籍可以发起删除处理。2.3 问题学籍佐证后发起重新处理
之前通过佐证方式处理结束的问题学籍,学校可以重新发起问题学籍处理业务。2.4 身份证件号已发生变更的处理 新增一类问题学籍,公安部认证不通过的问题学籍,新增错误类型“公安部校验不通过:身份证件号已发生变更”。处理方式仍为三种:佐证、删除、变更。2.5 认证不通过问题学籍信息中新增反馈信息项 问题学籍信息中新增“反馈描述”信息项,对于公安部身份认证不通过的问题学籍,该信息项给出错误提示信息。2.6 补充了问题学籍处理流程帮助
系统中提供了《问题学籍处理流程帮助》文档,学校用户可以在问题学籍处理功能中下载,教育管理部门用户可以在问题学籍审核功能中下载。3 正式学籍号下发的相关控制
用于新一批正式学籍号通过数据交换下发到省级后,省级的下发业务逻辑控制。4 无身份证在校学生列表
学校学籍管理员可查询本学校没有身份证号的在校学生学籍,方便联系学生家长确认学生身份证信息。
各级教育管理部门可查询辖区内学校没有身份证号的在校学生学籍。5 其他
不允许将正式学籍号学籍的身份证件类型变更为“其他”,包括问题学籍处理和关键数据变更。
不允许将身份证件类型变更为“户口簿”。
第三篇:数据结构课程设计 飞机订票系统
飞机订票系统
1.需求分析
描述要求编程解决的问题。以无歧义的陈述说明程序设计的任务,强调的是程序要做什么?明确规定:
(a)输入的形式和输入值的范围;
(b)输出的形式;
(c)程序所能达到的功能;
(d)测试数据:包括正确的输入及其输出结果和含有错误的输入及其输出结果。
2.概要设计
给出程序要达到的具体的要求。描述解决相应问题算法的设计思想。描述所设计程序的各个模块(即函数)功能。说明本程序中用到的所有抽象数据类型的定义、主程序的流程以及各程序模块之间的层次(调用)关系。
3.详细设计
实现概要设计中定义的所有数据类型,对每个操作只需要写出流程或伪码算法;对主程序和其他模块也都需要写出流程或伪码算法(伪码算法达到的详细程度建议为:按照伪码算法可以在计算机键盘直接输入高级程序设计语言程序);画出函数的调用关系图。给出所使用的基本抽象数据类型,所定义的具体问题的数据类型,以及新定义的抽象数据类型。设计出良好的输入输出界面(清晰易懂)。
4.调试分析 内容包括:
(a)调试过程中遇到的问题是如何解决的以及对设计与实现的回顾讨论和分析;
(b)算法的时空分析(包括基本操作和其他算法的时间复杂度和空间复杂度的分析)和改进设想;
(c)经验和体会等。
5.用户使用说明
说明如何使用你编写的程序,详细列出每一步的操作步骤。
6.测试结果
设计测试数据,或具体给出测试数据。要求测试数据能全面地测试所设计程序的功能。列出你的测试结果,包括输入和输出。这里的测试数据应该完整和严格,最好多于需求分析中所列。
7.测试情况:给出程序的测试情况,并分析运行结果
附录(非必须,按照需要添加)
带注释的源程序。可以只列出程序文件名的清单。
需求分析
任务:通过此系统可以实现如下功能: 录入:
可以录入航班情况(数据可以存储在一个数据文件中,数据结构、具体数据自定)
查询:
可以查询某个航线的情况(如,输入航班号,查询起降时间,起飞抵达城市,航班票价,票价折扣,确定航班是否满仓); 可以输入起飞抵达城市,查询飞机航班情况;
订票:(订票情况可以存在一个数据文件中,结构自己设定)可以订票,如果该航班已经无票,可以提供相关可选择航班;
退票: 可退票,退票后修改相关数据文件;
客户资料有姓名,证件号,订票数量及航班情况,订单要有编号。
概要设计
详细设计
详列函数 void list(){
struct airline *info;
int i=0;
info=start;
printf(“起点城市t终点城市t航班号t起飞时间t降落时间t总票数t余票数n”);
while(i { display(info); info++; i++; } printf(“nn”);} 查询函数 void search(){ struct airline *info,*find(); char qiname[10]; char jiangname[10]; int i=0; info=start; printf(“请输入要起飞城市的名称:”); scanf(“%s”,qiname); printf(“请输入要抵达城市的名称:”); scanf(“%s”,jiangname); while(i { if(!strcmp(jiangname,info->jiang_name)) { break; } info++; i++; } if(i>=MAXSIZE) { printf(“没有这条航线!n”); } else { printf(“起飞城市t降落城市t航班号t起飞时间t降落时间t总票数t余票数n”); display(info); } } struct airline *find(){ struct airline *info; char number[10]; int i=0; info=start; printf(“请输入航班号:”); scanf(“%s”,number); while(i { if(!strcmp(number,info->air_num)) { return info; } info++; i++; } printf(“没有这条航线!n”); return NULL;} 订票函数 void order(){ struct airline *info; char qiname[10]; char jiangname[10]; int amount; char name[10]; char id[30]; info=start; printf(“请输入您的起飞城市:”); scanf(“%s”,qiname); printf(“请输入您的降落城市:”); scanf(“%s”,jiangname); printf(“请输入您需要的票数:”); scanf(“%d”,&amount); int i=1; while(i<5) { if(!strcmp(info->qi_name,qiname)&&!strcmp(info->jiang_name,jiangname)) { if(amount<=info->ticket_left) { int i; printf(“请输入您的姓名:”); scanf(“%s”,name); printf(“请输入您的身份证号:”); scanf(“%s”,id); info->order=insertlink(info->order,amount,name,id); printf(“您的航班信息为:n”); display(info); for(i=0;i { printf(“%s的座位号是:%dn”,name,info->ticket_all-info->ticket_left+i+1); } info->ticket_left-=amount; printf(“订票成功!n”); break; } else { info++; i++; } } else { info++; i++; } } } 退票函数 void returnticket(){ struct airline *info; linklist *p1,*p2,*head; char name[10]; if(!(info=find())) { return; } head=info->order; p1=head; printf(“请输入您的姓名:”); scanf(“%s”,name); while(p1!=NULL) { if(!strcmp(name,p1->name)) { break; } p2=p1; p1=p1->next; } if(p1==NULL) { printf(“您没有订过票!n”); return; } else { if(p1==head) { head=p1->next; } else { p2->next=p1->next; } info->ticket_left+=p1->tickets; printf(“%s退票成功!n”,p1->name); free(p1); } info->order=head;} 存储结构 typedef struct passenger { char name[10]; int tickets; char id[30]; struct passenger *next;} linklist;typedef struct airline { char qi_name[10]; char jiang_name[10]; char air_num[10]; char qi_time[10]; char jiang_time[10]; int ticket_all; int ticket_left; linklist *order;} lineinfo;调试分析 查看航线信息 查询航线 ① 输入起飞城市 ② 输入抵达城市 ③ 输出航班信息 办理订票业务 ① 查询符合的航班 ② 查询余票量 ③ 输出航班信息 办理退票业务 源代码 #include char name[10]; int tickets; char id[30]; struct passenger *next;} linklist; typedef struct airline { char qi_name[10]; char jiang_name[10]; char air_num[10]; char qi_time[10]; char jiang_time[10]; int ticket_all; int ticket_left; linklist *order;} lineinfo; struct airline *start; void display(struct airline *info){ printf(“%st %10st %10st %10st %10st %5dt %5dn”,info->qi_name,info->jiang_name,info->air_num,info->qi_time,info->jiang_time,info->ticket_all,info->ticket_left);} void list(){ struct airline *info; int i=0; info=start; printf(“起点城市t终点城市t航班号t起飞时间t降落时间t总票数t余票数n”); while(i { display(info); info++; i++; } printf(“nn”);} void search(){ struct airline *info,*find(); char qiname[10]; char jiangname[10]; int i=0; info=start; printf(“请输入要起飞城市的名称:”); scanf(“%s”,qiname); printf(“请输入要抵达城市的名称:”); scanf(“%s”,jiangname); while(i { if(!strcmp(jiangname,info->jiang_name)) { break; } info++; i++; } if(i>=MAXSIZE) { printf(“没有这条航线!n”); } else { printf(“起飞城市t降落城市t航班号t起飞时间t降落时间t总票数t余票数n”); display(info); } } struct airline *find(){ struct airline *info; char number[10]; int i=0; info=start; printf(“请输入航班号:”); scanf(“%s”,number); while(i { if(!strcmp(number,info->air_num)) { return info; } info++; i++; } printf(“没有这条航线!n”); return NULL;} linklist *insertlink(linklist *head,int amount,char name[],char id[]){ linklist *p1,*new1; p1=head; new1=(linklist*)malloc(sizeof(linklist)); strcpy(new1->name,name); new1->tickets=amount; new1->next=NULL; strcpy(new1->id,id); if(head==NULL) { head=new1; new1->next=NULL; } else { while(p1->next!=NULL) p1=p1->next; p1->next=new1; } return head;} void order(){ struct airline *info; char qiname[10]; char jiangname[10]; int amount; char name[10]; char id[30]; info=start; printf(“请输入您的起飞城市:”); scanf(“%s”,qiname); printf(“请输入您的降落城市:”); scanf(“%s”,jiangname); printf(“请输入您需要的票数:”); scanf(“%d”,&amount); int i=1; while(i<5) { if(!strcmp(info->qi_name,qiname)&&!strcmp(info->jiang_name,jiangname)) { if(amount<=info->ticket_left) { int i; printf(“请输入您的姓名:”); scanf(“%s”,name); printf(“请输入您的身份证号:”); scanf(“%s”,id); info->order=insertlink(info->order,amount,name,id); printf(“您的航班信息为:n”); display(info); for(i=0;i { printf(“%s的座位号是:%dn”,name,info->ticket_all-info->ticket_left+i+1); } info->ticket_left-=amount; printf(“订票成功!n”); break; } else { info++; i++; } } else { info++; i++; } } } void returnticket(){ struct airline *info; linklist *p1,*p2,*head; char name[10]; if(!(info=find())) { return; } head=info->order; p1=head; printf(“请输入您的姓名:”); scanf(“%s”,name); while(p1!=NULL) { if(!strcmp(name,p1->name)) { break; } p2=p1; p1=p1->next; } if(p1==NULL) { printf(“您没有订过票!n”); return; } else { if(p1==head) { head=p1->next; } else { p2->next=p1->next; } info->ticket_left+=p1->tickets; printf(“%s退票成功!n”,p1->name); free(p1); } info->order=head;} int menu_select(){ int c; char s[20]; printf(“ 订票系统n”); printf(“-------------n”); printf(“ 1.查看航线信息 printf(” 2.查询航线 printf(“ 3.办理订票业务 printf(” 4.办理退票业务 printf(“ 5.退出系统 printf(”-------------n“); do { printf(”请选择(1-5):“); scanf(”%s“,s); c=atoi(s); } while(c<1||c>6); return c; n”);n“);n”);n“); n”); } int main(){ struct airline air[MAXSIZE]= { {“harbin”,“beijing”,“1”,“12:00”,“14:00”,30,30},{“harbin”,“shanghai”,“2”,“10:00”,“13:00”,20,20},{“harbin”,“beijing”,“3”,“13:30”,“10:00”,50,50},{“harbin”,“guangzhou”,“4”,“17:00”,“21:00”,50,50},{“harbin”,“dalian”,“5”,“14:00”,“17:00”,40,40} }; start=air; while(1) { system(“cls”); switch(menu_select()) { case 1: list(); break; case 2: search(); break; case 3: order(); break; case 4: returnticket(); break; case 5: exit(0); } getch(); } } 经验体会 1、通过设计飞机订票系统,加深了对链表的运用和理解。 2、通过多组测试数据,发现了程序的问题,并做了调整、3、通过设计选择菜单,对选择结构有更深刻的了解。 《数据结构》 课程设计报告书 一.课程设计题目 图书借阅管理系统 二.课程设计内容 实现图书管理信息系统的设计 (一)管理员功能: ①登录:输入管理员密码,若密码错误则不得执行管理员操作。 ②添加新书:增加新的图书资料,同时需检查新书的图书编号是否已存在于原图书资料中,若已存在则应取消添加或提示重新输入。 ③修改图书:通过编号查询该图书资料,若该编号存在,则显示已有信息,允许修改,否则提示 无该图书信息。 ④删除图书:通过编号查询该图书资料,若该编号存在,则显示已有信息,允许删除,否则提示无该图书信息。删除对象包括该图书资料以及“图书状态”和“借阅人”中与此书相关的所有记录。 ⑤查找图书: A.按书号查找:通过编号查询该图书资料,若该编号存在,则显示图书信息,否则提示无该图书信息。 B.按书名查找:通过书名查询该图书资料,若该编号存在,则显示图书信息,否则提示无该图书信息。 C.按作者查找:通过作者查询该图书资料,若该编号存在,则显示图书信息,否则提示无该图书信息。 ⑥查看全部图书:显示所有图书资料,包括书号、书名、作者、状态和借阅人等信息。 ⑦修改读者:通过姓名查询该读者信息,若该姓名存在,则显示已有信息,允许修改,否则提示无该读者信息。 ⑧删除读者:通过姓名查询该读者信息,若该姓名存在,则显示已有信息,允许删除,否则提示无该读者信息。删除对象包括该读者姓名、班级、电话以及“图书状态”和“借阅人”中与此人相关的所有记录。 ⑨查看所有读者:显示所有读者资料,包括姓名、班级、电话等信息。 (二)读者功能: ①登录:输入读者姓名,若未经注册则不得进入读者服务界面。②注册:新用户经注册方可登录系统并使用读者服务功能。③借书: A.输入所需图书编号,判断该编号是否存在,若不存在则提示重新输入。 B.若所输入图书编号存在,则判断该书籍是否已被借出,若已借则不允许执行借书操作。 C.若所输入图书未借,则提示输入读者姓名,判断所输入读者姓名是否存在,若不存在则提示重新输入。D.若读者姓名存在,则允许执行借书操作。 E.借书处理包括在“图书状态”中加上“已借”标记。④还书: A.输入所借书编号,判断该编号是否存在,若不存在则提示重新输入。B.判断该书是否已借出,若未借则不允许执行还书操作。C.借书处理包括在“图书状态”中加上“未借”标记。⑤查询图书: A.按书号查找:通过编号查询该图书资料,若该编号存在,则显示图书信息,否则提示无该图书信息。 B.按书名查找:通过书名查询该图书资料,若该编号存在,则显示图书信息,否则提示无该图书信息。 C.按作者查找:通过作者查询该图书资料,若该编号存在,则显示图书信息,否则提示无该图书信息。 ⑥查看借阅情况:输入读者姓名,若该姓名不存在则提示重新输入,若该姓名存在则显示该读者借阅信息。 三.算法设计 1.流程图(部分示例) ①管理员登录 ②读者登录 ③读者借阅图书 ④管理员或读者按书名查找图书 2.代码实现 #include #include //将字符串BookFile替换原文件中的宏名称book #define ReaderFile “reader.txt” using namespace std;//**********读者结构体,用于存放读者基本信息********** class Reader { private: char rname[10]; char rclass[10]; char rtel[10];public: Reader()//构造函数,实现数据初始化 {strcpy(rname,“");strcpy(rclass,”“);strcpy(rtel,”“);} //初始化 void set_rname(char *rn)//设置读者姓名 {strcpy(rname,rn);} //将rn的字符复制给rname char * get_rname()//获得读者姓名 {return rname;} //返回rname的值 void set_rclass(char *rc)//设置班级 {strcpy(rclass,rc);} char *get_rclass() //获得班级 {return rclass;} void set_rtel(char *rt) //设置电话 {strcpy(rtel,rt);} char *get_rtel() //获得电话 {return rtel;} void copy(Reader m)//读者Reader结构体copy函数 {strcpy(rname,m.get_rname());strcpy(rclass,m.get_rclass());strcpy(rtel,m.get_rtel());} };//*********读者管理结构体,实现对读者用户的管理********* class ReaderManage { Reader readers[50];//定义读者结构体数组对象,最多50位 int length; void readFile() //读取读者文件函数 { ifstream fread;//定义输入文件流对象fread length=0; //计数 if(!fread) {cout<<”读取磁盘文件失败!“< fread.open(ReaderFile,ios::binary);//使文件流与文件关联,以二进制方式打开 int i=0; while((fread.read((char *)&readers[i],sizeof(Reader))))//计算并返回所占字节数 i++; length=i; fread.close();//关闭磁盘文件 } void saveFile()//保存读者文件 { ofstream fwrite; //定义输出文件流对象fwrite if(!fwrite) {cout<<”文件保存失败!n“;exit(1);} fwrite.open(ReaderFile,ios::binary);//使文件流与文件关联,以二进制方式打开 fwrite.write((char *)readers,length*sizeof(Reader));//计算并返回所占字节数 fwrite.close();//关闭磁盘文件 } public: ReaderManage()//构造函数,读取读者文件 {readFile();} ~ReaderManage()//析构函数,保存读者文件 {saveFile();} void add_reader(Reader r)//添加读者用户函数 { if(length>=50) {cout<<”对不起,注册人数已满!n“;return;} readers[length].copy(r);//调用读者结构体copy函数 length++;} int search(char *rn)//按姓名查找读者函数 { for(int i=0;i if(strcmp(readers[i].get_rname(),rn)==0)//判断是否相等 return i; return-1; } bool revise(Reader reader,int i)//修改读者资料函数 { readers[i].copy(reader);//调用读者结构体cpoy函数 return true;} void delete_reader(int index)//删除读者函数 { for(int i=index;i readers[i].copy(readers[i+1]);//用后面的地址覆盖前面的地址 length--;} bool log_reader(Reader r)//登录时判断读者用户是否存在函数,相当于遍历 { for(int i=0;i if(strcmp(readers[i].get_rname(),r.get_rname())==0) return true; return false; } void reg_reader()//注册用户函数 { char n[10]; //姓名name char c[10]; //班级class char t[10]; //电话tel Reader reader; cout<<”nt请输入您的姓名:“; cin>>n; cout<<”nt请输入您的所在班级:“; cin>>c; cout<<”nt请输入您的联系电话:“; cin>>t; reader.set_rname(n);//调用读者结构体设置读者姓名函数 reader.set_rclass(c);//调用读者结构体设置读者班级函数 reader.set_rtel(t);//调用读者结构体设置联系电话函数 add_reader(reader);//调用读者结构体添加读者函数 cout<<”nt注册成功!“;} void show_reader()//不带参的显示读者信息函数 { cout<<”n ☆☆☆☆☆☆☆☆☆☆☆☆读★★者★★信★★息★★列★★表☆☆☆☆☆☆☆☆☆☆☆nn“; cout<<”姓名ttt班级ttt电话n“; for(int i=0;i { cout< cout<<”ttt“< cout<<”ttt“< } } void show_reader(int i)//带参的显示读者信息函数 { cout<<”n ☆☆☆☆☆☆☆☆☆☆☆☆读★★者★★信★★息★★列★★表☆☆☆☆☆☆☆☆☆☆nn“; cout<<”姓名ttt班级ttt电话n“; cout< cout<<”ttt“< cout<<”ttt“< } }; //********书籍结构体,用于存放书籍基本信息******** class Book { private: char bnum[10]; //书号 char bname[20]; //书名 char bauthor[10]; //作者 char rname[10]; //借阅人 public: int tag; //状态标记判断指标(已借/在架)Book() //构造函数初始化信息 {strcpy(bnum,”“);strcpy(bname,”“);strcpy(bauthor,”“);strcpy(rname,”“);tag=0;} void set_bnum(char *no) //设置书号 {strcpy(bnum,no);} //把字符串no中的字符复制到字符串bnum中 char *get_bnum() //获得书号 { return bnum;} //返回值为bnum void set_bname(char *n) //设置书名 {strcpy(bname,n);} char *get_bname() //获得书名 {return bname;} void set_bauthor(char *a) //设置作者 {strcpy(bauthor,a);} char * get_bauthor() //获得作者姓名 {return bauthor;} void set_tag(int t) //状态设置 {tag=t;} void set_rname(char *rn) //设置借阅人 {strcpy(rname,rn);} char *get_rname() //获得借阅人姓名 {return rname;} void show_tag() //显示图书状态 { if(tag==1) {cout<<”已借“;} else {cout<<”在架“;} } void copy(Book m) //Book结构体copy函数 { strcpy(bnum,m.get_bnum()); //将获得书号函数里的返回值里的字符复制到bnum strcpy(bname,m.get_bname()); strcpy(bauthor,m.get_bauthor()); tag=0; } };//**********书籍管理结构体,实现管理书籍功能********** class BookManage { private: Book books[100]; //定义Book书籍结构体数组对象,最大容量100本 int length; void saveFile() //保存书籍文件 { ofstream fwrite;//定义输出文件流ofstream结构体对象fwrite if(!fwrite) {cout<<”文件保存失败!n“;exit(1); } fwrite.open(BookFile,ios::binary);//使文件流与文件建立关联,以二进制方式打开 fwrite.write((char *)books,length*sizeof(Book));//计算并返回所占字节数 fwrite.close(); //关闭磁盘文件 } void readFile() //读取书籍文件 { ifstream fread;//定义输入文件流对象fread length=0; if(!fread) {cout<<”文件读取失败!“< Book temp; //定义书籍结构体临时对象temp int i=0; fread.open(BookFile ,ios::binary);//使文件流与文件建立关联,以二进制方式打开 while((fread.read((char *)&books[i],sizeof(Book)))) i++; //每读完一次,指针后移一位,直到不能读出正确结果为止 length=i; fread.close();} public: BookManage() //构造函数,读取磁盘文件 { length=0; //从头读起,计数,最大100 readFile(); //调用读取文件函数 } ~BookManage() //析构函数,保存磁盘文件 { saveFile(); //调用保存文件函数 } bool add(Book book) //添加图书资料 { if(length>=100) { cout<<”对不起,储存已满,您无法继续添加!n“; return-1; } else { books[length].copy(book);//调用书籍结构体copy函数 length++; return(length-1); } } int bnu_search(char *bnu) //按书号查找书籍 { for(int i=0;i if(strcmp(books[i].get_bnum(),bnu)==0)//字符串比较,判断是否相等 return i; return-1; } int bna_search(char *bna) //按书名查找书籍 { for(int i=0;i if(strcmp(books[i].get_bname(),bna)==0)//判断 return i; return-1; } int bau_search(char *bau)//按作者查找书籍 { for(int i=0;i if(strcmp(books[i].get_bauthor(),bau)==0)//判断 return i; return-1; } int rn_search(char *rn)//按借阅人查找书籍 { for(int i=0;i if(strcmp(books[i].get_rname(),rn)==0)//判断 return i; return-1; } void revise(Book book,int i)//带参的修改书籍函数 {books[i].copy(book);} //调用Book结构体copy函数 void deleteBook(int index)//带参的删除书籍资料函数 { for(int i=index;i books[i].copy(books[i+1]);//用后面的地址将当前的地址覆盖 length--; } void show_book()//不带参的显示书籍函数 { cout<<” ☆☆☆☆☆☆☆☆☆☆☆书★★籍★★信★★息★★列★★表☆☆☆☆☆☆☆☆☆☆☆nn“; cout<<”书号“; cout.width(10); cout<<”书名“; cout.width(10); cout<<”作者“; cout.width(17); cout<<”状态“; cout.width(25); cout<<”借阅人n“; for(int i=0;i { cout< cout.width(10); cout< cout.width(10); cout< cout.width(20); books[i].show_tag(); cout.width(20); cout< } } void show_book(int i)//带参的显示书籍函数 { cout<<” ☆☆☆☆☆☆☆☆☆☆☆书★★籍★★信★★息★★列★★表☆☆☆☆☆☆☆☆☆☆☆nn“; cout<<”书号“; cout.width(10); cout<<”书名“; cout.width(10); cout<<”作者“; cout.width(17); cout<<”状态“; cout.width(25); cout<<”借阅人n“; cout< cout.width(10); cout< cout.width(10); cout< cout.width(20); books[i].show_tag(); cout.width(20); cout< } void br_book()//读者借、还书功能函数 { ReaderManage reader; int choi;//选择 int a; //图书状态指标(1已借2在架) char sh[10];//需要还书的书号 char dz[10];//读者姓名 cin>>sh; int index=bnu_search(sh);//定义一个变量等于查找到的书号 if(index>=0) { if(books[index].tag==1)//已借 a=1; if(books[index].tag==0)//在架 a=2; switch(a) { case 1: cout<<”nt该书目前状态为<已借出>n“; cout<<”nt请选择您需要的服务:1:还书 0:返回n“; cin>>choi; cin.ignore();//清除以回车结束的输入缓冲区的内容,消除上一次输入对下一次输入的影响 if(choi!=1&&choi!=0) { cout<<”nt操作有误,请重新选择(0/1)!n“; return; } else if(choi==1) { cout<<”nt请输入您的姓名:“; cin>>dz; cin.ignore(); int index1=reader.search(dz); if(index1==-1) { cout<<”nt对不起,系统无该读者记录,新用户请先注册!“; return; } else { strcpy(dz,”“);//将读者姓名已空白代替 books[index].set_rname(dz);//借阅人一项变为空白 books[index].set_tag(0);//图书状态变为在架 cout<<”nt还书成功!“< } }break; case 2: cout<<”nt该书目前状态为<在馆>n“; cout<<”nt请您需要的服务:1:借书 0:返回n“; cin>>choi; cin.ignore(); if(choi!=1&&choi!=0) { cout<<”nt操作有误,请重新选择(0/1)!n“; return; } else if(choi==1) { cout<<”nt请输入您的姓名:“; cin>>dz; int index1=reader.search(dz); if(index1==-1) { cout<<”nt对不起,系统无改读者记录,新用户请先注册!“; return; } else { books[index].set_rname(dz); books[index].set_tag(1); cout<<”nt借书成功!“< } }break; } } else { cout<<”nt对不起,系统无该书记录!“;} } bool in(int i)//判断图书是否在架函数 { if(books[i].tag==1) return false; return true; } };//**********菜单结构体,实现界面引导********** class Menu { BookManage bm; //定义书籍管理结构体对象bm ReaderManage rm; //定义读者管理结构体对象rm Reader r; //定义读者结构体对象r private: int choice; //菜单序号选择 int key; //管理员密码 public: void header() //页眉 { system(”color fd“); cout<<”t ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ 图 书 借 阅 管 理 系 统 ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆n“;} void log_menu() //主界面登录菜单 { system(”color fd“); header(); cout<<”nttt< 请 选 择 登 录 身 份 >n“; cout<<”ntttt1: 管理员nntttt2: 读 者nntttt0: 退 出nt您的选择是: “;choice: cin>>choice; cin.ignore(); //清除以回车结束的输入缓冲区的内容,消除上一次输入对下一次输入的影响 switch(choice) { case 1: log_admin(); //管理员登录,需密码验证 break; case 2: reader_lr(); //读者登录或注册 break; case 0: exit(1); //退出系统 break; default: cout<<”nt您的操作有误,请重新选择(0→2): “; goto choice; } } void admin_menu() //管理员管理菜单 { system(”cls“); system(”color f9“); cout<<”t ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ 系★统★管★理★界★面 ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ 1: 添加新的图书资料 2: 修改已有图书资料 ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ 3: 删除已有图书资料 4: 查找已有图书资料 ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ 5: 查看所有图书资料 6: 修改读者用户信息 ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ 7: 删除读者用户信息 8: 查看所有读者信息 ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ 9: 返回系统登录界面 0: 退出图书管理系统 ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆n“; cout<<”nt请选择您需要的服务序号: “;choice: cin>>choice; cin.ignore(); switch(choice) { case 1: //添加图书 addBook(); bm.~BookManage(); break; case 2: //修改图书 reviseBook(); bm.~BookManage(); break; case 3: //删除图书 delBook(); bm.~BookManage(); break; case 4: //查找图书 absearch_menu(); break; case 5: //查看全部图书 bm.show_book(); cout<<”nt显示完毕!“; system(”pause“); admin_menu(); break; case 6: //修改读者 reviseReader(); rm.~ReaderManage(); break; case 7: //删除读者 delReader(); rm.~ReaderManage(); break; case 8: //查看所有读者 rm.show_reader(); cout<<”nt显示完毕!“; system(”pause“); admin_menu(); break; case 9: //返回系统登录界面 system(”cls“); log_menu(); case 0: //退出系统 exit(1); break; default: cout<<”nt您的操作有误,请重新选择(0→7): “; goto choice; } } void reader_menu() //读者服务菜单 { system(”cls“); system(”color f9“); cout<<”t ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ 读★者★服★务★界★面 ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ 1: 借 阅 图 书 2: 归 还 图 书 ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ 3: 查 找 图 书 4: 借 阅 情 况 ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ 5: 返 上 一 级 0: 退 出 系 统 ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆n“; cout<<”nt请选择您需要的服务序号: “;choice: cin>>choice; cin.ignore(); switch(choice) { case 1: cout<<”nt请输入您欲借阅的图书书号: “; bm.br_book(); bm.~BookManage(); break; case 2: cout<<”nt请输入您欲归还的图书书号: “; bm.br_book(); bm.~BookManage(); break; case 3: bsearch_menu(); break; case 4: rn_search(); break; case 5: system(”cls“); reader_lr(); break; case 0: exit(1); break; default: cout<<”nt您的操作有误,请重新选择(0→5): goto choice; } } void bsearch_menu() //读者查找书籍菜单 { system(“color f2”); cout<<“ttt☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆n”;cout<<“ttt☆ ☆n”; cout<<“ttt☆ 书★籍★查★找★界★面 ☆n”; cout<<“ttt☆ ☆n”; cout<<“ttt☆ 1: 按 书号查找 ☆n”; cout<<“ttt☆ ☆n”; cout<<“ttt☆ 2: 按 书名查找 ☆n”; cout<<“ttt☆ ☆n”; cout<<“ttt☆ 3: 按 作者查找 ☆n”; cout<<“ttt☆ ☆n”; cout<<“ttt☆ 4: 返 回 上 级 ☆n”; cout<<“ttt☆ ☆n”; cout<<“ttt☆ 0: 退 出 系 统 ☆n”;cout<<“ttt☆ ☆n”; cout<<“ttt☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆n”; int bsc;//book search choice cout<<“nt请输入您需要的服务序号: ”; cin>>bsc; cin.ignore(); switch(bsc){ case 1: bnu_search(); break; case 2: bna_search(); “; break; case 3: bau_search(); break; case 4: reader_menu(); break; case 5: exit(1); default: cout<<”nt操作有误,请重新选择<0→4>“; break; } } void absearch_menu() //管理员查找书籍菜单 { system(”color f2“); cout<<”ttt☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆n“; cout<<”ttt☆ ☆n“; cout<<”ttt☆ 书★籍★查★找★界★面 ☆n“; cout<<”ttt☆ ☆n“; cout<<”ttt☆ 1: 按 书号查找 ☆n“; cout<<”ttt☆ ☆n“; cout<<”ttt☆ 2: 按 书名查找 ☆n“; cout<<”ttt☆ ☆n“; cout<<”ttt☆ 3: 按 作者查找 ☆n“; cout<<”ttt☆ ☆n“; cout<<”ttt☆ 4: 返 回 上 级 ☆n“; cout<<”ttt☆ ☆n“; cout<<”ttt☆ 0: 退 出 系 统 ☆n“; cout<<”ttt☆ ☆n“; cout<<”ttt☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆n“; int bsc;//book search choice cout<<”nt请输入您需要的服务序号: “; cin>>bsc; cin.ignore(); switch(bsc) { case 1: bnu_search(); break; case 2: bna_search(); break; case 3: bau_search(); break; case 4: admin_menu(); break; case 5: exit(1); default: cout<<”nt操作有误,请重新选择<0→4>“; break; } } void reader_lr()//读者登录或注册菜单 { system(”cls“); header(); system(”color f1“); cout<<”nttt< 读 者 登 录 界 面 >n“; cout<<”nttt 1: 登 录t2: 注 册nnttt 3: 返 回t0: 退 出nt您的选择是: “; int rlc;//reader login choice choice: cin>>rlc; cin.ignore(); switch(rlc) { case 1: //已注册读者登录 cout<<”nt请输入您的姓名: “; char rn[10];//reader name cin>>rn; r.set_rname(rn); if(rm.log_reader(r)) { cout<<”nt登录成功!“; system(”pause“); reader_menu(); } else cout<<”nt登录失败!新用户请先注册!“; system(”pause“); reader_lr(); break; case 2: //新用户注册 rm.reg_reader(); rm.~ReaderManage(); system(”pause“); reader_lr(); break; case 3: system(”cls“); log_menu(); case 0: exit(1); break; default: cout<<”nt您的操作有误,请重新选择(0→2): goto choice; } } void log_admin() //管理员登录 { cout<<“nt请输入管理员密码:”; int key; cin>>key; if(key==14125) { cout<<“nt登录成功!nnt”; system(“pause”); admin_menu(); //管理员操作菜单 } else {cout<<“nt登录失败!原因是密码错误!n”; cout<<“nt请选择 <1:返回上一级菜单 0:退出系统> cin>>choice; cin.ignore(); switch(choice) ”;“; { case 1: system(”cls“); log_menu(); break; case 0: exit(1); break; default: cout<<”nt操作有误,请重新选择(0/1)“; } } } void rn_search() //按书号查找函数 { char rn[10];//reader name cout<<”nt请输入您的姓名:“; cin>>rn; int index=bm.rn_search(rn); if(index>=0) bm.show_book(index); else cout<<”nt对不起,系统无您的借阅记录!“; cout<<”nt“; system(”pause“); reader_menu(); } void bnu_search() //按书号查找函数 { char bnu[10]; cout<<”nt请输入您要查找的书号:“; cin>>bnu; int index=bm.bnu_search(bnu); if(index>=0) bm.show_book(index); else cout<<”nt对不起,系统无该书籍记录!“; cout<<”nt“; system(”pause“); bsearch_menu(); } void bna_search() //按书名查找函数 { cout<<”nt请输入您要查找的书名:“< char bna[20]; cin>>bna; int index=bm.bna_search(bna); if(index>=0) bm.show_book(index); else cout<<”nt对不起,系统无该书籍记录!“; cout<<”nt“; system(”pause“); bsearch_menu(); } void bau_search() //按作者查找函数 { cout<<”nt请输入您要查找的作者:“< char bau[10]; cin>>bau; int index=bm.bau_search(bau); if(index>=0) bm.show_book(index); else cout<<”nt对不起,系统无该书籍记录!“; cout<<”nt“; system(”pause“); bsearch_menu(); } void addBook() //新增书籍函数 { char numb[10]; //书号 char nameb[20]; //书名 char authorb[10];//作者 Book book; //书籍结构体对象book int tag1;input1:cout<<”nt请输入新书书号:“; cin>>numb; int index=bm.bnu_search(numb); if(index==-1) { cout<<”nt系统目前尚无该书记录,您可以继续操作!n“; cout<<”nt请输入新书书名:“; cin>>nameb; cout<<”nt请输入新书作者:“; cin>>authorb; tag1=0; book.set_bnum(numb); book.set_bname(nameb); book.set_bauthor(authorb); book.set_tag(tag1); bm.add(book); cout<<”nt恭喜您!新书资料录入成功!“; } else { cout<<”nt对不起,该书号纪录已存在!请重新输入!“; goto input1; } system(”pause“); admin_menu();} void reviseBook() //修改书籍函数 { char numb[10]; char nameb[20]; char authorb[10]; Book book; int index=-1;input2: cout<<”nt请输入您要修改书籍的书号:“; cin>>numb; index=bm.bnu_search(numb); if(index==-1) { cout<<”nt对不起,您输入的书号不存在,请重新输入!“< goto input2; return; } bool sta=bm.in(index);//判断是否在馆 if(sta) { cout<<”nt该书目前处于<在架>状态,您可以继续操作!“; cout<<”nt请输入更改后的书名:“; cin>>nameb; cout<<”nt请输入更改后的作者:“; cin>>authorb; book.set_bnum(numb); book.set_bname(nameb); book.set_bauthor(authorb); bm.revise(book,index); cout<<”nt恭喜您!书籍资料修改成功!“;} else cout<<”nt该书已被借出,请于读者归还后再进行相关操作!“< system(”pause“); admin_menu(); } void delBook() //删除书籍函数 { char numb[10]; cout<<”nt请输入您要删除书籍的书号:“; cin>>numb; int index=bm.bnu_search(numb); if(index>=0) { cout<<”nt您确定要删除该书记录吗(y/n) “; char y; cin>>y; if(y=='y'||y=='Y') { bm.deleteBook(index); cout<<”nt删除成功!“; } else cout<<”nt删除取消!“; } else cout<<”nt对不起,系统没有该图书记录!“; system(”pause“); admin_menu(); } void reviseReader()//修改读者用户函数 { char namer[10]; Reader reader;get1: cout<<”nt请输入你要修改读者用户的姓名: “; cin>>namer; int index=rm.search(namer); if(index==-1) { cout<<”nt对不起,系统无改读者记录,重新输入请按1,返回请按0: int a; cin>>a;get2: cin.ignore(); switch(a) { case 1: goto get1; break; case 0: system(“pause”); admin_menu(); break; default: cout<<“nt您的操作有误,请重新选择(0/1): ”; goto get2; } return; } “; else { char namer[10]; char classr[10]; char telr[10]; Reader reader; cout<<”nt请输入更改后的读者姓名:“; cin>>namer; cout<<”nt请输入更改后的班级名称:“; cin>>classr; cout<<”nt请输入更改后的联系电话:“; cin>>telr; reader.set_rname(namer); reader.set_rclass(classr); reader.set_rtel(telr); cout<<”nt是否真的修改该记录(y/n?):“; char y; cin>>y; if(y=='y'||y=='Y') { rm.revise(reader,index); cout<<”nt修改成功!n“; } else cout<<”nt操作取消!n“; } system(”pause“); admin_menu(); } void delReader() //删除读者用户函数 { cout<<”nt请输入您要删除的读者用户的姓名:“< char namer[10]; cin>>namer; int index=rm.search(namer); if(index>=0) { cout<<”nt是否真的删除该记录(y/n?): “; char y; cin>>y; if(y=='y'||y=='Y') { rm.delete_reader(index); cout<<”nt删除成功!n“; } else cout<<”nt操作取消!n“; } else cout<<”nt对不起,系统尚无该读者记录!“; system(”pause“); admin_menu(); } };//********主函数******** int main(){ system(”color fd“);Menu menu;//定义菜单结构体对象menu cout<<”ttt 文计091-1 庞丽萍 200990514125 “;cout<<”ttt 当前日期:2011-6-22 星期三“;cout<<”ttt 当前时间:08:00 “;cout<<”nttt ★ 欢 “;cout<<”★ 迎 “; } cout<<”★ 进 “;cout<<”★ 入 ★nn";menu.log_menu();return 0;四.程序正确性验证 1主页面 2.管理员登陆页面 3.图书添加 五.课程设计过程中出现的问题、原因及解决方法 1.用户登录密码时,不能使用暗码来保护密码。(未解决成功)2.每个界面都能退出到主页面,而不是直接跳出系统。(以解决)3.书名字长太多影响书籍、作者、数量等之间的一一对应关系。(为解决成功) 六.课程设计的主要收获 通过这几天学习设计图书信息管理系统,认识到一切看似简单的事情只有自己动手做,明白了其中的原理才会更好的把它变成自己的东西。图书管理系统主要用到了文件的输入输出,以及利用简单的顺序查找知识,加深了对数据结构的理解与应用。对于这次的课程设计,首先,许多知识不仅仅只是课本上的,需要我们自己去图书馆或网上收集资料。其次,编程过程终遇到各种错误,需要我们耐心分析,讨论,最后得出正确结果。第三,程序无错,进行调试,然后进行加工修改优化。 七.对今后课程设计的建议 希望老师可以分小组做课程设计,题目可以相应的增大难度。分组可以锻炼团对合作能力,队员可以相互讨论解决问题,彼此能够激发更多的思想,做出更完善的作品,同时也防止了互相拷贝的情况,让每个同学都积极的参与到设计中,而不是坐享其成。 《财务管理CAI项目》修改意见 中山大学新华学院管理学系李安兰 针对该项目立项评审时专家提出,财务管理课程的内容涉及大量的数学运算,如何利用PPT课件解决的意见,现提出如下解决办法: 一、从教学经验来看,利用公式编辑程序“Microsoft公式3.0”能解决目前财务管理教学中的所有数学公式的输入问题。 二、学生在学习财务管理时,已经学习了《高等数学》等相关数学知识,财务管理学习中主要是一些基本的数学方法的运用,很少数学推导。目前碰到的最复杂的也就是等比数列的求和以及一元回归方程的运用,这些都已经在前面的教学中输入了ppt课件。 三、财务管理是一门理论和实践都比较成熟的专业课,一方面,很多复杂的数学计算在实践中已经通过列表等形式简化了,比如资金的时间价值计算中涉及的指数运算,财务管理就有复利终值系数表、复利现值系数表、年金终值系数表、年金现值系数表等附表,计算时比较简单;另一方面,教学中会运用大量的案例教学,利用PPT既节省板书时间,又有利于学生理解案例意思。总之,从08财务管理、08市场营销、08电子商务和08工商管理的教学实践来看,利用公式编辑程序Microsoft公式3.0,PPT课件的制作已经得以解决。另外,在教学过程中,为了强化某个知识点,会辅以必要的粉笔板书。从教学实践来看,利用PPT课件教学,不仅增加了数学方法的直观性,更节省了板书时间,提高了案例教学的效果。所以,笔者认为财务管理CAI课件项目是可行的。第四篇:图书管理系统 数据结构 课程设计
第五篇:财务管理CAI项目修改意见