神秘国度的爱情故事.docx
- 文档编号:24587635
- 上传时间:2023-05-29
- 格式:DOCX
- 页数:37
- 大小:604.26KB
神秘国度的爱情故事.docx
《神秘国度的爱情故事.docx》由会员分享,可在线阅读,更多相关《神秘国度的爱情故事.docx(37页珍藏版)》请在冰豆网上搜索。
神秘国度的爱情故事
软件综合课程设计
神秘国度的爱情故事
活期储蓄帐目管理
二〇一四年六月
神秘国度的爱情故事
1.问题陈述
输入要求:
输入由若干组测试数据组成。
每组数据的第1行包含一正整数N(1≤N≤50000),代表神秘国度中小村的个数,每个小村即从0到N-1编号。
接下来有N-1行输入,每行包含一条双向道路的两端小村的编号,中间用空格分开。
之后一行包含一正整数M(1≤M≤500000),代表着该组测试问题的个数。
接下来M行,每行给出A,B,C三个小村的编号,中间用空格分开。
当N为0时,表示全部测试结束,不要对该数据做任何处理。
输出要求:
对每一组测试给定的A,B,C,在一行里输出答案,即:
如果C在A和B之间的路径上,输出Yes,否则输出No。
2.程序代码
//神秘国度的爱情故事代码
#include
usingnamespacestd;
#defineMAXNODE100//图中顶点的最大个数
typedefcharElemType;//顶点的数据类型
structNode//定义边的表结点
{intadjvex;//邻接点在顶点向量中的下标
structNode*next;//指向下一邻接点的指针
};
typedefstruct//定义顶点结点
{ElemTypevertex;//顶点信息
Node*firstarc;//指向第一邻接点的指针
}VerNode;
typedefstruct
{VerNodevertices[MAXNODE];//定义邻接表
intvexnum,arcnum;//顶点和边的数目
}AlGraph;
AlGraphcreatgraph(AlGraphG){//建立图函数
inti,j,k;//i,j,k用于边和顶点的建立
Node*p;//用于新生成顶点的指针
cout<<"输入小村的个数:
"< cin>>G.vexnum; G.arcnum=G.vexnum-1; for(i=0;i { G.vertices[i].firstarc=NULL; } cout<<"输入道路两端小村的编号("< "< for(k=0;k { cin>>i>>j; p=(Node*)malloc(sizeof(Node)); p->adjvex=j; p->next=G.vertices[i].firstarc; G.vertices[i].firstarc=p;//用头插法 p=(Node*)malloc(sizeof(Node)); p->adjvex=i; p->next=G.vertices[j].firstarc; G.vertices[j].firstarc=p; } returnG; } intvisited[MAXNODE];//用于深度遍历记住遍历过的顶点 AlGraphG;//全局图 intw;//记住C【j】点 intcount=0;//计数器,深度优先后,保存是否在AB间 intcount1=0;//辅助计数器,判断ABC是否重复 voidDFS(AlGraphG,intA,intB,intC){//G为邻接表存储的图,从第v个顶点出发递归的深度优先遍历函数 if(A==C||B==C)count1++;//如果遍历到A或B点辅助计数器加一 visited[C]=1;Node*p; p=(Node*)malloc(sizeof(Node));//为p申请空间 p=G.vertices[C].firstarc;//指向c的第1邻接点的指针 while(p! =NULL) { if(! visited[p->adjvex]) {DFS(G,A,B,p->adjvex);}//访问p的顶点向量中的下标 if(p->adjvex==w&&count1==1) count=1;//如果辅助计数器为一且遍历返回到C时计数器为一 if(count==1)break; p=p->next;//遍历到已被遍历的顶点从此顶点的下一邻接点 } } voidIf(AlGraphG){//判断C是否在A和B之间,原理是判断是否在一次探测,还是产生回溯 intd;//d为判断的次数 cout<<"输入测试的次数: "< cin>>d; intA[10],B[10],C[10];//记住每次用于测试A、B、C的值 cout<<"输入A,B,C三个小村的编号("< "< for(inti=0;i {cin>>A[i]>>B[i]>>C[i];} cout<<"显示测试结果: "< for(intj=0;j { w=C[j]; DFS(G,A[j],B[j],C[j]); if(count==1) cout<<"YES恭喜你将找到命中的恋人"< if(count==0)cout<<"NO你将与她错过"< for(intk=0;k<=G.vexnum;k++) visited[k]=0; count=0; count1=0;//计数器清0 } } voidmain(){ cout<<"《故事背景介绍》\n"< cout<<"/*欢迎来到神秘国度,在神秘国度里你将找到命中的恋人*/\n"< cout<<"。 。 。 请按照提示信息寻找爱情。 。 。 \n"< G=creatgraph(G);//调用图建立函数 If(G);//调用判断函数 } 3.运行结果 4.设计体会与总结 通过此次的课程试验的练习,我有了很大的收获,同时也加深了对数据结构这门课程的理解,比如说: 图的邻接表存储,深度优先搜索树等。 在这次课程设计中,我感受最深的是学会了用”二分查找”的方法查找问题。 通过这次课程设计,我对C++编程有了更新的认识。 以前编程只是注重如何编写函数能够完成所需要的功能,凭单纯的意识和简单的语句来堆砌出一段程序。 现在编程有了深刻的感觉。 在编写一个程序之前,自己能够综合考虑各种因素,选取我们需要的数据结构,在编写每一个函数之前,仔细斟酌比对,挑选出最适合当前状况的算法。 这样,即使在完整的程序还没有写出来之前,我们心中已经有了明确的原图了,这样在无形中就提高了我们编写的程序的质量。 另外,还体会到深刻理解数据结构的重要性。 只有真正理解这样定义数据类型的好处,才能用好这样一种数据结构。 了解典型数据结构的性质也是非常有用的,而它往往是我们编写程序的关键。 活期储蓄帐目管理 1.问题陈述 活期储蓄处理中,储户开户、销户、存入、支出活动频繁,系统设计要求: (1)能比较迅速地找到储户的帐户,以实现存款、取款记账; (2)能比较简单,迅速地实现插入和删除,以实现开户和销户的需要。 2.需求分析 需要先建立结本程序点类模板,然后使用链表的基本操作应用实现各个程序的实现,头插法先建立链表使之成当前操作数据基础,然后可以使用节点的删除进行储户的销户,结点的插入的应用成为程序的开户(注意: 建立新的用户要先确认新建的用户号不可以与之前的用户号码相同,引起系统错误! 本程序应用链表节点的比较改进程序。 )。 储户的存取也是应用节点的比较查找之后进行的账户钱数加减。 程序的执行命令操作: (1)建立节电类模板,构建链表 (2)输入储户信息 (3)执行各项操作(数据测试): ①查询储户信息 ②开户 ③储户支取信息查询 ④储户的程序销户 ⑤程序完成 (4)程序退出 3.概要设计 (1)结构设计说明 1.本程序主要应用数据结构节点类模板,首先构建节点类模板,在建立已有储户数据中对头结点(*head)分配动态存储空间,对头结点的邻接点(head->next)赋初值,循环插入新结点建立储户数据(头插法)。 在账号循环插入中进行账号重复判断。 2.在查找账户的过程中,应用结点下移继续查找,实现账户正确查找应用。 3.在销户过程中,进行结点删除,从而实现储户的销户。 4.在开户过程中,定义新结点,分配新的存储空间,进行结点插入,在账号循环插入中进行账号重复判断,完成开户过程。 5.在存取记录过程中,应用结点下移进行循环查找账户信息,显示账户信息。 6.主函数测试。 (2)程序流程图 4.详细设计 //活期储蓄帐目管理 #include #include usingnamespacestd; template classNode { public: Node stringname; Tdata; longintnumber; }; template classSavingList { public: SavingList(){}; Node voidSearchAccount(longintx); Node Node voidRecord(longintx,inty); private: Node }; template Node : CreatSavingList() { head=newNode intk=1;//分配动态空间 Node head->next=NULL;//赋初值 longintnumber,Number; intdata; stringname; cout<<"请输入账户号(八位整数): "; cin>>number; Number=number; cout<<"请输入姓名: "; cin>>name; cout<<"请输入账户余额: "; cin>>data; while(number/1e7>=1&&number/1e7<=10) {p=newNode q=newNode p->number=number;//节点初值 p->name=name; p->data=data; p->next=head->next;//将p插入连中 head->next=p; cout<<"是否继续输入信息按1继续输入按0退出"< cin>>k; if(k==0) break; cout<<"请输入账户号(八位整数): "; cin>>number; q=head->next; while(q)//账号的重复判断 { if(q->number==number) { cout<<"账号已存在! "< break; } else q=q->next; } if(! q) { cout<<"请输入姓名: "; cin>>name; cout<<"请输入账户余额: "; cin>>data; } } returnhead; } template voidSavingList : SearchAccount(longintx) { if(x/1e7<1||x/1e7>10) { cout<<"您输入的账户不存在"< return; } Node p=head; while(p! =NULL&&p->number! =x) { p=p->next;//向下移位继续查找 } if(p==NULL) { cout<<"您输入的账户未找到"< } else { cout<<"账户名: "< cout<<"账户号码: "< cout<<"账户余额: "< } } template Node : DeleteAccount(longintx) { Node p=head; while(p! =NULL&&p->number! =x) { q=p; p=p->next; } if(p==NULL) { cout<<"您输入的账户已不存在"< } else { q->next=p->next;//将q删掉 } returnhead; } template Node : InsertAccount(longintx) { Node q=newNode charw[10];//名字 inti; p=head; q->number=x; q->next=p->next; p->next=q;//插入q(新的账号) cout<<"请输入姓名: "; cin>>w; cout<<"请输入余额: ";cin>>i; q->name=w; q->data=i; cout<<"您的新账户的信息是: "< cout<<"账户名: "< cout<<"账户号码: "< cout<<"账户余额: "< returnhead; } template voidSavingList : Record(longintx,inty) { Node p=head; while(p! =NULL&&p->number! =x)//循环查找P的相同正确值节点下移 { p=p->next; } if(p==NULL) cout<<"您输入的账户不存在"< else { p->data=p->data+y; if(p->data<0) cout<<"余额不足请充值! "< else { cout<<"目前您的账户信息: "< cout<<"账户名(八位): "< cout<<"账户号码: "< cout<<"账户余额: "< } } } intMenu() { intn; cout<<"--------------------------Menu---------------------------"< cout<<"\t1.查询账户2.开户\n\n"< cout<<"\t5.退出"< cout<<"---------------------------------------------------------"; cout< do { cout<<"请输入你的选择(1--5): \n"< cin>>n; } while(n<1||n>5); returnn; } intmain() { SavingList Node head=T.CreatSavingList(); longintx; inty,n; for(;;) { switch(Menu()) { case1: { cout<<"请输入您要查询的账户: "; cin>>x; T.SearchAccount(x); cout<<"是否需要继续进行操作? 是请输入1,放弃则输入0: "; cin>>y; if(y==1) { cout<<"-----------------------------------------------------\n\n\n"; cout<<"\t1.支出存入2.销户\n\n"; cout<<"-----------------------------------------------------\n\n\n"; do { cout<<"请输入你选择的操作: "; cin>>n; } while(n! =1&&n! =2); if(n==1) { cout<<"请输入你存取的钱数: "; cout<<"存入钱数在前加“+”,取出钱数在前加“-”"< inta; cin>>a; T.Record(x,a); } if(n==2) { cout<<"销户请输入1,不进行操作输入0! : "; intb; cin>>b; if(b==1) T.DeleteAccount(x); } } } break; case2: { longintc; Node q=head->next; cout<<"请输入您的账号(八位): "; cin>>c; while(q) { if(q->number==c) { cout<<"账号已存在! "< break; } else q=q->next; } if(! q) { while(c/1e7<1||c/1e7>10) { cout<<"输入的位数不正确: "; cin>>c; } T.InsertAccount(c); } } break; case3: { longintr; intt,l; cout<<"请输入执行操作的账号: "; cin>>r; cout<<"请输入你存取的钱数: "; //cout<<"存入钱数在前加“+”,取出钱数在前加“-”"< cin>>t; T.Record(r,t); cout<<"继续操作请输入1,退出输入0: "< cin>>l; while(l==1) { cout<<"请输入执行操作的账号: "; cin>>r; cout<<"请输入你存取的钱数: "; cout<<"存入钱数在前加“+”,取出钱数在前加“-”"< cin>>t; T.Record(r,t); cout<<"继续操作请输入1,退出输入0"< cin>>l; } } break; case4: { longintk; intm; cout<<"请输入你想要消掉的账户(请选择以上已有的): "; cin>>k; while(k/1e7<1||k/1e7>9) { cout<<"输入的位数不正确: "; cin>>k; } T.DeleteAccount(k); cout<<"继续操作请输入1,退出输入0"< cin>>m; while(m==1) { cout<<"请输入要销掉的账户: "; cin>>k; while(k/1e7<1||k/1e7>10) { cout<<"输入的位数不正确,请你确认后再进行操作! : "; } T.DeleteAccount(k); cout<<"继续操作请输入1,退出输入0"< cin>>m; } } break; case5: exit(0); } } return0; } 5.程序代码 #include #include usingnamespacestd; template classNode { public: Node stringname; Tdata; longintnumber; }; template classSavingList { public: SavingList(){}; Node
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 神秘 国度 爱情故事