停车场管理系统设计
面向对象程序设计(C++)课程大作业
设计题目:停车场管理系统设计
院系:计算机科学与信息工程学院
专业班级:
学号姓名:
指导教师:
年1月
目录
一、成员分工 (1)
二、需求分析 (2)
三、总体设计 (3)
四、详细设计 (6)
五、系统测试 (17)
六、总结 (20)
七、参考文献 (21)
一成员分工
我们小组成员共有三名,分别是,为了能按时圆满的完成这次VC++课程设计,我们小组进行了详细的分工,以确保设计能按时完成。经过周密的考虑和详细的调查最终确定该停车场管理系统需要以下几个功能模块:
(1)需求分析
(2)界面的设计
(3)添加功能
(4)显示功能
(5)查询功能
(6)编辑功能
(7)删除功能
(8)统计功能
(9)保存功能
(10)读取功能
经过小组成员的讨论,并根据个人的特长和具体爱好做如下具体分工:
神1具体完成以下模块的设计与实现:
(1 )需求分析
(2 )界面的设计
(3 )添加功能
(4 )保存功能
神2具体完成以下模块的设计与实现:
(1)显示功能
(2)查询功能
(3)显示功能
神3主要具体完成以下模块的设计与实现:
(1)编辑功能
(2)删除功能
(3)读取功能
二需求分析
1.问题描述
定义车辆类,属性有车牌号、颜色、车型(小汽车、小卡、中卡和大卡)、到达的时间和离开的时间等信息和相关的对属性做操作的行为。定义一个管理类,完成对停车场的管理。停车场的具体要求:设停车场是一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端),若车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等待,一旦有车开走,则排在便道上的第一辆车即可开入;每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。
2. 基本要求
(1)添加功能:程序能够添加到达停车场的车辆信息,要求车辆的车牌号要唯一,如果添加了重复编号的记录时,则提示数据添加重复并取消添加。
(2)查询功能:可根据车牌号、车型等信息对已添加的停车场中的车辆信息进行查询,如果未找到,给出相应的提示信息,如果找到,则显示相应的记录信息;
(3)显示功能:可显示当前系统中所有车辆的信息,每条记录占据一行。(4)编辑功能:可根据查询结果对相应的记录进行修改,修改时注意车牌号的唯一性。
(5)删除功能:主要实现对已添加的车辆记录进行删除。如果当前系统中没有相应的人员记录,则提示“记录为空!”并返回操作。
(6)统计功能:能统计停车场中车辆的总数、按车型、按到达时间进行统计等。
(7)保存功能:可将当前系统中各类人员记录和休假记录存入文件中,存入方式任意。
(8)读取功能:可将保存在文件中的信息读入到当前系统中,供用户进行使用。 3.系统运行环境
(1)硬件环境。联想双核处理器,2G内存,2G独立显卡,80G硬盘。
(2)软件环境。Microsoft Visual C++6.0,WindosXP系统。
三总体设计
(1)设计思想
本停车场n个车位, 所以可以用数组表示,每辆车用一结构体表示,包括车牌号、颜色、车型、车位号、停车时间和停车标志位(标志是否停车)。当车入库时,将更改信息,当车出库时,将信息写入car.dat中。再次进入该系统时,还用这个该数组,来接受car.dat数据的读入,便于用户以后的操作,防止停车信息的流失。此外,由于需要显示所有汽车的停车信息,所以我们又加了一个顾客结构体,一个顾客链表,当存车时,新建用户节点,并使用头插法,插于链表(便于取车时查到用户,补充完整用户的信息),填写用户的相关信息(车牌号,颜色,车型,车位号,车入库时刻)。当出库时,查找相应节点,补充完整用户信息,包括(用户留言,停车时间总计,花费)。当退出系统后,将已出库的汽车的车主信息,写入历史文件list.dat中,便于管理员的查询。将还未取走车的车主的信息存入临时文件temp.dat中,防止系统关闭后数据信息的丢失,车主取车时找不到车。同时,还要将成员信息写入临时文件user.dat;
(2)数据结构
结构体Car,保存每个车位的停车信息。
结构体Gustomer,保存每个客户的信息。
结构体User,保存管理员信息。
数组Cars,保存整个停车状况。
数组user;
链表CustList,保存所有客户的信息,包括车已取走,和车未取走的。
(3)程序模块
(1)此停车场管理系统,主要分为以下若干模块:
首先定义用来模拟停车的数组,用来保存顾客信息的链表,保存管理员信息的结构以及全局变量,然后编写主函数,在此主函数中实现对其它各个模块的调用。在主函数中首先调用option()函数,出现欢迎用户使用的界面,然后提示用户进入此停车场管理系统后,再出现一个供用户选择的主界面(包括顾客界面和停车场管理员管理界面)。当用户选择顾客界面时,跳入到顾客界面,再次界面,用户可以选择存车、取车及返回主页面。在用户的选择过程中,程序又分别存车,取车函数调用以及退出程序这三个函数模块。其中,当存车时,调用了显示空闲车位状态的信息函数,并调用了保存car.dat的函数;当取车时,调用显示本次停车情况以及消费金额的函数, 并调用了保存car.dat的函数。建立user.dat存放管理人员的信息。最后,在主界面选择“退出”,保存历史文件list.dat和临时文件temp.dat。当用户选择车管系统时,调用管理员身份验证函数,从而跳入车管界面,然后相应的功能函数,实现查询所有停车信息。
(2)各模块之间的调用关系以及算法设计
下图是个模块之间的调用关系:
(3)函数设计
int UsertestAdd();
void SaveUsers(User users[6]);
void loa(User users[6]);
void FourUserIn(User users[6]);
void Load(Car cars[6]);
void Showusers(User users[6]);
void loa users[6],char name[10],char id[10],char password[10], int qingjia,int empty);
void Load cars[6],char license[10],char pchexing[10],char pcolor[2],int pnumber,int ptime,int empty);
void FourCarIn(Car Cars[6]);
void Enterpark(Car cars[6]);
void Showcars(Car cars[6]);
void Savecars(Car cars[6]);
bool IsEmpty(Car cars[6]);
void Print(char license[10],char pchexing[10],char pcolor[2],int pnumber,int ptime,float &cost);
void Leavepark(Car cars[6],char license[],char pchexing[],char pcolor[],int &pnumber,int &ptime,float &cost,char note[100]);
void CarOutMenu(char license[],char pchexing[],char pcolor[],int &pnumber,int &ptime,float &cost,char note[100]);
void Manage(Car cars[6]);
void InitCustList(CustList *&cl);
void CreateCustList(CustList *&cl,char *license,char *pchexing,char *pcolor);
void GetDate(char tmp[64]);
void SearchCust(CustList *&cl,char *license,char *pchexing,char *pcolor,float cost,int pcount);
void Customer(Car cars[6]);
void CustomerNote(char note[100]);
void EachGuideInfor(Car c);
四详细设计
实现概要设计中定义的所有数据类型,对主要操作写出实现算法,对主程序和其他模块写出算法,写出函数的调用关系。
(1)数据类型
结构体Car,保存每个车位的停车信息。
struct Car
{
char license[8];
int pnumber;
char pcolor[2];
char pchexing[10];
int ptime;
int empty;//标志位,有车为1,无车为0
};
struct Customer
{
char license[10];//车牌号
char pchexing[10];//车的型号
char pcolor[2];//车的颜色
char date[64];//停车的时刻
int ptimecount;//本次停车总时间
float cost;
char note[100];//顾客留言
Customer *next;
};
struct User
{
char id[10];//编号
char name[10];//姓名
char password[10];//留言
int qingjia;
int empty;//标志位,有车为1,无车为0
};
数组Cars,保存整个停车状况。
数组User,保存整个管理人员的信息。
Car Cars[PNUMBER];
链表,保存所有客户的信息,包括车已取走,和车未取走的。
typedef struct Snode CustList;
(2)主要操作
1)存车
void Enterpark(Car cars[6])
{
cout<<"input your license,chexing,color"< char licen[10],pche[10],pcolo[2]; cin>>licen>>pcolo>>pche; while(!licen) { cout<<"input your license,chexing,color"< cin>>licen>>pcolo>>pche; } //判断车库是否已经满了 int i; for(i=0;i<6;i++) { if(cars[i].empty==1) { cars[i].ptime +=5; } else { cars[i].pnumber =i+1; cars[i].ptime=5; cars[i].empty=1; strcpy(cars[i].license,licen); return; //如果使用break,则只能跳出单层循环, } } 2)取车 void Leavepark(Car cars[FLOOR][PNUMBER],char license[],int &floor,int &pnumber,int &ptime,char note[100]) { //判断车位是否已空 if(IsEmpty(cars)==1) { cout<<"停车场已没有车停放!请确定您是否停车。"< return; }//查找车位 int sign=1;//标志位,车库有该车为1,没有赋值为零,初始值为0 int i,j; while(sign) { for(i=0;i { for(j=0;j { if(strcmp(cars[i][j].license,license)==0) { sign=0; floor=i; pnumber=j; ptime=cars[i][j].ptime; } } } if(sign) { cout<<"您刚才输入的车牌号不存在!"< cout<<"请重新输入:"; cin>>license; } } if(sign==0) cout<<"车已找到,请稍等。。。"< strcpy(note,"0000000000"); floor+=1; pnumber+=1; //system ("cls"); for(i=0;i<100000000;i++); cars[floor-1][pnumber-1].floor =0; cars[floor-1][pnumber-1].pnumber =0; cars[floor-1][pnumber-1].ptime=0; cars[floor-1][pnumber-1].empty=0; strcpy(cars[floor-1][pnumber-1].license," "); } 3)添加管理员的信息到User.txt中 void SaveUsers(User users[6]) { FILE* fp = fopen("user.txt","wb"); if(fp==NULL) { cout<<"Can not open this file"< return; } User user; int j=0; while(j<6) { if(users[j].empty ==1) { strcpy(https://www.360docs.net/doc/311437057.html, ,users[j].name ); strcpy(user.id ,users[j].id ); strcpy(user.password ,users[j].password); user.qingjia =users[j].qingjia; fwrite(&user,sizeof(user),1,fp); } j++; } fclose(fp); } 4)登录界面 int UsertestAdd() { //simple登陆验证和注册用户功能 User UserArr[10]={"031010216","神1","031010216"};//默认用户 int count=0;//统计输入用户名和密码错误次数 int i=0;//遍历变量或找到用户的ID int k=1;//表示已存在的用户数 while(1) { int n=0;//标识是否匹配,若匹配,则退出外循环 cout<<"请输入您的管理账号"< char id[10]; cin>>id; cout<<"请输入密码"< char password[10]; cin>>password; for(i=0;i<10;i++) { if(!strcmp(UserArr[i].id,id)&&!strcmp(UserArr[i].password,password)) { n=1; break; } } if(n) { break; } i=0; count++; cout<<"密码或账号错误,"; if(count==2||k==2) { cout<<"您今天已累计输错"< cout<<"您是否要注册用户?(否则您将自动退出系统)"<