机器人工程的工作与考研之困惑→汇总篇←
【摘要】
有困惑,说明还在思考,麻木才是最恐怖的自我放弃。
如果在思想上不能做自己的主人,那么在身体上就只能做他人的奴仆。
还挺拗口的O(∩_∩)O
☞ 机器人工程的工作与考研之困惑“卷”
☞ 机器人工程的工作与考研之困惑“歧视”
☞ 机器人工程的工作与考研之困惑“取舍”
☞ ...
有困惑,说明还在思考,麻木才是最恐怖的自我放弃。
如果在思想上不能做自己的主人,那么在身体上就只能做他人的奴仆。
还挺拗口的O(∩_∩)O
-
#include<stdio.h>
-
-
#define n 4
-
-
int compltedPhilo = 0,i;
-
-
struct fork{
-
int taken;
-
}ForkAvil[n];
-
-
struct philosp{
-
int left;
-
int right;
-
}Philostatus[n];
-
-
void goForDinner(int philID){ //same like threads concept here cases implemented
-
if(Philostatus[philID].left==10 && Philostatus[philID].right==10)
-
printf("Philosopher %d completed his dinner\n",philID+1);
-
//if already completed dinner
-
else if(Philostatus[philID].left==1 && Philostatus[philID].right==1){
-
//if just taken two forks
-
printf("Philosopher %d completed his dinner\n",philID+1);
-
-
Philostatus[philID].left = Philostatus[philID].right = 10; //remembering that he completed dinner by assigning value 10
-
int otherFork = philID-1;
-
-
if(otherFork== -1)
-
otherFork=(n-1);
-
-
ForkAvil[philID].taken = ForkAvil[otherFork].taken = 0; //releasing forks
-
printf("Philosopher %d released fork %d and fork %d\n",philID+1,philID+1,otherFork+1);
-
compltedPhilo++;
-
}
-
else if(Philostatus[philID].left==1 && Philostatus[philID].right==0){ //left already taken, trying for right fork
-
if(philID==(n-1)){
-
if(ForkAvil[philID].taken==0){ //KEY POINT OF THIS PROBLEM, THAT LAST PHILOSOPHER TRYING IN reverse DIRECTION
-
ForkAvil[philID].taken = Philostatus[philID].right = 1;
-
printf("Fork %d taken by philosopher %d\n",philID+1,philID+1);
-
}else{
-
printf("Philosopher %d is waiting for fork %d\n",philID+1,philID+1);
-
}
-
}else{ //except last philosopher case
-
int dupphilID = philID;
-
philID-=1;
-
-
if(philID== -1)
-
philID=(n-1);
-
-
if(ForkAvil[philID].taken == 0){
-
ForkAvil[philID].taken = Philostatus[dupphilID].right = 1;
-
printf("Fork %d taken by Philosopher %d\n",philID+1,dupphilID+1);
-
}else{
-
printf("Philosopher %d is waiting for Fork %d\n",dupphilID+1,philID+1);
-
}
-
}
-
}
-
else if(Philostatus[philID].left==0){ //nothing taken yet
-
if(philID==(n-1)){
-
if(ForkAvil[philID-1].taken==0){ //KEY POINT OF THIS PROBLEM, THAT LAST PHILOSOPHER TRYING IN reverse DIRECTION
-
ForkAvil[philID-1].taken = Philostatus[philID].left = 1;
-
printf("Fork %d taken by philosopher %d\n",philID,philID+1);
-
}else{
-
printf("Philosopher %d is waiting for fork %d\n",philID+1,philID);
-
}
-
}else{ //except last philosopher case
-
if(ForkAvil[philID].taken == 0){
-
ForkAvil[philID].taken = Philostatus[philID].left = 1;
-
printf("Fork %d taken by Philosopher %d\n",philID+1,philID+1);
-
}else{
-
printf("Philosopher %d is waiting for Fork %d\n",philID+1,philID+1);
-
}
-
}
-
}else{}
-
}
-
-
int main(){
-
for(i=0;i<n;i++)
-
ForkAvil[i].taken=Philostatus[i].left=Philostatus[i].right=0;
-
-
while(compltedPhilo<n){
-
/* Observe here carefully, while loop will run until all philosophers complete dinner
-
Actually problem of deadlock occur only thy try to take at same time
-
This for loop will say that they are trying at same time. And remaining status will print by go for dinner function
-
*/
-
for(i=0;i<n;i++)
-
goForDinner(i);
-
printf("\nTill now num of philosophers completed dinner are %d\n\n",compltedPhilo);
-
}
-
-
return 0;
-
}
-
#include<iostream>
-
-
#define n 4
-
-
using namespace std;
-
-
int compltedPhilo = 0,i;
-
-
struct fork{
-
int taken;
-
}ForkAvil[n];
-
-
struct philosp{
-
int left;
-
int right;
-
}Philostatus[n];
-
-
void goForDinner(int philID){ //same like threads concept here cases implemented
-
if(Philostatus[philID].left==10 && Philostatus[philID].right==10)
-
cout<<"Philosopher "<<philID+1<<" completed his dinner\n";
-
//if already completed dinner
-
else if(Philostatus[philID].left==1 && Philostatus[philID].right==1){
-
//if just taken two forks
-
cout<<"Philosopher "<<philID+1<<" completed his dinner\n";
-
-
Philostatus[philID].left = Philostatus[philID].right = 10; //remembering that he completed dinner by assigning value 10
-
int otherFork = philID-1;
-
-
if(otherFork== -1)
-
otherFork=(n-1);
-
-
ForkAvil[philID].taken = ForkAvil[otherFork].taken = 0; //releasing forks
-
cout<<"Philosopher "<<philID+1<<" released fork "<<philID+1<<" and fork "<<otherFork+1<<"\n";
-
compltedPhilo++;
-
}
-
else if(Philostatus[philID].left==1 && Philostatus[philID].right==0){ //left already taken, trying for right fork
-
if(philID==(n-1)){
-
if(ForkAvil[philID].taken==0){ //KEY POINT OF THIS PROBLEM, THAT LAST PHILOSOPHER TRYING IN reverse DIRECTION
-
ForkAvil[philID].taken = Philostatus[philID].right = 1;
-
cout<<"Fork "<<philID+1<<" taken by philosopher "<<philID+1<<"\n";
-
}else{
-
cout<<"Philosopher "<<philID+1<<" is waiting for fork "<<philID+1<<"\n";
-
}
-
}else{ //except last philosopher case
-
int dupphilID = philID;
-
philID-=1;
-
-
if(philID== -1)
-
philID=(n-1);
-
-
if(ForkAvil[philID].taken == 0){
-
ForkAvil[philID].taken = Philostatus[dupphilID].right = 1;
-
cout<<"Fork "<<philID+1<<" taken by Philosopher "<<dupphilID+1<<"\n";
-
}else{
-
cout<<"Philosopher "<<dupphilID+1<<" is waiting for Fork "<<philID+1<<"\n";
-
}
-
}
-
}
-
else if(Philostatus[philID].left==0){ //nothing taken yet
-
if(philID==(n-1)){
-
if(ForkAvil[philID-1].taken==0){ //KEY POINT OF THIS PROBLEM, THAT LAST PHILOSOPHER TRYING IN reverse DIRECTION
-
ForkAvil[philID-1].taken = Philostatus[philID].left = 1;
-
cout<<"Fork "<<philID<<" taken by philosopher "<<philID+1<<"\n";
-
}else{
-
cout<<"Philosopher "<<philID+1<<" is waiting for fork "<<philID<<"\n";
-
}
-
}else{ //except last philosopher case
-
if(ForkAvil[philID].taken == 0){
-
ForkAvil[philID].taken = Philostatus[philID].left = 1;
-
cout<<"Fork "<<philID+1<<" taken by Philosopher "<<philID+1<<"\n";
-
}else{
-
cout<<"Philosopher "<<philID+1<<" is waiting for Fork "<<philID+1<<"\n";
-
}
-
}
-
}else{}
-
}
-
-
int main(){
-
for(i=0;i<n;i++)
-
ForkAvil[i].taken=Philostatus[i].left=Philostatus[i].right=0;
-
-
while(compltedPhilo<n){
-
/* Observe here carefully, while loop will run until all philosophers complete dinner
-
Actually problem of deadlock occur only thy try to take at same time
-
This for loop will say that they are trying at same time. And remaining status will print by go for dinner function
-
*/
-
for(i=0;i<n;i++)
-
goForDinner(i);
-
cout<<"\nTill now num of philosophers completed dinner are "<<compltedPhilo<<"\n\n";
-
}
-
-
return 0;
-
}
-
#include <stdio.h>
-
-
int current[5][5], maximum_claim[5][5], available[5];
-
int allocation[5] = {0, 0, 0, 0, 0};
-
int maxres[5], running[5], safe = 0;
-
int counter = 0, i, j, exec, resources, processes, k = 1;
-
-
int main()
-
{
-
printf("\nEnter number of processes: ");
-
scanf("%d", &processes);
-
-
for (i = 0; i < processes; i++)
-
{
-
running[i] = 1;
-
counter++;
-
}
-
-
printf("\nEnter number of resources: ");
-
scanf("%d", &resources);
-
-
printf("\nEnter Claim Vector:");
-
for (i = 0; i < resources; i++)
-
{
-
scanf("%d", &maxres[i]);
-
}
-
-
printf("\nEnter Allocated Resource Table:\n");
-
for (i = 0; i < processes; i++)
-
{
-
for(j = 0; j < resources; j++)
-
{
-
scanf("%d", ¤t[i][j]);
-
}
-
}
-
-
printf("\nEnter Maximum Claim Table:\n");
-
for (i = 0; i < processes; i++)
-
{
-
for(j = 0; j < resources; j++)
-
{
-
scanf("%d", &maximum_claim[i][j]);
-
}
-
}
-
-
printf("\nThe Claim Vector is: ");
-
for (i = 0; i < resources; i++)
-
{
-
printf("\t%d", maxres[i]);
-
}
-
-
printf("\nThe Allocated Resource Table:\n");
-
for (i = 0; i < processes; i++)
-
{
-
for (j = 0; j < resources; j++)
-
{
-
printf("\t%d", current[i][j]);
-
}
-
printf("\n");
-
}
-
-
printf("\nThe Maximum Claim Table:\n");
-
for (i = 0; i < processes; i++)
-
{
-
for (j = 0; j < resources; j++)
-
{
-
printf("\t%d", maximum_claim[i][j]);
-
}
-
printf("\n");
-
}
-
-
for (i = 0; i < processes; i++)
-
{
-
for (j = 0; j < resources; j++)
-
{
-
allocation[j] += current[i][j];
-
}
-
}
-
-
printf("\nAllocated resources:");
-
for (i = 0; i < resources; i++)
-
{
-
printf("\t%d", allocation[i]);
-
}
-
-
for (i = 0; i < resources; i++)
-
{
-
available[i] = maxres[i] - allocation[i];
-
}
-
-
printf("\nAvailable resources:");
-
for (i = 0; i < resources; i++)
-
{
-
printf("\t%d", available[i]);
-
}
-
printf("\n");
-
-
while (counter != 0)
-
{
-
safe = 0;
-
for (i = 0; i < processes; i++)
-
{
-
if (running[i])
-
{
-
exec = 1;
-
for (j = 0; j < resources; j++)
-
{
-
if (maximum_claim[i][j] - current[i][j] > available[j])
-
{
-
exec = 0;
-
break;
-
}
-
}
-
if (exec)
-
{
-
printf("\nProcess%d is executing\n", i + 1);
-
running[i] = 0;
-
counter--;
-
safe = 1;
-
-
for (j = 0; j < resources; j++)
-
{
-
available[j] += current[i][j];
-
}
-
break;
-
}
-
}
-
}
-
if (!safe)
-
{
-
printf("\nThe processes are in unsafe state.\n");
-
break;
-
}
-
else
-
{
-
printf("\nThe process is in safe state");
-
printf("\nAvailable vector:");
-
-
for (i = 0; i < resources; i++)
-
{
-
printf("\t%d", available[i]);
-
}
-
-
printf("\n");
-
}
-
}
-
return 0;
-
}
文章来源: zhangrelay.blog.csdn.net,作者:zhangrelay,版权归原作者所有,如需转载,请联系作者。
原文链接:zhangrelay.blog.csdn.net/article/details/124890695
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)