学生选课最多可以选3门,如果王同学选了3门C1、C2、C3后,想把C3换成C4,王同学就得先退选C3再申请选修C4。但是这个时候可能C4已经选满了,而王同学再选回C3的时候可能已经被人选满,不能再选了。为了解决这个问题,使用一个函数TradeCourse(

admin2014-12-08  24

问题 学生选课最多可以选3门,如果王同学选了3门C1、C2、C3后,想把C3换成C4,王同学就得先退选C3再申请选修C4。但是这个时候可能C4已经选满了,而王同学再选回C3的时候可能已经被人选满,不能再选了。为了解决这个问题,使用一个函数TradeCourse(user,course1,course2)将课程course1换成course2。下面给出一种实现。如果不正确,给出所有错误的执行情况,并给出你认为正确的实现,要有适当的注释。
    TradeCourse(user,course1,course2){
    course1->p();    //申请课程coursel数据结构的互斥信号量
    course1->drop(user);    //退选课程course1
    course2->p();    //申请课程course2数据结构的互斥信号量
    if(course2->isFull()==false){  //课程course2没有选满
    course2->add(user);    //申请选修课程course2
    course2->v();    //释放课程course2数据结构的互斥信号量
    course1->v();    //释放课程course1数据结构的互斥信号量
    }
    }

选项

答案该算法是错误的,若课程2选满,即course2->isFull=true,就会使得该学生有可能选不到3门课,因此要保证该同学在退选课程后,申请新课程失败的情况下,仍然可以选回原课程,即不同同学的退选和申请课程应该互斥进行,因此这里只要处理好course2->isFull=true的情况即可。 正确的算法如下: TradeCourse(user,coursel,course2){ course1->p(); //申请课程coursel数据结构的互斥信号量 course1->drop(user); //退选课程course1 course2->p(); //申请课程course2数据结构的互斥信号量 if(course2->isFull()==false){ //课程course2没有选满 course2一>add(user); //申请选修课程course2 course2->v(); //释放课程course2数据结构的互斥信号量 coursel->v(); //释放课程coursel数据结构的互斥信号量 } else{ course1>add(user); //重新选择course1 course2->v(); //释放课程course2数据结构的互斥信号量 course1->v(); //释放课程course1数据结构的互斥信号量 } }

解析
转载请注明原文地址:https://kaotiyun.com/show/ydxi777K
0

最新回复(0)