算法与数据结构说明书.docx
《算法与数据结构说明书.docx》由会员分享,可在线阅读,更多相关《算法与数据结构说明书.docx(66页珍藏版)》请在冰豆网上搜索。
![算法与数据结构说明书.docx](https://file1.bdocx.com/fileroot1/2023-1/6/67e151bb-36b4-4c6b-85db-79ba3b6a56df/67e151bb-36b4-4c6b-85db-79ba3b6a56df1.gif)
算法与数据结构说明书
算法与数据结构课程设计说明书
学生姓名:
文云杰学号:
11500103
班级:
2011级计算机科学与技术基地班
题目:
1队列实现的仿真技术预测理发馆的经营状况
题目:
2病人就医管理模拟问题
题目:
3长整数运算问题
题目:
4随机走步问题
题目:
5最短字符串问题
题目:
6猴子吃桃问题
题目:
7跳马问题
题目:
8数据删除
题目:
9排序比较
题目类型:
软件工程(R)
指导教师:
张永
题目1:
队列实现的仿真技术预测理发馆的经营状况
序言
理发馆营业情况模拟主要运用的数据类型就是队列,先进先出的数据特点,顾客在选择了所要级别的理发师后,如果有顾客在理发就需要排队,当前面的理完发后,先排队的顾客开始理发。
队列的选择,可以是顺序的,也可以是链式的队列,这儿选择链式队列(考虑到空间复杂度的需要)。
营业时间以及理发时间的产生分别由程序决定和随机产生一个半个小时到一个小时之间的数代表。
题目的要求考验了对队列的认识掌握程度。
数据类型:
链式队列:
结构体:
structnode
{
intcl;//理发师级别
node*link;
};
structqueue
{
node*front;
node*rear;
};
整型数组:
inta[4]={0,0,0,0};//椅子
inttim[2]={9,00};//时间(早上9点到下午6点)
各模块流程图及伪码算法:
函数Ya()是实现程序仿真的主题函数,通过case1、case2、case3选择语句模拟顾客的活动。
函数make(cl)是模拟顾客活动的具体函数实现,对花费时间ti,花费金钱money(),现在的时间tim[2]以及是否理发期间有顾客进来的判断、排队。
函数count()、count2(),是对总人数num1num2num3和排队人数b1b2b3的控制调节。
函数调用关系图:
调试分析
遇到的问题:
1.营业时间、理发时间的控制;通过一个一维整形全局变量数组,随机产生数解决。
2.怎样判断是否有顾客指定正在理发的理发师理发;通过给一个顾客理完后,提出提问是否有顾客指定正在理发的理发师理发?
来解决顾客排队的问题。
测试结果
执行结果通过产生随机数来进行,到下班时间后退出。
执行结果如下:
源程序:
#include
#include
usingnamespacestd;
intnum1=0;//一级理发师理发的总人数
intnum2=0;//二级理发师理发的总人数
intnum3=0;//三级理发师理发的总人数
intb1=0;//一级理发师排队的人数
intb2=0;//一级理发师排队的人数
intb3=0;//一级理发师排队的人数
inta[4]={0,0,0,0};椅子是否被占(0-空,1-被占)
inttim[2]={9,00};//时间(早上9点到下午6点)
structnode
{
intcl;
node*link;
};
structqueue
{
node*front;
node*rear;
};
queue*q1=newqueue;
queue*q2=newqueue;
queue*q3=newqueue;
voidinit(queue*q,intk)//初始化
{
q->front=newnode;
q->rear=q->front;
q->front->cl=k;
}
voidcount(intx)
{
if(x==1)
num1++;
elseif(x==2)
num2++;
elseif(x==3)
num3++;
}
voidcount1(intx)
{
if(x==1)
b1++;
elseif(x==2)
b2++;
elseif(x==3)
b3++;
}
voidcount2(intx)
{
if(x==1)
b1--;
elseif(x==2)
b2--;
elseif(x==3)
b3--;
}
intcount3(intx)
{
if(x==1)
returnb1;
elseif(x==2)
returnb2;
elseif(x==3)
returnb3;
return0;
}
voidenterqueue(queue*q,intx)//入队
{
count(x);
node*s=newnode;
s->cl=x;
q->rear->link=s;
q->rear=s;
}
voidmoney(intx)
{
if(x==1)
cout<<"您好!
您的消费金额是40元!
"<if(x==2)
cout<<"您好!
您的消费金额是30元!
"<if(x==3)
cout<<"您好!
您的消费金额是20元!
"<}
voidmake(intx)
{
intti=30+rand()%30;
intn=0;
cout<<"您好!
您所用时间为"<money(x);
tim[1]=ti+tim[1];
if(tim[1]>=60)
{
tim[0]++;
tim[1]=tim[1]-60;
}
cout<<"现在时间是:
"<cout<<"理发期间有几位顾客要该级别的理发师理发?
"<//cin>>s;
//cin>>n;
n=rand()%2;
cout<<"有"<"<for(inti=0;i{
count1(x);
cout<<"先生(女士),不好意思,请您稍等一会."<cout<<"您的编号为:
"<enterqueue(q1,x);
a[x]=1;
}
if(tim[0]>=18)
{
cout<<"下班时间到!
"<}
}
voidya()
{
cout<"<cout<<"请问您需要理发师的级别(1--3)"<intcl=0;
cl=rand()%3+1;
cout<<"需要级别为"<count1(cl);
cout<<"您的编号为:
"<switch(cl)
{
case1:
if((q1->front->cl==cl)&&a[cl]==0)
{
cout<<"请"<a[cl]=1;
make(cl);
count(cl);
count2(cl);
a[cl]=0;
}
else
{
cout<<"先生(女士),不好意思,请您稍等一会."<enterqueue(q1,cl);
}
break;
case2:
if(q2->front->cl==cl&&a[cl]==0)
{
cout<<"请"<a[cl]=1;
make(cl);
count(cl);
count2(cl);
a[cl]=0;
}
else
{
cout<<"先生(女士),不好意思,请您稍等一会."<enterqueue(q2,cl);
}
break;
case3:
if(q3->front->cl==cl&&a[cl]==0)
{
cout<<"请"<a[cl]=1;
make(cl);
count(cl);
count2(cl);
a[cl]=0;
}
else
{
cout<<"先生(女士),不好意思,请您稍等一会."<enterqueue(q3,cl);
}
break;
}
}
voiddeal()//数据处理总结
{
intnum=num1+num2+num3;
floata=60.0*7/num;
intb=b1+b2+b3;
floatc=(float)b/3;
cout<<"每位顾客平均逗留的时间是"<cout<<"顾客排队等候理发的队列长度平均值是"<intb1=num1*40+num2*30+num3*20;
cout<<"今天的营业额是"<cout<<"仍需完成服务的收尾工作时间为"<cout<<"一级理发师的创收是"<cout<<"二级理发师的创收是"<cout<<"三级理发师的创收是"<}
intmain()
{
init(q1,1);
init(q2,2);
init(q3,3);
intflag=1;
cout<<"欢迎光临!
"<while(flag)
{
ya();
if(tim[0]>=18)
flag=0;
}
cout<<"下班时间到!
"<cout<cout<<"-----------------------------------------------"<cout<<"今天的营业情况:
"<deal();
return1;
}
题目:
2病人就医管理模拟问题
关键字:
病人就医管理模拟问题
前言
病人就医管理模拟问题程序中涉及到排队问题,所以解决的方法也主要是运用队列来解决,此程序运用链式队列来解决问题,病人排队、就诊,分别是队列的入队出队,查看排队就是遍历一次队列,输出排队的病人的病历号。
数据类型
链式队列:
structnode
{
stringdata;
node*link;
};
structqueue
{
node*front;
node*rear;
};
函数的伪代码
init(queue*q)//初始化
申请一个node大小的空间,将front和rear初始化相等
enterqueue(queue*q,stringx)//进队
为q申请一个node大小的空间,将x进队,队尾rear指向q
deletequeue(queue*q,string*x)//出队
将队头front的
测试结果
源代码:
#include
#include
#include
usingnamespacestd;
structnode
{
stringdata;
node*link;
};
structqueue
{
node*front;
node*rear;
};
voidinit(queue*q)//初始化
{
q->front=newnode;
q->rear=q->front;
}
voidenterqueue(queue*q,stringx)//进队
{
node*s;
s=newnode;
s->data=x;
q->rear->link=s;
q->rear=s;
cout<}
intdeletequeue(queue*q,string*x)//出队
{
if(q->front==q->rear)
{
cout<<"没有人排队!
"<return0;
}
node*p;
p=q->front->link;
q->front->link=p->link;
if(q->rear==p)
q->rear=q->front;
*x=p->data;
return1;
}
voidya(queue*p)//遍历
{
intflag=1;
if(p->front==p->rear)
cout<<"没有人排队!
"<cout<while(flag)
{
if(p->front==p->rear)
flag=0;
cout<front->data<<"\t";
p->front=p->front->link;
}
}
intmain()
{
cout<<"-------------------菜单------------------"<cout<<"
(1)排队"<cout<<"
(2)就诊"<cout<<"(3)查看排队"<cout<<"(4)下班"<cout<<"-----------------------------------------"<intx;
cout<<"选择要实现功能的序号(1--4)"<cin>>x;
//srand(time(0));
//x=rand()%5+1;
//cout<queue*a=newqueue;
strings="000000";
init(a);
do{
switch(x)
{
case1:
cout<<"请输入病历号:
"<cin>>s;
cout<enterqueue(a,s);
break;
case2:
inti;
i=deletequeue(a,&s);
if(i==1)
cout<
break;
case3:
cout<<"现在排队的病人有:
"<ya(a);
cout<break;
case4:
cout<<"下班!
"<return1;
}
cout<<"选择要实现功能的序号(1--4,按0退出)"<cin>>x;
//x=rand()%5+1;
//cout<if(x==0)
break;
}while
(1);
return1;
}
题目:
3长整数运算问题
数据类型:
链表
structnode
{
intdata;
node*link;
};
主要函数伪代码
ya1(node*p,node*q)是长整形数字的输入,p和q作为头指针,用while语句,每次申请一个node的空间,将输入的数字x存到data中,头指针指向申请的新空间。
ya2(node*p,node*q)是两个数字的相加,num1num2分别是两个数字的长度,将两个数字同位的数字相加,存到新申请的空间中,长出来的数字直接存入申请的空间中,然后各位上大于9的数字减10,向前进一位。
ya3(node*p,node*q)是两个数字的相减,类似于两个数字的相加,小于减数的向后退一位。
voidya4(node*p,node*q)是两个数字的相乘,将每个链表的数字转换为一个数字,相乘得结果。
测试结果:
源程序:
#include
usingnamespacestd;
structnode
{
intdata;
node*link;
};
intnum1=0;
intnum2=0;
voidjiemian()
{
cout<<"请选择所要操作(1-5)"<cout<<"1------输入"<cout<<"2------相加"<cout<<"3------相减"<cout<<"4------相乘"<cout<<"5------退出"<}
voidya1(node*p,node*q)//数字的输入
{
node*a;
a=p;
node*b;
b=q;
node*s;
cout<<"输入第一个数字(输入-1结束):
"<intx,y;
while(x!
=-1)
{
cin>>x;
s=newnode;
s->data=x;
a->link=s;
a=s;
num1++;
}
cout<<"输入第二个数字(输入-1结束):
"<while(y!
=-1)
{
cin>>y;
s=newnode;
s->data=y;
b->link=s;
b=s;
num2++;
}
cout<<"第一个数字:
";
for(inti=1;i{
p=p->link;
cout<data;
}
cout<";
for(intj=1;j{
q=q->link;
cout<data;
}
cout<}
voidya2(node*p,node*q)//相加
{
node*a,*s;
a=newnode;
a->link=NULL;
p=p->link;
q=q->link;
for(inti=1;i<=num2;i++)
{
s=newnode;
s->data=p->data+q->data;
s->link=a->link;
a->link=s;
}
for(intj=num2;j{
s=newnode;
s->data=p->data;
s->link=a->link;
a->link=s;
}
cout<<"直接相加后为:
";
for(intk=1;k{
a=a->link;
cout<data;
}
cout<}
voidya3(node*p,node*q)//相减
{
node*a,*s;
a=newnode;
a->link=NULL;
p=p->link;
q=q->link;
for(inti=1;i<=num2;i++)
{
s=newnode;
s->data=p->data-q->data;
s->link=a->link;
a->link=s;
}
for(intj=num2;j{
s=newnode;
s->data=p->data;
s->link=a->link;
a->link=s;
}
cout<<"直接相减后为:
";
for(intk=1;k{
a=a->link;
cout<data;
}
cout<}
doubleya44(node*p)
{
doublex=0.0;
for(inti=1;i{
p=p->link;
x=x+p->data;
}
returnx;
}
voidya4(node*p,node*q)//相乘
{
doublex=ya44(p);
doubley=ya44(q);
//cout<<"***************"<//cout<//cout<cout<<"相乘得:
"<cout<<(double)x*y<}
voidya5()//退出程序
{
cout<<"退出程序!
"<exit
(1);
}
intmain()
{
node*a=newnode;
a->link=NULL;
node*b=newnode;
b->link=NULL;
intx;
jiemian();
cin>>x;
cout<do{
switch(x)
{
case1:
ya1(a,b);
break;
case2:
ya2(a,b);
break;
case3:
ya3(a,b);
break;
case4:
ya4(a,b);
break;
case5:
ya5();
}
cout<<"请选择所要操作(1-5)"<cin>>x;
cout<}while
(1);
return1;
}
题目:
4随机走步问题
数据类型:
结构体:
structpoint
{
intx;
inty;
};
主要函数伪代码:
申请一个point空间,定义四个全局变量n