求指教:用c语言写吃苹果问题,原理是操作系统同步与互斥 父亲往盘子里放一个苹果,儿子取一个吃,且盘

Python016

求指教:用c语言写吃苹果问题,原理是操作系统同步与互斥 父亲往盘子里放一个苹果,儿子取一个吃,且盘,第1张

您好,有个例子,对您有用:

同步关系

设信号量e(表示盘子为空),a(表示盘子里是苹果),o(表示盘子里是桔子)

int

e=1,a=o=0

main()

{father()

//son()

//daughter()/*三个为并发进程*/

}

father()

{while(1)

{

洗水果

wait(e)

把水果放入盘子

if(水果是苹果)signal(a)

else

signal(o)

}

}

son()

{while(1)

{wait(o)

从盘子里取桔子

signal(e)

吃桔子}

}

daughter()

{while(1)

{wait(a)

从盘子里取苹果

signal(e)

吃苹果}

}

将以下内容全部复制到新建的源文件中:(本人自己写的,因为你那课本上的代码,没解释,书写不规范,很难理解清楚,所以我直接新写了一个完整的代码,附带详细说明)

#include <stdio.h>

//汉诺塔x层塔从A塔整体搬到C塔,中间临时B塔。

//x层塔是从大到小往上叠放。每次移动只能移动一层塔。并且在移动过程中必须保证小层在上边

//借助B塔可以将x层塔全部从A搬到C上,并且符合要求(在移动过程中大的那块在下边,小的那块在上边)

int main()

{

void tower(int x,char a,char b,char c) //声明函数

int x=5,a='A',b='B',c='C' //x表示有5层塔,具体要多少层自己修改这个值。abc分别表示ABC塔。

tower(x,a,b,c) //x层塔从a移动到c的全过程,主程序只有这条有效语句

return 0

}

//以下是tower函数的定义

//参数解析:x层塔放在a上,b是中间塔,c是目标塔。即x层塔要从a搬到c上。

//此函数实现x层塔从a整体转移到c上。以及这个过程是怎么搬的全部过程。

void tower(int x,char a,char b,char c)

{

if(x==1)printf("将%d从%c放到%c\n",x,a,c) //只有1层塔时,直接从a搬到c上。

else //不止1层塔,则先将x-1层塔从a按照规律搬到b上,再将最后一块从a搬到c上,最后再将b上的x-1层塔按照规律搬到c上。

{

tower(x-1,a,c,b) //先将x-1层塔从a按照规律搬到b上,注意参数b放在最后,因为放在最后的参数是准备搬过去的目标塔。

printf("将%d从%c放到%c\n",x,a,c) //将最后一块从a搬到c上

tower(x-1,b,a,c) //最后再将b上的x-1层塔按照规律搬到c上,注意参数b放在开头,因为x-1层是要从b上搬过去的。

}

}

n=1时,就直接执行形参a到形参c(按照图片格式打印输出字符串就行了啊)。

其它情况按照递归,先通过c先把小的都移动到b,再把最大的移动到c,最后通过a把b所有盘移动到c。

最后输出就是你图中效果。

#include<stdio.h>

void doMove(int n,char x,char y)

void move(int n,char a,char b,char c)

int main()

{

  int n

  scanf("%d",&n)

  move(n,'A','B','C')

}

void move(int n,char a,char b,char c)

{

  if(n==1)

      doMove(n,a,c)   //n==1个时直接从a移动到c

  else

  {

      move(n-1,a,c,b)           //通过c从a移动到b,移动n-1个盘子

      doMove(n,a,c)           //然后把要移动的最后一个也就是最大的一个移动到c

      move(n-1,b,a,c)           //最后通过a从b移动到c,移动n-1个盘

  }

}

void doMove(int n,char x,char y)

{

  printf("%c move %d号 ->%c\n",x,n,y)

}