📄 tingchechang.rar.txt
字号:
//停车场管理
/*实现功能:由用户输入车站的车位数,价钱,车牌号,进入离开车站的时间,车牌号不能重复,若重复,会要求重新输入。
进入车站的时间应该比离开车站的时间早,否则,会要求重新输入。*/
#include<stdio.h>
#include<malloc.h>
#include<process.h>
#include<conio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#define ok 1
#define stack_size 100
//数据结构体的定义
//时间的结构体,分为小时和分钟。
typedef struct time
{
int hour;
int min;
}time;
//定义汽车的信息,分别是车牌,汽车进站出站的时间,还有进入离开走道的时间
typedef struct carnode
{
char carnumber[17];//车牌号
time carreach;//进入车库的时间
time carleave;//离开车库的时间
time reach;//进入走道的时间
time leave;//离开走道的时间
}carnode;
//定义栈
typedef struct
{
carnode *base;//栈顶指针
carnode *top;//栈底指针
int stacksize;//存储空间
}carsqstack;
//定义队列
typedef struct Qnode
{
carnode data;//汽车数据
struct Qnode *next;
}Qnode,*Queuecar;
typedef struct
{
Queuecar front;//队头指针
Queuecar rear;//队尾指针
}linkqueuecar;
//栈的初始化
int Initstack(carsqstack &s)
{
s.base=(carnode*)malloc(stack_size*sizeof(carnode));
s.top=s.base;//初始栈为空
s.stacksize=stack_size;
return ok;
}
//队列的初始化
int Initqueue(linkqueuecar &q)
{
q.front=q.rear=(Queuecar)malloc(sizeof(Qnode));
q.front->next=NULL;//初始队列为空
return ok;
}
//入栈
int push(carnode &e,carsqstack &s)
{
*s.top++=e;//把值给s.top,再执行s.top++
return ok;
}
//出栈
int pop(carsqstack &s,carnode &e)
{
e=*--s.top;//把值给e
return ok;
}
//入队
int Enqueue(linkqueuecar &q,carnode &e)
{
Queuecar p;
p=(Queuecar)malloc(sizeof(Qnode));
p->data=e;//p指向要插入的数据
p->next=NULL;
q.rear->next=p;//q的队尾指针指向p
q.rear=p;//把q尾指针放在p
return ok;
}
//出队
int Dequeue(linkqueuecar &q,carnode &e)
{
Queuecar p;
p=q.front->next;//把的p指针移到q的队头指针的后面
e=p->data;//把队头的数据附值给e
q.front->next=p->next;//把p删除
if(q.rear==p)
q.rear=q.front;
free(p);//释放p
return ok;
}
//判断输入的数据是否是整形变量
void pdok(int &w5,int &w1)
{
int i,w,e,w3,w4,k;
char x[50];
while(1)
{
scanf("%s",&x);
i=strlen(x);//求字符串长度
if(i>10)
printf("\n\t数据太长,请输入有效数字:");
else
{
w1=0;
w5=0;
k=5;
for(w=0,w4=i-1;w<i;w++)
{
e=x[w]-48;//把字符的ASSII码减48
if(e>=0&&e<=9)//判断是不是0到9之间的数字
{
w3=pow(10,w4);//执行10的W4次方
w5+=e*w3;
}
else
w1++;
w4--;
}
if(k==5)break;//跳出循环
}
}
}
//判断输入的数据是否是有效
void money(float &zp)
{
int xp1,xp2,xp3,xp4,xp5,w;
char xp[50];
while(1)
{
scanf("%s",&xp);
xp1=strlen(xp);//求字符串长度
if(xp1>4)//字符串太长,直接提示
printf("\n\t数据太长,请输入有效数字:");
else
{
for(xp2=0,xp4=0,xp5=0;xp2<xp1;xp2++)
{
xp3=xp[xp2]-48;
if(xp3>=0&&xp3<=9)//判断是不是0到9之间
xp4++;
if(xp3==-2)//判断是不是.
xp5++;//xp5代表.的个数
}
if(xp4+xp5==xp1&&(xp5==0||xp5==1))//如果字符串有数字和小数点组成的
{
zp=atof(xp);//把它转变为浮点型
w=5;
}
if(w==5)break;
else
printf("\n\t请重新输入数据,数据必须要大于O的数字:");
}
}
}
//判断车牌号码有没有相同的
void pdcp(carsqstack &s,linkqueuecar &q,carsqstack &p,linkqueuecar &u,carnode &r,int &s0,int qq)
{
int i;
carnode w;
s0=0;
for(i=s.top-s.base;i>0;i--)
{
pop(s,w);//出栈
if(!strcmp(r.carnumber,w.carnumber))//比较字符串是否相同
s0++;//字符串相同就记数
push(w,p);//再把它压到新栈
}
//把从新栈的元素压回原来的栈里面
for(i=p.top-p.base;i>0;i--)
{
pop(p,w);
push(w,s);
}
for(i=0;i<qq;i++)
{
Dequeue(q,w);
if(!strcmp(r.carnumber,w.carnumber))//比较字符串是否相同
s0++;//字符串相同就记数
Enqueue(u,w);
}
//把新队列的元素压回原来的队列里面
for(i=0;i<qq;i++)
{
Dequeue(u,w);
Enqueue(q,w);
}
}
//输入营业时间
void sj0(time &m)
{
int w5,w1;
printf("\n\t\t小时:");
while(1)//实现小时必须大于等于0小于24
{
pdok(w5,w1);
m.hour=w5;
if(w1==0&&m.hour>=0&&m.hour<24)
break;
else
printf("\n\t小时在0到24之间,请输入1到23");
}
printf("\n\t\t分钟:");
while(1)//实现分钟在0与60之间
{
pdok(w5,w1);
m.min=w5;
if(w1==0&&m.min>=0&&m.min<60)
break;
else
printf("\n\t分钟是在0到60之间,请输入0到59");
}
}
//下面四个sj都是输入时间的函数
void sj1(carnode &r)
{
int w5,w1;
printf("\n\t请输入进入车库的的小时:");
while(1)//实现小时必须大于等于0小于24
{
pdok(w5,w1);
r.carreach.hour=w5;
if(w1==0&&r.carreach.hour>=0&&r.carreach.hour<24)
break;
else
printf("\n\t小时在0到24之间,请输入1到23");
}
printf("\n请输入进入车库的分钟:");
while(1)//实现分钟在0与60之间
{
pdok(w5,w1);
r.carreach.min=w5;
if(w1==0&&r.carreach.min>=0&&r.carreach.min<60)
break;
else
printf("\n\t分钟是在0到60之间,请输入0到59");
}
}
void sj2(carnode &r)
{
int w5,w1;
printf("\n\t请输入进入走道的小时:");
while(1)//实现小时必须大于等于0小于24
{
pdok(w5,w1);
r.reach.hour=w5;
if(w1==0&&r.reach.hour>=0&&r.reach.hour<24)
break;
else
printf("\n\t小时在0到24之间,请输入1到23");
}
printf("\n\t请输入进入走走道的分钟:");
while(1)//实现分钟在0与60之间
{
pdok(w5,w1);
r.reach.min=w5;
if(w1==0&&r.reach.min>=0&&r.reach.min<60)
break;
else
printf("\n\t分钟是在0到60之间,请输入0到59");
}
}
void sj3(carnode &r)
{
int w5,w1;
printf("\n请输入离开车库的小时:");
while(1)//实现小时必须大于等于0小于24
{
pdok(w5,w1);
r.carleave.hour=w5;
if(w1==0&&r.carleave.hour>=0&&r.carleave.hour<24)
break;
else
printf("\n\t小时在0到24之间,请输入1到23");
}
printf("\n\t请输入离开车库的分钟:");
while(1)//实现分钟在0与60之间
{
pdok(w5,w1);
r.carleave.min=w5;
if(w1==0&&r.carleave.min>=0&&r.carleave.min<60)
break;
else
printf("\n\t分钟是在0到60之间,请输入0到59");
}
}
void sj4(carnode &r)
{
int w5,w1;
printf("\n请输入离开走道的小时:");
while(1)//实现小时必须大于等于0小于24
{
pdok(w5,w1);
r.leave.hour=w5;
if(w1==0&&r.leave.hour>=0&&r.leave.hour<24)
break;
else
printf("\n\t小时在0到24之间,请输入1到23");
}
printf("\n请输入离开走道的分钟:");
while(1)//实现分钟在0与60之间
{
pdok(w5,w1);
r.leave.min=w5;
if(w1==0&&r.leave.min>=0&&r.leave.min<60)
break;
else
printf("\n\t分钟是在0到60之间,请输入0到59");
}
}
//车库里面是否有车,如果有车辆的话,要比较前一辆车的时间
void zk(carsqstack &s,carnode &r,float &price,time &money1,time &money2,carnode &w)
{
carnode x;
if(s.top-s.base==0)//车库没有车辆
{
printf("车库停车每分钟%2.2f元钱,请在汽车出来后付钱\n",price);
//没有进入停车场走道的车,把进入离开走道的时间付为0
r.reach.hour=0;
r.reach.min=0;
r.leave.hour=0;
r.leave.min=0;
while(1)
{
sj1(r);
if(r.carreach.hour<money2.hour||(r.carreach.hour==money2.hour&&r.carreach.min<=money2.min))
if(r.carreach.hour>money1.hour||(r.carreach.hour==money1.hour&&r.carreach.min>=money1.min))
if(r.carreach.hour>w.carleave.hour||(r.carreach.hour==w.carleave.hour&&r.carreach.min>=w.carleave.min))
{
push(r,s);
break;
}
else
printf("进入车站的时间要比上一辆离开车库的时间要晚");
else
printf("%d:%d将开始营业,%d:%d将停止营业",money1.hour,money1.min,money2.hour,money2.min);
else
printf("%d:%d将开始营业,%d:%d将停止营业",money1.hour,money1.min,money2.hour,money2.min);
}
}
else//车库有车辆
{
//没有进入停车场走道的车,把进入离开走道的时间付为0
r.reach.hour=0;
r.reach.min=0;
r.leave.hour=0;
r.leave.min=0;
while(1)
{
sj1(r);
pop(s,x);
push(x,s);
//判断后面进站的车辆比前面进入车站的要晚
if(r.carreach.hour<money2.hour||(r.carreach.hour==money2.hour&&r.carreach.min<=money2.min))
if(r.carreach.hour>x.carreach.hour||(r.carreach.hour==x.carreach.hour&&r.carreach.min>=x.carreach.min))
if(r.carreach.hour>w.carleave.hour||(r.carreach.hour==w.carleave.hour&&r.carreach.min>=w.carleave.min))
{
push(r,s);
break;
}
else
printf("进入车站的时间要比上一辆离开车库的时间要晚");
else
printf("这辆车辆不能比上一辆车进入车站时间早,请重新输入\n");
else
printf("%d:%d将开始营业,%d:%d将停止营业",money1.hour,money1.min,money2.hour,money2.min);
}
}
}
//进入走道的函数
void cjzd(linkqueuecar &q,carnode &r,float &price1,int &qq,carsqstack &s,linkqueuecar &u,time &money1,time &money2,carnode &h,carnode &w)
{
carnode x,y;
int sp;
if(qq==0)//如果队列为空,进入走道的车辆,必须和车库最后一辆车进行比较
{
printf("车库已满,请在走道上等候\n");
printf("走道上停车每分钟%2.2f元,请在汽车出来后付钱\n",price1);
while(1)
{
sj2(r);
pop(s,x);
push(x,s);
if(r.reach.hour<money2.hour||(r.reach.hour==money2.hour&&r.reach.min<=money2.min))
if(r.reach.hour>x.carreach.hour||(r.reach.hour==x.carreach.hour&&r.reach.min>=x.carreach.min))
if(r.reach.hour>w.carleave.hour||(r.reach.hour==w.carleave.hour&&r.reach.min>=w.carleave.min))
if(r.reach.hour>h.leave.hour||(r.reach.hour==h.leave.hour&&r.reach.min>=h.leave.min))
{
Enqueue(q,r);
break;
}
else
printf("\n进走道的时间应该比上一辆离开车库时间要晚");
else
printf("\n进走道的时间比上一辆离开走道时间要晚");
else
printf("这辆车辆不能比上一辆车进入车站时间早,请重新输入\n");
else
printf("%d:%d将开始营业,%d:%d将停止营业",money1.hour,money1.min,money2.hour,money2.min);
}
}
else//队列不为空的时候,和队列的最后的一辆车进行比较
{
printf("车库已满,请在走道上等候\n");
printf("走道上停车每分钟%2.2f元,请在汽车出来后付钱\n请输入进入车库走道的时间(例如**:**):",price1);
while(1)
{
sj2(r);
for(sp=1;sp<qq;sp++)//把队列最后一个数据之前的数据全部出队,再入新队列
{
Dequeue(q,x);
Enqueue(u,x);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -