求一个基于c语言车辆信息管理系统悬赏分:0 - 解决时间: 2011年03月30日 22时39分
最佳答案------------------------------------------
// 文件名:模拟停车场问题.cpp // 文件功能描述:模拟停车场问题 //----------------------------------------------------------------*/ //头文件 #include <iostream> #include <malloc.h> #include <string> #include <windows.h> //常量定义 #define MAX_STOP 4 //定义停车场最大停车数 #define MAX_PLATE 10 //定义车牌号最大长度 #define TIME_COUNT "秒" //定义时间单位 #define TIME_MS_TO_CONUT 1000 //定义时间进制,意为由TIME_COUNT到毫秒的进制 #define UNIT_PRICE 10 //定义单位时间收费标准 using namespace std; //使用std命名空间 //数据结构定义 //定义存储汽车信息的结构体 typedef struct { char license_plate[MAX_PLATE]; //汽车牌照号码,定义为一个字符指针类型 char state; //汽车当前状态,字符p表示停放在停车位上,字符s表示停放在便道上,每辆车的初始状态用字符i来进行表示 int time; //汽车停入停车场时的时间,用来计时收费 }CAR; //定义模拟停车场的栈结构 typedef struct { CAR STOP[MAX_STOP]; //汽车信息的存储空间 int top; //用来指示栈顶位置的静态指针 }SeqStack; //定义模拟便道的队列结构 typedef struct node { CAR WAIT; //汽车信息的存储空间 struct node *next; //用来指示队列位置的动态指针 }QNode; //链队列节点的类型 //定义链队列的收尾指针 typedef struct { QNode *front,*rear; }LQueue; //将头尾指针封装在一起的链队 //函数声明 int Empty_LQueue(LQueue *q); //判队空 int LeaveCheck(SeqStack parking , char *license_plate); //检查离开的车是否在停车场中 int QueueLength(LQueue *q); //判队长度 int Out_LQueue(LQueue *&sidewalk , char *license_plate); //出队操作 int StackEmpty(SeqStack parking); //判断栈是否为空 int StackFull(SeqStack parking); //判断栈是否为满 int StackPop(SeqStack &parking); //出栈操作 int StackTop(SeqStack parking , char *license_plate , int &time);//取栈顶元素 void Car_come(SeqStack &parking , LQueue *&sidewalk); //有车到来时的操作 void Car_leave(SeqStack &parking , LQueue *&sidewalk); //有车离开的操作 void Display(SeqStack parking); //显示停车场内的所有信息 调试时用 void InitStack(SeqStack &parking); //初始化栈 void InitList(LQueue *&sidewalk); //初始化队列 void In_LQueue(LQueue *&sidewalk , char *license_plate); //进队操作 void Input_Check(char *license_plate); ////检验输入的车牌是否合法 void StackPush(SeqStack &parking , char *license_plate , int stop_time);//进栈操作 void main() { //定义变量 SeqStack parking; LQueue *sidewalk = NULL; char *choice = new char; int flag = 1; //定义一个变量 判断是否退出 //初始化一个为空的停车场 InitStack(parking); //初始化一个为空的便道 InitList(sidewalk); //运行界面及功能选择 while(flag) { cout<<"\n\t 停车场模拟管理系统 \n\n"; cout<<"\t|--------------------------------------------------|\n\n"; cout<<"\t|本程序为停车场的模拟管理系统,有车到来时请按C键。|\n\n"; cout<<"\t|然后根据屏幕提示进行相关操作,有车要走时请按l键。|\n\n"; cout<<"\t|然后根据屏幕提示进行相关操作,查看停车场请按D键。|\n\n"; cout<<"\t|然后根据屏幕提示进行相关操作,要退出系统请按Q键。|\n\n"; cout<<"\t|--------------------------------------------------|\n\n"; cout<<"请选择操作:"; gets(choice); if(1 != strlen(choice)) { cout<<"请正确输入选项!"; continue; } else { switch(*choice) { case 'c': case 'C': { Car_come(parking,sidewalk);break; } case 'l': case 'L': { Car_leave(parking,sidewalk);break; } case 'q': case 'Q': { flag=0;break; } case 'd': case 'D': { Display(parking);break; } default: cout<<"选择不正确!请重新选择!\n"; } } } } //有车到来时的操作 void Car_come(SeqStack &parking , LQueue *&sidewalk) { //定义变量 char license_plate[MAX_PLATE]; cout<<"请输入车辆的车牌号码:"; Input_Check(license_plate); //判断停车场是否已满,满则进入便道,不满进入停车场 if(StackFull(parking)) { In_LQueue(sidewalk , license_plate); //进入便道 cout<<"停车场已满请在便道等候,您的位置为"<<QueueLength(sidewalk) <<endl; } else { StackPush(parking , license_plate , GetTickCount()); //进入停车场 cout<<"请进入停车场中的"<<parking.top+1<<"号停车位\n"; } // Display(parking); } //有车离开时的操作 void Car_leave(SeqStack &parking , LQueue *&sidewalk) { //定义变量 SeqStack tmpparking; //定义临时停车场 char leave_license_plate[MAX_PLATE]; //要离开的车牌号 char license_plate[MAX_PLATE]; //存放从停车场中读出来的车牌信息 int time; InitStack(tmpparking); //初始化临时停车场 //判断停车场中是否有车 if(StackEmpty(parking)) { cout<<"当前停车场中没有车\n"; return; //退出子函数 } cout<<"请输入要离开的车牌照:"; Input_Check(leave_license_plate); cout<<"当前停车场中有"<<parking.top+1<<"辆车\n"; if(LeaveCheck(parking , leave_license_plate)) //判断车是否在停车场中 { //车在停车场中 cout<<"您的车在"<<LeaveCheck(parking , leave_license_plate)<<"号车位上\n"; while(StackTop(parking , license_plate , time) && (strcmp(parking.STOP[parking.top].license_plate , leave_license_plate) != 0)) { strcpy(parking.STOP[parking.top].license_plate , license_plate); cout<<"牌照为"<<license_plate<<"的车暂时退出停车场"<<parking.top+1<<"号位\n"; StackPush(tmpparking , license_plate , time); //停车场中的车暂时退出 进入临时停车场 StackPop(parking); //出栈 } cout<<"牌照为"<<license_plate<<"的车离开停车场"<<parking.top+1<<"号位\n"; cout<<"您在停车场中停了"<<(GetTickCount()-time)/TIME_MS_TO_CONUT<<TIME_COUNT<<endl; //输出所停时间信息 cout<<"应缴费用为"<<(GetTickCount()-time)/TIME_MS_TO_CONUT*UNIT_PRICE<<"元\n";; //输出费用信息 StackPop(parking); //出栈 //将临时停车场中的车停回停车场 while(StackEmpty(tmpparking) != 1) { StackTop(tmpparking , license_plate , time); StackPush(parking , license_plate , time); cout<<"牌照为"<<license_plate<<"的车进入停车场"<<parking.top+1<<"号位\n"; license_plate[0] = '\0'; StackPop(tmpparking); } if(parking.top+1 == MAX_STOP-1) //判断车离开前停车场是否停满 if(QueueLength(sidewalk)) //如果停满则判断便道上是否有车 { //便道中有车 则从便道中停入停车场 Out_LQueue(sidewalk , license_plate); //出队 StackPush(parking , license_plate , GetTickCount()); //入栈 cout<<"在便道中牌照为"<<license_plate<<"的车进入停车场"<<parking.top+1<<"号位\n"; } } else //车不在停车场中 cout<<"您的车不在停车场中!\n"; } //初始化顺序栈 void InitStack(SeqStack &parking) { parking.top = -1; } //判栈空 int StackEmpty(SeqStack parking) { if(parking.top == -1) return 1; else return 0; } //判栈满 int StackFull(SeqStack parking) { if(parking.top == MAX_STOP-1) return 1; else return 0; } //入栈 void StackPush(SeqStack &parking , char *license_plate , int stop_time) { parking.top++; strcpy(parking.STOP[parking.top].license_plate , license_plate); parking.STOP[parking.top].state = 'p'; parking.STOP[parking.top].time = stop_time; } //出栈 返回栈顶指针 int StackPop(SeqStack &parking) { if(StackEmpty(parking)) return 0; else return parking.top--; } //取栈顶元素 int StackTop(SeqStack parking , char *license_plate , int &time) { if(StackEmpty(parking)) return 0; else { strcpy(license_plate , parking.STOP[parking.top].license_plate); time = parking.STOP[parking.top].time; return 1; } } //显示所有 void Display(SeqStack parking) { if(parking.top == -1) printf("停车场为空\n"); else { while(parking.top != -1) { cout<<"车牌号为:"<<parking.STOP[parking.top].license_plate; cout<<",停在"<<parking.top + 1 <<"号车位上"; cout<<",已停"<<(GetTickCount()-parking.STOP[parking.top].time)/TIME_MS_TO_CONUT<<TIME_COUNT<<endl; parking.top--; } } } //初始化队列 void InitList(LQueue *&sidewalk) { sidewalk = (LQueue *)malloc(sizeof(LQueue)); sidewalk->front=sidewalk->rear = NULL; } //入队 void In_LQueue(LQueue *&sidewalk,char *license_plate) { QNode *car_on_sidewalk; car_on_sidewalk = (QNode *)malloc(sizeof(QNode)); //为新节点开辟新空间 strcpy(car_on_sidewalk->WAIT.license_plate , license_plate); //将数据写入节点 car_on_sidewalk->WAIT.state = 's'; //写入停车信息 car_on_sidewalk->WAIT.time = GetTickCount(); //写入停车时间 car_on_sidewalk->next = NULL; if(Empty_LQueue(sidewalk)) //队空则创建第一个节点 sidewalk->front = sidewalk->rear = car_on_sidewalk; else { //队非空插入队尾 sidewalk->rear->next = car_on_sidewalk; sidewalk->rear = car_on_sidewalk; } } //判队空 int Empty_LQueue(LQueue *q) { if(q->front == NULL) return 1; else return 0; } //判队长度 返回队长 int QueueLength(LQueue *q) { QNode *p=q->front; int i=0; while(p != NULL) { i++; p=p->next; } return i; } //出队 成功返回1 队空返回0 int Out_LQueue(LQueue *&sidewalk,char *license_plate) { QNode *car_on_sidewalk; if(Empty_LQueue(sidewalk)) //如果队空返回0 return 0; car_on_sidewalk = sidewalk->front; strcpy(license_plate , car_on_sidewalk->WAIT.license_plate);//取出队头元素 if(sidewalk->front == sidewalk->rear) //队中只有一个元素 sidewalk->front = sidewalk->rear=NULL; //删除元素 else sidewalk->front = sidewalk->front->next; //队头指针后移 free(car_on_sidewalk); //释放指针 return 1; } //检查离开的车是否在停车场中 返回车在停车场中位置 不在则返回0 int LeaveCheck(SeqStack parking,char *license_plate) { int flag = parking.top+1; //定义变量记录当前车在停车场中位置 if(StackEmpty(parking)) return 0; else { //查找离开车所在位置 while(parking.top != -1 && strcmp(parking.STOP[parking.top].license_plate , license_plate) != 0) { flag--; parking.top--; } return flag; } } //检验输入的车牌是否合法 void Input_Check(char *license_plate) { int flag = 1; int i; string tmpstr; while(flag) { cin>>tmpstr; getchar(); if(tmpstr.length()<MAX_PLATE) { for(i=0;i<10;i++) license_plate[i] = tmpstr.c_str()[i]; flag = 0; } else cout<<"输入有误,请重新输入:"; } } |
|
来自: 杰出天下 > 《linux系统编程》