数据结构与算法课程设计报告00.docx

上传人:b****4 文档编号:5736453 上传时间:2023-05-09 格式:DOCX 页数:43 大小:392.91KB
下载 相关 举报
数据结构与算法课程设计报告00.docx_第1页
第1页 / 共43页
数据结构与算法课程设计报告00.docx_第2页
第2页 / 共43页
数据结构与算法课程设计报告00.docx_第3页
第3页 / 共43页
数据结构与算法课程设计报告00.docx_第4页
第4页 / 共43页
数据结构与算法课程设计报告00.docx_第5页
第5页 / 共43页
数据结构与算法课程设计报告00.docx_第6页
第6页 / 共43页
数据结构与算法课程设计报告00.docx_第7页
第7页 / 共43页
数据结构与算法课程设计报告00.docx_第8页
第8页 / 共43页
数据结构与算法课程设计报告00.docx_第9页
第9页 / 共43页
数据结构与算法课程设计报告00.docx_第10页
第10页 / 共43页
数据结构与算法课程设计报告00.docx_第11页
第11页 / 共43页
数据结构与算法课程设计报告00.docx_第12页
第12页 / 共43页
数据结构与算法课程设计报告00.docx_第13页
第13页 / 共43页
数据结构与算法课程设计报告00.docx_第14页
第14页 / 共43页
数据结构与算法课程设计报告00.docx_第15页
第15页 / 共43页
数据结构与算法课程设计报告00.docx_第16页
第16页 / 共43页
数据结构与算法课程设计报告00.docx_第17页
第17页 / 共43页
数据结构与算法课程设计报告00.docx_第18页
第18页 / 共43页
数据结构与算法课程设计报告00.docx_第19页
第19页 / 共43页
数据结构与算法课程设计报告00.docx_第20页
第20页 / 共43页
亲,该文档总共43页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

数据结构与算法课程设计报告00.docx

《数据结构与算法课程设计报告00.docx》由会员分享,可在线阅读,更多相关《数据结构与算法课程设计报告00.docx(43页珍藏版)》请在冰点文库上搜索。

数据结构与算法课程设计报告00.docx

数据结构与算法课程设计报告00

计算机科学与技术学院

2007-2008学年第2学期

《算法与数据结构》课程设计报告

 

班级:

xxxxxxxxxA班

学号、姓名及成绩:

Xxxxxxxxxxxxx

Xxxxxxxxxxxxx

教师:

xxxxxx

完成日期:

2008-6-28

[所做题目及编号]:

1.2约瑟夫环

一.需求分析

约瑟夫问题的一种描述是:

编号为1,2,3……,n的n个人按照顺时针方向围坐在一圈,没人持有一个密码(正数)。

一开始任选一个正整数作为报数的上限值m从第一个人开始按顺时针方向自1开始报数,报到m时停止报数。

报m的人出列,将他的密码作为新的m的值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去直到所有人全部出列为止。

设计一个程序求出出列顺序。

结点类包括三个数据域:

存放序号、密码、指向下一个结点的指针。

动态分配大小,从键盘输入每个人的密码。

循环输入建立循环表,按照循环的条件序号既为人的序号。

二.算法设计(15分)

2.1概要设计

//结点类型。

structpeople

{

intNO;

intpass;

}node;

//重载的实现。

template

void*Link:

:

operatornew(size_t)

template

voidLink:

:

operatordelete(void*ptr)

//从链表的尾插入。

template

boolLList:

:

append(constpeople&T)

//找下一个结点。

template

voidLList:

:

prev()

//程序的主题。

template

voidLList:

:

getOut(int&it,int&sum)

2.2详细设计

结点类型

structpeople

{

intNO;

intpass;

}node;

template

classLink

{

private:

staticLink*firstNode;//静态数据成员的头结点。

public:

structpeopleelement;

Link*next;

Link(peopleelemval,Link*nextval=NULL)

{

element.NO=elemval.NO;

element.pass=elemval.pass;

next=nextval;

}

Link(Link*nextval=NULL)

{

next=nextval;

}

void*operatornew(size_t);//重载new函数。

voidoperatordelete(void*);//重载delete函数。

};

template

classLList

