操作系统课程设计吃水果问题完整版
猴子吃桃子问题 数据结构课程设计

目录1、需求分析 (1)2、概要设计 (1)2.1.用数组数据结构实现上述求解 (1)2.2.用链数据结构实现上述求解 (1)2.3 用栈数据结构实现求解 (1)2.4 用递归实现上述求解 (2)3、运行环境 (2)3.1 硬件环境 (2)3.2软件环境 (2)4、详细设计 (2)4.1系统流程图 (2)4.2用数组数据结构实现上述求解 (3)4.3用链数据结构实现上述求解 (4)4.4用栈数据结构实现求解 (5)4.5用递归实现上述求解 (6)5、调试分析 (7)6、运行结果 (7)课程设计总结 (8)参考文献 (9)附录: (9)1、需求分析1、猴子吃桃子问题有一群猴子摘了一堆桃子,他们每天都吃当前桃子的一半且再多吃一个,到了第10天就只余下一个桃子。
用多种方法实现求出原来这群猴子共摘了多少个桃子。
要求:1)采用数组数据结构实现上述求解2)采用链数据结构实现上述求解3)采用栈实现上述求解4)采用递归实现上述求解2、概要设计2.1.用数组数据结构实现上述求解在taozi函数中定义一个一维数组,分别存储每天的桃子个数,根据题目的内容找出各个数之间的关系,用数组元素表示出来,根据用户输入要计算哪一天的桃子,用for循环控制结束。
在main函数中让用户输入要计算的哪一天,调用taozi 函数,以便用户可查出任意一天的桃子个数,用switch语句判断用户要执行的功能,然后用while循环控制,直到用户输入0为止。
2.2.用链数据结构实现上述求解先写出预定义常量和类型,写出结点的类型定义,创建结点,初始化链表,定义变量并初始化,找出结点与其后继结点之间的联系,然后在主函数中控制。
2.3 用栈数据结构实现求解本部分包括预定义常量和类型,顺序栈的定义,InitStack函数,Push函数,和main函数,在InitStack函数构造一个空栈,在Push函数中调用该函数,并在其中编写控制栈顶指针和栈底指针移动的语句,找出指针所指向的数据之间的关系,在main函数中编写控制循环结束的语句,最后再用main函数去调用Push函数。
吃水果问题

实习一进程同步
一、实习内容
模拟进程同步。
二、实习目的
本实习要求学生理解进程同步的概念和进程同步技术——信号量机制。
三、实习题目
编写一个程序,模拟“吃水果问题”。
问题描述:桌上有一个盘子,每次只能放一个水果,爸爸专向盘中放苹果,妈妈专向盘中放橘子,儿子专等吃盘里的橘子,女儿专等吃盘里的苹果。
只要盘子空,爸爸妈妈可向盘中放水果,仅当盘中有自己需要的水果时,儿子或女儿可从中取出,请用信号量及PV操作模拟四人的同步关系。
提示:
(1)信号量和P、V(semwait&semsignal)操作原语自己定义,在保证该对原语原有意义的基础上,也可添加新内容(模拟的需要,结合提示(5)思考);
(2)4人分别是4个进程,每个进程的程序可由一个函数模拟;
其中,
进程名——作为进程的标识,自己定义。
状态——有两种状态,“就绪”和“阻塞”,初始状态都为“就绪”,用“R”表示。
当一个进程阻塞后,它的状态为“阻塞”,用“B”表示。
(3)当前执行哪个进程可由随机函数决定,若该进程当前是阻塞的,则打印“该进程阻塞”提示;否则,执行该进程程序;
(4)取、放水果的操作可用打印语句的方式替代;
(5)当一个阻塞态进程被唤醒成为就绪态,然后,再次被选中执行时,应从P原语的下一个语句开始执行。
这该怎么控制?想办法解决(结合提示(1)思考)。
注意:
信号量的设置和初值;
程序应有提示,界面友好!
用循环队列存阻塞队列和就绪队列。
进程吃水果

西华大学上机实践报告课程名称:Windows系统编程年级:2011上机实践成绩:指导教师:陈克力姓名:徐千上机实践名称:吃水果问题学号:312011*********上机实践日期:12_04上机实践编号:实验10组号:1上机实践时间:18:30--20:30一、目的1. 掌握多进程间消息通信方式;2. 掌握定时器应用,随即函数的应用;3. 提高项目系统分析与设计方法;二、内容与设计思想吃水果问题介绍:吃水果问题是操作系统中典型的进程间通信问题。
桌上有一个空盘,允许存放20个水果,父母可向盘内随机个数的水果,如果盘子放满了,则等待;孩子等着吃盘内的水果,如果盘子空了,则等着父母放水果。
设计三个基于对话框的进程分别模拟盘子、父母、孩子的行为。
可以实现:(1)盘子进程动态显示盘子里面的水果数量;(2)父母进程中点击开始按钮,每隔5 秒随机往盘子里面放不大于10 个水果;并显示真正放入的水果数;(3)孩子进程中点击开始按钮,每隔2 秒随机从盘子里面取不多于5 个水果;并显示真正取到的水果数量。
实验思想:1. 采用基于对话框的MFC 应用程序;2. 利用自定义消息来实现多个进程间通信:(1)父母放水果时发送一个自定义消息(WM_MSG1),通过消息参数WParam的值(如规定为100 表示放),lParam 的值表示具体放入的水果数量;(2)孩子取水果时发送一个自定义消息消息(WM_MSG2),通过消息参数WParam 的值(如规定为200 表示取),lParam 的值表示具体想取得的水果数量;(3)盘子进程随时响应父母进程或孩子进程的消息,并进行判断处理:父母放时要判断盘子是否满,并发送一条自定义消息(WM_MSG3)给父母表明实际放入的水果数;孩子取时要判断盘子是否为空,并发送一条自定义消息(WM_MSG4)给孩子表明实际取得的水果数;(4)父母或孩子把盘子返回的消息显示在各自的对话框中;3. 父母或孩子的行为可以用定时器消息来完成。
操作系统课程设计吃水果问题完整

1
1.1
进程同步模拟设计:吃水果问题
1.2
桌子上有一只盘子,最多可容纳两个水果,每次只能放入或者取出一个水果。爸爸专门向盘子中放苹果,妈妈专门向盘子中放橘子,两个儿子专门等待吃盘子中的橘子,两个女儿专门等吃盘子中的苹果。
1.3
将问题转换为信号量上的资源分配类型问题:
这是进程同步问题的模拟,可以把向盘子放或取水果的每一个过程可以转为一个进程的操作,这些进程是互斥的,同时也存在一定的同步关系。通过编程实践时,实际是随机的调用人一个进程的操作,而这些进程的操作相当于程序中的函数调用。而计算机在执行时每一个时刻只能执行一个操作,这就默认了互斥。同步的模拟可以类似于函数调用时的前提关系即先决条件。这样进程同步模拟就完全可以通过函数的调用来实现。
int MonFa_c;//用于爸爸妈妈等待次序的区别
int Son_a;//用于两个儿子等待次序的区别
int daughter_b;//用于两个女儿等待次序的区别
int k;//产生进程调用的数量
srand((unsigned)time(NULL));//srand()函数产生一个以当前时间开始的随机种子
Son2(); //处于等待的Son2()自动调用
Son_a=1;
}
}
else
{
if(Son1_lag==true)
{
Son1_lag=false; //Son1等待取消
cout<<"处于等待的Son1自动被调用"<<endl;
Son1(); //处于等待的Son源自()自动调用Son_a=0;
}
else if(Son2_lag==true)
{
orange--;
进程同步模拟设计--吃水果问题

附件1:学号:012课程设计题目进程同步模拟设计--吃水果问题学院计算机科学与技术学院专业计算机科学与技术专业班级计算机姓名指导教师2011 年01 月19 日课程设计任务书学生:专业班级:指导教师:作单位:计算机科学与技术学院题目: 进程同步模拟设计——吃水果问题初始条件:1.预备容:阅读操作系统的进程管理章节容,对进程的同步和互斥,以及信号量机制度有深入的理解。
2.实践准备:掌握一种计算机高级语言的使用。
要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1.模拟吃水果的同步模型:桌子上有一只盘子,最多可容纳两个水果,每次只能放入或者取出一个水果。
爸爸专门向盘子中放苹果,妈妈专门向盘子中放橘子,两个儿子专门等待吃盘子中的橘子,两个女儿专门等吃盘子中的苹果。
2.设计报告容应说明:⑴需求分析;⑵功能设计(数据结构及模块说明);⑶开发平台及源程序的主要部分;⑷测试用例,运行结果与运行情况分析;⑸自我评价与总结:i)你认为你完成的设计哪些地方做得比较好或比较出色;ii)什么地方做得不太好,以后如何改正;iii)从本设计得到的收获(在编写,调试,执行过程中的经验和教训);iv)完成本题是否有其他方法(如果有,简要说明该方法);v)对实验题的评价和改进意见,请你推荐设计题目。
时间安排:设计安排一周:周1、周2:完成程序分析及设计。
周2、周3:完成程序调试及测试。
周4、周5:验收、撰写课程设计报告。
(注意事项:严禁抄袭,一旦发现,一律按0分记)指导教师签名:年月日系主任(或责任教师)签名:年月日进程同步模拟设计——吃水果问题1需求分析1.1吃水果问题的描述桌子上有一只盘子,最多可容纳两个水果,每次只能放入或者取出一个水果。
爸爸专门向盘子中放苹果,妈妈专门向盘子中放橘子,两个儿子专门等待吃盘子中的橘子,两个女儿专门等吃盘子中的苹果。
1.2问题的转换这是进程同步问题的模拟,可以把向盘子放或取水果的每一个过程可以转为一个进程的操作,这些进程是互斥的,同时也存在一定的同步关系。
进程同步模型系统的设计—吃水果

课程设计课程设计任务书学生: Miss屠专业班级: 08计科指导教师:王海英工作单位:计算机科学与技术学院题目: 进程同步模型系统的设计——吃水果问题初始条件:1.预备容:阅读操作系统的进程管理章节容,对进程的同步和互斥,以及信号量机制度有深入的理解。
2.实践准备:掌握一种计算机高级语言的使用。
要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1.为下面吃水果的问题创建进程并利用通信API实现进程之间的同步模型。
能够处理以下的情形:桌子上有一只盘子,最多可容纳两个水果,每次只能放入或者取出一个水果。
爸爸专门向盘子中放苹果,妈妈专门向盘子中放橘子,两个儿子专门等待吃盘子中的橘子,两个女儿专门等吃盘子中的苹果。
2.设计报告容应说明:⑴课程设计目的与功能;⑵需求分析,数据结构或模块说明(功能与框图);⑶源程序的主要部分;⑷运行结果与运行情况分析;⑸自我评价与总结:i)你认为你完成的设计哪些地方做得比较好或比较出色;ii)什么地方做得不太好,以后如何改正;iii)从本设计得到的收获(在编写,调试,执行过程中的经验和教训);iv)完成本题是否有其他的其他方法(如果有,简要说明该方法);时间安排:设计安排一周:周1、周2:完成程序分析及设计。
周2、周3:完成程序调试及测试。
周4、周5:撰写课程设计报告。
指导教师签名:年月日系主任(或责任教师)签名:年月日进程同步模型系统的设计——吃水果问题1、课程设计目的与功能1.1、目的为下面吃水果的问题创建进程并利用通信API实现进程之间的同步模型。
能够处理以下的情形:桌子上有一只盘子,最多可容纳两个水果,每次只能放入或者取出一个水果。
爸爸专门向盘子中放苹果,妈妈专门向盘子中放橘子,两个儿子专门等待吃盘子中的橘子,两个女儿专门等吃盘子中的苹果。
1.2、实现的功能本程序共创建了4个在windows系统环境下实现的线程,即Fahter、Mother、Son和Daughter等4个线程,以及putapple、putorange、getapple和getorange 等4个函数,其中4个线程是用于实现爸爸、妈妈、儿子和女儿分别放水果和取水果的线程操作的,并分别调用这4个函数,来实现真正的操作。
000操作系统课设报告(进程控制-吃苹果)

semctl(semid_mutex,0,IPC_RMID);
semctl(semid_empty,0,IPC_RMID);
semctl(semid_full1,0,IPC_RMID);
semctl(semid_full2,0,IPC_RMID);
操作系统课程设计
——Linux系统管理实践与进程通信实现
实验学期2至2学年,第学期
学生姓名
专业班操作系统》课程设计报告
实验题目:Linux系统管理实践与进程控制、进程通信实现
设计时间:2014-01-09至
2014-01-14
一、 实验目的与要求
1、掌握基本的同步与互斥算法。
int mother()//母亲程序
int daughter()//女儿程序
int son()//儿子程序
int main(int argc, char *argv[])//主程序,包含了初始化程序
信号量:
设置互斥信号量mutex:每次盘子中只能放一只水果或取出一只水果;
设置同步信号量full1:实现父亲放苹果,女儿取水果的同步;
else
printf("Fail To Create SEM_FULL2!\n");
return -1;
}
/*给信号量赋初值*/
set_sembuf_struct(&sem_tmp, 0, BUFF_LEN, 0);/*BUFF_LEN*/
void set_sembuf_struct(struct sembuf *sem,int semnum, int semop,int semflg)
数据结构课程设计-猴子吃桃问题(DOC)

数学与计算机学院课程设计说明书课程名称:课程代码: 6015059 题目: 年级/专业/班:学生姓名:学号: 312011********* 开始时间: 2014 年 5 月 14 日完成时间: 2014 年 5 月 28 日课程设计成绩:学习态度及平时成绩(20)技术水平与实际能力(20)完成情况(20)创新(5)说明书(计算书、图纸、分析报告)撰写质量(35)总分(100)指导教师签名:年月日目录1 需求分析 (3)2 概要设计 (3)3详细设计 (4)4调试分析 (11)5用户使用说明 (12)6测试结果 (12)7 结论 (14)致谢 (15)参考文献 (15)摘要本课程设计主要解决猴子吃桃子的问题。
一群猴子摘了一堆桃子,他们每天都吃当前桃子的一半且再多吃一个,到了第10天就只余下一个桃子。
用多种方法实现求出原来这群猴子共摘了多少个桃子。
在课程设计中,系统开发平台为Windows 2000,程序设计设计语言采用Visual C++,数据库采用MS SQL 2000,程序运行平台为Windows 98/2000/XP。
在整个程序中分别采用数组数据结构、链数据结构、递归等结构形式实现此问题的求解。
程序通过调试运行,初步实现了设计目标。
关键词:程序设计;C++;数组;链;递归;猴子吃桃引言在日常生活中经常遇到一些与数据计算有关的问题,许多与猴子吃桃问题类似的问题要求用计算机程序语言来解决,用这个程序算法可以解决一些类似问题,以便利于生活实际。
1 需求分析1.1任务与分析任务功能:有一群猴子摘了一堆桃子,他们每天都吃当前桃子的一半且再多吃一个,到了第10天就只余下一个桃子。
用多种方法实现求出原来这群猴子共摘了多少个桃子要求:采用数组数据结构实现上述求解采用链数据结构实现上述求解采用递归实现上述求解如果采用4种方法者,适当加分分析:这个课程设计分为三个部分,即分别用三种不同的方法解决猴子吃桃子问题。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
目录1 题目内容及要求 (2)1.1 题目名称 (2)1.2 题目描述 (2)1.3 解题思路 (2)1.4 程序清单 (6)1.5 提交结果框图 (16)2 总结 (20)3 参考文献 (20)1 题目内容及要求1.1题目名称进程同步模拟设计:吃水果问题1.2题目描述桌子上有一只盘子,最多可容纳两个水果,每次只能放入或者取出一个水果。
爸爸专门向盘子中放苹果,妈妈专门向盘子中放橘子,两个儿子专门等待吃盘子中的橘子,两个女儿专门等吃盘子中的苹果。
1.3解题思路将问题转换为信号量上的资源分配类型问题:这是进程同步问题的模拟,可以把向盘子放或取水果的每一个过程可以转为一个进程的操作,这些进程是互斥的,同时也存在一定的同步关系。
通过编程实践时,实际是随机的调用人一个进程的操作,而这些进程的操作相当于程序中的函数调用。
而计算机在执行时每一个时刻只能执行一个操作,这就默认了互斥。
同步的模拟可以类似于函数调用时的前提关系即先决条件。
这样进程同步模拟就完全可以通过函数的调用来实现。
具体的每一个操作的对应的函数的关系:爸爸向盘子中放一个苹果:Father()妈妈向盘子中放一个橘子:Mother()儿子1从盘子取一个橘子:Son1()儿子2从盘子取一个橘子:Son2()女儿1从盘子取一个苹果:Daugther1()儿子1从盘子取一个苹果:Daugther2()具体实现方案:(1)用一个整型变量Plate_Size表示盘子,初始值为0,当放水果时Plate_Size 加1,取水果时Plate_Size减1。
变量Plate_Size的最大值为2,当为2时表示盘子已经满,此时若进行放水果操作,放水果将处于等待状态;为0时表示盘子为空,此时若进行取水果操作,取水果操作将处于等待状态。
(2)整型变量orange和apple分别表示盘子中的橘子和苹果数目,初始都为0,Plate_Size=apple+orange。
(3)用6个bool型的变量Father_lag,Mother_lag,Son1_lag,Son2_lag,Daughter1_lag,Daughter2_lag表示六个进程是否处于等待状态。
处于等待时,变量值为true。
(4)两个放水果进程进程同时处于等待状态时,若有取水果的操作将自动执行等待的放水果进程,执行按等待的先后顺序;两个取苹果或橘子进程同时候处于等待状态,若有放苹果或橘子的操作将自动执行等待的取进程,进行按等待的先后顺序。
(5)用一个随机的函数产生0—5的6个整数,分别对应六个进程的调用。
放水果操作流程图设计(以Father为例,Mother类似):图1 Father放水果操作流程图取水果操作流程图设计(以Son为例,Daughter类似):图2 Son取水果(橘子)操作流程图1.4程序清单#include <iostream.h>#include <ctime>#include <cstdlib>#include <cmath>int apple=0;int orange=0;bool Father_lag;bool Mother_lag;bool Son1_lag;bool Son2_lag;int son_a;int Daughter_b;bool Daughter1_lag;bool Daughter2_lag;void Print(){cout<<" 现在盘子里有"<<apple<<"个苹果,"<<orange<<"个橘子,"<<"共有"<<apple+orange<<"个水果."<<endl;if(Father_lag==true)cout<<" Father进程处于等待状态,"<<endl;if(Mother_lag==true)cout<<" Mother进程处于等待状态,"<<endl;if(Son1_lag==true)cout<<" Son1进程处于等待状态,"<<endl;if(Son2_lag==true)cout<<" Son2进程处于等待状态, "<<endl;if(Daughter1_lag==true)cout<<" Daughter1进程处于等待状态,"<<endl;if(Daughter2_lag==true)cout<<" Daughter2进程处于等待状态,"<<endl;if(((Father_lag==false)&&(Mother_lag==false)&&(Son1_lag==false)&&(Son2_lag==false)&& (Daughter1_lag==false)&&(Daughter2_lag==false))!=true)cout<<endl;}void Father() //Father进程{apple++;Print();void Mother() //Mother进程{orange++;Print();}void Son1() //Son1进程{orange--;Print();}void Son2() //Son2进程{orange--;Print();}void Daughter1() //Daughter1进程{apple--;Print();}void Daughter2() //Daughter2进程{apple--;Print();}void main(){int i;int Plate_Size;//水果数量int MonFa_c;//用于爸爸妈妈等待次序的区别int Son_a;//用于两个儿子等待次序的区别int daughter_b;//用于两个女儿等待次序的区别int k;//产生进程调用的数量srand((unsigned)time(NULL));//srand()函数产生一个以当前时间开始的随机种子for(k=0;k<10;k++){cout<<endl;cout<<"***********************************"<<"第"<<k+1<<"次操作"<<"***********************************"<<endl;i=rand()%6; //随进生成1-5.Plate_Size=apple+orange;switch(i){case 0:cout<<" Father调用."<<endl;if(Plate_Size==2){Father_lag=true;//Father()等待Print();if(Mother_lag==false)MonFa_c=1;}else{Father();if((Daughter1_lag==true)&&(Daughter2_lag==true)){if(Daughter_b==1){Daughter1_lag=false;//Daughter1等待取消cout<<" 处于等待的Daughter1自动被调用"<<endl;Daughter1(); //处于等待的Daughter1自动调用Daughter_b=2;}else{Daughter2_lag=false;//Daughter2等待取消cout<<" 处于等待的Daughter2自动被调用"<<endl;Daughter2(); //处于等待的Daughter2()自动调用Daughter_b=1;}}else{if(Daughter1_lag==true){Daughter1_lag=false;//Daughter1等待取消cout<<" 处于等待的Daughter1自动被调用"<<endl;Daughter1(); //处于等待的Daughter1()自动调用Daughter_b=0;}else if(Daughter2_lag==true)Daughter2_lag=false;//Daughter2等待取消cout<<" 处于等待的Daughter1自动被调用"<<endl;Daughter2(); //处于等待的Daughter2()自动调用Daughter_b=0;}}}break;case 1:cout<<" Mother调用."<<endl;if(Plate_Size==2){Mother_lag=true; //等待Print();if(Father_lag==false)MonFa_c=2;}else{Mother();if((Son1_lag==true)&&(Son2_lag==true)){if(Son_a==1){Son1_lag=false;//Son1等待取消cout<<" 处于等待的Son1自动被调用"<<endl;Son1(); //处于等待的Son1()自动调用Son_a=2;}else{Son2_lag=false;//Son2等待取消cout<<" 处于等待的Son2自动被调用"<<endl;Son2(); //处于等待的Son2()自动调用Son_a=1;}}else{if(Son1_lag==true)Son1_lag=false; //Son1等待取消cout<<" 处于等待的Son1自动被调用"<<endl;Son1(); //处于等待的Son1()自动调用Son_a=0;}else if(Son2_lag==true){Son2_lag=false; //Son2等待取消cout<<" 处于等待的Son2自动被调用"<<endl;Son2(); //处于等待的Son2()自动调用Son_a=0;}}}break;case 2:cout<<" Son1调用."<<endl;if(orange==0){Son1_lag=true; //Son1处于等待Print();if(Son2_lag==false)Son_a=1; //用于判断Son1和Son2等待的先后性}else{Son1();if((Father_lag==true)&&(Mother_lag==true)){if(MonFa_c==1) //Father和Mother同时处于等待,但Father先等待,因此先调用{Father_lag=false;cout<<" 处于等待的Father自动被调用"<<endl;Father();MonFa_c=2;}else //Father和Mother同时处于等待,但Mother先等待,因此先调用{Mother_lag=false;cout<<" 处于等待的Mother自动被调用"<<endl;Mother();MonFa_c=1;}}else{if(Father_lag==true) //只有Father处于等待,调用{Father_lag=false;cout<<" 处于等待的Father自动被调用"<<endl;Father();MonFa_c=0;}else if(Mother_lag==true)//只有Mother处于等待,调用{Mother_lag=false;cout<<" 处于等待的Mother自动被调用"<<endl;Mother();MonFa_c=0;}}}break;case 3:cout<<" Son2调用."<<endl;if(orange==0){Son2_lag=true; //Son2处于等待Print();if(Son1_lag==false)Son_a=2;}else{Son2();if((Father_lag==true)&&(Mother_lag==true)){if(MonFa_c==1)//Father和Mother同时处于等待,但Father先等待,因此先调用{Father_lag=false;cout<<" 处于等待的Father自动被调用"<<endl;Father();MonFa_c=2;}else //Father和Mother同时处于等待,但Mother先等待,因此先调用{Mother_lag=false;cout<<" 处于等待的Mother自动被调用"<<endl;Mother();MonFa_c=1;}}else{if(Father_lag==true) //只有Father处于等待,调用{Father_lag=false;cout<<" 处于等待的Father自动被调用"<<endl;Father();MonFa_c=0;}else if(Mother_lag==true) //只有Mother处于等待,调用{Mother_lag=false;cout<<" 处于等待的Mother自动被调用"<<endl;Mother();MonFa_c=0;}}}break;case 4:cout<<" Daughter1调用."<<endl;if(apple==0){Daughter1_lag=true; //Daughter1等待Print();if(Daughter2_lag==false)Daughter_b=1;}else{Daughter1();if((Father_lag==true)&&(Mother_lag==true)){if(MonFa_c==1) //Father和Mother同时处于等待,但Father先{ //等待,因此先调用Father_lag=false;cout<<" 处于等待的Father自动被调用"<<endl;Father();MonFa_c=2;}else //Father和Mother同时处于等待,但Mother先等待,因此先调用{Mother_lag=false;cout<<" 处于等待的Mother自动被调用"<<endl;Mother();MonFa_c=1;}}else{if(Father_lag==true) //只有Father处于等待,调用{Father_lag=false;cout<<" 处于等待的Father自动被调用"<<endl;Father();MonFa_c=0;}else if(Mother_lag==true) //只有Mother处于等待,调用{Mother_lag=false;cout<<" 处于等待的Mother自动被调用"<<endl;Mother();MonFa_c=0;}}}break;case 5:cout<<" Daughter2调用."<<endl;if(apple==0){Daughter2_lag=true; //Daughter2等待Print();if(Daughter1_lag==false)Daughter_b=2;}else{Daughter2();if((Father_lag==true)&&(Mother_lag==true)){if(MonFa_c==1) //Father和Mother同时处于等待,但Father先等待,因此先调用{Father_lag=false;cout<<" 处于等待的Father自动被调用"<<endl;Father();MonFa_c=2;}else //Father和Mother同时处于等待,但Mother先等待,因此先调用{ Mother_lag=false;cout<<" 处于等待的Mother自动被调用"<<endl;Mother();MonFa_c=1;}}else{if(Father_lag==true) //只有Father处于等待,调用{ Father_lag=false;cout<<" 处于等待的Father自动被调用"<<endl;Father();MonFa_c=0;}else if(Mother_lag==true) //只有Mother处于等待,调用{ Mother_lag=false;cout<<" 处于等待的Mother自动被调用"<<endl;Mother();MonFa_c=0;}}}break;}}}1.5提交结果框图由于程序是模拟产生10次随机的操作,执行相应的函数来模拟进程同步。