#include <stdio.h>
#include <time.h>
#include <string.h>
#include <stdlib.h>
#include <Windows.h>
#define MAX 20 //车库容量
typedef struct car{
time_t time1; //车辆进入时间
time_t time2; //车辆离开时间
char num[10]; //车牌号
}CAR; //车辆信息
typedef struct seqstackcar{
int top;
CAR stack[MAX];
}SeqStackCar; //用栈模拟车库
typedef struct QNode{
CAR waitingcar;
struct QNode *next;
}QNode,*QueuePtr;//结点类型
typedef struct{
QueuePtr front; //队头指针
QueuePtr rear; //队尾指针
}Linkq; //链队列类型
void InitStack(SeqStackCar *S)//初始化栈
{
S->top=0;
}
void EnQueue(Linkq *q,CAR a) //入便道队列
{
QNode *p;
printf("\n车位已满,请在便道等候!\n");
p=(QNode *)malloc(sizeof(QNode));
p->next=NULL;
p->waitingcar=a;
q->rear->next=p;
q->rear=p;
}
void Arrival(Linkq *q,SeqStackCar *Enter,CAR h,int n){//车辆进入
//time_t t;
if(Enter->top==n){
printf("\n 车位已满,请在便道等候,请输入车牌号:\n");
scanf("%s",h.num);
EnQueue(q,h);
}
else{
printf("\n 请输入车牌号:");
scanf("%s",h.num);
h.time1 = time(NULL);
Enter->top++;
Enter->stack[Enter->top]=h;
printf("\n 您的车位号是%d\n",Enter->top);
}
}
double price(CAR h,double p,int t){ //停车费
static double sum=0;
double a=difftime(h.time2,h.time1);
sum+=a*p;
if(t==1)
return a*p;
else
return sum;
}
void Leave(Linkq *q,SeqStackCar *Enter,double p,CAR h){ //离开车位
SeqStackCar *Temp; //临时栈
int room;
Temp=(SeqStackCar *)malloc(sizeof(SeqStackCar));
InitStack(Temp);
printf("请输入离开的车位号(范围为1--%d)\n",Enter->top);
scanf("%d",&room);
while(Enter->top>room)//车辆进入临时栈
{
Temp->stack[++Temp->top]=Enter->stack[Enter->top];
Enter->top--;
}
h=Enter->stack[Enter->top];
Enter->top--;
h.time2=time(NULL);
printf("\n出库车牌:%s 车位号:%d\n",h.num,Enter->top);
printf("您本次的停车费为:%.2f\n",price(h,p,1));
while(Temp->top>=1)
{
Enter->top++;
Enter->stack[Temp->top]=Temp->stack[Enter->top];
Temp->top--;
}
if((q->front!=q->rear)&&Enter->top<MAX)
{
QNode *p;
p=(QNode *)malloc(sizeof(QNode));
p=q->front->next;
q->front->next=p->next;
if(p->next==NULL)
q->rear=q->front;
Enter->top++;
Enter->stack[Enter->top]=p->waitingcar;
printf("便道内车牌为%s的车进入%d号车位\n",p->waitingcar.num,Enter->top);
free(p);
}
}
void check(SeqStackCar *Enter,int n){
int a;
a=n-Enter->top;
printf("目前还有车位数%d\n",a);
}
void InitQueue(Linkq *q)//初始化暂停便道
{
q->front=(QNode *)malloc(sizeof(QNode));
q->rear=q->front;
q->front->next=NULL;
}
void display(Linkq *q,SeqStackCar *Enter){
QNode *p;
int i=0;
p=(QNode *)malloc(sizeof(QNode));
if(Enter->top==0)
printf("停车场内没有车!\n");
else
printf("停车场内有%d辆车\n",Enter->top);
if(q->rear==q->front)
printf("暂停便道内没有车!\n");
else{
for(p=q->front->next;p;p=p->next)
i++;
printf("停车场内有%d辆车\n",i);
}
free(p);
}
void Menu()
{
printf("\t** 停车场管理程序 **\n");
printf("\t===================================================\n");
printf("\t** 1 --- 设置已停车量、停车价格 **\n");
printf("\t** 2 --- 汽车进停车场 **\n");
printf("\t** 3 --- 汽车出停车场 **\n");
printf("\t** 4 --- 收费情况统计 **\n");
printf("\t** 5 --- 查询当前空闲车位数 **\n");
printf("\t** 6 --- 查看当前整体情况 **\n");
printf("\t** 7 --- 退出 **\n");
printf("\t===================================================\n");
}
void operate(int n,double p,SeqStackCar *Enter,CAR h,Linkq *q)
{
int ch;
printf("请输入您的选择:");
scanf("%d",&ch);
switch(ch)
{
case 1:
{
printf("请输入参数n,停车每秒价格p\n");
scanf("%d%f",&n,&p);
operate(n,p,Enter,h,q);
break;
}
case 2:
{
Arrival(q,Enter,h,n);
operate(n,p,Enter,h,q);
break;
}
case 3:
{
Leave(q,Enter,p,h);
operate(n,p,Enter,h,q);
break;
}
case 4:
{
printf("统计从程序启动到当前已经收入%.2f费用\n",price(h,p,0));
operate(n,p,Enter,h,q);
break;
}
case 5:
{
check(Enter,n);
operate(n,p,Enter,h,q);
break;
}
case 6:
{
display(q,Enter);
operate(n,p,Enter,h,q);
break;
}
case 7:
{
exit(0);
break;
}
default:
{
printf("输入错误,请重新选择操作!");
operate(n,p,Enter,h,q);
break;
}
}
}
int main(){
int n=10; //最多停n量
double p=3; //停车每秒价格
SeqStackCar *S;
Linkq *q;
CAR h;
h.time1=0;
S=(SeqStackCar *)malloc(sizeof(SeqStackCar));
q=(Linkq *)malloc(sizeof(Linkq));
InitQueue(q);
InitStack(S);
Menu();
operate(n,p,S,h,q);
getchar();getchar();
return 0;
}
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交