{

private:

Link*head;

Link*tail;

Link*fence;

voidinit()

{

head=tail=fence=newLink;

tail->next=head->next;//生成链表是要把它的头结点和尾结点连接起来构成循环链表。

//因为有一个空的头结点。

所以要把他的尾结点接到头结点的下一个指针。

}

voidremoveall()

{

while(head!

=NULL)

{

fence=head;

fence=fence->next;

deletefence;

}

}

public:

LList()

{

init();

}

~LList()

{

removeall();

}

boolinsert(constpeople&T);

boolremove(Elem&);

voidgetOut(int&,int&);

voidprev();//寻找下一个结点

boolappend(constpeople&T);//从链表的结尾插入

};

template

Link*Link:

:

firstNode=NULL;//静态数据成员的初始化。

//重载的实现。

template

void*Link:

:

operatornew(size_t)

{

if(firstNode==NULL)

return:

:

newLink;

Link*temp=firstNode;

firstNode=firstNode->next;

returntemp;

}

//重载的实现

template

voidLink:

:

operatordelete(void*ptr)

{

((Link*)ptr)->next=firstNode;

firstNode=(Link*)ptr;

}

//从链表的尾插入。

template

boolLList:

:

append(constpeople&T)

{

tail->next=newLink(T,head->next);//通过调用构造函数的初始化。

tail=tail->next;

returntrue;

}

template

boolLList:

:

remove(Elem&it)

{

if(tail==head)

returnfalse;

if(fence->next==NULL)

{

it=fence->element.pass;

cout<element.NO<<"--";

returntrue;

}

it=fence->next->element.pass;

cout<next->element.NO<<"--";

Link*temp=fence->next;

fence->next=temp->next;

if(temp==tail)

{

tail=fence;//当是尾结点的时候要把他的尾指针指向标记指针

}

deletetemp;

returntrue;

}

//找下一个结点。

template

voidLList:

:

prev()

{

if(fence->next!

=head)

fence=fence->next;

else

{

fence->next=head->next;

fence=fence->next;

}

}

//程序的主题//

template

voidLList:

:

getOut(int&it,int&sum)

{

intsign,n=1;

fence=tail;//因为是从报到数的上一个人开始找到的删除点。

所以要记得从head的上一个结点tail开始。

cout<<"输入m的初值:

";

cin>>sign;//报数值。

cout<<"正确的出列顺序为:

"<

while(sum>0)

{

if(sign>sum&&sign>1)//为避免多次的循环找数通过取模可以节省时间。

sign=sign%sum;

if(sign==n||sum==1)

{

remove(it);

sign=it;

sum--;

n=0;//重新做标记从下一个人1开始。

}

else

prev();//找下个结点。

n++;

}

}

流程图:

三.测试数据及结果分析(10分)

用户手册:

用户根据自己的需要,从键盘输入约瑟夫环的总人数,然后随机输入第一个开始报数的数字,创建循环表时应户需要输入每个人的密码,然后回车即可。

[所做题目及编号]:

2.7航空客运订票系统

一.需求分析

航空客运订票的业务活动包括:

查询航线、客票预订和办理退票等。

试设计一个航空客运订票系统,以使上述业务可以借助计算机来完成。

(1)每条航线涉及的信息有:

终点站名、航班号、飞机号、飞行周日、成员定额、余票量、已订票的客户名单(包括姓名、订票量、舱位等级1,2和3)以及等候替补的客户名单(包括姓名、所需票量)

(2)查询航线:

根据旅客提出的终点站名输出下列信息:

航班号、飞机号、星期几飞行,最近一天的日期和余票额;

(3)承担订票业务:

根据客户提出的要求(航班号、订票数额)查询该航班票额情况,若有剩余,为客户办理订票手续,输出座位号;若已满员或余票额少于订票额,则需重新询问客户要求,若需要,可登记排队候补。

(4)办理退票业务:

根据客户提供的情况(日期、航班),为客户办理退票手续,然后查询是否有人排队候补,首先询问排在第一的客户,若所退票额能满足他的要求,则为他办理订票手续,否则依次询问其他排队候补的客户。

二.算法设计(15分)

2.1概要设计

该程序的数据关系比较复杂。

分别有所有航线的汇总,每条航线的相关信息,已订票的客户名单,候补客户的名单等。

为此,我们构建了以下几个类:

AirLine(整个航班的信息)、CheckedList(已订票客户的名单)和WaitQueue(候补客户名单)等3个基本类。

另外设计了SingleLine、checked和wait三个结构体,存储相应的信息。

其中,AirLine和CheckedList由于是顺序表,采用链表存储,WaitQueue由于是先进先出的模式,采用队列存储。

