数据结构课程设计实验报告 安徽大学.docx
《数据结构课程设计实验报告 安徽大学.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计实验报告 安徽大学.docx(53页珍藏版)》请在冰豆网上搜索。
数据结构课程设计实验报告安徽大学
【实验一】
停车场管理系统
设计要求
1.问题描述
设计一个停车场管理系统,模拟停车场运作,此程序具备以下功能:
(1)若车辆到达,则显示汽车在停车场内或便道上的停车位置;
(2)若车辆离开,则显示汽车在停车场内停留的时间和应缴纳的费用(在便道上停留的时间不收费);
2.需求分析
(1)要求以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。
(2)要求处理的数据元素包括三个数据项:
汽车“到达”或“离去”信息、汽车牌照号码及到达或离去时刻。
(3)要求栈以顺序结构实现,队列以链表实现。
概要设计
1.主界面设计
为了实现“停车管理系统”的各项功能,首先为系统设计一个含有多个菜单的主控菜单子程序,以链接系统的各项子功能,方便用户使用本系统。
系统主控菜单运行界面如下:
2.存储结构设计
本系统采用顺序栈模拟停车场管理操作,以链表队列模拟便道停车管理操作。
以下是本系统中涉及的存储结构的定义:
typedefstruct{
int*base;
int*top;
intstacksize;
intcartime[m];
intchepaihao[m];
}SqStack;//栈的顺序存储表示
structList
{
intA[m+n];//记录车牌号信息
intB[m+n];//记录车辆到达时选择的车位号
intlen;//表示数组中元素个数
}L;
typedefstructQNode
{
//链队列元素结点类型
intdata;
structQNode*next;
}QNode,*QueuePtr;
typedefstruct
{
//链队列类型
QueuePtrfront;
QueuePtrrear;
}LinkQueue;
3.系统主要功能设计
本系统共采用3个功能模块,每个模块中又各自包含自己的子功能,各功能模块如下:
1.车辆到达;该模块将给用户提供两种停车选择,是场内停车还是便道停车方式,便于用户选择。
2.车辆离开;用户进入该界面,只要输入相关信息,系统将会显示用户在该停车场内停留的时间以及是否需要支付相应金额的停车费用等。
3.退出系统;方便用户退出本系统。
模块设计
1.模块设计
本程序包含4个模块,它们分别是:
主程序模块、菜单选择模块、栈操作模块、队列操作模块。
调用关系如图所示:
2.系统子程序及功能设计
1)voidInitshuzu()//初始化数组
2)voidtime()//时间函数
3)voidchepaihao()//输入的车牌号
4)voidInitStack(SqStack&S)//构造一个空栈s
5)voidpush(SqStack&S,inte)//车辆进入停车场场内停车
6)voidpop(SqStack&S,inte)//车辆离开停车场场内
7)voidInitQueue(LinkQueue&Q)//构造一个空队列Q
8)voidEnQueue(LinkQueue&Q,intelem)//车辆进入便道
9)voidDeQueue(LinkQueue&Q,int&e)//车辆离开便道
10)voidtingchefangshi()//选择停车方式,场内停车还是便道停车
11)voidlikai()//车辆离开
12)voidmain()//主函数
3.函数主要调用关系图
详细设计
1.数据类型定义
(1)栈的顺序存储结构体定义
typedefstruct{
int*base;
int*top;
intstacksize;
intcartime[m];
intchepaihao[m];
}SqStack;
(2)数组的结构体定义
structList
{
intA[m+n];//记录车牌号信息
intB[m+n];//记录车辆到达时选择的车位号
intlen;//表示数组中元素个数
}L;
(3)链队列元素结点的结构体定义
typedefstructQNode
{
intdata;
structQNode*next;
}QNode,*QueuePtr;
typedefstruct
{
QueuePtrfront;
QueuePtrrear;
}LinkQueue;
(4)全局变量定义
intz;
time_ta[m+n],end;
doubleA[m+n]={0};
intcount1=0,count2=0;//count1、count2分别用来统计场内停车数和便道停车数,并且初始化为0
2.系统主要子程序设计
(1)车辆进入停车场场内停车
voidpush(SqStack&S,inte)
{//车辆进入停车场场内停车
intstacksize=50;
if(S.top-S.base>=stacksize){//栈满,追加存储空间
S.base=(int*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(int));
if(!
S.base)exit(OVERFLOW);
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
}//push
(2)车辆进入便道停车
voidEnQueue(LinkQueue&Q,intelem)
{//车辆进入便道
QNode*s;
s=(QueuePtr)malloc(sizeof(QNode));
if(!
s)exit(OVERFLOW);
s->data=elem;
s->next=NULL;
Q.rear->next=s;
Q.rear=s;
}
(3)车辆离开场内
voidpop(SqStack&S,inte)
{//车辆离开停车场场内
e=*--S.top;
}//pop
(4)车辆离开便道
voidDeQueue(LinkQueue&Q,int&e)
{//车辆离开便道
QNode*t;
if(Q.front==Q.rear)
{
printf("便道内无任何车辆\n");
exit
(1);
}
else
{
t=Q.front->next;
e=t->data;
Q.front->next=t->next;
if(Q.rear==t)Q.rear=Q.front;
free(t);
}
}
(5)选择停车方式
voidtingchefangshi()
{//选择停车方式,场内停车还是便道停车
printf("请选择您的停车方式:
\n");
printf("1.场内停车\n");
printf("2.便道停车\n");
scanf("%d",&z);
switch(z)
{
case1:
{if(count1<=m){
printf("您选择的是:
1.场内停车\n");
printf("您的车位是:
%d号车位\n",count1);
chepaihao();
printf("\n");
printf("从现在开始为您计时,您的到达时间是:
\n");
time();
a[count1]=time(NULL);
count1++;
push(S,count1);
}
elseprintf("当前车位已满,请选择其他停车方式\n");
break;
return;
}
case2:
{if(count2<=n){
printf("您选择的是2.便道停车\n");
printf("您的车位是:
%d号车位\n",count2+m);
EnQueue(Q,count2);
chepaihao();
printf("\n");
printf("从现在开始为您计时,您的到达时间是:
\n");
time();
a[count2]=time(NULL);
count2++;
EnQueue(Q,count2);
}
elseprintf("当前车位已满,请选择其他停车方式\n");
break;
return;
}
default:
printf("您的输入有误,请重新输入!
\n");
return;
}
getch();
}
(6)车辆离开函数
voidlikai()
{
inti;
printf("请输入您的车位号:
\n");
scanf("%d",&i);
if(i>=0&&i<=m)
{
end=time(NULL);
A[i]=difftime(end,a[i]);
printf("您在停车场内停留时间为:
%0.2f秒\n",difftime(end,a[i]));
printf("您所需支付金额为:
%0.2f元\n",difftime(end,a[i])*j);
printf("感谢您的使用,欢迎下次光临!
");
count1--;
}
elseif(i>m&&i<=m+n)
{
end=time(NULL);
A[i]=difftime(end,a[i]);
printf("您在停车场内停留时间为:
%0.2f秒\n",difftime(end,a[i]));
printf("您的服务是免费服务,感谢您的使用,欢迎下次光临!
");
count1--;
}
elseprintf("您的输入有误,请重新输入!
");
}
测试分析
系统运行主界面如下:
1.车辆到达界面
车辆到达后需要选择相应的停车方式,主要有两种方式,场内停车方式和便道停车方式。
2.车辆离开界面
车辆离开时需要输入自己的车位号,系统会自动判别你的停车方式,提供相关服务
3.车辆进入场内停车
4.车辆进入便道停车
5.车辆离开场内
6.车辆离开便道
源程序清单
#include
#include
#include
#include
#include
#include
#definem50//停车场内总容纳量m,车位号依次为:
1—50
#definen50//停车场便道容纳量n,车位号依次为:
51-100
#definep3//车牌号码的位数000-999
#defineSTACK_INIT_SIZE100
#defineSTACKINCREMENT10
#defineOVERFLOW0
#defineT100
intz;
time_ta[m+n],end;
doubleA[m+n]={0};
#definej0.001//停车场内收费标准0.001元/秒
intcount1=0,count2=0;//count1、count2分别用来统计场内停车数和便道停车数,并且初始化为0
typedefstruct{
int*base;
int*top;
intstacksize;
intcartime[m];
intchepaihao[m];
}SqStack;//栈的顺序存储表示
structList
{
intA[m+n];//记录车牌号信息
intB[m+n];//记录车辆到达时选择的车位号
intlen;//表示数组中元素个数
}L;
typedefstructQNode
{
//链队列元素结点类型
intdata;
structQNode*next;
}QNode,*QueuePtr;
typedefstruct
{
//链队列类型
QueuePtrfront;
QueuePtrrear;
}LinkQueue;
voidInitshuzu()
{//初始化数组
for(inti=1;i<=m+n;i++)
L.B[i]=0;
L.len=0;
};
voidtime()
{//时间函数
time_ttimep;
time(&timep);
printf("现在时刻:
%s",ctime(&timep));
}
voidchepaihao()
{//输入的车牌号
intch[p];
inti;
printf("请输入您的车牌号:
");
for(i=0;i<3;i++)
scanf("%d",&ch[i]);
printf("\n");
printf("您输入的车牌号码为:
\n");
for(i=0;i<3;i++)
{
printf("%d",ch[i]);
}
}
voidInitStack(SqStack&S){
//构造一个空栈s
S.base=(int*)malloc(STACK_INIT_SIZE*sizeof(int));
if(!
S.base)exit(OVERFLOW);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
}
SqStackS;
voidpush(SqStack&S,inte)
{//车辆进入停车场场内停车
intstacksize=50;
if(S.top-S.base>=stacksize){//栈满,追加存储空间
S.base=(int*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(int));
if(!
S.base)exit(OVERFLOW);
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
}//push
voidpop(SqStack&S,inte)
{//车辆离开停车场场内
e=*--S.top;
}//pop
voidInitQueue(LinkQueue&Q)
{//构造一个空队列Q
Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));
if(!
Q.front)exit(OVERFLOW);
Q.front->next=NULL;
}
LinkQueueQ;
voidEnQueue(LinkQueue&Q,intelem)
{//车辆进入便道
QNode*s;
s=(QueuePtr)malloc(sizeof(QNode));
if(!
s)exit(OVERFLOW);
s->data=elem;
s->next=NULL;
Q.rear->next=s;
Q.rear=s;
}
voidDeQueue(LinkQueue&Q,int&e)
{//车辆离开便道
QNode*t;
if(Q.front==Q.rear)
{
printf("便道内无任何车辆\n");
exit
(1);
}
else
{
t=Q.front->next;
e=t->data;
Q.front->next=t->next;
if(Q.rear==t)Q.rear=Q.front;
free(t);
}
}
voidtingchefangshi()
{//选择停车方式,场内停车还是便道停车
printf("请选择您的停车方式:
\n");
printf("1.场内停车\n");
printf("2.便道停车\n");
scanf("%d",&z);
switch(z)
{
case1:
{if(count1<=m){
printf("您选择的是:
1.场内停车\n");
printf("您的车位是:
%d号车位\n",count1);
chepaihao();
printf("\n");
printf("从现在开始为您计时,您的到达时间是:
\n");
time();
a[count1]=time(NULL);
count1++;
push(S,count1);
}
elseprintf("当前车位已满,请选择其他停车方式\n");
break;
return;
}
case2:
{if(count2<=n){
printf("您选择的是2.便道停车\n");
printf("您的车位是:
%d号车位\n",count2+m);
EnQueue(Q,count2);
chepaihao();
printf("\n");
printf("从现在开始为您计时,您的到达时间是:
\n");
time();
a[count2]=time(NULL);
count2++;
EnQueue(Q,count2);
}
elseprintf("当前车位已满,请选择其他停车方式\n");
break;
return;
}
default:
printf("您的输入有误,请重新输入!
\n");
return;
}
getch();
}
voidlikai()
{
inti;
printf("请输入您的车位号:
\n");
scanf("%d",&i);
if(i>=0&&i<=m)
{
end=time(NULL);
A[i]=difftime(end,a[i]);
printf("您在停车场内停留时间为:
%0.2f秒\n",difftime(end,a[i]));
printf("您所需支付金额为:
%0.2f元\n",difftime(end,a[i])*j);
printf("感谢您的使用,欢迎下次光临!
");
count1--;
}
elseif(i>m&&i<=m+n)
{
end=time(NULL);
A[i]=difftime(end,a[i]);
printf("您在停车场内停留时间为:
%0.2f秒\n",difftime(end,a[i]));
printf("您的服务是免费服务,感谢您的使用,欢迎下次光临!
");
count2--;
}
elseprintf("您的输入有误,请重新输入!
");
}
//主函数
voidmain()
{
system("color1f");
system("modecon:
cols=90lines35");
Initshuzu();
InitStack(S);
InitQueue(Q);
while
(1)
{
printf("\n*****************************欢迎光临ABC停车场*****************************\n");
printf("\n\n");
printf("1.车辆到达\n");
printf("2.车辆离开\n");
printf("3.退出系统\n\n");
time();
printf("\n提示:
选择后按回车键进入下一步操作\n");
printf("\n\n");
printf("\n*****************************欢迎光临ABC停车场*****************************\n");
printf("请选择您所需服务:
");
intc;
scanf("%d",&c);
switch(c)
{
case1:
{
system("cls");
printf("\n*****************************车辆到达界面*****************************\n");
tingchefangshi();
getch();
system("cls");
break;
}
case2:
{
system("cls");
printf("\n*****************************车辆离开界面*****************************\n");
likai();
getch();
system("cls");
break;
}
return;
getch();system("cls");
case3:
return;
getch();
system("cls");
default:
printf("您的输入有误!
请重新输入:
\n");
getch();
system("cls");
}
}
}
用户手册
1.本程序执行程序文件为“停车管理系统.exe”。
2.车辆进入停车场,场内允许及便道允许停车数分别为50个车位,依次为0-49和50-99,用户可根据自己需要进行适当更改,不影响程序执行。
3.程序中车牌号暂假定为3位,请用空格键隔开,否则将出现差错。
4.程序内每一界面跟换需要敲两次回车键方才有效,方便用户确认录入信息是否正确无误。
【实验二】
重言式判别问题
设计要求
1.问题描述
一个逻辑表达式如果对于其变元的任一种取值都为真,则称为重言式;反之,如果对于其变元的任一种取值都为假,则称为矛盾式;然而,更多的情况下,既非重言式,也非矛盾式。
试写一个程序,通过真值表判断一个逻辑表达式属于上述哪一种类型。
2.需求分析
(1)逻辑表达式从终端输入,长度不超过一行。
逻辑运算符包括“|”、“+”、“-”,分别表示或、与、非,运算优先程度递增,但可有括号改变,即括号内的运算优先。
逻辑变元为大写字母。
表达式中任何地方都可以含有多个空格符。
(2)若是重言式或矛盾式,可以只显示“TrueForever”或“FalseForever”,否则显示“Satisfactible”以及变量名序列,与用户交互。
若用户对表达式中变元取定一组值,程序就求