CSDN-CSDN社区-C/C++-新手乐园

收藏 200分帮忙调试一下停车场问题,看了一天,快疯了[问题点数:100,结帖人:cismylife]

  • cismylife
  • (还有两年毕业!)
  • 等 级:
  • 结帖率:
楼主发表于:2008-10-28 21:53:58

错误肯定是出在car_leave()函数中,别的功能均没有错误,我把注释大多都写了,高手们只要把代码复制到vc中,然后运行一编肯定能看出来错误,我看了一天,快疯了

C/C++ code
/*停车场程序-我靠制作*/ #include<iostream> #include<string> #define MAX_STOP 7 //停车位个数 #define MAX_PAVE 100 //便道不限制车位的个数,就定义为100 using namespace std; //描述汽车的结构体 typedef struct { char license_plate[7];//汽车牌照号码,定义为一个字符指针类型。 char state;//汽车当前状态,字符s表示停放在停车位上,字符p表示停放在便道上,每辆车的初始状态用字符i来进行表示。 }Car; //模拟停车位的栈 typedef struct { Car STOP[MAX_STOP];//7个位置用来存放汽车对象的栈。 int top;//栈顶指针 }Stopping; Stopping *s; //模拟便道的队列 typedef struct { Car PAVE[MAX_PAVE]; //用队列来存放汽车对象。 int front,rear;//对头,队尾指针。 int num; }Pavement; Pavement *p; //辅助栈,用来存放开出停车位汽车(后面的)所有汽车的栈 typedef struct { Car BUFFER[MAX_STOP]; int top; }Buffer; Buffer *b; /*----------------------------栈的操作-------------------------------*/ //初始化停车位栈 Stopping * Init_Stopping() { s=new Stopping; if(!s) { cout<<"空间不足!!!"<<endl; return NULL; } else { s->top=-1; return s; } } //判断是否为空 int Empty_Stopping(Stopping *s) { if(s->top==-1) return 1; else return 0; } //入栈 int Push_Stopping(Stopping *s,Car c) { if(s->top==MAX_STOP-1) return 0; else { s->top++; s->STOP[s->top]=c; return 1; } } //出栈 int Pop_Stopping(Stopping *s,Car *c) { if(Empty_Stopping(s)) return 0; else { *c=s->STOP[s->top]; s->top--; return 1; } } //取栈顶 Car * Top_Stopping(Stopping *s) { if(Empty_Stopping(s)) return NULL; else return &s->STOP[s->top]; } //判断栈是否为满 int Full_Stopping(Stopping *s) { if(s->top==MAX_STOP-1) return 1; else return 0; } /*----------辅助栈----------*/ //初始化辅助栈 Buffer * Init_Buffer() { b=new Buffer; if(!b) { cout<<"空间不足!!!"<<endl; return NULL; } else { b->top=-1; return b; } } //判断辅助栈是否空 int Empty_Buffer(Buffer *b) { if(b->top==MAX_STOP) return 1; else return 0; } //入栈 int Push_Buffer(Buffer *b,Car c) { if(b->top==MAX_STOP-1) return 0; else { b->top++; b->BUFFER[b->top]=c; return 1; } } //出栈 int Pop_Buffer(Buffer *b,Car *c) { if(Empty_Buffer(b)) return 0; else { *c=b->BUFFER[b->top]; b->top--; return 1; } } //取栈顶 Car *Top_Buffer(Buffer *b) { if(Empty_Buffer(b)) return NULL; else return &b->BUFFER[b->top]; } /*-------------------------队列的操作--------------------------------*/ //初始化队列 Pavement *Init_Pavement() { p=new Pavement; p->front=p->rear=-1; p->num=0; return p; } //入队 int In_Pavement(Pavement *p,Car c) { if(p->num==MAX_PAVE-1) { cout<<"便道满!!"<<endl; return 0; } else { p->rear++; p->PAVE[p->rear]=c; p->num++; return 1; } } //出队 int Out_Pavement(Pavement *p,Car *c) { if(p->num==0) { cout<<"没车了!!!"<<endl; return 0; } else { p->front++; *c=p->PAVE[p->front]; p->num--; return 1; } } //取对头 Car *Top_Pavement(Pavement *p) { if(p->num==0) { cout<<"没车了!!!"<<endl; return NULL; } else { p->front++; return &p->PAVE[p->front]; } } /*-------------------------有关停车场的相关操作----------------------*/ //车来的方法 void car_come() { cout<<"请输入车牌号:"<<endl; Car *car=new Car; cin>>car->license_plate; if(Full_Stopping(s)!=1) { Push_Stopping(s,*car); cout<<"牌照为"<<car->license_plate<<"的汽车停入停车位的"<<s->top+1<<"号车位!"<<endl; } else { In_Pavement(p,*car); cout<<"牌照为"<<car->license_plate<<"的汽车停入便道位的"<<p->rear+1<<"号车位!"<<endl; } } //车走的方法 void car_leave() { Car *c;//存取Pop_Stopping栈弹出的Car对象 Car *c0; Car *c1; char car_num[7]; cout<<"请输入要走的车的车牌号码:"<<endl; cin>>car_num; Pop_Stopping(s,c); while(strcmp(car_num,c->license_plate)!=0) { Push_Buffer(b,*c);//把车牌号不相等的车放入缓冲栈 Pop_Stopping(s,c); } if(strcmp(car_num,c->license_plate)==0&&s->top!=-1) { cout<<"牌照为"<<c->license_plate<<"的汽车从停车厂开走;"<<endl; while(Empty_Buffer(b)!=1) { Pop_Buffer(b,c0); Push_Stopping(s,*c0); } //便道的车进入停车位 Out_Pavement(p,c1); Push_Stopping(s,*c1); cout<<"牌照为"<<c1->license_plate<<"的汽车从便道上停入停车位的"<<s->top+1<<"车位"<<endl; } /* if(s->top==-1) { cout<<"没有找到要开走的车!!!"<<endl; while(Empty_Buffer(b)!=-1) { Pop_Buffer(b,c); Push_Stopping(s,*c); } } */ } //显示状态 void car_display() { Car *c; Car *c1; cout<<"停车位情况:"<<endl; int top_b=s->top;//用于保存最初的栈顶值 int front_b=p->front;//用于保存最初队列头指针 if(Empty_Stopping(s)!=1) { while(s->top!=-1) { c=Top_Stopping(s); cout<<s->top+1<<"号车位----"<<c->license_plate<<endl; s->top--; } s->top=top_b;//还原栈顶值 } else cout<<"还没有车进入停车位!!!"<<endl; cout<<"便道上情况:"<<endl; if(p->num!=0) { while(p->front!=p->rear) { c1=Top_Pavement(p); cout<<p->front+1<<"号车位----"<<c1->license_plate<<endl; } p->front=front_b;//还原头指针 } else cout<<"还没有车进入便道上!!!"<<endl; } void welcome() { cout<<" ● 欢迎使用本程序●"<<endl; cout<<"本程序为停车场的模拟管理程序,有车到来时请按c键。"<<endl; cout<<"然后根据屏幕提示进行相关操作,有车要走时请按l键。"<<endl; cout<<"然后根据屏幕提示进行相关操作,要查询状态请按r键。"<<endl; cout<<"然后根据屏幕提示进行相关操作,要退出程序请按q键。"<<endl; } int main() { s=Init_Stopping(); p=Init_Pavement(); b=Init_Buffer(); char key; int m=100; while(m) { welcome(); cout<<"请选择c,l,r,q"<<endl; cin>>key; switch(key) { case 'c': car_come(); break; case 'l': car_leave();break; case 'r': car_display();break; case 'q': exit(0); } m--; } return 0; }
回复次数:15
#1楼 得分:5回复于:2008-10-28 21:55:07
邦定先
#2楼 得分:5回复于:2008-10-28 21:55:14
帮顶先
  • wuyu637用户头像
  • wuyu637
  • (乱世藏大米(继续收藏中))
  • 等 级:
#3楼 得分:10回复于:2008-10-28 22:01:36
Car *c =new Car;//存取Pop_Stopping栈弹出的Car对象
    Car *c0 ;
    Car *c1;

指针没有初始化
  • baihacker用户头像
  • baihacker
  • (飞雪-水群:29818877)
  • 等 级:
  • 4

    2

#4楼 得分:36回复于:2008-10-28 22:04:36
  • macfan用户头像
  • macfan
  • (我的世界只有我自己,Love )
  • 等 级:
#5楼 得分:2回复于:2008-10-28 22:08:37
好长.
  • zmlovelx用户头像
  • zmlovelx
  • (帅得不敢出门群31843264)
  • 等 级:
#6楼 得分:2回复于:2008-10-28 22:13:47
up 洗澡去
#7楼 得分:10回复于:2008-10-28 22:28:00
引用 3 楼 wuyu637 的回复:
Car *c =new Car;//存取Pop_Stopping栈弹出的Car对象
Car *c0 ;
Car *c1;

指针没有初始化

根据楼主的意思,这里应该想从函数里返回Car,所以不应该在外面创建这个对象,应该这样:
C/C++ code
//出栈 int Pop_Stopping(Stopping *s,Car *&c) // 这里 { if(Empty_Stopping(s)) return 0; else { c=&(s->STOP[s->top]); // 这里 s->top--; return 1; } }


Pop_Buffer() 和 Out_Pavement()也应该进行相应的修改
#8楼 得分:10回复于:2008-10-28 22:33:33



C/C++ code
void car_leave() { Car *c=new Car;//存取Pop_Stopping栈弹出的Car对象 Car *c0; Car *c1; char car_num[7]; cout<<"请输入要走的车的车牌号码:"<<endl; cin>>car_num; Pop_Stopping(s,c);


Car *c=new Car;//存取Pop_Stopping栈弹出的Car对象
没有初始化,所以出现问题了
#9楼 得分:0回复于:2008-10-28 22:56:02
我也UP
#10楼 得分:2回复于:2008-10-29 08:29:55
顶了。
  • hqin6用户头像
  • hqin6
  • (!独行)
  • 等 级:
#11楼 得分:2回复于:2008-10-29 08:38:20
问题解决了??
#12楼 得分:10回复于:2008-10-29 09:42:48
调试了好一会儿
lz写的程序,好复杂,好复杂。建议以后注意良好的代码风格~~~

这到题目问题在于:忘记了指针的特点,必须先定义,后使用。

比如下面的这种方法就是错误的:
int *iTemp1;
*Temp1 = 10;//这个含义是iTemp1指向的数据单元赋值为10,问题是它现在还没有指向谁那,所以就会出现错误
#13楼 得分:2回复于:2008-10-29 09:46:06
友情UP
  • aaajj用户头像
  • aaajj
  • (忆江南)
  • 等 级:
#14楼 得分:2回复于:2008-10-29 09:50:21
遥想当年
  • aaajj用户头像
  • aaajj
  • (忆江南)
  • 等 级:
#15楼 得分:2回复于:2008-10-29 09:50:21
遥想当年