2.2函数的功能及调用关系

该程序的主要函数及其功能实现是:

voidLoad(AirLinelines)//读入各条航线信息

voidPreconcert(AirLinelines,CheckedListlist,WaitQueuequeue)//客户办理订票

voidReturn(AirLinelines,CheckedListlist,WaitQueuequeue)//客户办理退票

voidSearch(AirLinelines)//查询航班信息

2.3详细设计

该程序的主要类设计如下:

1、航班信息类(AirLine):

structSingleLine

{

charEnd[20];

intnumber;

charFlight[20];

charweekday[5];

intMaxSize;

intleft;

wait*queue;

checked*list;

SingleLine*next;

};

classAirLine

{

friendvoidRun();

friendvoidLoad(AirLinelines);

friendvoidSearch(AirLinelines);

friendvoidPreconcert(AirLinelines,CheckedListlist,WaitQueuequeue);

friendvoidReturn(AirLinelines,CheckedListlist,WaitQueuequeue);

private:

SingleLine*front;

SingleLine*rear;

SingleLine*current;

intLineCount;

public:

intgetCount();

voidInsert(SingleLine*line);

voidsearch(char*end1);

AirLine();

virtual~AirLine();

};

2、已订票客户名单类(CheckedList):

structchecked

{

charname[20];//客户姓名

intcount;//订票量

intdegree;//舱位等级

checked*next;

};

classCheckedList

{

private:

checked*top;

checked*current;

intcount;

public:

intMaxSize;

checked*getTop();

intgetCount();

intDeleteNode(checked*list,intleft);

intInsert(checked*list,intcount1,intmax,intleft);

CheckedList();

virtual~CheckedList();

};

3、候补客户名单类(WaitQueue):

structwait

{

charname[20];

intcount;

wait*next;

};

classWaitQueue//(订票候补)

{

private:

wait*front;

wait*rear;

intQueueCount;

public:

wait*getFront();

intgetCount();

intgetFirst(CheckedListlist1,wait*queue,intleft);

wait*Insert(wait*queue,intcount);

WaitQueue();

virtual~WaitQueue();

};

三.测试数据及结果分析(10分)

测试数据存放在同目录下的airline.dat文件中。

程序功能演示如下:

四.总结与建议(5分)

这个程序的数据关系比较地复杂,用到了各种的数据结构形式,如链表、队列等综合在一起。

对于这种程序,在代码编写之前一定要事先想好它们的逻辑关系,理顺思路,然后再开始代码的实现,否则到后来就可能由于代码太乱而需要返工。

计算机科学与技术学院

2007-2008学年第2学期

《算法与数据结构》课程设计报告

 

班级:

060341A班

学号、姓名及成绩:

杨微

060341134

教师:

贺怀清

完成日期:

2008-6-28

[所做题目及编号]:

2.8电梯模拟

一.需求分析

1.1问题描述:

设计一个电梯模拟系统。

这是一个离散的模拟程序,因为电梯系统是乘客和电梯等“活动体”构成的集合,虽然他们彼此交互作用,但他们的行为是基本独立的。

在离散的模拟中,以模拟时钟决定每个活动体的动作发生的时刻和顺序,系统在某个模拟瞬间处理有待完成的各种事情,然后把模拟时钟推进到某个动作预订要发生的下一个时刻。

1.2基本要求:

(1)模拟某校五层教学楼的电梯系统。

该楼有一个自动电梯,能在每层停留。

五个楼层由上至下一次成为地下层、第一层、第二层、第三层、第四层,其中第一层是大楼的进出层,即是电梯的“本垒层”,电梯“空闲”时,将来到该层候命。

(2)乘客可随机地进出任何层。

对每个人来说,他有一个能容忍的最长等待时间,一旦等侯电梯时间过长,他将放弃。

(3)模拟时钟从0开始,时间单位为0.1秒。

人和电梯的各种动作均要耗费一定的时间单位(简记为t),比如:

有人进出时,电梯每隔40t测试一次,若无人进出,则关门;

关门和开门各需要20t;

每个人进出电梯均需要25t;

如果电梯在某层静止时间超过300t,则驶回一层候命。

(4)按时序显示系统状态的变化过程:

发生的全部人和电梯的动作序列。

二.算法设计(15分)

2.1概要设计

利用VC++的图形设计功能。

//初始定义

intx=500,s=0,w=0;//x是电梯位置,S是控制电梯走的步数,W是步长

inta[]={0,0,0,0,0},b[]={0,0,0,0,0},

c[]={0,0,0,0,0},d[]={0,0,0,0,0};

intf=0;//f=0上,f=1下

voidCDiantiView:

:

OnDraw(CDC*pDC)

//13个按钮的

voidCDiantiView:

:

OnButton()函数

//时钟函数

voidCDiantiView:

:

OnTimer(UINTnIDEvent)

2.2详细设计

voidCDiantiView:

:

OnDraw(CDC*pDC)

{

CPen*pPen=newCPen(PS_SOLID,10,RGB(0,0,0));

CPen*OldPen=pDC->SelectObject(pPen);

inti;

for(i=0;i<5;i++)

{

pDC->MoveTo(10,100+i*100);

pDC->LineTo(300,100+i*100);

}

pDC->Rectangle(CRect(20,x-80,60,x));

deletepPen;

pPen=newCPen(PS_SOLID,10,RGB(200,0,0));

pDC->SelectObject(pPen);

for(i=0;i<5;i++)

{

if(a[i]==1)

pDC->Ellipse(CRect(260,500-(60+100*i),270,500-(70+100*i)));

}

deletepPen;

pPen=newCPen(PS_SOLID,10,RGB(0,200,0));

pDC->SelectObject(pPen);

for(i=0;i<5;i++)

{

if(b[i]==1)

pDC->Ellipse(CRect(280,500-(60+100*i),290,500-(70+100*i)));

}

deletepPen;

pPen=newCPen(PS_SOLID,10,RGB(0,0,200));

pDC->SelectObject(pPen);

for(i=0;i<5;i++)

{

if(c[i]==1)

pDC->Ellipse(CRect(300,500-(60+100*i),310,500-(70+100*i)));

}

deletepPen;

pDC->SelectObject(OldPen);

}

 

voidCDiantiView:

:

OnButton1()

{

a[0]=1;

Invalidate();

}

voidCDiantiView:

:

OnButton2()

{

a[1]=1;

Invalidate();

}

voidCDiantiView:

:

OnButton3()

{

a[2]=1;

Invalidate();

}

voidCDiantiView:

:

OnButton4()

{

a[3]=1;

Invalidate();

}

voidCDiantiView:

:

OnButton5()

{

a[4]=1;

Invalidate();

}

voidCDiantiView:

:

OnButton6()

{

b[0]=1;

Invalidate();

}

voidCDiantiView:

:

OnButton7()

{

b[1]=1;

Invalidate();

}

voidCDiantiView:

:

OnButton8()

{

b[2]=1;

Invalidate();

}

voidCDiantiView:

:

OnButton9()

{

b[3]=1;

Invalidate();

}

voidCDiantiView:

:

OnButton10()

{

b[4]=1;

Invalidate();

}

voidCDiantiView:

:

OnButton14()

{

c[1]=1;

Invalidate();

}

voidCDiantiView:

:

OnButton15()

{

c[0]=1;

Invalidate();

}

voidCDiantiView:

:

OnButton13()

{

c[2]=1;

Invalidate();

}

voidCDiantiView:

:

OnButton12()

{

c[3]=1;

Invalidate();

}

voidCDiantiView:

:

OnButton11()

{

c[4]=1;

Invalidate();

}

 

voidCDiantiView:

:

OnTimer(UINTnIDEvent)

{

if(nIDEvent==0)

{

intp;

if(w!

=0)

{

s++;

x+=w;

Invalidate();

if(s==10)

{

s=0;

p=(500-x)/100;

if(w<0&&(a[p]==1||c[p]==1||b[p]==1))

{

w=0;

a[p]=0;

b[p]=0;

c[p]=0;

Invalidate();

}

elseif(w>0&&(b[p]==1||c[p]==1||a[p]==1))

{

w=0;

a[p]=0;

b[p]=0;

c[p]=0;

Invalidate();

}

}

}

}

elseif(nIDEvent==1)

{

intp1,i;

if(w==0)//havestoped

{

p1=(500-x)/100;

if(f==0)

{

for(i=p1;i<5;i++)

{

if(a[i]==1||c[i]==1||b[i]==1)

{

w=-10;

break;

}

}

if(w==0)

{

for(i=p1-1;i>=0;i--)

{

if(a[i]==1||b[i

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2