专业课程设计I报告B.docx
- 文档编号:28514575
- 上传时间:2023-07-18
- 格式:DOCX
- 页数:28
- 大小:294.59KB
专业课程设计I报告B.docx
《专业课程设计I报告B.docx》由会员分享,可在线阅读,更多相关《专业课程设计I报告B.docx(28页珍藏版)》请在冰豆网上搜索。
专业课程设计I报告B
专业课程设计I报告
(2011/2012学年第二学期)
题目1:
进程的同步与互斥
题目2:
计算机图形动画
专业计算机科学与技术
学生姓名黄金花
班级学号B09040208
指导教师黄海平
指导单位计算机学院
日期2012.4.16-4.26
指导教师成绩评定表
学生姓名
班级学号
专业
计算机科学与技术
评分内容
评分标准
优秀
良好
中等
差
平时成绩
认真对待课程设计,遵守实验室规定,上机不迟到早退,不做和设计无关的事
√
设计成果
设计的科学、合理性
功能丰富、符合题目要求
界面友好、外观漂亮、大方
程序功能执行的正确性
程序算法执行的效能
设计报告
设计报告正确合理、反映系统设计流程
文档内容详实程度
文档格式规范、排版美观
验收答辩
简练、准确阐述设计内容,能准确有条理回答各种问题,系统演示顺利。
评分等级
指导教师
简短评语
该同学出勤率(满勤、较高、一般,较低),学习态度(端正、较端正、一般、较差),演示程序(未)达到了(基本要求、提高要求1或/和2),撰写报告格式(规范、一般)、表述(清晰、一般、不清楚),圆满(较好、基本)完成了课题任务。
(可选:
尚存在……缺陷。
)
指导教师签名
日期
2012-4-30
备注
评分等级有五种:
优秀、良好、中等、及格、不及格
教师对学生的项目评分——进程的同步与互斥
一、课题内容和要求
二、
1、课题内容
题目:
教师对学生的项目评分——进程的同步与互斥
内容:
在一个班上有S个学生。
每个学生都要做一个项目,每一个项目由K个老师一起评分。
总共有M个老师。
每个老师最多给N个项目评分。
其中,S*K<=M*N。
在项目结束后,老师们提供T分钟用来检查学生们的项目。
检查每一个学生的项目需要用时D分钟。
其中,T>D。
每一个学生的项目由K个老师共同来检查。
在T分钟的时间段内,学生可以在任何时间进入教室(random),除了在最后的D分钟内。
所有的老师一直保持工作状态直到他检查完N个项目或者是T分钟过去后。
T分钟过去后,所有的老师和同学都必须离开教室。
另外,在T分钟结束前的D分钟内(即在最后的D分钟内),如果有任何老师或者是学生都处在没有任务的状态下,都必须离开教室,因为已经没有时间让他完成任务了(因为一个项目检查的时间是整整D分钟)。
具体过程:
当一个学生进入教室后,他立即开始找K个没有任务的老师(一次找一个老师,假如没有空闲的老师,则等到有老师为止),找齐K个老师之后给老师检查,然后离开教室。
刚开始每一个老师都是处于空闲状态直到他被学生找到,被学生找到后只能等待,直到学生找齐K个老师(在等待学生找其他老师的时间里,他是不能接受其他同学检查作业的请求的),当学生找齐K个老师后,老师们执行完检查任务,然后重新变成空闲状态。
每个老师在总共检查了N个学生的作业后,离开教室。
2.课程要求
用一个程序来模拟上面描述的作业检查过程。
每一个学生和每一个老师应该用不同的线程来完成。
可以选用C、C++和Java作为开发语言,但是考虑到专业课程设计I的实验大纲,请尽可能使用Java语言。
提高要求:
(1)考虑到跨平台的特性,请尽量使用posix线程标准(采用该标准有额外的加分);
(2)实现良好的图形用户界面;
(3)在程序演示过程中能清晰的展示多个学生线程和多个老师线程的同步和互斥流程。
2、需求和思路分析
3、
该课题主要考察操作系统中PV操作知识点,涉及到多进程管理和死锁的相关知识。
1.为了实现老师与学生能协调进行下去,可以采用多线程,这里可以使用三种线程:
总线程,老师线程,学生线程。
(1).总线程:
主线程作为主类,实现对老师线程和学生线程的调用
产生老师线程,并激活;
产生随机数来定义每个学生进入的时间;
产生学生线程;并按上面产生的时间激活;
时间结束,程序结束;
(2).老师线程:
(0)老师进入教室;
(1)在教室中空闲;
(2)直到被一个学生选择后等待(所有K个老师聚集);
(3)等待结束项目检查开始;
(4)做D分钟的项目检查;
(5)N次检查完毕或者T分钟时间到,离开教室。
否则回到
(1)
(3).学生线程:
(0)进入教室
(1)选择一个进入的时间(random()%(T-D))minutes;
(2)进入教室;
(3)选择K个空闲的老师,若找不齐,则等待;
(4)找齐后,做D分钟的检查;
(5)检查完毕离开教室。
2.在此题目要求中涉及PV操作的有学生选择老师阶段,在学生选择老师时刻,可能出现学生甲,学生乙同时发现有K个老师,于是每个人占有了一部分但又不够,且不放开资源,造成死锁的现象,对于这一问题可以设定,只要有一个学生在选择老师时,其他的学生都不可以选,一个人选完了,另外一个人才可以再选,这样就避免了死锁的发生;
还有一个同步和互斥的问题,教室每次只可以进去或出来一个人,即学生、老师不可以同时进入教室,离开教室。
这可以通过相关修饰符来解决;
以上两个问题皆可以用修饰符synchronized来解决。
如果线程进入,则得到对象锁,那么别的线程在该类所有对象上的任何操作都不能进行。
3.注意事项
(1)在剩余时间小于D时,一个已创建的学生线程只能执行第(5)步,不能再创建新的学生线程;
(2)在剩余时间小于D时,一个老师进程只能在执行(3)—(4)步或者直接执行第(5)步;
(3)对于所有合理的S,M,K,N,T,D数值(这些数必须都是正整数并且满足条件:
S*K<=M*NandT>D),你的程序都能够运行成功;
(4)你的程序对所有的时间安排策略都必须运行成功。
例如不管线程的相对速度,例如要把握好sleep的毫秒数;
(5)在每一个线程的生命周期内,每一步都要有一个合理的说明信息,来表明这个线程中包括哪个老师,哪个学生,进行到什么程度了;
(6)要特别注意防范死锁问题的发生。
3、概要设计
4、
1.主类
2.
通过人机对话获得所需要的学生人数S,老师人数M,学生需要接受检查的老师数K,老师最多检查学生数N,学生接受检查所需时间D,总时间T。
创建获取时间函数,进入,离开公共函数,供学生线程和老师线程使用,调用随机函数产生学生线程产生的时间,接着产生老师线程,等老师线程全部产生,一旦学生线程产生时间一到立即产生学生线程,等待时间T到,结束所有未结束的学生和老师线程,退出程序。
流程图如下:
staticintbusy[];//0表示闲1表示忙
staticintcount[];//老师已经检查的个数staticintTnum;//教室中空闲老师的个数
staticintS=1,M=2,K=1,N=2,D=1,T=2,p;
staticlongstart;
staticObjectoo=newObject();//用于锁
staticintr[];
publicstaticintgettime();
publicstaticsynchronizedvoidcomein();
publicstaticsynchronizedvoidleave();
2、老师线程
在教师线程中,老师进入和离开教室时利用修饰符synchronized来解决同步与互斥的问题;在进入的函数声明为:
publicstaticsynchronizedvoidcomein(),离开的函数声明为publicstaticsynchronizedvoidcomein(),在synchronized的修饰下,每次只能有一个线程调用comein和leave函数,且这两个函数是在主类中声明的,故老师与老师,学生与学生,老师与同学都不会同时进入或离开。
教师线程中,老师先进来并告知用户老师已经进入,刚开始时,进来一个教师,教室中的空闲教师就增加一个,老师进来后,程序先判断该教室检查的学生数够N没,时间已经不够了。
若两者有一个满足则老师要离开教室并告知用户,教室中空闲的教室少一个,且要把改离开的教室的状态设为忙,因为学生并不知道老师的编号,通过随机数找老师时,仍可能找到该老师,故只能通过设“忙”使该老师不可用才行。
告知用户老师离开时,通过对比老师离开的原因,输出不同的信息;
如果不满足条件,则通过while语句让老师处在等待之中;等待学生请老师来检查;
流程图如下:
2、学生进程
在学生线程中,进入之前先判断现在进去时间够不够检查,如果不够,学生则不进入,离开,输出离开信息。
如果够,学生。
进入,并向用户打印进入信息。
学生进入后就开始看有没有K个空闲的老师,且时间够不够,如果时间够,但老师不足,则通过while语句一直等待;如果等待中时间不够了(不管空闲老师足够了没有),则直接离开,输出离开信息;如果在有效时间内等到了K个老师则开始选择老师;
一个学生选择老师时,不允许他人选择,且一开始就将空闲教师数减K,老师编号是通过随机数产生的,随机产生一个老师,看他忙不忙,如果忙则再随机找,如果不忙,则将老师编号存起来,将老师的状态改为忙;找到K个空闲老师后,通过sleep函数来表示检查D这么长的时间。
检查完毕后,输出检查完毕信息,学生释放老师,将选择的老师的状态改为空闲,老师空闲数加依次增加,每个老师的检查次数增加1,(此时判断时间够不够,老师是否已近检查了N个人,如果不够或已经检查够N个人,则让老师离开,状态改为忙空闲老师相应减少。
若不是,则继续等待;)学生离开,输出离开信息;
流程图:
四、详细设计
源程序代码如下:
/*
*Tochangethistemplate,chooseTools|Templates
*andopenthetemplateintheeditor.
*/
package教师对学生项目评分;
importjava.util.*;
importjava.util.Scanner;
publicclassjob{
staticintbusy[];//老师忙,0表示闲,1表示忙
staticintcount[];//老师已经检查的个数
staticintTnum;//教室中空闲老师的个数
staticintS=1,M=2,K=1,N=2,D,T,p;
staticlongstart;
staticintr[];
publicstaticintgettime()
{
doubleduration;
longfinish=System.currentTimeMillis();
duration=(double)(finish-start);
return(int)duration;
}
publicstaticvoidmain(Stringargs[])
{
do
{
if(S*K>M*N||S<0||K<0||M<0||N<0)
System.out.println("Wronginput!
!
!
");
System.out.println("请输入学生个数S:
");
Scannerinput=newScanner(System.in);
S=input.nextInt();
System.out.println("请输入老师个数M:
");
M=input.nextInt();
System.out.println("请输入检查每个项目需要的老师数K:
");
K=input.nextInt();
System.out.println("请输入每个老师可以检查的项目数N:
");
N=input.nextInt();
System.out.println("请输入总时间T:
");
T=input.nextInt();
System.out.println("请输入检查每个项目所需时间D:
");
D=input.nextInt();
}while(S*K>M*N||S<0||K<0||M<0||N<0);
busy=newint[M];
count=newint[M];
Tnum=0;
r=newint[S];
for(inti=0;i { busy[i]=0; count[i]=0; } Teachertea[]=newTeacher[M]; for(intk=0;k { tea[k]=newTeacher(k); } Studentstu[]=newStudent[S]; for(intk=0;k { stu[k]=newStudent(k); } System.out.println("time: "); for(inti=0;i { r[i]=(int)((double)Math.random()*T); System.out.println(r[i]); } for(inti=0;i for(intj=i+1;j if(r[j] { p=r[j];r[j]=r[i];r[i]=p; } for(inti=0;i { count[i]=0; busy[i]=0; } start=System.currentTimeMillis(); for(inti=0;i { tea[i].start(); } for(inti=0;i { while(gettime() stu[i].start(); } while(gettime()<=T); } } classTeacherextendsThread { intI;//第几个老师 publicTeacher(inti){ I=i; } publicsynchronizedvoidcomein() { job.Tnum++;//教室中空闲老师人数加1 System.out.println(job.gettime()+"ms"+I+"老师进入教室"); } publicsynchronizedvoidleave() { job.Tnum--; this.stop(); } publicvoidrun() { ein(); while(job.count[I] //老师去迟了就没意义了,通过对互斥锁leave上锁,使同一时刻只有一人离开教室 { if(job.count[I]==job.N)//老师由于检查次数到达N所以离开 { this.leave(); System.out.println(job.gettime()+"ms"+I+"老师离开教室(已经检查够N个)");} else {if(job.busy[I]==0) { System.out.println(job.gettime()+"ms"+I+"老师离开教室(剩下时间不足以检查一个项目))"); this.leave(); }//老师由于时间不够再查一个人,所以离开 } } } } classStudentextendsThread { intI; inta=0; intvisit[]=newint[job.K]; publicStudent(inti) {I=i;} publicsynchronizedvoidcomein() {System.out.println(job.gettime()+"ms"+I+"学生进入教室");} publicsynchronizedvoidleave() {System.out.println(job.gettime()+"ms"+I+"学生离开教室"); this.stop(); } publicvoidrun() { if(job.gettime()>job.T-job.D)//剩余时间是否小于D//是,则学生离开 { System.out.println(job.gettime()+"ms"+I+"学生离开教室(时间不足)"); this.stop(); //结束学生线程 } else { ein();//不是,学生进入教室 //System.out.println(Work.gettime()+"msstudent"+I+"comeintheclassroom."); } while(job.Tnum if(job.gettime()>=job.T-job.D)//等老师够,可是等;老师够的时候时间不够了 { System.out.println(job.gettime()+"ms"+I+"学生离开教室(时间不够)"); this.stop(); } else synchronized(this){ { job.Tnum=job.Tnum-job.K; for(intj=0;j { while(job.count[a]>=job.N||job.busy[a]! =0)//test[a]>=N表明老师已完成任务,已离开 a=(int)((double)Math.random()*job.M);//busy[a]! =0表明老师正在忙,为别人检查,继续寻找 job.busy[a]=1;//找到老师,修改其忙闲状态 visit[j]=a;//保存老师序号 System.out.println(job.gettime()+"ms老师"+visit[j]+"检查"+I+"学生"); }} try{Thread.sleep(job.D);} catch(InterruptedExceptione){}//检查学生 for(intj=0;j { job.busy[visit[j]]=0;//将老师忙闲状态置闲 job.count[visit[j]]++;//老师检查次数加1 job.Tnum++;//教室中处于空闲状态的老师人数加1 System.out.println(job.gettime()+"ms老师"+visit[j]+"检查完"+I+"学生");//同时完成 if(job.gettime()>job.T-job.D)//如果时间已经不够了,立即让老师离开(即让他们不可用)//离开不能同时 { System.out.println(job.gettime()+"ms老师"+visit[j]+"离开教室(时间不够)."); job.busy[visit[j]]=1; } } } this.leave(); } } 五、测试数据及其结果分析 输入数据: S=3.M=3,K=2,N=3,T=1000,D=200 系统为S=3个学生生成三个随机进入教室的时间: 单位是毫秒。 运行结果: 六、调试过程中的问题 1、程序中学生进入教室的时间是通过随机函数产生随机的,但是由于学生线程是依次产生的,如果先开始的学生线程的随机时间比较迟,后开始的学生线程的随机时间比较早,那么会导致先开始的学生线程没有开始时,把后面的学生线程都堵塞了。 所以在这里通过对产生的随机时间从小到大排列,这样就可以避免这种问题。 2、 2.还有就是在老师线程中,当老师时间不足或者检查够作业离开后,将空闲老师数量减一,输出离开消息,但是并没有使这个老师线程消亡,与世就出现了老师离开后,后面还有学生成功的找到他为自己检查。 为了解决这一问题,当老师离开的时候就将老师的状态改为忙,这样,学生就不会再去找这个老师检查作业了。 七、专业课程设计总结 通过这次实验,我对java语言有了更进步一步的了解,通过不断地查阅,好像自己重新学了一遍java语言一样。 这次实验,刚开始是没有头绪的,一直在图书馆查资料,也不知道从何着手,后来老师给了C++版本的,回去装了LUNIX虚拟机,把老师的给的运行了一下才有了一些头绪。 后来和同学一起研究讨论,一点点的硬是把C++语言改成了java语言,其实对我们来说这是个挺艰难的事情,这个时候才发现自己学了一个学期java 真的好像白学了一样。 这次实验让我发现了自己对java掌握的严重不足,其实理解了,还是觉得挺简单的,以后我会继续努力学习java这门语言 图形动画制作 一、课题内容和要求 二、 用图形函数设计动画,一个人在公路上奔跑,这时从屏幕右端开出一辆卡车,最终将人撞倒了。 基本要求: (1)编程实现该动画; (2)实物演示时要求讲出程序原理; (3)程序操作友好、界面清晰。 提高要求: (1)人和卡车的图形设计轮廓明晰,动画显示清楚、逼真; (2)能够给动画赋予色彩,甚至实现三维效果。 二、需求和思路分析 此程序用C语言实现 使用的是EasyX库 一个人在路上跑,然后出现一个行驶的车将其撞倒,可将这个程序分为两个部分,一部分是奔跑的人,一部分是行驶的车。 最后将两部分组合。 主要任务便是构造人,小车,以及用getimage,和putimage函数制造运动的效果。 奔跑的人: 由于人奔跑时有多个动作,所以需要画多个小人的图形,再组合起来形成奔跑的动作。 行驶的小车: 行驶的小车只需要画一个小车即可。 人与小车的结合: 本程序的即
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 专业课程 设计 报告