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