| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 777 人关注过本帖
标题:[原创]自编停车场问题!
只看楼主 加入收藏
zerojunyan
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2008-11-2
收藏
 问题点数:0 回复次数:8 
[原创]自编停车场问题!

自己编写的停车场问题,一起来讨论一下如何修改会更好吧!!!



代码如下:


#include<stdio.h>
#include<stdlib.h>
#define MaxStackSize 2              /*栈的最大值*/
#define MaxQueueSize 100             /*队列的最大值*/
#define money 2                      /*停车场每小时的费用*/
typedef struct                       /*车的数据结构*/
{int num;
 float time;
}CarType;

/*定义栈*/
typedef struct                       /*定义堆栈*/
{CarType stack[MaxStackSize];
 int top;
}SeqStack;

void StackInitate(SeqStack *S)       /*初始化堆栈*/
{S->top=0;
}

int stackfull(SeqStack S)            /*判断栈是否满*/
{if(S.top>=MaxStackSize)
    return 1;
 else return 0;


}


int StackNotEmpty(SeqStack S)        /*判断是否为非空栈*/
{if(S.top<=0) return 0;
 else return 1;
}

int StackPush(SeqStack *S,CarType x)    /*入栈*/
{if(S->top>=MaxStackSize)
    {printf("堆栈已满无法插入!\n");
     return 0;
    }
 else
    {S->stack[S->top]=x;
     S->top++;
     return 1;
 
    }

}

int StackPop(SeqStack *S,CarType *d)   /*出栈*/
{if(S->top<=0)
    {printf("堆栈已空无数据元素出栈!\n");
     return 0;
    }
 else
    {S->top--;
     *d=S->stack[S->top];
     return 1;

    }

}
int StackTop(SeqStack S,CarType *d)  /*取栈顶元素*/
{if(S.top<=0)
    {printf("堆栈已空!\n");
     return 0;

    }
 else
    {*d=S.stack[S.top-1];
     return 1;
    }


}

/*定义队列*/
typedef struct
{
  CarType queue[MaxQueueSize];
  int rear;             /*队尾指针*/
  int front;                /*队头指针*/
  int count;            /*计数器*/
} SeqCQueue;

void QueueInitiate(SeqCQueue *Q)
/*初始化顺序循环队列Q*/
{Q->rear = 0;      /*定义初始队尾指针下标值*/   
 Q->front = 0;    /*定义初始队头指针下标值*/   
 Q->count = 0;   /*定义初始计数器值*/
}

int QueueNotEmpty(SeqCQueue *Q)
{if(Q->count==0 && Q->rear == Q->front)
     return 0;
 else return 1;
   



}

int QueueAppend(SeqCQueue *Q, CarType x)      /*入队*/
{   if(Q->count > 0 && Q->rear == Q->front)
    {   printf("便道已满无法插入! \n");
        return 0;   }
    else
    {   Q->queue[Q->rear] = x;
        Q->rear = (Q->rear + 1) % MaxQueueSize;
        Q->count++;
        return 1;   }
}

int QueueDelete(SeqCQueue *Q, CarType *d)     /*出队*/
{   if(Q->count == 0)
    {printf("队列已空无数据元素出队列! \n");
     return 0;  }
    else   
    {
        *d = Q->queue[Q->front];
         Q->front = (Q->front + 1) % MaxQueueSize;
         Q->count--;
          return 1; }
}


void enter(CarType *car,SeqCQueue *Carland,SeqStack *Carparking) /*进入停车场*/
{if(!QueueNotEmpty(Carland))
    if(!stackfull(*Carparking))
        {printf("停车场未满,可放入停车场\n\n");
         StackPush(Carparking,*car);
        }
    else
        {printf("停车场已满,请在便道上等候\n\n");
         QueueAppend(Carland,*car);
        }
 else {printf("停车场已满,请在便道上等候\n\n");
         QueueAppend(Carland,*car);
        }


}

float out(CarType *car,SeqCQueue *Carland,SeqStack *Carparking) /*离开停车场*/
{void StackInitate(SeqStack *S);
 void QueueInitiate(SeqCQueue *Q);
 CarType cartemp;
 float time;
 SeqStack Temp;                          /*定义临时车道*/
 StackInitate(&Temp);                    /*初始化临时车道*/
 if(StackNotEmpty(*Carparking))
     do
     {if(StackNotEmpty(*Carparking))
        {StackPop(Carparking,&cartemp);
         StackPush(&Temp,cartemp);
        }
      else
        {printf("找不到此车\n");
          break;
        }
     }while(cartemp.num!=car->num);
 else printf("无车可拿\n");
 if(cartemp.num==car->num)
    {StackPop(&Temp,&cartemp);
     printf("此车已经出停车场了\n");
     time=car->time-cartemp.time;
     
    }
 while(StackNotEmpty(Temp))
    {StackPop(&Temp,&cartemp);
     StackPush(Carparking,cartemp);
 
    }
 QueueDelete(Carland, &cartemp);
 if(cartemp.num==car->num)
    cartemp.time=car->time;        /*可认为这辆车进入的时间是另一辆车出车的时间*/
 StackPush(Carparking,cartemp);
 return time;


}






