欢迎来到入门教程网!

C语言

当前位置:主页 > 软件编程 > C语言 >

C语言实现游戏VIP停车场管理系统

来源:本站原创|时间:2020-01-10|栏目:C语言|点击:

在数据结构这部分学习结束后,写一个小项目,我想是对这部分知识一个很好的运用过程。

我在这介绍我写的一个项目,游戏停车场(这个版本只是初级版,可以在这之上继续添加很多其他功能,大家可以自己尝试)。

功能要求如下:

程序如下:

/*************************************************************************** 
项目要求 
游戏VIP停车场 
问题描述:停车场是一个能放10辆车的车场(链表实现), 汽车按到达的先后次序停放
在等候区。若等候区满了(10辆车),按汽车的VIP等级(两种排序方法),依次停入停车场 ,在停
车期间,我们可以通过汽车牌号查找汽车相关信息,并且可以随意删除其中一辆汽车,汽车
离开要按等候区的顺序依次离开(使用队列实现)汽车离开时按停放时间收费。 
***************************************************************************/ 
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
 
#define LEN sizeof(struct parking)      
#define MAXSIZE 10 //车库大小,可自定义大小,这里默认为10
#define MONEY 0.002 //收费价格,这里默认为1分钟,收费0.12元
 
typedef struct parking
{
 char number[10]; //车辆信息
 int vip; //车辆VIP等级
 int time1;  // 进入停车场时间
 int time2;  // 离开停车场时间
 int count; //标记车辆,后面入队时使用
 struct parking*next;
}car;
static int n = 0; //全局变量,用于标记车辆数目,计算车位
car c;
void menu()
{
 printf("\t==============欢迎来到中南国际停车场=============\n");
 printf ("\t******************目前停车场状况*****************\n");
 printf ("\t停车场共有%d个车位,当前停车场剩余%d车位\n", MAXSIZE,MAXSIZE - n);
 printf ("\t*************************************************\n");
 printf("\t================1,停入车辆=======================\n");
 printf("\t================2,VIP等级排序车辆================\n");
 printf("\t================3,驶出所有车辆(队列)==============\n");
 printf("\t================4,查找车辆=======================\n");
 printf("\t================5,遍历停车场全部车辆信息=========\n");
 printf("\t================6,驶出指定车辆===================\n");
 printf("\t================7,退出===========================\n");
}
 
struct parking *creat() //创建链表,用于存放车辆信息
{
 struct parking*p1,*p2,*head;
 head = NULL; //为方便后面排序,这里创建不带头结点的链表
 int i = 1;
 p1=p2=(struct parking*)malloc(LEN);
 printf("输入车辆VIP等级:\n");
 scanf("%d",&p1->vip);
 printf("输入车牌号:\n");
 scanf("%s",p1->number);
 p1->count = i;
 time_t t1;
  long int t = time(&t1);  // 标记进入停车场的时间
  c.time1 = t;
  char* t2;
  t2 = ctime(&t1);  // 获取当前时间         
  printf("牌照为%s的汽车停入等候区成功,当前时间:%s\n",p1->number,t2); //显示停车场状况,以及停入时间
 while(p1->vip != 0 && i <= 10)
 {      //由于不带头结点,这里创建时考虑了三种插入方法
 n = n+1;
 if(n == 1)
  head = p1;
 else
  p2->next = p1;
 p2 = p1;
 p1 = (struct parking*)malloc(LEN);
 printf("输入车辆VIP等级:\n");
 scanf("%d",&p1->vip);
 printf("输入车牌号:\n");
 scanf("%s",p1->number);
 i++;
 p1->count = i;
 time_t t1;
    long int t = time(&t1); // 标记进入停车场的时间
 c.time1 = t;
    char* t2;
    t2 = ctime(&t1);  // 获取当前时间         
    printf("牌照为%s的汽车停入等候区成功,当前时间:%s\n",p1->number,t2); //显示停车场状况,以及停入时间
    
 }
 p2->next = NULL;
 printf("等候区以满\n");
 return head;
}
 
struct parking *Sort(struct parking *head)//链表排序,冒泡排序
{
  struct parking *p,*q,*s;
  int t,a,m;
  char arr[10];
 printf("请输入排序方式:(1:冒泡排序法 0:选择排序法)\n");
 scanf("%d",&a);
 if(a = 1)
 {
   for(p = head;p != NULL;p = p->next)
   {
     for(q = p->next;q != NULL;q = q->next)
     {
       if(p->vip < q->vip)//降序
  {
         t = q->vip; //按VIP等级交换结点数据
   q->vip = p->vip;
   p->vip = t;
   strcpy(arr,q->number);
   strcpy(q->number,p->number);
   strcpy(p->number,arr);
   m = q->count;   
   q->count = p->count;
   p->count = m;
  }
     }
   }
 return head; 
  }
 else //选择排序法
 {
 for(p = head;p != NULL;p = p->next)  
   {
  s = p; //s标记为最大值
  for(q = p->next;q != NULL;q = q->next)
     {
   if(p->vip < q->vip)//降序
  {
         s = q;
  }
  if(s != p)
  { 
         t = q->vip; //按VIP等级交换结点数据
   q->vip = p->vip;
   p->vip = t;
   strcpy(arr,q->number);  
   strcpy(q->number,p->number);
   strcpy(p->number,arr);
   m = q->count;   
   q->count = p->count;
   p->count = m;
  }
     }
   }
 return head;
 }
}
 
typedef struct QueueNode //先入先出(队列)Vip离场
{
  int data;
  struct QueueNode *next;
}Queue,*QueuePtr;
 
typedef struct
{
  QueuePtr front,rear; //队列指针
}LinkQueue;
 
LinkQueue* CreateQueue(LinkQueue *Q) //创建队列
{
  Q = (LinkQueue*)malloc(sizeof(LinkQueue));
  Q->front = Q->rear = (QueuePtr)malloc(sizeof(Queue));
  Q->front->next = NULL;
  return Q;
}
 
void Push(struct parking *head,LinkQueue* Q) //入队操作,按链表中一开始车辆标号顺序
{
  struct parking *p;
 p = head;
  while(p!=NULL)
  {
    QueuePtr s = (QueuePtr)malloc(sizeof(Queue));
    s->data = p->count; //队列只记录车辆一开始的标号信息
    s->next = NULL;
    Q->rear->next = s;
    Q->rear = s;
    p = p->next;     
  }
}
 
struct parking Exert1(struct parking *head,int e) //按等候区顺序出队(一辆)
{
  struct parking *p;
  p = head;
  while(p != NULL && p->count != e)
  {
    p = p->next;
  }
  if(p->count == e)
  {
    time_t t1;
 long int t = time(&t1);  // 标记显示时的时间
 printf ("车牌号\tVIP等级\t\t停放时长\t当前所需支付金额\n"); //打印查到的车辆信息  
 printf ("%s\t%d\t\t%d秒\t\t%2.3f元\n",p->number,p->vip,t - c.time1, MONEY * (t - c.time1));
  }
}
int Pop(struct parking *head,LinkQueue *Q) //按等候区顺序出队(全部)
{
  QueuePtr p;
  int i = 1;
  if(Q->front == Q->rear)
  {
    printf("停车场无车辆!\n");
    return 0;
  }
  else
  {
    for(i;i <= 10;i++) //按等候区顺序出队(全部)
    { 
     p = Q->front->next;
     Q->front->next = p->next; //出队操作
     if(Q->rear == p) 
       Q->rear = Q->front;
     Exert1(head,i); //调用函数,实现按等候区顺序出一辆车
     }
  }
}
 
 
 
struct parking *Exert(struct parking *head,char number[10]) //驶出指定车辆
{ 
 struct parking *p1,*p2;
 p1 = head;
 p2 = p1;
 while(p1->next !=NULL && strcmp(p1->number,number) != 0)
 {
 p2=p1;
 p1=p1->next; 
 }
 if(strcmp(p1->number,number) == 0) //不带头结点,这里有三种删除车辆的辨别
 {
 if(p1 == head)
 {
  head = head->next; //头,中间,尾,三种删除方式
  printf("驶出车辆成功\n");
  n--;
 }
 else
 {
  p2->next = p1->next;
  printf("驶出车辆成功\n");
  n--;
 }
 time_t t1;   
 long int t = time(&t1);        
 c.time2 = t; // 标记离开停车场的时间
 char* t2;
 t2 = ctime(&t1); // 获取当前时间
 printf("离开时间%s\n需付%2.3f元\n",t2,MONEY * (c.time2 - c.time1)); //显示停车场状况以及驶出时间和收费情况
 }
 else
 {
 printf("停车场没此车辆!\n");
 }
 free(p1);
 return head;
}
 
struct parking *find(struct parking *head,char number[20]) //查找指定车辆
{
 struct parking *p1;
 p1 = head;
 while(p1->next != NULL && strcmp(p1->number,number)!=0)
 {
 p1 = p1->next; 
 }
 if(strcmp(p1->number,number)==0) //打印查到的车辆信息
 {
 printf("查找成功,车辆信息如下:\n");
 time_t t1;
 long int t = time(&t1);       // 标记显示时的时间
 printf ("车牌号\tVIP等级\t\t停放时长\t当前所需支付金额\n"); //打印查到的车辆信息  
 printf ("%s\t%d\t\t%d秒\t\t%2.3f元\n",p1->number,p1->vip,t - c.time1, MONEY * (t - c.time1));
 }
 else
 printf("停车场没此车辆!\n"); 
}
 
void show(struct parking *head) //显示车库现有车辆
{
 struct parking *p;
 p = head;
 if(head != NULL)
 {
 do
  {
  time_t t1;
  long int t = time(&t1); // 标记显示时的时间
  printf ("车牌号\tVIP等级\t\t停放时长\t当前所需支付金额\n"); //打印查到的车辆信息  
  printf ("%s\t%d\t\t%d秒\t\t%2.3f元\n",p->number,p->vip,t - c.time1, MONEY * (t - c.time1));
  p = p->next;
  }while(p != NULL);
 } 
 else
 printf("停车场无车辆!\n");
}
 
int main()
{
 int n = 1;
 int i;
 struct parking *head; //初始化链表
 LinkQueue q;
 LinkQueue* Q = &q;
 Q = CreateQueue(Q);
 char number[10];   
 while(n)
 {
 system("clear");
 menu();
 printf("请输入你的骚操作:\n");
 scanf("%d",&i);
 switch(i)
 {
  case 1:{head = creat();Push(head,Q);break;} //创建链表,并创建队列
  case 2:{head = Sort(head);break;} //按vip排序
  case 3:{Pop(head,Q);break;} //按等候区顺序出队(全部)
  case 4:
  {
  printf("请输入查找车辆的车牌号:\n"); //查找指定车辆
  scanf("%s",number);
  find(head,number);break;
  }
  case 5:{show(head);break;} //显示车库现有车辆
  case 6:
  { 
  printf("请输入要驶出车辆的车牌号:\n"); //驶出指定车辆
  scanf("%s",number);
  head = Exert(head,number);break; 
  }
  default:{break;}
 }
 }
}

功能的实现,有很多方法,如果大家有自己的想法,可以评论,大家互利共进。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

上一篇:C语言实现简单航班管理系统

栏    目:C语言

下一篇:C语言实现的猜数字小游戏

本文标题:C语言实现游戏VIP停车场管理系统

本文地址:https://www.xiuzhanwang.com/a1/Cyuyan/6.html

网页制作CMS教程网络编程软件编程脚本语言数据库服务器

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:835971066 | 邮箱:835971066#qq.com(#换成@)

Copyright © 2002-2020 脚本教程网 版权所有