停车场管理系统程序设计书 - 图文

更新时间:2024-07-08 08:35:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

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

信息工程学院 计算机科学与技术专业

题目:停车场管理系统

班级:计算机卓越111班 第10组

组长:

姓名: 学号: 组员:

姓名: 学号:

指导老师:曲朝阳、郭晓利、刘志颖

日期:2012年12月27日

1

程序设计书目录

一、程序设计目标……………………………………………….3 二、问题描述…………………………………………………...3 三、需求分析…………………………………………………….4 四、概要设计…………………………………………………….5 五、详细设计…………………………………………………….8 六、软件说明书…………………………………………………11 七、源程序清单………………………………………………..12 八、测试报告 ………………………………………………….28 九、课程设计总结……………………………………………..36

2

一、程序设计目标

1、通过本次课设进一步的了解栈和队列等有关概念。掌握栈和队列的建立,掌握栈和队列的基本操作,深入了解栈和队列的特性,以便在解决实际问题中灵活运用它们。

2、复习巩固C语言知识。通过C语言课程设计,使我们了解高级程序设计语言的结构,掌握基本的程序设计过程和技巧,更加了解C语言的好处和其可用性。进一步加深对C语言、数据结构、离散数学等基础技能的理解和掌握。

3、掌握基本的分析问题和利用计算机求解问题的能力,具备初步的高级语言程序设计能力。为后续各门计算机课程的学习和毕业设计打下坚实基础。

4、掌握工程软件设计的基本方法,强化上机动手编程能力,闯过理论与实践相结合的难关!让我们有一个既动手又动脑,独立实践的机会,锻炼我们的分析解决实际问题的能力。同时增加了同学之间的团队合作精神!更加体会到工作中团队合作的重要性和必要性!

二、 问题描述

※按照题目要求,我们把程序分为三个模块

a.车辆到达模块:设有一个可以停放n辆汽车的狭长停车场,它只有一个大门可以供车辆进出。车辆按到达停车场时间的早晚依次从停车场最里面向大门口处停放(最先到达的第一辆车放在停车场的最里面)。如果停车场已放满n辆车,则后来的车辆只能在停车场大门外的便道上等待。

b.车辆离开模块:一旦停车场内有车开走,则排在便道上的第一辆车就进入停车场。停车场内如有某辆车要开走,在他之后进入停车场的车都必须先退出停车场为它让路,待其开出停车场后,这些车辆再依原来的次序进场。每辆车在离开停车场时,都应依据它在停车场内停留的时间长短交费。如果停留在便道上的车未进停车场就要离去,允许其离去,不收停车费,并且仍然保持在便道上等待的车辆的次序。

3

c.显示模块:当需要列表显示时,系统判断输入值(1-3),如果输入1,则调用显示车场列表,如果输入2,则调用显示便道信息,如果输入3,则返回主菜单。

三、 需求分析

这个程序的关键是车辆的进站和出站操作,以及车辆的通道之间的相互关系。由于停车场是一个很窄的、一边开口的车道,先进后出,类似数据结构中的栈结构,故车场用顺序栈这种数据结构来描述。

外面的狭长的通道,先进后出,通道的车辆可以随时退出,故可用链式队列结构来描述。考虑到车场和通道在整个程序中都要用到,故把这两个变量定义为全局变量。本程序中的数据对象是汽车,可以认为车牌号是每个元素的关键项,不能重复,和现实中的一样,车的入场时间以及出场时间都将作收费项目来考虑。在通道上的车由于没有入场,故不用收取费用。

※功能实现方式:

(1).以栈S作为停车场,栈S1作为让路的临时停车点,队列Q作为车等待时用的便道,stack[Max+1]作为车场能够容纳的车辆数,num[10]作为车所在位置的编号,并且限定车场最多能够容纳10辆车.

(2).用户根据系统所规定并提示的要求输入有关内容,车场所能容纳的车辆数由收费人员来确定,车辆离开时,车主还可以得到收据,便于收费的管理使用,并且系统程序所提供的一些信息可通过特殊硬件显示出来,供车主了解信息,准确有效的停车。

(3).程序能够显示当前存车信息以及等待车的信息,便于管理人员对车辆进行管理,并且能够给等待中的车提供当前车场占用情况信息,便于他们能够及时的停车。

(4).程序执行的命令为:输入进站信息->输入出站信息->打印收据

(5).每组输入信息相应的输出信息为:如果是到达的车辆,则输出其在停车场中或便道上的位置;如果是离去的车辆,则输出其在停车场中停留的时间和应交的费用。

4

四、概要设计

1.数据结构说明

用到两个顺序栈:一个为车场栈;另一个为临时栈temp typedef struct Node {

CarNode *stack[MAX+1]; int top; }SeqStackCar;

一个链式队列结构,存储便道车辆信息: typedef struct Node {

QueueNode *head; QueueNode *rear; }LinkQueueCar;

2.算法说明 终端汽车读入数据包含三项: a.是“到达”还是“离开”; b.汽车牌照号码;

c.“到达”或“离开”的时刻。

3.功能模块说明 停车场管理系统含有三个模块,即:车辆到达、离开、列表显示停车场系统132车辆到达车辆离开列表显示

(图1) 以模块为单位分析算法

5

a.车辆到达模块:到达时有两种情况,即车场是否满,未满则直接进入停车场;满时,到便道等待。如图2。 车辆到达停车场是否满是否进入停车场进入便道

结束 (图2)

b.车辆离开模块:离开时,当车库为空时,提示没有车,结束;否则车辆离开。如图3。 车辆离开停车场是否空是否车辆离开提示没有车是便道是否有车车进入车场否结束

6

(图3)

c.显示模块:显示模块有两个显示选项,即:车场与便道。如图4。

列表显示判断输入值2.便道1.车场显示车场列表显示便道列表结束 (图4)

4、主要要点说明 a.主程序 Void main() { 声明定义

调用栈与队列的函数

主信息(输入初始操作信息) }

b.栈---实现栈抽象数据类型

c.队列---实现队列抽象数据类型 d.结构体---用于对对象及变量的管理 它们之间的调用关系如下:

7

主程序 ↓ 结构体 ↓ 栈 ↓ 队列

五、详细设计(实现程序模块的具体算法)

1.菜单选项

应用switch分支循环对应的数字类别,执行相应的系统功能。

2.动画

欢迎动画从屏幕下方上升,结束动画是从屏幕上方下落。动画

是由输出的图案叠加而成,输出一个图案便立刻清屏,接着输出下一时刻的图案,一次输出一次清屏便在人眼中形成动画效果。

开头动画

结束动画

3.停车场系统

a、结构体声明与定义

typedef struct time{ int hour;

8

int min;

}Time; /*时间结点*/

typedef struct node{ char num[10]; Time reach; Time leave;

}CarNode; /*车辆信息结点*/

typedef struct NODE{ CarNode *stack[Max+1]; int top;

}SeqStackCar; /*模拟车站*/

typedef struct car{ CarNode *data; struct car *next;

}QueueNode; /*队列信息结点*/

typedef struct Node{ QueueNode *head;

}LinkQueueCar; /*模拟通道*/

b、函数声明与定义

(1)主函数 void main() {//主程序 //初始化等 while(1){

scanf(...................);//根据提示信息输入想要的操作switch(k){//根据输入的数调用不同的函数 case 1:

9

case 2:

.................... } }

typedef struct **{

//用于创建不同结构体类型的指针与变量 }

void PRINT(CarNode *p){ //调用输出函数

Leave(*p,n)...................

根据求解时间值来求得费用,并通过收据打印出来 }

(2)功能函数的声明 ① void InitStack(SeqStackCar *,int n); 初始化栈

②int InitQueue(LinkQueueCar *); 初始化队列

③int Arrival(SeqStackCar *,LinkQueueCar *,int n); 车辆到达,登车牌号,没停满进栈。否则,进队列

④void Leave(SeqStackCar *,SeqStackCar *,LinkQueueCar *); 车辆离开,通过输入离开车辆的位置处理,然后调用PRINT(CarNode *p);函数进行收费,然后,判断便道上有没有车, 如果有,就进停车场。

⑤void ExitCar(SeqStackCar *,SeqStackCar *,LinkQueueCar *,int n); 车辆离开,通过输入车牌号而处理离开,然后调用PRINT(CarNode *p);函数进行收费,然后,判断便道上有没有车,如果有,就进停车场。

⑥void List(SeqStackCar,LinkQueueCar); 显示信息,用switch();函数选择显示车场与便道上的车辆情况,包括对void List1(SeqStackCar *S);void List2(LinkQueueCar *W);分别为车场和便道上的车辆情况 ⑦void PRINT(CarNode *p)

10

打印出站车的信息。

(3)库函数

Stdio.h /*标准输入/输出头文件*/

String.h /*包含字符串处理函数头文件*/

Stdlib.h /*包含动态存储与释放函数头文件*/ Malloc.h /*包含内存分配头文件*/

4.主要函数思想

本程序是个简单的栈与队列的应用程序,其所用的函数也是栈与队列的基本函数,但在编写函数时应特别注意它的面向对象性与窗口化设计,切身为使用者着想.所以在运用一些函数时调用的基本语句有太多的重复,其目的在于实现它本来的基本目的.

六、软件说明书

本系统为存车信息管理软件,能实现车场存车及便道存车信息的输入,输出,查找等功能,并建立和更新的存车费用信息保存于文件输出或打印。每辆车的相关信息包括:车牌号,进站时间,出站时间,存车位置,(非)会员停车费用等。

该程序是简单的用于运用栈与队列基本知识的工具,不能用于现实中,特别是栈“先进后出”的规则大大限定了该程序的推广,现实世界的车站管理系统比这个远远复杂的多。

--------------------------------------------------------- ※进入演示系统后首先会出现欢迎动画,是一个用户及管理员使用注意事项界面。

该停车场管理系统是个比较简单系统,在应用的时候请注意要求! 如果您有任何问题,请及时联系我们,谢谢合作!

╭------ ╮ ╰-╮ ╭-╯ ..____.╭╮╭╮.___.. ╭╯╰- ╯╰╮-╮ .._.. ╭-┴┴★ ╮ .._.. |◢█◣◢█◣ ||| .._...│ ︵ │ .._.. |██████ ||| .._...│◎ │.._.. |◥████◤ ||| ..※※※╰○---○╯※※※..

11

| ◥██◤ |╯╯ ............................... | ◥◤ | ★∵∴☆★∵∴★∵∴☆★∵∴☆ ╰=============╯

※进入注意事项界面后系统会提示你停车场所容纳的车辆数,输入可容纳车辆后(1-10),进入管理系统界面

◆ * ★☆★☆欢迎使用本停车管理系统☆★☆★ * ◆

*************************************************************** ※ --※ 1. 车辆到达 ※-- ※ ※ --※ 2. 车辆(位置 )离开 ※-- ※ ※ --※ 3. 车辆(车牌号)离开※-- ※ ※ --※ 4. 列表显示 ※-- ※ ※ --※ 5. 退出系统 ※-- ※

*************************************************************** *本停车场管理实行24小时制*\\n\

*本停车场有会员服务,会员0.05/每分钟,非会员0.1/每分钟*

请选择所需要的服务:1|2|3|4|5.

※这时可按照提示进行你想要的操作,对于1-5的具体操作与内容请详见前面的调试分析,您便可以轻松操作了! !注意事项:

1、注意按提示内容输入,以免出错。

2、本系统功能还需完善,操作简单,只是供学习之用,并不能作 为实际生活使用。 七、源程序清单

#include #include #include #include

/*------------------------------------------------------------------------------*/ #define Max 10 char NUM[10];

12

int getn() {

int n;

printf(\请输入停车场可容纳的车(最多10辆):\ scanf(\

fflush(stdin);/*用来清空输入缓存,以便不影响后面输入的东西*/ do{

if(n<1 || n>10) {

printf(\输入的车辆数不在要求范围内,请重新输入!\ scanf(\ fflush(stdin); }

else break; }

while(n<1 || n>10); return n; }

typedef struct time{ int hour; int min;

}Time; /*时间结点*/ typedef struct node{ char num[10]; Time reach; Time leave;

}CarNode; /*车辆信息结点*/ typedef struct NODE{

CarNode *stack[Max+1]; int top; int n;

}SeqStackCar; /*模拟车站*/ typedef struct car{ CarNode *data; struct car *next;

}QueueNode; /*队列结点*/ typedef struct Node{

13

QueueNode *head; QueueNode *rear;

}LinkQueueCar; /*模拟通道*/

void InitStack(SeqStackCar *,int n); /*声明栈*/ int InitQueue(LinkQueueCar *); /*声明便道*/

int Arrival(SeqStackCar *,LinkQueueCar *,int n); /*车辆进站*/

void Leave(SeqStackCar *,SeqStackCar *,LinkQueueCar *,int n); /*车辆出站*/

void List(SeqStackCar,LinkQueueCar); /*显示存车信息*/ /*开头动画*/ void dh1() { printf(\◆ * ★☆★☆欢迎使用本停车管理系统☆★☆★ * ◆ \\n\ printf(\╭/\☆------/\╮ ╭/\------☆/\ ╮\\n\ printf(\│ │ │ \ / │\\n\ printf(\│ ● ● │ │ ● ● │\\n\ printf(\│○ ╰———╯ ○ │ │ 〃╰┬┬┬╯〃 │\\n\ printf(\│ │ │ ╰—╯ │\\n\ printf(\│ │ │ │\\n\ printf(\╰—┬○———○┬—╯ ╰—┬○———○┬—╯\\n\ }

void set1() {

for (int i=15; i>1; i--) {

system(\

for (int j=0; j

printf(\ } dh1(); }

system(\ fflush(stdin); }

/*结束动画*/

void dh2() {

14

printf(\│\__╭╭╭╭╭__/│\\n\ printf(\│ │\\n\ printf(\│ │\\n\ printf(\│ │\\n\ printf(\│ ● ● │\\n\ printf(\│≡ ╰┬┬┬╯ ≡│\\n\ printf(\│ ╰—╯ │\\n\ printf(\│ │\\n\ printf(\│ │\\n\ printf(\╰——┬O———O┬——╯\\n\ printf(\ │ 欢迎下次 │ \\n\ printf(\ │ 光临 │ \\n\ printf(\ ╰┬———┬╯ \\n\}

void out2() {

for (int i=1; i<10; i++) {

system(\

for (int j=0; j

printf(\ }

dh2(); }

exit(0); }

void InitStack(SeqStackCar *s,int n) /*初始化栈*/ {

int i;

s->top=0;

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

s->stack[s->top]=NULL; }

int InitQueue(LinkQueueCar *Q) /*初始化便道*/ {

15

Q->head=(QueueNode *)malloc(sizeof(QueueNode)); if(Q->head!=NULL) {

Q->head->next=NULL; Q->rear=Q->head; return(1); }

else return(-1);/*结束*/ }

void PRINT(CarNode *p) /*打印出站车的信息*/ {

int A1,A2,B1,B2; int a,b,c; int i;//会员 char ch;

printf(\请输入离开的时间(小时:分钟):\

scanf(\ fflush(stdin);

do{/*直到程序输出正确的时间*/

if(p->leave.hourreach.hour || (p->leave.hour==p->reach.hour && p->leave.minreach.min)) {

printf(\输入离开时间比进站时间早,请重新输入!\\n\ scanf(\ fflush(stdin); }

if(p->leave.hour<0 || p->leave.hour>=24 || p->leave.min<0 || p->leave.min>=60) {

printf(\输入的时间格式有错!请重新输入:\

scanf(\ fflush(stdin); }

else break; }

while(p->leave.hourreach.hour || (p->leave.hour==p->reach.hour && p->leave.minreach.min) || p->leave.hour<0 || p->leave.hour>=24 || p->leave.min<0 || p->leave.min>=60);

16

printf(\车场现在有一辆车离开,请便道里的第一辆车进入车场!\\n\printf(\出站的车的车牌号为:\puts(p->num);/*把车牌号输出*/ printf(\

/*计算出正确的所需的钱数*/ A1=p->reach.hour; A2=p->reach.min; B1=p->leave.hour; B2=p->leave.min;

a=(B1-A1)*60+B2-A2; if(a>=60) {

b=a/60;/*停留时间中的小时*/ c=a-60*b;/*停留时间的分钟*/ } else {

b=0; c=a; }

printf(\请问你是否是会员(是1/否0):\while(1){

scanf(\ if (i==1) {

printf(\ 祝您一路顺风,欢迎您下次光临.\ printf(\ ★☆收 据★☆\\n\ printf(\ ★☆会员★☆\\n\ printf(\ 车牌号: \ puts(p->num); printf(\

printf(\ printf(\进车场时刻 | 出车场时刻 | 停留时间 | 应付(元)|\\n\

printf(\ printf(\ %d:%d\ printf(\ | %d:%d\ printf(\ | %d:%d\ printf(\ | %2.1f\

17

printf(\ |\\n\

printf(\

free(p);break; }

if(i==0) {

printf(\ 祝您一路顺风,欢迎您下次光临.\ printf(\ ★☆收 据★☆\\n\ printf(\ ★☆非会员★☆\\n\ printf(\ 车牌号: \ puts(p->num); printf(\

printf(\ printf(\进车场时刻 | 出车场时刻 | 停留时间 | 应付(元)|\\n\

printf(\ printf(\ %d:%d\ printf(\ | %d:%d\ printf(\ | %d:%d\ printf(\ | %2.1f\ printf(\ |\\n\

printf(\

free(p);break; } else

printf(\输入有错,请重新输入:\ fflush(stdin); // ch=getchar(); } }

int Arrival(SeqStackCar *Enter,LinkQueueCar *D,int n) /*车辆到达,Enter为车场的指针,D为便道队列的指针*/ {

CarNode *p;/*车辆结点p*/

18

QueueNode *t;/*队列结点t*/

p=(CarNode *)malloc(sizeof(CarNode)); flushall(); /*清空缓存区*/ int i;

printf(\请输入车牌号(例:A1234):\\n\gets(p->num);

if(Enter->top

Enter->top++;

printf(\车辆在车场第%d位置.\ fflush(stdin);

printf(\请输入到达时间(小时:分钟):\

scanf(\ fflush(stdin); do{ if(p->reach.hour<0 || p->reach.hour>=24 || p->reach.min<0 ||

p->reach.min>=60)

{

printf(\输入的时间格式有错,请重新输入:\

scanf(\ fflush(stdin); } else

break; } while(p->reach.hour<0 || p->reach.hour>=24 || p->reach.min<0 ||

p->reach.min>=60);

Enter->stack[Enter->top]=p; /*把p结点赋值给车站*/ return(1); }

else /*车场已满,车进便道*/ {

printf(\请该车在便道稍作等待!\\n\

t=(QueueNode *)malloc(sizeof(QueueNode));/*开辟一个队列结点,它的数据结点是p,它的指针结点是空,队列的头与尾都是此结点*/ t->data=p;

t->next=NULL; D->rear->next=t;

19

D->rear=t; return(1); } }

//车辆离开,输入车牌号离开

void ExitCar(SeqStackCar *Enter,SeqStackCar *Temp,LinkQueueCar *W,int n) {

int i=0,room,flag=0;/*room为要输出的位置*/ char num[10],*pnum;//字符串的比较

SeqStackCar *S;//开辟新的空间时是否是NULL空

CarNode *p,*t; //车辆本生的结点是p,车辆在队列中的结点是t QueueNode *q; //判断车场内是否有车,队列结点*q

pnum=num;

if(Enter->top>0) //车场有车 {

while(!flag) //输入离开车辆的信息 {

printf(\请输入出站车辆的车牌号:\ scanf(\

for(i=0;itop;i++)

if(strcmp(Enter->stack[i+1]->num,pnum)==0) {

room=i+1; flag=1;

fflush(stdin); }

else

printf(\第%d车位没有此车\\n\ fflush(stdin); }

while(Enter->top>room) /*车辆离开*/ {

Temp->top++;

Temp->stack[Temp->top]=Enter->stack[Enter->top];/*把剩余的车辆退出车站并送入临时栈内*/

Enter->stack[Enter->top]=NULL;/*栈顶为空*/

20

Enter->top--; }

p=Enter->stack[Enter->top]; /*p是离开车辆的结点*/ Enter->stack[Enter->top]=NULL; /*栈顶为空*/ Enter->top--;

while(Temp->top>=1) {

Enter->top++;

Enter->stack[Enter->top]=Temp->stack[Temp->top];/*把临时栈中的车辆重新开进车站*/

Temp->stack[Temp->top]=NULL; /*临时栈为空*/ Temp->top--; }

PRINT(p);

/*LXY判断通道上是否有车及车站是否已满*/

if((W->head!=W->rear)&&Enter->top

q=W->head->next; /*队列结点中头结点的指针结点*/ t=q->data;/*车辆队列中要出去的结点的数据*/ Enter->top++;

printf(\现在请便道上的车进入车场,该车的车牌号为:\ puts(t->num);

printf(\该车进入车场第%d位置.\

printf(\请输入现在的时间(即该车进站的时间)(小时:分钟):\ scanf(\ fflush(stdin);

do{/*控制到达的时间*/

if(t->reach.hour<0 || t->reach.hour>=24 || t->reach.min<0 || t->reach.min>=60) {

printf(\输入的时间格式有错,请重新输入!\

scanf(\ fflush(stdin); } // else

// break; }

21

while(t->reach.hour<0 || t->reach.hour>=24 || t->reach.min<0 || t->reach.min>=60);

W->head->next=q->next; if(q==W->rear)

W->rear=W->head; Enter->stack[Enter->top]=t; free(q); }

else printf(\目前便道里没有车.\\n\ }

/*车场没车*/

else printf(\目前车场里没有车,来车请直接进入车场!\\n\ }

void Leave(SeqStackCar *Enter,SeqStackCar *Temp,LinkQueueCar *W,int n) //车辆离开 {

int i, room;//room为要输出的位置

CarNode *p,*t; //车辆本生的结点是p,车辆在队列中的结点是t QueueNode *q; //判断车场内是否有车,队列结点q if(Enter->top>0) //车场有车 {

while(1) //输入离开车辆的信息 {

printf(\请输入要离开的车在车场的位置/1--%d/:\ scanf(\ fflush(stdin);

if(room>=1&&room<=Enter->top) break; }

while(Enter->top>room) //车辆离开* {

Temp->top++;

Temp->stack[Temp->top]=Enter->stack[Enter->top];//把剩余的车辆退出车站并送入临时栈内

Enter->stack[Enter->top]=NULL;//栈顶为空 Enter->top--; }

p=Enter->stack[Enter->top]; //p是离开车辆的结点 Enter->stack[Enter->top]=NULL; //栈顶为空

22

Enter->top--;

while(Temp->top>=1) {

Enter->top++;

Enter->stack[Enter->top]=Temp->stack[Temp->top];//把临时栈中的车辆重新开进车站

Temp->stack[Temp->top]=NULL; //临时栈为空 Temp->top--; }

PRINT(p);

//LXY判断通道上是否有车及车站是否已满

if((W->head!=W->rear)&&Enter->top

q=W->head->next; //队列结点中头结点的指针结点 t=q->data;//车辆队列中要出去的结点的数据 Enter->top++;

printf(\现在请便道上的车进入车场,该车的车牌号为:\ puts(t->num);

printf(\该车进入车场第%d位置.\

printf(\请输入现在的时间(即该车进站的时间)(小时:分钟):\ scanf(\ fflush(stdin);

do{//控制到达的时间

if(t->reach.hour<0 || t->reach.hour>=24 || t->reach.min<0 || t->reach.min>=60) {

printf(\输入的时间格式有错,请重新输入!\

scanf(\ fflush(stdin); } else

break; }

while(t->reach.hour<0 || t->reach.hour>=24 || t->reach.min<0 || t->reach.min>=60);

W->head->next=q->next; if(q==W->rear)

W->rear=W->head;

23

Enter->stack[Enter->top]=t; free(q); }

else printf(\目前便道里没有车.\\n\ }

//车场没车

else printf(\目前车场里没有车,来车请直接进入车场!\\n\ }

void List1(SeqStackCar *S) //列表显示车场存车信息 {

int i;

if(S->top>0) //判断车站内是否有车 {

printf(\车场:\

printf(\位置||到达时间||车牌号\\n\ for(i=1;i<=S->top;i++) {

printf(\ %d \ printf(\ %d:%d

\ puts(S->stack[i]->num); } }

else printf(\目前车场里没有车\}

void List2(LinkQueueCar *W)//LXY列表显示便道信息 {

QueueNode *p; p=W->head->next;

if(W->head!=W->rear) //判断通道上是否有车 {

printf(\目前正在等待车辆的号码为:\\n\ while(p!=NULL) {

puts(p->data->num); p=p->next; printf(\ }

24

}

else printf(\目前便道里没有车.\}

void List(SeqStackCar S,LinkQueueCar W) {

int tag; /*tag为(1-3)的选择*/ int flag=1;/*flag判断返回主菜单*/ while(flag) {

printf(\车场\\n2.便道\\n3.返回\\n\ while(1) {

printf(\请选择 1|2|3:\ scanf(\ fflush(stdin); do{

if(tag<1||tag>3) {

printf(\输入有误,请按要求重新输入:\ scanf(\ fflush(stdin); } else

break; }

while(tag>3 && tag<1);break;/*直到输出的tag是正确的值*/ }

switch(tag) {

case 1:List1(&S);break; /*列表显示车场信息*/ case 2:List2(&W);break; /*列表显示便道信息*/ case 3:flag=0;break;/*返回*/ default: break; } } }

void main() {

25

system(\背景为黑底紫字*/ /*初始化*/

set1();system(\开头动画*/ SeqStackCar Enter,Temp; LinkQueueCar Wait; int ch; int n; printf(\☆★该停车场管理系统是个比较简单系统,在应用的时候请注意要求☆★ \\n\

printf(\ ☆★如果您有任何问题,请及时联系我们,谢谢合作☆★\\n\ printf(\╭----- ╮ \\n\ printf(\╰-╮ ╭-╯ ..____.╭╮╭╮.____ .. \\n\ printf(\╭╯╰-╯╰╮-╮ .._... ╭-┴┴★╮ .._.. \\n\ printf(\|◢█◣◢█◣||| .._...│ ︵ │ .._.. \\n\ printf(\|██████||| .._...│◎ │.._.. \\n\ printf(\|◥████◤||| ...※※※╰○---○╯※※※ .. \\n\ printf(\| ◥██◤ |╯╯ ................ .. \\n\ printf(\| ◥◤ | ★∵∴☆★∵∴★∵∴☆★∵∴☆★ \\n\ printf(\╰============╯ \\n\

n=getn();

InitStack(&Enter,n); /*初始化车场*/

InitStack(&Temp,n); /*初始化让路的临时栈*/ InitQueue(&Wait); /*初始化便道*/ // while(1) // { while(1)

{ printf(\◆ * ★☆★☆欢迎使用本停车管理系统☆★☆★ * ◆ \\n\

printf(\******\\n\

printf(\ ※ --※ 1. 车辆到达 ※-- ※ \\n\

printf(\ ※ --※ 2. 车辆(位置 )离开 ※-- ※ \\n\

printf(\ ※ --※ 3. 车辆(车牌号)离开※-- ※ \\n\

26

printf(\ ※ --※ 4. 列表显示 ※-- ※ \\n\

printf(\ ※ --※ 5. 退出系统 ※-- ※ \\n\

printf(\**\\n\

printf(\本停车场管理实行24小时制*\\n\

printf(\本停车场有会员服务,会员0.05/每分钟,非会员0.1/每分钟*\\n\

printf(\请选择所需要的服务:1|2|3|4|5.\\n\ scanf(\ fflush(stdin); while(ch>5||ch<1) {

printf(\输入有误,请重新输入:\ scanf(\ fflush(stdin); break; }

switch(ch) {

case 1:Arrival(&Enter,&Wait,n);break; /*车辆进站*/

case 2:Leave(&Enter,&Temp,&Wait,n);break; /*车辆出站*/

case 3:ExitCar(&Enter,&Temp,&Wait,n);break; //车辆离开,车牌号的离开 case 4:List(Enter,Wait);break; /*存车信息*/ case 5:out2(); /*退出系统*/ default:break; } } }

八、测试报告

(一)测试用例(说明:测试用例合理并且足够,既有正确用例,也有错误用例,同时检验程序的正确性和强壮性),为了检验方便,我们以车场有3个车位来做:

27

1.第一组测试用例

(1)测试输入:停车场的车辆离开,如下表: 服务选择/是车牌号/车位 到达/离开时间 否是会员 1 A1234 45:12 09:00 1 B3456 10:12 2 1 08:00 1 10:32 (2)测试目的:测试到达方法时间格式控制以及费用计算是否正确

28

(3)正确输出:第一次到达时应该会提示车辆进入第一个车道,第二次输入时间,会提示输入时间格式有错误,请重新输入,如图1

第三次是B3456到达车站,在第二个位置,第四次输入2,离开时输入08:00会提示输入离开时间比进站时间早,请重新输入,如图2

第五次输入10:32时,会得到一个车辆清单,以及便道车辆情况,如图3 (4)实际输出

(图1)

29

(图2)

(图3)

(5)错误原因:第一个错误是进入车站时的时间格式错了,第二个错误是进入车站的时间比离开时间晚

(6)当前状态:已改正

30

2.第二组测试用例

(1)测试输入:连续5辆车到达,如下表:

服务选择 车牌号 到达时间 1 A1234 7:00 1 B2345 8:25 1 JY111 10:40 1 XS222 1 XY333 4 1 2 3

(2)测试目的:测试到达方法与列表显示方法能否正确完成。 (3)正确输出:先到达的3辆车先进入停车场,最后到达的2辆在便道等候。 (4)实际输出:

31

(此时,车场内的信息如图所示)

(此时,便道内有两辆车在等待)

32

3.第三组测试用例 (1)测试输入:接上一步输入离开信息,下表:

服务选择 离开车位 离开时间 便道车进入时间 2 2 13:40 13:50

(2)测试目的:测试位置离开方法功能是否成功以及便道进入车场是否正确。

(3)正确输出:输出2号车位的车辆离开信息清单,便道1号车进入停车场。 (4)实际输出:

(5)错误原因:没有错误。 (6)当前状态:通过

33

4.第四组测试用例

(1)测试输入:接第上组输入离开信息,下表: 服务选择 车牌号 离开时间 便道车进入时间 会员收费 3 2vbd A1234 13:52 d 5 1 13:55 (2)测试目的:测试使用车牌号离开方法功能是否成功,会员制度健壮性以及便道进入车场是否正确。

(3)正确输出:选择3后,提示输入车牌号,输入2vbd,如图4,会提示没有此车,再次输入A1234后,会员收费输入的d和5,提示出错,如图5 (4)实际输出:

(图4)

34

(图5)

(5)错误原因:输入的信息不合法 (6)当前状态:通过

(二)测试结果分析

此停车管理系统实现一个小的停车场的管理,健壮性较好,由于篇幅问题,没有测试更多,其“到达”与“离开”方法都相对比较完整,结算清单明了。

35

九、课程设计总结

这次的课程设计使我们真正的能运用我们所学知识来做实际的事情,虽然此次的停车场运用程序不是特别能运用到实际中,因为它的一些要求难以实现,但是,锻炼了我们自己。对于我们来说是一个挑战。我们对数据结构的学习在程序的设计中也有所体现。

通过对程序的编制,调试和运行,使我们更好的掌握了栈和队列基本性质和有关它们之间关系使用问题的解决方法,熟悉了各种调用的数据类型,在调试和运行过程中使我更加的了解和熟悉程序运行的环境,提高了我们对程序调试分析的能力和对错误的纠正能力。

课程设计是培养学生综合运用所学知识、发现、提出、分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程。

随着科学技术发展的日新月异,当今计算机应用在生活中可以说得是无处不在。作为计算机专业的学生来说,不能光学会课本的知识,掌握计算机实际的开发应用技术也是十分重要的。

※软件特色:

1.本软件在原有基础上添加了会员制模块,实现了会员与非会员采用不同的计费方式。

2.汽车在出停车场时可选用两种方式,即利用其在车场中的位置控制出站或利用其车牌号控制出站。方便软件管理员使用

3.软件具有较强的健壮性,当输入不符合规范的信息时,系统可自动提示重新输入。

※我们自己对软件的评价:

我们在做此程序时,遇到了一些问题,前期我们使用车道控制车辆出站,在后期制作时,为了方便管理人员使用软件,我们在此基础之上添加了利用车牌号控制车辆出站。除此之外,原本程序中有对车牌号位数的限制,考虑到现实中位数未必固定,最后删掉了这一部分。后期结合生活实际,在软件中加入了会员收费制度模块,

36

并加入了system(\背景为黑底紫字*/ 函数,使程序更美观。在设计过程中,我们尽量选择比较简洁的语言,使框架更清晰。

在不断的调试和改进过程中,我们也学到了更多。能把所学的知识真正的运用到实际中,我们非常高兴。

※参考文献:

1.《数据结构》

编著:曲朝阳 郭晓利 王晓惠 孙鸿飞

2.《数据结构(c语言版)例题详解与课程设计指导》(第二版) 编著:秦峰 袁志祥

3.《数据结构(c语言)实践教程》 编著:胡元义 邓亚玲等

37

本文来源:https://www.bwwdw.com/article/owh.html

Top