?? car.c
字號:
/*設停車場是一個可停放n輛車的狹長通道,且只有一個大門可供汽車進出。在停車場內,汽車按到達的先后次
序,由北向南依次排列(假設大門在最南端)。若車場內已停滿n輛車,則后來的汽車需在門外的便道上等候,
當有車開走時,便道上的第一輛車即可開入。當停車場內某輛車要離開時,在它之后進入的車輛必須先退出車
場為它讓路,待該輛車開出大門后,其它車輛再按原次序返回車場。每輛車離開停車場時,應按其停留時間的
長短交費在便道上停留的時間不收費)。試編寫程序,模擬上述管理過程。要求以順序棧模擬停車場,以鏈隊
列模擬便道。從終端讀入汽車到達或離去的數據,每組數據包括三項:①是"到達"還是"離去";②汽車牌照號
碼;③"到達"或"離去"的時刻。與每組輸入信息相應的輸出信息為:如果是到達的車輛,則輸出其在停車場中
或便道上的位置;如果是離去的車輛,則輸出其在停車場中停留的時間和應交的費用。(提示:需另設一個棧
,臨時停放為讓路而從車場退出的車。)*/
/*下面給出實驗用數據及其結果。
輸出:1. 車輛到達 2. 車輛離開 3. 列表顯示 4. 退出系統
輸入:1
輸出:請輸入車牌號(例:陜A1234):
輸入:陜A1234
輸出:車輛在車廠第1位置。
輸出:請輸入到達時間:**:**
輸入:10:00
輸出:1. 車輛到達 2. 車輛離開 3. 列表顯示 4. 退出系統
輸入:1
輸出:請輸入車牌號(例:陜A1234):
輸入:陜C4321
輸出:車輛在車廠第2位置。
輸出:請輸入到達時間:**:**
輸入:10:30
輸出:1. 車輛到達 2. 車輛離開 3. 列表顯示 4. 退出系統
輸入:1
輸出:請輸入車牌號(例:陜A1234):
輸入:陜A5678
輸出:該車須在便道等待!
輸出:1. 車輛到達 2. 車輛離開 3. 列表顯示 4. 退出系統
輸入:3
輸出:請選擇1|2|3:
輸出:1.車場2.便道3.返回
輸入:1
輸出:
車場:
位置 到達時間 車牌號
1 10:00 陜A1234
2 10:30 陜C4321
輸出:請選擇1|2|3:
輸出:1.車場2.便道3.返回
輸入:2
輸出:等待車輛的號碼為:陜A5678
輸出:請選擇1|2|3:
輸出:1.車場2.便道3.返回
輸入:3
輸出:1. 車輛到達 2. 車輛離開 3. 列表顯示 4. 退出系統
輸入:2
輸出:請輸入車在車場的位置/1--2/
輸入:1
輸出:請輸入離開的時間:**:**
輸入:11:00
輸出:
離開的車牌號為:陜A1234
其到達的時間為: 10:00 離開的時間為:11:00
應繳費用為:3.0元
便道的陜A5678號車進入停車場第2位置.
請輸入現在的時間**:**
輸入:11:00
*/
/*源程序如下:*/
/*停車場管理系統*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
/*------------------------------------------------------------------------------*/
#define MAX 2 /*車庫容量*/
#define price 0.05 /*每車每分鐘費用*/
typedef struct time
{
int hour;
int min;
}Time; /*時間結點*/
typedef struct node
{
char num[10];
Time reach;
Time leave;
}CarNode; /*車輛信息結點*/
typedef struct NODE
{
CarNode *stack[MAX+1];
int top;
}SeqStackCar; /*模擬車站*/
typedef struct car
{
CarNode *data;
struct car *next;
}QueueNode;
typedef struct Node
{
QueueNode *head;
QueueNode *rear;
}LinkQueueCar; /*模擬通道*/
/*------------------------------------------------------------------------------*/
void InitStack(SeqStackCar *); /*初始化棧*/
int InitQueue(LinkQueueCar *); /*初始化便道*/
int Arrival(SeqStackCar *,LinkQueueCar *); /*車輛到達*/
void Leave(SeqStackCar *,SeqStackCar *,LinkQueueCar *); /*車輛離開*/
void List(SeqStackCar,LinkQueueCar); /*顯示存車信息*/
/*------------------------------------------------------------------------------*/
void main()
{
SeqStackCar Enter,Temp;
LinkQueueCar Wait;
int ch;
InitStack(&Enter); /*初始化車站*/
InitStack(&Temp); /*初始化讓路的臨時棧*/
InitQueue(&Wait); /*初始化通道*/
while(1)
{
printf("\n1. 車輛到達");
printf(" 2. 車輛離開");
printf(" 3. 列表顯示");
printf(" 4. 退出系統\n");
while(1)
{
scanf("%d",&ch);
if(ch>=1&&ch<=4)
break;
else
printf("\n請選擇: 1|2|3|4.");
}
switch(ch)
{
case 1:
Arrival(&Enter,&Wait);
break; /*車輛到達*/
case 2:
Leave(&Enter,&Temp,&Wait);
break; /*車輛離開*/
case 3:
List(Enter,Wait);
break; /*列表打印信息*/
case 4:
exit(0); /*退出主程序*/
default: break;
}
}
}
/*------------------------------------------------------------------------------*/
void InitStack(SeqStackCar *s) /*初始化棧*/
{
int i;
s->top=0;
for(i=0;i<=MAX;i++)
s->stack[s->top]=NULL;
}
int InitQueue(LinkQueueCar *Q) /*初始化便道*/
{
Q->head=(QueueNode *)malloc(sizeof(QueueNode));
if(Q->head!=NULL)
{
Q->head->next=NULL;
Q->rear=Q->head;
return(1);
}
else return(-1);
}
void PRINT(CarNode *p,int room) /*打印出站車的信息*/
{
int A1,A2,B1,B2;
printf("\n請輸入離開的時間:/**:**/");
scanf("%d:%d",&(p->leave.hour),&(p->leave.min));
printf("\n離開車輛的車牌號為:");
puts(p->num);
printf("\n其到達時間為: %d:%d",p->reach.hour,p->reach.min);
printf("離開時間為: %d:%d",p->leave.hour,p->leave.min);
A1=p->reach.hour;
A2=p->reach.min;
B1=p->leave.hour;
B2=p->leave.min;
printf("\n應交費用為: %2.1f元",((B1-A1)*60+(B2-A2))*price);
free(p);
}
int Arrival(SeqStackCar *Enter,LinkQueueCar *W) /*車輛到達*/
{
CarNode *p;
QueueNode *t;
p=(CarNode *)malloc(sizeof(CarNode));
flushall();
printf("\n請輸入車牌號(例:陜A1234):");
gets(p->num);
if(Enter->top<MAX) /*車場未滿,車進車場*/
{
Enter->top++;
printf("\n車輛在車場第%d位置.",Enter->top);
printf("\n請輸入到達時間:/**:**/");
scanf("%d:%d",&(p->reach.hour),&(p->reach.min));
Enter->stack[Enter->top]=p;
return(1);
}
else /*車場已滿,車進便道*/
{
printf("\n該車須在便道等待!");
t=(QueueNode *)malloc(sizeof(QueueNode));
t->data=p;
t->next=NULL;
W->rear->next=t;
W->rear=t;
return(1);
}
}
void Leave(SeqStackCar *Enter,SeqStackCar *Temp,LinkQueueCar *W)
{ /*車輛離開*/
int room;
CarNode *p,*t;
QueueNode *q;
/*判斷車場內是否有車*/
if(Enter->top>0) /*有車*/
{
while(1) /*輸入離開車輛的信息*/
{
printf("\n請輸入車在車場的位置/1--%d/:",Enter->top);
scanf("%d",&room);
if(room>=1&&room<=Enter->top) break;
}
while(Enter->top>room) /*車輛離開*/
{
Temp->top++;
Temp->stack[Temp->top]=Enter->stack[Enter->top];
Enter->stack[Enter->top]=NULL;
Enter->top--;
}
p=Enter->stack[Enter->top];
Enter->stack[Enter->top]=NULL;
Enter->top--;
while(Temp->top>=1)
{
Enter->top++;
Enter->stack[Enter->top]=Temp->stack[Temp->top];
Temp->stack[Temp->top]=NULL;
Temp->top--;
}
PRINT(p,room);
/*判斷通道上是否有車及車站是否已滿*/
if((W->head!=W->rear)&&Enter->top<MAX) /*便道的車輛進入車場*/
{
q=W->head->next;
t=q->data;
Enter->top++;
printf("\n便道的%s號車進入車場第%d位置.",t->num,Enter->top);
printf("\n請輸入現在的時間/**:**/:");
scanf("%d:%d",&(t->reach.hour),&(t->reach.min));
W->head->next=q->next;
if(q==W->rear)
W->rear=W->head;
Enter->stack[Enter->top]=t;
free(q);
}
else
printf("\n便道里沒有車.\n");
}
else printf("\n車場里沒有車."); /*沒車*/
}
void List1(SeqStackCar *S) /*列表顯示車場信息*/
{
int i;
if(S->top>0) /*判斷車站內是否有車*/
{
printf("\n車場:");
printf("\n 位置 到達時間 車牌號\n");
for(i=1;i<=S->top;i++)
{
printf(" %d ",i);
printf("%d:%d ",S->stack[i]->reach.hour,S->stack[i]->reach.min);
puts(S->stack[i]->num);
}
}
else printf("\n車場里沒有車");
}
void List2(LinkQueueCar *W) /*列表顯示便道信息*/
{
QueueNode *p;
p=W->head->next;
if(W->head!=W->rear) /*判斷通道上是否有車*/
{
printf("\n等待車輛的號碼為:");
while(p!=NULL)
{
puts(p->data->num);
p=p->next;
}
}
else printf("\n便道里沒有車.");
}
void List(SeqStackCar S,LinkQueueCar W)
{
int flag,tag;
flag=1;
while(flag)
{
printf("\n請選擇 1|2|3:");
printf("\n1.車場\n2.便道\n3.返回\n");
while(1)
{
scanf("%d",&tag);
if(tag>=1||tag<=3) break;
else printf("\n請選擇 1|2|3:");
}
switch(tag)
{
case 1:
List1(&S);
break; /*列表顯示車場信息*/
case 2:
List2(&W);
break; /*列表顯示便道信息*/
case 3:
flag=0;
break;
default: break;
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -