标签:
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 }
标签:
原文地址:http://www.cnblogs.com/wozixiaoyao/p/5686019.html