c语言实现会员管理系统,C语言实现游戏VIP停车场管理系统

这是一个使用数据结构实现的初级版停车场游戏项目,通过链表和队列管理10个车位的车辆进出。车辆按VIP等级排序停入,按等候区顺序离开并计费。用户可以查找、删除车辆信息,查看停车场状态。项目展示了数据结构在实际问题中的应用。
摘要由CSDN通过智能技术生成

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

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

功能要求如下:

e146c82db9257260eddff56d588dd442.png

程序如下:

/***************************************************************************

项目要求

游戏VIP停车场

问题描述:停车场是一个能放10辆车的车场(链表实现), 汽车按到达的先后次序停放

在等候区。若等候区满了(10辆车),按汽车的VIP等级(两种排序方法),依次停入停车场 ,在停

车期间,我们可以通过汽车牌号查找汽车相关信息,并且可以随意删除其中一辆汽车,汽车

离开要按等候区的顺序依次离开(使用队列实现)汽车离开时按停放时间收费。

***************************************************************************/

#include

#include

#include

#include

#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;}

}

}

}

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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1需求分析……………………………………………………………………(页码) 2概要设计……………………………………………………………………(页码) 3详细设计……………………………………………………………………(页码) 4 测试与分析………………………………………………………………………(页码) 5 用户使用说明……………………………………………………………………(页码) 6.发现问题及错误分析 7总结…………………………………………………………………………………(页码)  参考文献 ……………………………………………………………………………(页码)  附录:程序源代码 …………………………………………………………………(页码) 1、需求分析:   根据题目要求,充分地分析和理解问题,描述系统的功能要求,明确问题要求做什么?以及限制条件是什么? 问题描述 随着我国人民生活水平提高和汽车工业的高速发展.越来越多的家庭拥有了汽车,但受到土地的限制,所以采用立体停车场是解决停车难的必然出路。立体停车场占地少,容量大.利用效率高;泊车与取车全自动化,省时省力,安全防盗。本文主要以两层停车场为例,设计一能完成存车与取车的停车场系统。 有一个两层的停车场, 每层有6个车位, 当第一层车停满后才允许使用第二层. ( 停车场可用一个二维数组实现, 每个数组元素存放一个车牌号 ) 每辆车的信息包括车牌号、 层号、 车位号、停车时间共4项, 其中停车时间按分钟计算 。 假设停车场初始状态为第一层已经停有4辆车, 其车位号依次为1—4 , 停车时间依次为20, 15, 10 , 5 . 即先将这四辆车的信息存入文件”car.dat”中( 数组的对应元素也要进行赋值 ) 。  停车操作:当一辆车进入停车场时, 先输入其车牌号, 再为它分配一个层号和一个车位号, 停车时间设为5 , 最后将新停入的汽车的信息添加文件”car.dat”中, 并将在此之前的所有车的停车时间加5。 收费管理(取车): 当有车离开时, 输入其车牌号, 先按其停车时间计算费用, 每5分钟0.2元. (停车费用可设置一个变量进行保存), 同时从文件”car.dat”中删除该车的信息, 并将该车对应的车位设置为可使用状态(即二维数组对应元素清零). 按用户的选择来判断是否要输出停车收费的总计。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值