1、5.1.3 张越测试 275.2 组装与系统测试 305.3 系统运行 316 课题总结 326.1 课题评价 326.2 团队协作 326.3 个人设计小结(按组员分工) 326.3.1 余灏然设计小结 326.3.2 魏嘉设计小结 326.3.3 张越设计小结 337 附录A 课题任务分工 34A-1 课题程序设计分工 34A-2 课题报告分工 35 附录B 课题设计文档(光盘) B-1课程设计报告(电子版) B-2源程序代码(*.H,*.CPP) B-3工程与可执行文件) B-4屏幕演示录像文件(可选) 附录C 用户操作手册(可选) 36C.1 运行环境说明 36C.2 操作说明 36
2、1课题概述1.1 课题任务我们选择利用线段树这种结构来建立一个车票购票系统。【设计要求】1.2 课题原理 线段树,类似区间树,是一个完全二叉树,它在各个节点保存一条线段(数组中的一段子数组),主要用于高效解决连续区间的动态查询问题,由于二叉结构的特性,它基本能保持每个操作的复杂度为O(lgN)!流程图如下:1.3相关知识前序遍历树,将树变成链表,用于存储;Si与Sj用于测试,可删除;2需求分析2.1 课题调研线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点。对于线段树中的每一个非叶子节点a,b,它的左儿子表示的区间为a,(a+b)/2,
3、右儿子表示的区间为(a+b)/2+1,b。因此线段树是平衡二叉树,最后的子节点数目为N,即整个线段区间的长度。2.2 用户需求分析利用线段树高效快速的运行车票出售系统。功能需求 (1)输入功能和显示功能 (2)购买车票、查询车票余额 (3)添加、修改、删除站点信息 (4)读取文件功能和保存文件功能 (5)需要用户友好的界面以便用户方便使用3方案设计3.1 总体功能设计线段树3.2 数据结构设计前序遍历树,将树变成链表,用于存储。3.3 函数原型设计函数原型功能描述void TreeToList(Tree T,list &p) void ListToTree(Tree &T,list:itera
4、tor &iterP)链表还原成树int Loading(Tree &T) 读取数据将数据还原成树void print(list显示乘车顺序Tree Find(int a, Tree T) 寻找叶子void BuyTicket(int a,int b,int n,Tree &T)购票void Check()检查数据文件void welcome()初始界面显示void Inquire(Tree T,list查询车票数量void intitle(listp)站号对应站名的处理3.4主算法设计 线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点
5、。3.5 用户界面设计Dos界面输入后:4 方案实现4.1 开发环境与工具主要编程环境:Microsoft Visual Studio C+6.0 编程工具:C+。4.2 程序设计关键技术线段树及其应用:(1)C#语言的学习和Microsoft Visual Studio 2008的使用方法,因为未学习过此语言,学会使用C#和开发工具是程序设计的关键。(2)线段树的实现问题,线段树的实现还是相对复杂的,我们从网上,书籍查阅了许多资料,进行了多次debug才完成此部分。(3)多人程序的融合性问题,由于没怎么接触过多人写程序,每个人写的程序必须能够很好组合。4.3.1 余灏然设计实现Main函数#
6、includehead.hsave.cppStationName.cppbuy.cppcheck.cppinquire.cppframe.cppvoid main() list p; Tree T; int i,j,a,b,n,t=0; /t值用于判断第一次重新生成线段树时是否执行DelData(T),t=0不执行 t=1执行 Check(); /检查数据文件是否丢失 t=Loading(T); /读取线段树数据 Loading2(p); /读取站名链表数据 welcome(); while(1) system(cls);frame(); gotoxy(25,8);couti; if(i=1)
7、 while(1) print(p); coutendlj; if(j=1) coutabn; if(ab) BuyTicket2(a,b,n,T); if(j=2) Inquire(T,p); if(j=3) break; if(i=2) system(请选择(1.重新生成线段树 2.改变站名对应站号 3.删除树并初始化 4.返回 ): 请输入线段区间(a,b) 必须符合0a a.Sj=T- a.Snum=T-num; a.Snum2=T-num2; p.push_back(a); TreeToList(T-lchild,p);rchild,p); else a.k=0;/ a.Si=-1;
8、a.Sj=-1; /Si与Sj用于测试,可删除void SaveTree(Tree T) FILE *fp; SaveData h;iterator iterP=p.begin(); TreeToList(T,p); iterP=p.begin(); fp=fopen(TicketData.dat,wb h.k=iterP-k;h.Si=iterP-Si;h.Sj=iterP-Sj; h.Snum=iterP-Snum;h.Snum2=iterP-Snum2; fwrite(&h,sizeof(SaveData),1,fp); iterP+; if(iterP=p.end() break; S
9、aveData t; t.k=-1; /t-k=-1表链表尾 fwrite(&t,sizeof(SaveData),1,fp); fclose(fp);/ coutk=0) T=NULL; iterP+; if(!(T=(Btree*)malloc(sizeof(Btree) exit(-1); T-i=iterP- T-j=iterP-T-num=iterP-num2=iterP- ListToTree(T-lchild,iterP);rchild,iterP);T) /读取数据将数据还原成树iterator iterP;rb fread(& if(h.k=-1) cout-无数据内容。 r
10、eturn 0; while(h.k!=-1) / 判断是不是链表尾 p.push_back(h); fread(& ListToTree(T,iterP);数据读取成功,已生成树。 return 1;int DelData(Tree T) DestroyTree(T);wb+ / 不写入内容,即可清除数据inquire.cppTree Find(int a, Tree T);p) /查询车票数量 int i=0; Tree t; coutk,T); coutk号站-namename num) else iterP-; iterP-; iterP-;num2) else iterP+;4.3.
11、2 魏嘉设计实现head.h#ifndef _HEAD_H #define _HEAD_H / 运用 #ifndef避免重复定义 iostreamstdio.hwindows.hconio.h#include using namespace std;#define max 100 /每站票数的最大上限typedef struct Node int i,j; /分别表示线段树左右节点 int num; /存储数据,表示当前已出售票数 int num2; /返程 struct Node *lchild,*rchild;Btree,*Tree;typedef struct station int k
12、; /站点所对应的数字 char name20;staname;typedef struct save /k=1时储存节点信息, k=0时代表空格不存储其他信息,k=-1时表示链表尾 (NULL不知为何不好使=A=) int Si,Sj; int Snum; int Snum2;SaveData;int CreateTree(Tree &T,int a,int b) if(ba | a1 | b1) CreateTree(T-lchild,a,(a+b)/2);rchild,(a+b)/2,b);lchild=NULL;rchild=NULL;num=0; /初始化为0num2=0;void
13、DestroyTree(Tree &T) /删除时用这个,判断树是否已为空,若不空则执行Destroy(Tree T); int Destroy(Tree T); if(T-num=-1) Destroy(T);线段树已销毁。 /如果树不为空,则T-num=-1 else coutlchild);rchild); free(T);void PreOrder(Tree T) /前序遍历树ij!void gotoxy(int x,int y) /光标移动 x为列坐标,y为行坐标 COORD pos=x,y; HANDLE hOut=GetStdHandle(STD_OUTPUT_HANDLE);
14、SetConsoleCursorPosition(hOut,pos);#endifStationName.cppstring.hp) /站号对应站名的处理 void Loading2(listp); void firstuse(); char b20; staname h; iterP=p.begin(); fp=fopen(StationName.dath,sizeof(staname),1,fp); while(h.k!=0) couth.kh.name; p.push_back(h); iterP=p.begin(); fp=fopen( h.k=iterP- strcpy(h.name
15、,iterP-name); fwrite(& iterP+; if(iterP=p.end() break; h.k=0; fwrite(& fclose(fp); if(i=2) firstuse();p.clear(); if(i=3) break;void firstuse() /站名数据文件初始化 staname p; p.k=0;p,sizeof(staname),1,fp);void Loading2(listp) /读取站名链表数据buy.cppp) /显示乘车顺序 int i=1;乘车区间: while(i)号站:name; if(i=5) cout i=1; if( !( iterP=p.end()
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1