数据结构课设报告 模板.docx
《数据结构课设报告 模板.docx》由会员分享,可在线阅读,更多相关《数据结构课设报告 模板.docx(22页珍藏版)》请在冰豆网上搜索。
数据结构课设报告模板
数据结构课设报告
一.【需求分析】
1.输入
1.1.1输入来自文本文件和随机数发生器。
1.1.2由文件给出机场飞机起落的航班架次,由此在系统中生成一个航班表。
1.1.3由随机数发生器产生飞机存油的值,设满油为100,小于10为紧急情况。
2.输出
1.2.1每单位时间所发生的事情:
各队列中的内容,飞机等待起飞或降落的
时间。
1.2.2紧急降落的飞机数,跑道上的状况等。
1.2.3采用图形界面演示。
3.细节
1.3.1时间可以用时间节拍器模拟,一个单位时间为一个节拍。
1.3.2设在一个节拍中,空中的飞机消耗5个油。
1.3.3飞机到达机场用入队的方式表示。
1.3.4设计若干个队列放不同状况的飞机(如:
起飞、降落、紧急……)。
1.3.5飞机实体包括航班号、燃油、到达时间、进入跑道时间等。
1.3.6在图形动态演示起飞与降落过程。
(扩展要求)
二【数据结构设计】
2.1飞机类设计
classplane
{
public:
plane(){}
stringid;//航班号
time1tm;
intgas;//汽油
intgas1;//生育汽油
intpaodao;//跑道号
intshij;//实际起飞或降落时间
inttime;//判断用的时间
intkind;//区分降落起飞1为起飞,2为降落,0为正常降落,3为进入降落队列,5为紧急降落,6为已起飞
inttimy;//延误时间
voidshijian()//将小时和分钟化成同一单位
{
time=60*tm.hour+tm.min;
}
voidshijian1()//计算延误的时间
{
timy=shij-time;
}
};
2.2队列设计
classque
{
private:
public:
intst[NUM3];
intpoint;
que(){point=-1;}
voidpush(intx);
voidpop();
intfront();
};
voidque:
:
push(intx)
{
if(point<=NUM3-1)
{
point++;
st[point]=x;
}
}
intque:
:
front()
{
inti=st[0];
returni;
}
voidque:
:
pop()
{
inti=0;
for(i=0;i{
st[i]=st[i+1];
}
point--;
}
2.3时间结构体
structtime1
{
inthour;
intmin;
};
2.4头文件
#include"stdafx.h"
#include
#defineNUM322
usingnamespacestd;
#include
#include
#include
#include
#include
#include
#include
#include//就是需要引用这个图形库
#include
三.【详细设计】
3.1飞机类的操作
1.voidshow(planep[],intx)
将成员变量输出。
2.voidseparate(planep[],intx,planejl[],planeqf[],int&x1,int&x2)//分离起飞降落飞机,依据为kind种类1起飞,2降落
3.voidpaixu(planep[],intx)//将降落的飞机按时间顺序重新排序
依据飞机类中的shij(实际降落时间)
3.2txt读取函数
voidreadtxt(planep[],intx)//文件读取函数
{
inti=0;
ifstreamfile("数据.txt");
for(i=0;i{
file>>p[i].id;
file>>p[i].tm.hour;
file>>p[i].tm.min;
file>>p[i].kind;
p[i].shij=0;//初始化
p[i].paodao=0;//初始化
if(p[i].kind==1)
p[i].gas=100;//无实际意义
//elseif(p[i].kind==2)
//p[i].gas=10;//无实际意义,初始化值
p[i].shijian();
}
file.close();
}
3.3绘图函数
1.绘制基本框架
voiddraw(inttim)
{
charbuffer[100];//存储信息
setlinestyle(PS_DOT,10);
line(80,400,250,400);
line(80,500,250,500);
line(300,400,470,400);
line(300,500,470,500);
line(520,400,690,400);
line(520,500,690,500);
outtextxy(140,450,"一号跑道:
");
outtextxy(350,450,"二号跑道:
");
outtextxy(560,450,"三号跑道:
");
sprintf(buffer,"时间:
%5d",tim);
outtextxy(50,50,buffer);
}
2.飞机演示函数
voidpaixu(planep[],intx)//将降落的飞机按实际降落时间重新排序
voiddrawjl(stringx,intz,inty,IMAGE&img)1架降落
voiddrawqf(stringx,inty,IMAGE&img)1架起飞
voiddrawjl2(stringx1,stringx2,inty,IMAGE&img)2架降落
3.主程序
3.1程序框架设计:
首先通过文件读取函数读取txt中的内容,存入飞机类数组中。
然后根据plane类中的kind将飞机分为要起飞的飞机和要降落的飞机,并存入两个新的数组中,更记录个字个数。
While循环中设一个时间变量,每次循环变量+5。
这个循环完成了全部的数据处理。
在循环中首先判断起飞队列中的飞机,如果plane类中的time(计划时间)=tim,则进入起飞队列,计数器加一。
然后判断降落数组中的飞机。
首先time=tim的飞机随机产生油量,
弱<=10进入紧急队列,其计数器+1.否则进入普通降落队列,计数器+1.
接下来跟居起飞队列计数器判断处理。
=0不操作,=1出队一架飞机,分配1号跑道,记录类中实际起飞时间=tim,计数器减一,kind置6。
然后跟据紧急队列和普通降落队列处理降落飞机。
若紧急队列>2,出队两架飞机,分配2,3号跑道,kind=5,紧急降落.计数器减二。
若1紧急,1普通。
则普通分配2号跑道,紧急飞机分配3号跑道。
若无紧急飞机,2普通飞机,则分别分配2号,3号跑道,计数器减二。
普通飞机kind=0,紧急飞机kind=5;(两个队列总共不够两架飞机很简单,不叙述了)
之后将飞机油料扣除。
紧急队列飞机出队,油料-5,在进队。
操作计数器次数次。
普通降落队列出队,油料-5.若<=10进入紧急队列。
否则还回到普通降落队列。
同样操作计数器次数次。
这样就把这堆飞机合理安排起飞和降落了。
代码:
voidmain()
{
srand((unsigned)time(NULL));//随机数种子
planep[NUM3];//全部飞机
readtxt(p,NUM3);
intnum1=0;//起飞的飞机数
intnum2=0;//降落的飞机数
inti=0;
intj=0;
intm=0;
intkey=0;
intm1=0;
intn1=0;//起飞队列中飞机数量
intn2=0;//降落队列中飞机数量
intn3=0;//紧急状况飞机数量
//show(p,16);//显示读取的txt数据
planejl[NUM3];//目标降落的飞机
planeqf[NUM3];//目标起飞的飞机
separate(p,NUM3,jl,qf,num1,num2);
show(qf,num1);
cout<<"需要降落的飞机数为"<show(jl,num2);*/
inttim=450;//时间初始值7:
30
queq1;//起飞队列
queq2;//正常降落队列
queq3;//紧急降落队列
while(tim<=790)//时间结束值为13:
10
{
tim+=5;//机场系统时间
for(i=0;i{
if(qf[i].kind==1&&qf[i].time==tim)
{
n1++;
q1.push(i);
qf[i].kind=0;
}
}
for(i=0;i{
if(jl[i].kind==2&&jl[i].time==tim)
{
flag:
jl[i].gas=rand()%100;
jl[i].gas1=jl[i].gas;
if(jl[i].gas<=6)//防止产生油料不够导致直接坠毁的飞机
gotoflag;
if(jl[i].gas<=10)
{
n3++;
jl[i].kind=3;
q3.push(i);
}
elseif(jl[i].gas>10)
{
n2++;
jl[i].kind=3;
q2.push(i);
}
}
}
if(n1!
=0)//起飞函数
{
qf[q1.front()].shij=tim;
qf[q1.front()].paodao=1;
qf[q1.front()].kind=6;
q1.pop();
n1--;
}
if(n3>=2)//2架以上紧急飞机
{
jl[q3.front()].shij=tim;
jl[q3.front()].paodao=2;
jl[q3.front()].kind=5;
q3.pop();
jl[q3.front()].shij=tim;
jl[q3.front()].paodao=3;
jl[q3.front()].kind=5;
q3.pop();
n3-=2;
}
elseif(n3==1&&n2==0)//1架紧急,无正常飞机
{
jl[q3.front()].shij=tim;
jl[q3.front()].paodao=3;
jl[q3.front()].kind=5;
q3.pop();
n3--;
}
elseif(n3==1&&n2>=1)//1架紧急飞机,1架正常飞机
{
jl[q3.front()].shij=tim;
jl[q3.front()].paodao=3;
jl[q3.front()].kind=5;
q3.pop();
n3--;
jl[q2.front()].shij=tim;
jl[q2.front()].paodao=2;
jl[q2.front()].kind=0;
q2.pop();
n2--;
}
elseif(n3==0&&n2==1)//无紧急飞机,1架正常飞机
{
jl[q2.front()].shij=tim;
jl[q2.front()].paodao=2;
jl[q2.front()].kind=0;
q2.pop();
n2--;
}
elseif(n3==0&&n2>=2)//无紧急飞机,2架正常飞机
{
jl[q2.front()].shij=tim;
jl[q2.front()].paodao=2;
jl[q2.front()].kind=0;
q2.pop();
jl[q2.front()].shij=tim;
jl[q2.front()].paodao=3;
jl[q2.front()].kind=0;
q2.pop();
n2-=2;
}
for(i=0;i{
if(jl[i].kind==3)//准备降落的飞机油料-5
{
jl[i].gas1-=5;
}
}
for(i=0;i{
m=q2.st[i];
m1=jl[m].gas1;
if(m1<=10)
{
q3.push(m);
n3++;
for(j=i;j{
q2.st[j]=q2.st[j+1];
}
q2.point--;
n2--;
}
}
}
3.2图形界面演示:
简单算法:
利用EasyX实现简单绘图。
同样设置一个tim时间计数器。
此时注意飞机类中的对应时间不再是计划时间了,而是实际的起飞或降落时间。
跟据同一时间的飞机个数调用不同的绘图方法。
paixu(jl,num2);
for(i=0;i{
qf[i].shijian1();
cout<cout<<"实际起飞时间"<"<"<}
cout<for(i=0;i{
jl[i].shijian1();
cout<cout<<"实际降落时间"<"<cout<<"初始油料"<"<"<}
cout<cout<<"紧急降落的飞机有:
"<for(i=0;i{
if(jl[i].kind==5)
{
cout<cout<<"实际降落时间"<"<cout<<"初始油料"<"<}
}
cout<while(key==0)
{
printf("输入一个非零数进入图形演示界面\n");
scanf("%d",&key);
}
key=0;
flag2:
;
charbuffer[100];//存储信息
initgraph(800,600);
IMAGEimg;
loadimage(&img,("feiji.jpg"));
tim=450;
draw(tim);
while(tim<900)
{
sprintf(buffer,"时间:
%5d",tim);
outtextxy(50,50,buffer);
tim+=5;
for(i=0;i{
if(qf[i].shij==tim)
{
sprintf(buffer,"延误起飞时间:
%3d",qf[i].timy);
outtextxy(140,50,buffer);
drawqf(qf[i].id,tim,img);
}
}
for(i=0;i{
if(jl[i].shij==tim)
{
if(jl[i+1].shij==tim)
{
if(jl[i].paodao==2&&jl[i+1].paodao==3)
{
if(jl[i].kind==5)
{
sprintf(buffer,"本次飞机为紧急降落");
outtextxy(350,70,buffer);
}
if(jl[i+1].kind==5)
{
sprintf(buffer,"本次飞机为紧急降落");
outtextxy(560,70,buffer);
}
sprintf(buffer,"延误降落时间:
%3d",jl[i].timy);
outtextxy(350,50,buffer);
sprintf(buffer,"延误降落时间:
%3d",jl[i+1].timy);
outtextxy(560,50,buffer);
drawjl2(jl[i].id,jl[i+1].id,tim,img);
}
elseif(jl[i].paodao==3&&jl[i+1].paodao==2)
{
if(jl[i+1].kind==5)
{
sprintf(buffer,"本次飞机为紧急降落");
outtextxy(350,70,buffer);
}
if(jl[i].kind==5)
{
sprintf(buffer,"本次飞机为紧急降落");
outtextxy(560,70,buffer);
}
sprintf(buffer,"延误降落时间:
%3d",jl[i+1].timy);
outtextxy(350,50,buffer);
sprintf(buffer,"延误降落时间:
%3d",jl[i].timy);
outtextxy(560,50,buffer);
drawjl2(jl[i+1].id,jl[i].id,tim,img);
}
i++;
}
else
{
if(jl[i].paodao==2)
{
if(jl[i].kind==5)
{
sprintf(buffer,"本次飞机为紧急降落");
outtextxy(350,70,buffer);
}
sprintf(buffer,"延误降落时间:
%3d",jl[i].timy);
outtextxy(350,50,buffer);
}
elseif(jl[i].paodao==3)
{
if(jl[i].kind==5)
{
sprintf(buffer,"本次飞机为紧急降落");
outtextxy(560,70,buffer);
}
sprintf(buffer,"延误降落时间:
%3d",jl[i].timy);
outtextxy(560,50,buffer);
}
drawjl(jl[i].id,jl[i].paodao,tim,img);
}
}
}
}
MessageBoxA(0,"本次演示已结束!
","Notice",MB_OK);
getch();//按任意键继续
closegraph();//关闭图形界面
printf("再次观看请输入1-9,否则输入0\n");
scanf("%d",&key);
if(key!
=0)
{
gotoflag2;
}
else;
}
四.【测试】
后台数据正确,题目要求已达成
图形演示功能正常
五.【总结与提高】
十周的课程设计结束了,在这次的课程设计中不仅检验了我所学习的知识,也培养了我如何去把握一件事情,如何去做一件事情,又如何完成一件事情的方法和技巧。
在设计过程中,和同学们相互探讨,相互学习,相互监督。
我学会了运筹帷幄,学会了宽容,学会了理解,也学会了做人与处世,这次课程设计对我来说受益良多。
数据结构课程设计是我们专业课程知识综合应用的实践训练,着是我们迈向社会,从事职业工作前一个必不少的过程.“千里之行始于足下”,通过这次课程设计,我深深体会到这句千古名言的真正含义.我今天认真的进行课程设计,学会脚踏实地迈开这一步,就是为明天能稳健地在社会大潮中奔跑打下坚实的基础。
通过这次的课程设计,更是让我深刻认识到自己在学习中的不足,同时也找到了克服这些不足的方法,这也是一笔很大的资源。
在以后的时间中,我们应该利用更多的时间去上机实验,加强自学的能力,多编写程序,相信不久后我们的编程能力都会有很大的提高能设计出更多的更有创新的作品。
课程设计报告的格式要求。