cout<<\汽车已停止\ buffer=1; p2(); }
return 0; }
int p2()//乘客上下车进程 {
if(buffer) {
cout<<\售票员已打开车门\ cout<<\请乘客上下车\ while(1) {
cin>>a;
if((a=='1')&&(n>0)) {
n--;
cout<<\上了一名乘客\ continue; };
if((a=='2')&&(n n++; cout<<\下了一名乘客\ continue; }; if(a=='3') { break; }; if(a=='4') { if(n>=SIZE) { break; } else cout<<\乘客未全部下车,等待乘客下车\ }; if((a<='0')||(a>'4')) { cout<<\操作错误,请输入正确的操作符1-4\ }; if(n<=0) { cout<<\车上座位已满,无法再上乘客了\ continue; }; if(n>=SIZE) { cout<<\乘客已全部下车\ continue; }; } cout<<\现在关闭车门\ buffer=0; if(a=='4') { cout<<\汽车到达终点站,乘客已全部下车,一天行程结束\ buffer=1; }; p1(); } return 0; } int main() { cout<<\使用说明:\ cout<<\键入1表示乘客上车\ cout<<\键入2表示乘客下车\ cout<<\键入3表示乘客上下车过程结束\ cout<<\键入4表示汽车到达终点站,一天行程结束\ cout<<\行程开始,汽车在起点站准备启动\ p2(); return 0; } 2.2.4 测试用例,运行结果与运行情况分析; 运行结果: 程序运行后结果如下: 对程序操作后结果如下: 运行情况分析: 程序运行结果正确。但由于对程序的操作次数有限,所以并不能看到程序的全部功能。当输入的操作符不合要求的时候,程序会给出输入错误提示,由于车的容量有限,当乘客上满后,再对程序进行上车操作,程序也会给出车上乘客已满无法上车的提示。当车上没有乘客时,再对程序进行下车操作,程序会给出车上乘客已全部下车的提示。 2.2.5 自我评价与总结: 设计的比较好和比较出色的地方: 这次课程设计基本上完成了实验要求,实现了司机与售票员之间的同步关系。程序写的很简洁明了,少而精,很容易看懂,但达到了设计要求,并且有健全的判断错误操作的能力和对不正常操作给予提示的能力,也很 切合实际情况。 设计的不好的地方及如何改进: 但是程序写得有些简单,只能进行有限的几个简单操作,局限性很大并不能应用于实际情况。再对乘客进行上下车操作时也未对乘客的情况进行统计和记录,仅仅是体现出同步关系,完成实验要求,而未考虑的更深更远,使程序更加复杂,功能更加健全。在设计时我们应该考虑的更多一些,使得自己的设计更有用,像用在公交车上的无人售票系统中等等。 iii)从本设计得到的收获(在编写,调试,执行过程中的经验和教训); 这次设计实验使我懂得了如何用C++代码来表示进程间的同步关系,而不是用P,V信号量来表示。程序编写时发现信号量只用一个就足以表达司机和售票员之间的同步关系,而不需要使用2个。刚做完时程序功能很不健全只有中间过程而无头无尾,p1,p2 2个函数轮流调用程序始终终止不了,就像没有起点站和终点站的汽车一样,后来通过加入一个操作符和巧妙的应用同步信号量来实现了结束2个进程的操作。写程序时往往考虑的都不是很周全,有很多细节很可能自己没考虑到,这就需要我们再写完程序后在对程序的调试过程中发现这些细节并修正程序,这样才能写出更好功能更健全的程序。 进程同步最典型的表示方法就时利用PV信号量来表示,这种表示方法在上文已经给出了。 这次实验只是进程同步模拟设计的一个简单的例子,现实生活中还 有很多这样的例子,书上也列举了很多像读者与写者的问题,生产者和消费者的问题,哲学家就餐问题等等,这些都是很好的设计题目