void main()
{void StackInitate(SeqStack *S);
 void QueueInitiate(SeqCQueue *Q);
 void enter(CarType *car,SeqCQueue *Carland,SeqStack *Carparking);
 float out(CarType *car,SeqCQueue *Carland,SeqStack *Carparking);
 SeqStack Carparking;          /*定义停车场*/
 SeqCQueue Carland;            /*定义便道*/
 char a='a',b;                   /*a用于记录操作,b用来记下回车键*/
 CarType car;
 float time;
 FILE *fp;                       /*用一个文本来记录所有的数据*/
 StackInitate(&Carparking);       /*初始化停车场*/
 QueueInitiate(&Carland);         /*初始化便道*/
 if((fp=fopen("datarecorder.txt","w+"))==NULL)            /*打开数据记录文本*/
    {printf("Cannot open file strike any key exit!");   
     exit (0);
    }
 printf("\t\t停车场管理\n");
 printf("****************************************\n");
 while(a!='E')
 {  printf("\t请输入您操作:\n");
    printf("\t1.入车 请输入A+回车键\n");
    printf("\t2.出车 请输入D+回车键\n");
    printf("\t3.结束 请输入E+回车键\n");
    scanf("%c",&a);
    if(a=='A')                                                       /*入车*/
        {printf("请输入车牌号和入车时间(以小时为单位)用','隔开\n");
         scanf("%d,%f",&car.num,&car.time);
         enter(&car,&Carland,&Carparking);
         fprintf(fp,"操作%c,车牌号%d,时间%f\n",a,car.num,car.time);
         printf("****************************************\n\n");
        }
    
    if(a=='D')                                                      /*出车*/
        {printf("请输入车牌号和出车时间用','隔开\n");
         scanf("%d,%f",&car.num,&car.time);
         time=out(&car,&Carland,&Carparking);
         printf("现在每小时收费两元\n");
         printf("您的停车时间为:%f\n应缴纳的费用为:%f\n",time,time*money);
         fprintf(fp,"操作%c,车牌号%d,时间%f\n",a,car.num,car.time);
         fprintf(fp,"车牌号%d,花时间%f,应缴纳的费用为:%f\n",car.num,time,time*money);
         printf("****************************************\n\n");
        }
   
   scanf("%c",&b);                         /*用来存放多出来的回车符*/
 
 }
 printf("\t\tTHE END\n****************************************\n");
}


   我是在vc里运行的,是可以的,但是在wintc里就不可以,也不知道是什么原因?
   如何修改会更好呢?
搜索更多相关主题的帖子: 停车场 
2008-11-21 19:51
zerojunyan
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2008-11-2
收藏
得分:0 
没人发表下言论吗??
2008-12-05 19:48
ying8501
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:6
帖 子:1092
专家分:1446
注 册:2008-11-24
收藏
得分:0 
厉害。学习。
2008-12-05 20:00
zqy110007
Rank: 3Rank: 3
来 自:外太空
等 级:论坛游民
威 望:6
帖 子:1493
专家分:82
注 册:2008-11-19
收藏
得分:0 
呵呵,高手啊~
意见有一点点。
首先,你的A只是大写的,小写就不行。
改成if(a=='A' || a=='a')
当然,其他的也这么改一下

然后问一下,怎么到里面停了一辆车,然后就不能继续操作了?无论写‘A’还是‘a’都不行了。
可能是输入的问题咯。。我不知道车牌怎么写,我就写的asdf,45
然后弹出四个请您操作的,然后就不能操作了。。
你看看啊~

对了,顺便提一句,停车的时候不一定要用,号隔开,修改一下了。多几个判断,让他分隔符,逗号都可以,这样感觉好些。。

每个人都是蛤蟆,只是井的大小不同罢了.
沙石下的泉水,挖得越深,泉水越清.
2008-12-05 20:28
zerojunyan
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2008-11-2
收藏
得分:0 
谢谢你的意见。。。。。
其实为了方便我只系允许进入两辆车
2008-12-06 11:08
zerojunyan
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2008-11-2
收藏
得分:0 
谢谢你的意见。。。
其实我为了方便,就只是允许有两辆车可以进入停车站。。
2008-12-06 11:10
zqy110007
Rank: 3Rank: 3
来 自:外太空
等 级:论坛游民
威 望:6
帖 子:1493
专家分:82
注 册:2008-11-19
收藏
得分:0 
哦。。

每个人都是蛤蟆,只是井的大小不同罢了.
沙石下的泉水,挖得越深,泉水越清.
2008-12-06 11:44
li71
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2018-9-8
收藏
得分:0 
还是有点问题呀
2019-01-14 10:34
li71
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2018-9-8
收藏
得分:0 
最后输出钱数的时候为啥是负的呢?
2019-01-14 10:35
快速回复:[原创]自编停车场问题!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017088 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved