c语言车队
C语言数据结构 车队管理
我的结题思路:
车的状态分三种,用switch语句分开{
1:停车 A
库未满,往车库里停车
库满,往便道里停车
2:出车 D
从车库里出车使用临时车库
从变道里出车,使用临时便道
3:停止输入 E
}
注意:
1:请勿略下面代码中 “还没有计算位置” 写的时候提醒自己,上传时我忘删了
2:使用静态数组来记录进去的时间 ,用 a[车牌号]
3:用静态 i 来记录进车库里的进出车
进车 i++
出车 i--
4:在写最关键部分时,我是用到了才定义,所以看着有乱,包含哈-_- -_-
二、关键代码//我用的是VS2013
#include<stdlib.h>
#include<stdio.h>
#include<iostream>
usingnamespacestd;
staticinti=1;
staticinta[100];
#defineSTACK_INITSIZE100
#defineStackIncrement10
#defineOK1
#defineERROR0//结构体..............................................................................
typedefstructGARAGE{//创建车库的结构体
int*base;
int*top;
intstacksize;
intOutTime;
}Garage;
typedefstructTPGarage{//创建临时车库的结构体
int*base;
int*top;
intstacksize;
}TpGarage;
typedefstructQNode{
intdate;
structQNode*next;
}QNode,*QueuePtr;
typedefstruct{//创建便道的结构体
QueuePtrfront;
QueuePtrrear;
}OtGarage;
typedefstructTNode{//创建临时便道的结构体
intTdate;
structTNode*Tnext;
}TNode,*TQueuePtr;
typedefstruct{
TQueuePtrTfront;
TQueuePtrTrear;
}TOtGarage;
//.....................................................机构体..................
//...........................................声明........................
voidInitGarage(Garage&S,intt);//车库
voidPushGarage(Garage&S,intchp,intt);
voidZPushGarage(Garage&S,intchp);
voidGetTopGarage(TOtGarage&TG,OtGarage&OG,TpGarage&T,Garage&S,intchp,intt);
intPop(Garage&S,int&GH);
voidInitTpStack(TpGarage&T);//临时车库
voidPushTpStack(TpGarage&T,intchp);
voidPopTpStack(TpGarage&T,int&chp);
voidInitOtGarage(OtGarage&OG);//变道
voidPushTpStack(TpGarage&T,intchp);
intOutOtGarage(OtGarage&OG,int&e);
voidInitTOtGarage(TOtGarage&TG);//临时便道
voidTEnOtGarage(TOtGarage&TG,int&Te);
intTOutOtGarage(TOtGarage&TG,int&Te);
inttranverse(GarageS,intt);//遍历车库
intPush(charX,intchp,intt,Garage&S,TpGarage&T,OtGarage&OG,TOtGarage&TG);//枢纽
//............................................声明.......................................
//.................................车库........................................................
voidInitGarage(Garage&S,intt){//初始化出库
S.stacksize=t;
S.base=(int*)malloc(S.stacksize*sizeof(int));
S.top=S.base;
}
voidPushGarage(Garage&S,intchp,intt){//车库进车
a[chp]=t;//记录当前的时间
*(S.top)++=chp;
}
voidZPushGarage(Garage&S,intchp){//车库进车
*(S.top)=chp;
S.top++;
}
voidGetTopGarage(TOtGarage&TG,OtGarage&OG,TpGarage&T,Garage&S,intchp,intt){//车库中出
intkeepch=chp;//将当前的车牌保存下来
intgh=0;
intnum;
intfh=0;
inti=0;//记住车库出去车的量
inte=0;//做一个遍历,找出该车的位置
intjs=0;
intTe=0;
S.OutTime=t;//是的话,直接出车,删掉元素
if(tranverse(S,chp)){//做一个遍历,该车在车库的话,就从车库中出车
while(Pop(S,gh)!=keepch){//让车库的车出去
PushTpStack(T,gh);
i++;
}
if(num=(S.OutTime-a[chp])%10==0){
num=S.OutTime-a[chp];
}
elsenum=((S.OutTime-a[chp])/10+1)*10;
cout<<"该车在停车场的时间为"<<num<<//此时输出该车的信息
"分钟,应该收费为"<<0.5*num<<"元"<<endl;
for(size_tj=0;j<i;j++){
PopTpStack(T,fh);//依次将其他开回来,往前挪一位,空出门前的车位
ZPushGarage(S,fh);
}
if(OutOtGarage(OG,e)){//当变道里有车时,从外面再进来一辆车
PushGarage(S,e,S.OutTime);
}
}
else{//注意第一个if,这里是对应的else,表示车要从临时便道里出车
//将便道里的车送到临时便道,
inty=OutOtGarage(OG,gh);
while(gh!=keepch){//让车库的车出去OutOtGarage(OtGarage&OG,int&e)
TEnOtGarage(TG,gh);//推到临时车道
js++;
y=OutOtGarage(OG,gh);
}
if(js==0){//后面的车往前开
//直接从停车场出去
cout<<"该车未在车库停车,无需缴费"<<endl;
}
elseif(!OutOtGarage(OG,e)){//如果此时为底的话,再重新进入变道
for(size_tj=0;j<i;j++){
intv;
v=TOutOtGarage(TG,Te);//
PushTpStack(T,Te);//还没有计算位置
}i--;
cout<<"该车未在车库停车,无需缴费"<<endl;
}
else{
cout<<"该车未在车库停车,无需缴费"<<endl;
intjd;
QueuePtrp;//变道有车的话,返回一个
p=OG.front->next;
e=p->date;
OG.front->next=p->next;
if(OG.rear==p)
OG.rear=OG.front;
free(p);
//先释放一个节点,继续传
while(OutOtGarage(OG,gh)){//让车库的车出去OutOtGarage(OtGarage&OG,int&e)
TEnOtGarage(TG,gh);//推到临时车道
}
while(TOutOtGarage(TG,Te)){
PushTpStack(T,Te);
}i--;
}//如果此时不为底的话,继续进入临时便道,再进入变道
}
}
intPop(Garage&S,int&GH){//车库中出车
GH=*--S.top;
returnGH;
}
//....................................车库.........................
//...............................临时车库..........................
voidInitTpStack(TpGarage&T){//初始化临时车库
T.stacksize=STACK_INITSIZE;
T.base=(int*)malloc(T.stacksize*sizeof(int));
T.top=T.base;
}
voidPushTpStack(TpGarage&T,intchp){
if(T.top-T.base>=T.stacksize){
T.base=(int*)realloc(T.base,
(T.stacksize+STACK_INITSIZE)*sizeof(int));
T.top=T.base+T.stacksize;
T.stacksize+=STACK_INITSIZE;
}
*T.top++=chp;
}
voidPopTpStack(TpGarage&T,int&chp){//当其为返回值为1的时候,删除栈顶且返回
chp=*--T.top;
}
//...........................临时车库.................................
//...........................变道....................................
voidInitOtGarage(OtGarage&OG){//初始化便道
OG.front=OG.rear=(QueuePtr)malloc(sizeof(QNode));
OG.front->next=NULL;
}
voidEnOtGarage(OtGarage&OG,int&e){//进入变道
QueuePtrp;
p=(QueuePtr)malloc(sizeof(QNode));//用来放置车牌号
p->date=e;
p->next=NULL;
OG.rear->next=p;
OG.rear=p;
cout<<"车库已满,该车在变道上的第"<<i<<"位"<<endl;
i++;
cout<<endl;
}
intOutOtGarage(OtGarage&OG,int&e){//变道出车
cout<<endl;//没有车的话,返回0
if(OG.front==OG.rear){
returnERROR;
}
QueuePtrp;//变道有车的话,返回一个
p=OG.front->next;
e=p->date;
OG.front->next=p->next;
if(OG.rear==p)
OG.rear=OG.front;
free(p);
i--;
returnOK;
}
voidInitTOtGarage(TOtGarage&TG){//初始化便道
TG.Tfront=TG.Trear=(TQueuePtr)malloc(sizeof(TNode));
TG.Tfront->Tnext=NULL;
}
voidTEnOtGarage(TOtGarage&TG,int&Te){//进入临时变道
TQueuePtrp;
p=(TQueuePtr)malloc(sizeof(TNode));//用来放置车牌号
p->Tdate=Te;
p->Tnext=NULL;
TG.Trear->Tnext=p;
TG.Trear=p;
//cout<<"车库已满,该车在变道上的第"<<i<<"位"<<endl;
i++;
cout<<endl;
}
intTOutOtGarage(TOtGarage&TG,int&Te){//临时变道出车
cout<<endl;//没有车的话,返回0
if(TG.Tfront==TG.Trear)
returnERROR;
TQueuePtrp;//临时变道有车的话,返回一个
p=TG.Tfront->Tnext;
Te=p->Tdate;
TG.Tfront->Tnext=p->Tnext;
if(TG.Trear==p)
TG.Trear=TG.Tfront;
free(p);
i--;
returnOK;
}
//........................................临时便道...........................
//............................总枢纽...........................................
intPush(charX,intchp,intt,Garage&S,TpGarage&T,OtGarage&OG,TOtGarage&TG){
switch(X){//判断该车是进入还是要离开
case'A':{//情况A,进入车库
if(S.top-S.base>=S.stacksize){
cout<<"时间在第"<<t<<"分钟,"<<"车牌号为"<<chp<<"的小车进入便道等待车位"<<endl;
//车库满,接下来该车进入便道
EnOtGarage(OG,chp);//调用进入变道的函数
}
else{
//cout<<"OOOOO"<<endl;
PushGarage(S,chp,t);//进入车库
}
returnOK;
}break;
case'D':{//情况D,离开车库
GetTopGarage(TG,OG,T,S,chp,t);//1:在车库中的出去
returnOK;
}break;
case'E':{//情况E,所有的车辆弄干净
returnERROR;
}break;
}
}
inttranverse(GarageS,intt){
while(S.top!=S.base){
S.top--;
if(t==*S.top)
returnOK;
}
returnERROR;
}
intmain(){
intnum;
charX;
inttime;
intchp;
intx;
GarageS;
TpGarageT;
OtGarageOG;
TOtGarageTG;
cout<<"温馨提示:本停车场每10分钟收费0.5元,不足10分钟的部分按10分钟收费。"<<endl;
cout<<"请输入停车车位的总数:";
cin>>num;
cout<<endl;
InitGarage(S,num);
InitTpStack(T);
InitOtGarage(OG);
InitTOtGarage(TG);
cout<<"输入停止的标志为(E00)"<<endl;
cout<<"停车信息(格式:(动作,车牌号,时间)):"<<endl;do{
cout<<"请输入停车信息"<<endl;
cin>>X>>chp>>time;
x=Push(X,chp,time,S,T,OG,TG);
}while(x);
}
B. 百战程序员:编程语言到底有多少种
这个有很多种的,下面讲解写常遇到的。把编程语言比喻成车:
Ada 是辆丑到极点但是永远不会出故障的坦克。
C 是辆赛车,它能跑得超乎想象得快,不过每跑个 50 英里就会抛锚。
Cobol 号称是辆车,不过没有哪个有自尊心的驾驶员肯承认曾经开过。
C# 是辆竞争模式的家庭旅行车。一旦你开过它,你就不会再用其他竞品厂商的产品了。
C++ 是辆大马力版本的 C 型赛车,它额外提供了成打的特性,而且每跑 250 英里才会抛锚,不过当它真出问题的时候,没有人能找到究竟是哪儿坏了。
Eiffel 是辆内置了法国口音驾驶说明的汽车。他会帮你快速地找到错误并从中学到东西,不过你要是敢跟他争论的话,他会骂你然后把你从车里扔出去。[来自 Daniel Prager ,稍有修改]
Erlang 是一个车队,它们会互相协作把你送到任何你想去的地方。想要每只脚各自操纵一辆车还是需要一些练习的,不过一旦学会了之后你就可以驾驶着它们通往其他方式难以企及的地方了。还有,你用了那么多辆车,所以就算有几辆坏掉也没什么可担心的。
Forth 是你亲手用套件组装出来的车。你这辆车不论长相还是功能都没必要和别人的一样。不过,Forth 型号的车只能倒着走。
[Digg.com 网站上的评论,来自 256byteram(我忍不住要把它加上):]
FORTH LOVE IF HONK THEN !(译注:抱歉我实在不知道这句话是啥意思……)
Fortran 是辆非常原始的车。它能跑得很快,前提是你要始终在完全笔直的道路上开。据说学开 Fortran 型汽车会导致你再也没法学开其他型号的汽车了。
Java
Java 是辆家庭旅行车。它驾驶起来很容易,开起来速度也不会太快,不至于伤到你自己。
版本1:Haskell是辆设计极端优雅漂亮的车,传闻它能开到非常极端的地形中去。当你试图驾驶它的时候,它并不是真的沿着道路在前进的;实际上,它是不断把自己和道路进行复制,每次成功复制之后,车在路上都会比上一次更远一点。应该还是有可能按照传统的方式来驾驶它的,不过你的数学能力不足以找出这个办法来。
版本2:Haskell 并不是辆真的车,它是一个抽象的机器,能够详细地告诉你驾驶这个过程应该是什么样子的,如果你愿意的话。你必须把这个抽象的机器放到另一台实际的机器里面才能开动它,别问这个实际的机器是怎么运行的。还有一种方法,你可以用多台抽象的机器造出另一台抽象的机器,然后把它交给那台实际的机器,这样就能一个接一个地完成你的旅途了。[Monadic 的版本]
版本1:Lisp 看起来像一辆车,不过经过足够的改装,就能把它变成非常有效的一架飞机或一艘潜艇。
版本2:一开始它看起来一点儿都不像一辆车,不过时不时地你也能看到有人在开着它转悠。终于有一天你决定多了解一下它,然后你意识到它其实是一辆能造出更多汽车的汽车。你把这个发现告诉了朋友,不过他们都大笑着说这些车看起来太奇怪了。至今你仍在车库里留着一辆,期待着哪天能把它开上路去。[来自 Paul Tanimoto]
Mathematica是辆设计得很好的车,它从 Lisp 型汽车那里借鉴了大量的东西,却连一点儿应得的赞扬都不给它。它能通过方程计算出到达目的地最高效的路径,只不过这要花上一大笔钱。
是辆设计给新手用的短途旅行车,通常都是开往那些 Mathmatica 型汽车常去的地方。在那些地方这车开起来非常舒服,不过只要你偏离了路线,哪怕只有一点点,它就会变得非常难以驾驭,以致于很多势利的司机根本就不承认它是一辆车。
Ocaml 是辆非常性感的欧洲车。它不像 C 那么快,但它从不出故障,所以结果你反而会花更短的时间到达目的地。不过因为这是法国,所有的控制装置都不在它们平时该在的地方。
Perl 应该是辆挺酷的车,不过驾驶员手册却难以理解。另外,就算你能找到方法去驾驶一辆 Perl 型号的车,你也开不起来别人的 Perl 型汽车。
PHP 是辆热狗车(Oscar Mayer Wienermobile),它非常古怪、又难以驾驭,但是所有人却还是想开它。[来自 digg.com 网站的 CosmicJustice]
版本1:Prolog 是全自动的:你告诉它你的目的地是什么样子的,然后剩下的驾驶工作它就全搞定了。[Paul Graham附加的:]不过,大多数情况下,确认目的地所花的工夫,和你直接开过去也差不多了。
版本2:Prolog 这辆车上装了一个独特的试错型 GPS 系统。在通往目的地的路上,它会一直往前开,如果走到死胡同了,它就调头回来再试试别的路,如此不断往复,一直到目的地为止。[我忘了是谁建议的这一条]
Python 是辆非常棒的给初学者用的车,就算没有驾照也能开。除非你想开得超级快,或者想开去很危险的地方,否则你可能永远都用不到别的车。
Ruby 这辆车是因为一次 Perl、Python 和 Smalltalk 三车相撞事故产生的。一个日本的机师找到了这些车的碎片然后拼成了一辆车,很多司机都觉得这比那三辆车加在一起还要好。不过也有些司机会发牢骚说 Ruby 型汽车的好多控制器都是重复的、甚至有三份,而这些重复的控制器在某些特别的情况下又稍有不同,这会让这车开起来更麻烦。据传说重新设计的工作已经在进行中了。
Smalltalk 是辆小型汽车,原本是设计给那些打算学驾驶的人用的,不过因为它设计得太棒了,即使那些有经验的老司机都喜欢开它。它速度并没有很快,不过你可以把它的任何一个零部件拿下来改造改造,让它更符合你的期待。古怪的事情是,你其实并没有真正地驾驶它,你只是发了条消息让它去什么地方,然后它要么就开过去了,要么就告诉你它不懂你在说啥。
版本1:汇编就只是个发动机。你得自己把车子造出来,还得在它跑的时候手动给它加油。不过只要你足够小心,它就能像来自地狱的蝙蝠(a bat out of hell)一样飞速前进。
版本2:汇编:你自己就是那辆车。
如果编程语言是种武器:
C 语言是 M1 式加兰德步枪,很老但可靠。
C++是双截棍,挥舞起来很强悍,很吸引人,但需要你多年的磨练来掌握,很多人希望改用别的武器。
Java 是 M240 通用弹夹式自动机枪,有时它的弹夹是圆的,但有时候不是,如果不是,当你开火时,会遇到 NullPointerException 问题,枪就会爆炸,你被炸死。
Scala 是 M240 通用机枪的变种,但它的使用手册是用一种看不懂的方言写的,很多人怀疑那只是一些梦话。
JavaScript 是一把宝剑,但没有剑柄。
Go 语言是一种自制的“if err != nil”发令枪,每一次发射后,你都必须要检查它是否真的发射了。
Rust 语言是一种 3D 打印出的枪。将来也许真的能派上用场。
bash 是一个十分碍手的锤子,你抡起它时会发现所有东西看起来都像钉子,尤其是你的指头。
Ruby 是一把外嵌红宝石的宝刀,人们使用它通常是因为看起来很炫。
PHP 是水管子,你通常会把它的一段接到汽车的排气管,另一端插进车窗里,然后你坐进车里,开动引擎。
Mathematica 是一种地球低轨道粒子大炮,它也许能够干出很神奇的事情,但只有付得起费用的人才能使用它。
C#是一种强悍的激光大炮,架在一头驴子上,如果从驴子上卸下来,它好像就发不出激光。
Prolog 语言是一种人工智能武器,你告诉它要做什么,它会照做不误,但之后,它会弄几个终结者出来,烧掉你的房子。
Lisp 语言是一把剃须刀,有很多款式。只有寻求刺激和危险的人才会使用它。
希望可以帮到您,谢谢!