码迷,mamicode.com
首页 > 其他好文 > 详细

7.6 停车场管理

时间:2016-07-19 20:39:13      阅读:225      评论:0      收藏:0      [点我收藏+]

标签:

7-7 ParkCharge.c

  1 #include "stdio.h"
  2 #include "time.h"
  3 #define MAXNUM 5 //停车场车位数 
  4 #define PRICE 2.0 //每小时收费 
  5 typedef struct car //定义车的结构体
  6 {
  7    char num[10]; //车牌号(最多10个字节) 
  8    struct tm intime; //进入时间 
  9    struct tm outtime; //离开时间 
 10    int expense; //费用 
 11    int length; //停车时长 
 12    int position; //停车位 
 13 }CAR;
 14 typedef struct //栈结构 
 15 {
 16    CAR car[MAXNUM]; //车辆信息 
 17    int top; //栈顶指针 
 18 } SeqStack;
 19 void StackInit(SeqStack * s) //初始化栈
 20 {
 21    s->top = -1; 
 22 }
 23 int StackIsEmpty(SeqStack * s) //判断栈是否为空
 24 {
 25    if (s->top == -1)
 26       return 1;
 27    else
 28       return 0;
 29 }
 30 int StackIsFull(SeqStack *s) //判断栈是否为满
 31 {
 32    if (s->top == MAXNUM - 1)
 33       return 1;
 34    else
 35       return 0;
 36 }
 37 void StackPush(SeqStack *s, CAR car)    // 进栈
 38 {
 39    if (!StackIsFull(s)) //若栈未满 
 40    {
 41       s->top++; //修改栈顶指针 
 42       s->car[s->top] = car; //将车辆信息入栈 
 43    }
 44 }
 45 CAR StackPop(SeqStack *s)    //出栈
 46 {
 47    CAR car;
 48    if (s->top != -1) //栈不为空 
 49    {
 50       car = s->car[s->top];
 51       s->top--;
 52       return car;
 53    }
 54 }
 55 CAR StackGetTop(SeqStack * s)        //取栈顶元素
 56 {
 57    CAR car;
 58    if (s->top != -1)
 59    {
 60       car = s->car[s->top];
 61       return car;
 62    }
 63 
 64 }
 65 //队列链表
 66 typedef struct carnode            //定义链队列的节点 
 67 {
 68    CAR data;
 69    struct carnode *next;
 70 }CarNodeType;
 71 typedef struct                    //链队列 
 72 {
 73    CarNodeType *head; //头指针 
 74    CarNodeType *rear; //尾指针 
 75 }CarChainQueue;
 76 void ChainQueueInit(CarChainQueue * q) //初始化链队列接点性质
 77 {
 78    if(!(q->head = (CarNodeType *) malloc(sizeof(CarNodeType))))
 79    {
 80        printf("内存分配失败!\n");
 81        exit(0); 
 82    }
 83    q->rear = q->head; //头尾指针相同 
 84    q->head->next = NULL; //头尾指针后下一个节点为空 
 85    q->rear->next = NULL;
 86 }
 87 void ChainQueueIn(CarChainQueue * q, CAR car)    //入队列
 88 {
 89    CarNodeType *p;
 90    if(!(p = (CarNodeType *) malloc(sizeof(CarNodeType))))
 91    {
 92        printf("内存分配失败!\n");
 93        exit(0); 
 94    }
 95    p->data = car;
 96    p->next = NULL;
 97    q->rear->next = p;
 98    q->rear = p;
 99 }
100 CAR ChainQueueOut(CarChainQueue * q)        //出队列
101 {
102    CarNodeType *p;
103    CAR car;
104    if (q->head != q->rear)
105    {
106       p = q->head->next;
107       if (p->next == NULL)
108       {
109          car = p->data;
110          q->rear = q->head;
111          free(p);
112       } else
113       {
114          q->head->next = p->next;
115          car = p->data;
116          free(p);
117       }
118       return car;
119    }
120 
121 }
122 int ChainQueueIsEmpty(CarChainQueue * q) //判断链队列是否为空
123 {
124    if (q->rear == q->head) //若队首等于列尾 
125       return 1; //返回空 
126    else
127       return 0; //返回非空 
128 
129 }
130 void separator(int n,char ch,char newline) //输出多个字符 
131 {
132    int i;
133    for(i=0;i<n;i++)
134        printf("%c",ch);
135    if(newline==1)
136        printf("\n");
137 }
138 void PrintDate(struct tm gm_date)
139 {
140     printf("%d/%d %02d:%02d:%02d\n", gm_date.tm_mon,gm_date.tm_mday,gm_date.tm_hour+8, gm_date.tm_min, gm_date.tm_sec);
141 }
142 void ShowPark(SeqStack *s) //查看车位状态 
143 {
144    int i;
145    struct tm gm_date;
146    printf("\n车位使用情况\n");
147    separator(40,_,1);
148    if (StackIsEmpty(s)) //若栈是空 
149       printf("停车场内已没有车辆!\n");
150    else
151    {
152       printf("位置\t车牌号\t进站时间\n");
153       for (i = 0; i <= s->top; i++)
154       {
155          printf("%d\t", s->car[i].position);
156          printf("%s\t", s->car[i].num);
157          PrintDate(s->car[i].intime); //输出日期 
158       }
159       printf("\t\t\t共%d辆", s->top + 1);
160       if (s->top == MAXNUM - 1)
161          printf("(已满)\n");
162       else
163          printf("(还可停放放%d辆)\n", MAXNUM - 1 - s->top);
164       printf("\n");
165    }
166    separator(40,_,1);
167 }
168 void ShowAisle(CarChainQueue * q)//显示过道上车辆的情况 
169 {
170    if (!ChainQueueIsEmpty(q)) //若队列不为空 
171    {
172       CarNodeType *p;
173       p = q->head->next; //队列中的第1辆车 
174       printf("\n\n过道使用情况\n"); 
175       separator(30,_,1);
176       printf("车牌\t进入时间\n");
177       while (p!= NULL) //队列不为空 
178       {
179          printf("%s\t", p->data.num);
180          PrintDate(p->data.intime);; //显示该辆车的信息 
181          p = p->next; //下一辆 
182       }
183    } else
184       printf("\n过道上没有车在等待\n");
185    separator(30,_,1); 
186    printf("\n\n");
187 }
188 void ShowAll(SeqStack *s, CarChainQueue *q) //查看车位和过道使用情况 
189 {
190    ShowPark(s); //显示车位使用情况 
191    ShowAisle(q); //显示过道使用情况 
192 }
193 void InPark(SeqStack * s, CarChainQueue * q) //车辆进入停车场 
194 {
195    CAR car;
196    struct tm *gm_date;
197    time_t seconds;
198    time(&seconds);
199    gm_date = gmtime(&seconds);;
200 
201    printf("\n车牌号:");
202    scanf("%s",&car.num);   
203    car.intime=*gm_date; //进入停车场的时间 
204 
205    if (!StackIsFull(s) && ChainQueueIsEmpty(q))    //如果车位未占完,且过道上没有车
206    {
207       car.position = (s->top) + 2; //车位号 
208       StackPush(s, car); //车辆直接进入车位 
209       ShowPark(s); //输出现在停车场的情况 
210    }
211    else if (StackIsFull(s) || !ChainQueueIsEmpty(q)) //如果车位已满,过道上还有车,则必须放在过道上
212    {
213       printf("提示:车位满,只有先停放在过道中。\n");
214       car.position = MAXNUM;
215       ChainQueueIn(q, car);    //停放在过道
216 
217       ShowPark(s);    //显示车位的情况         
218       ShowAisle(q);    //输出过道上的情况
219    }
220 }
221 void PrintRate(CAR *car)        //离开时输出费用等情况 
222 {
223    printf("\n\n      账单\n" );
224    separator(30,_,1);
225    printf("车牌:%s\n", car->num);
226    printf("停车位置:%d\n", car->position);
227    printf("进入时间:");
228    PrintDate(car->intime);
229    printf("离开时间:"); 
230    PrintDate(car->outtime);  
231    printf("停车时间(秒):%d\n", car->length);
232    printf("费用(元):%d\n", car->expense);
233    separator(30,_,1);
234    printf("\n\n");
235 }
236 void OutPark(SeqStack *s, CarChainQueue *q) //车出站出当时过道上的情况放在过道上直接进入车站
237 {
238    struct tm *gm_date;
239    time_t seconds;
240 
241    SeqStack p;                    //申请临时放车的地方
242    StackInit(&p);
243    char nowtime[10];
244    int i, pos;
245    CAR car;
246 
247    if (StackIsEmpty(s)) //如果车位中没有车辆停放 
248    {
249       printf("所有车位都为空,没有车辆需要离开!\n");
250    }
251    else
252    {
253       printf("现在车位使用情况是:\n");
254       ShowPark(s); //输出车位使用情况 
255       printf("哪个车位的车辆要离开:");
256       scanf("%d", &pos);
257       if (pos > 0 && pos <= s->top + 1) //输入车位号正确 
258       {
259          for (i = s->top + 1; i > pos; i--) //在将pos车位之后停的车放入临时栈,以使pos车位的车出来 
260          {
261             car = StackPop(s); //出栈 
262             car.position = car.position - 1;//修改车位号
263             StackPush(&p, car); //将车辆放入临时栈 
264          }
265          car = StackPop(s); //将位于pos车位的车辆出栈 
266          time(&seconds);
267          gm_date = gmtime(&seconds); //获取当前时间 
268          car.outtime=*gm_date;//离开时间 
269          car.length=mktime(&car.outtime)-mktime(&car.intime); //停车场中停放时间 
270          car.expense=(car.length/3600+1)*PRICE; //费用 
271          PrintRate(&car);    //输出车出站时的情况---进入时间,出站时间,原来位置,花的费用等
272          while (!StackIsEmpty(&p))    //将临时栈中的车重新进入车位
273          {
274             car = StackPop(&p); //从临时栈中取出一辆车 
275             StackPush(s, car); //将车进入车位 
276          }
277          while(!StackIsFull(s) && !ChainQueueIsEmpty(q)) //如果车位未满, 且过道上还有车 
278          {
279             car = ChainQueueOut(q); //将最先停在过道中的车辆进入车位
280             time(&seconds);
281             gm_date = gmtime(&seconds); //获取当前时间 
282             car.intime = *gm_date;//保存进入车位的时间 
283             StackPush(s, car); //将车辆进入车位 
284          }
285       }
286       else //车位号输入错误 
287       {
288          printf("车位号输入错误,或该车位没有车辆!\n");
289       }
290    }
291 }
292 int main()
293 {
294    SeqStack Park; //停车场栈 
295    CarChainQueue Aisle; //过道链表 
296    StackInit(&Park);
297    ChainQueueInit(&Aisle);
298    char choice;
299    do{
300        printf("\n\n");
301        separator(10, ,0);
302        printf("停车场管理\n");
303        separator(30,_,1);
304        printf("1.车辆进入\n");
305        printf("2.车辆离开\n");
306        printf("3.查看停车场情况\n");        
307        printf("0.退出系统\n");
308        separator(56,_,1);
309        printf("提示:本停车场有%d个车位,车位停满后的车辆将停放在过道上。\n",MAXNUM);
310        printf("本停车场时计费,收费标准:%.2f元/小时,过道上不收费。\n\n",PRICE);
311        printf("\n选择操作(0~3):");
312        fflush(stdin);
313        choice=getchar();
314        switch (choice)
315        {
316        case 1: //车辆进入 
317           InPark(&Park,&Aisle);
318           break;
319        case 2: //车辆离开 
320           OutPark(&Park,&Aisle);
321           break;
322        case 3:
323           ShowAll(&Park,&Aisle);
324           break;
325        }
326    }while(choice!=0);
327    return 0;
328 }

 

7.6 停车场管理

标签:

原文地址:http://www.cnblogs.com/wozixiaoyao/p/5686019.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!