1、学 号: 课 程 设 计题 目 进程调度模拟设计优先级法、最高响应比优先调度算法学 院 计算机科学与技术专 业 计算机科学与技术班 级 计算机 班姓 名指导教师2012 年 1 月 12 日武汉理工大学计算机操作系统课程设计说明书1目 录1课程设计目的与功能描述 31.1 目的描述 .31.2 功能描述 .32.需求分析 .42.1 基本原理 .42.1.1 优先级调度算法.42.2.2 最高响应比调度算法.42.2 基本需求设计 .53程序设计 53.1 数据结构 .53.2 模块说明 .63.2.1 主要函数模块及功能.63.2.2 模块框图.63.2.4 程序流程图74. 开发平台及源程
2、序的主要部分 .104.1 开发平台 104.2 源程序的主要部分 105. 程序测试 .175.1 测试用例 175.2 程运行结果及分析 185.2.1 对测试用例的验证.185.2.2 对基本错误处理.205.2.3 其他功能.226. 自我评价与总结 .256.1 自我评价 256.2 经验与收获 256.3 对算法改进的想法 27本科生课程设计成绩评定表 28武汉理工大学计算机操作系统课程设计说明书2课程设计任务书学生姓名: 专业班级: 指导教师: 工作单位: 计算机科学与技术学院 题 目: 进程调度模拟设计优先级法、最高响应比优先调度算法 初始条件:1预备内容:阅读操作系统的处理机
3、管理章节内容,对进程调度的功能以及进程调度算法有深入的理解。2实践准备:掌握一种计算机高级语言的使用。要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1模拟进程调度,能够处理以下的情形: 能够选择不同的调度算法(要求中给出的调度算法) ; 能够输入进程的基本信息,如进程名、优先级、到达时间和运行时间等; 根据选择的调度算法显示进程调度队列; 根据选择的调度算法计算平均周转时间和平均带权周转时间。2设计报告内容应说明: 课程设计目的与功能; 需求分析,数据结构或模块说明(功能与框图) ; 源程序的主要部分; 测试用例,运行结果与运行情况分析; 自我评价与总结:i
4、)你认为你完成的设计哪些地方做得比较好或比较出色;ii)什么地方做得不太好,以后如何改正;iii)从本设计得到的收获(在编写,调试,执行过程中的经验和教训) ;iv)完成本题是否有其他方法(如果有,简要说明该方法) ;v)对实验题的评价和改进意见,请你推荐设计题目。时间安排:设计安排一周:周 1、周 2:完成程序分析及设计。周 2、周 3:完成程序调试及测试。周 4、周 5:验收、撰写课程设计报告。(注意事项:严禁抄袭,一旦发现,抄与被抄的一律按 0 分记)指导教师签名: 年 月 日系主任(或责任教师)签名: 年 月 日武汉理工大学计算机操作系统课程设计说明书3进程调度模拟设计优先级法、最高响
5、应比优先调度算法1课程设计目的与功能描述1.1 目的描述学习完计算机操作系统这门专业课后,对计算机操作系统的组成和功能有了一定的了解;基于此,在掌握操作系统实现进程调度以及对进程调度算法了解的基础上,编写一个程序,来模拟计算机操作系统进程的调度过程,从而加深对计算机操作系统进程调度各算法的在认识和理解;我抽到的题目为:进程调度模拟设计优先级法、最高响应比优先调度算法。1.2 功能描述此次我编写程序为 C+语言模拟进程调度的程序,主要功能有:1 选择不同的调度算法,主要为选择优先级法、最高响应比优先调度算法;2 输入进程的基本信息,如进程名、优先级、到达时间和运行时间;3 根据选择的调度算法显示
6、进程调度队列;4 根据选择的调度算法计算平均周转时间和平均带权周转时间并显示。5 对基本的输入错误进行处理,如:输入进程信息时要求进程名不能相同,到达时间、运行时间和优先级必须为正等输入错误。武汉理工大学计算机操作系统课程设计说明书42.需求分析2.1 基本原理2.1.1 优先级调度算法优先级法可被用作作业或进程的调度策略。首先,系统或用户按某种原则为作业或进程指定一个优先级来表示该作业或进程所享有的调度优先权。该算法的核心是确定进程或作业的优先级,此次课程设计采用静态优先级。作业调度中的静态优先级大多按以下原则确定: 1 由用户自己根据作业的紧急程度输入一个适当的优先级。为防止各用户都将自己
7、的作业冠以高优先级,系统应对高优先级用户收取较高的费用。 2 由系统或操作员根据作业类型指定优先级。作业类型一般由用户约定或由操作员指定。可将作业分为: IO 繁忙的作业、CPU 繁忙的作业、IO 与 CPU 均衡的作业、一般作业等,系统或操作员可以给每类作业指定不同的优先级。 3 系统根据作业要求资源情况确定优先级。例如根据估计所需处理机时间、内存量大小、IO 设备类型及数量等,确定作业的优先级。 进程的静态优先级确定原则可以是: 按进程的类型给予不同的优先级。例如,在有些系统中,进程被划分为系统进程和用户进程。系统进程享有比用户进程高的优先级。对于用户进程来说,则可以分为: IO 繁忙的进
8、程、CPU 繁忙的进程、IO 与 CPU 均衡的进程、其他进程。对系统进程,也可以根据其所要完成的功能划分为不同的类型,例如,调度进程、IO 进程、中断处理进程、存储管理进程等。 将作业的静态优先级作为它所属进程的优先级。2.2.2 最高响应比调度算法最高响应比优先法(HRN)是对 FCFS 方式和 SJF 方式的一种综合平衡。HRN 调度策略同时考虑每个作业的等待时间长短和估计需要的执行时间长短,从中选出响应比最高的作业投入执行。 响应比 R 定义: R=(W+T)/T=1+W/T武汉理工大学计算机操作系统课程设计说明书5其中 T 为该作业估计需要的执行时间,W 为作业在后备状态队列中的等待
9、时间。 每当要进行作业调度时,系统计算每个作业的响应比,选择其中 R 最大者投入执行。这样,即使是长作业,随着它等待时间的增加,W/T 也就随着增加,也就有机会获得调度执行。2.2 基本需求设计程序实现模拟进程调度的优先级调度算法和最高响应比调度算法;基本需求设计如下:进程信息的输入、输出采用命令行界面;程序执行过程如下:首先 输入进程信息,可连续添加;其次 选择调度算法:优先级和最高响应比调度算法;然后 根据选择的调度算法,执行相关函数,显示进程调度序列,输出总进程周转时间、总带权周转时间、平均周转时间、平均带权周转时间;最后 可再次选择调度算法、重新创建进程链、销毁进程链,如果选择销毁进程
10、队列,则退出程序。3程序设计3.1 数据结构此次课程设计的存储结构采用链表的数据结构,用链表的各个接点保存进程的相关信息,可实现对进程链的排序、删除、比较查找等。存储结构如下:struct ProcessProcess *pNext; string name; /进程名double readytime; /进程提交时间double runtime; /运行时间double priority; /进程的优先级;武汉理工大学计算机操作系统课程设计说明书63.2 模块说明3.2.1 主要函数模块及功能主要函数模块及功能如下:Process * Add( Process * pHead)功能:主要完成
11、要求用户输入进程的相关信息:进程名、进程提交时间、进程运行时间、进程优先级;按输入的提交时间的先后顺序组织进程链,同时对用户的一些简单的错误输入进行处理。Process * Copy(Process * pHead) 功能:实现对用户创建的进程链的深复制,由于要进行多次的进程调度,而每次的调度均会删除进程链中的各个接点,直至链表为空,因此要将原进程链保存,每次只是对复制链进行操作。Process* Destroy(Process *pHead) 功能:实现对进程各个接点的销毁回收。void Hrn(Process*pHead,int n) 功能:最高响应比调度算法执行函数,采用最高响应比的调度
12、算法,实现对进程链的执行,并输出周转时间、带权周转时间、平均周转时间、平均带权周转时间。void Highpriority(Process*pHead,int n)功能:优先级调度算法执行函数,采用高优先级调度算法,实现对进程链的执行,并输出周转时间、带权周转时间、平均周转时间、平均带权周转时间。int main()功能:程序的入口,提供人机交互函数,提示用户创建进程序列,选择调度算法。3.2.2 模块框图主函数模块输入进程模块优先级调度模块最高响应比调度模块销毁进程链模块武汉理工大学计算机操作系统课程设计说明书7图 3 - 13.2.4 程序流程图本次程序流程图如下武汉理工大学计算机操作系统
13、课程设计说明书8其他输入YN cpHead-pnext31优先级调度算法2 4选择操作:优先级 1、最高响应比 2、重新创建进程链 3、销毁进程链 4开始选择 1、2、3、4最高响应比优先算法 重新创建进程链销毁进程链创建进程链继续?Y/N结束退出图 3 - 2优先级调度算法流程图:武汉理工大学计算机操作系统课程设计说明书9否是否是否是开始复制进程链取 cpHeadtime =头接点提交时间从所有提交时间不大于time 中选取一个优先级最大进程 flagtimereadytime ?cpHead 是否为空?time = flag-readytime 输出 flag 执行信息删除 flagFla
14、g = c pHead ?输出周转时间和带权周转时间完毕返回cpHead = cpHead-pnext图 3 - 3最高响应比调度算法流程图:武汉理工大学计算机操作系统课程设计说明书10否是否是否是开始复制进程链取 cpHeadtime =头接点提交时间从提交时间不大于time 进程中选取一个响应比最大进程 flagtimereadytime ?cpHead 是否为空?time = flag-readytime 输出 flag 执行信息删除 flagFlag = c pHead ?输出周转时间和带权周转时间完毕返回cpHead = cpHead-pnext图 3 - 44. 开发平台及源程序的
15、主要部分4.1 开发平台开发环境:Windows7 平台开发平台:VC+6.04.2 源程序的主要部分输入进程信息源程序:Process * Add( Process * pHead)int mksure=1,i=1; /用来判断是否继续输入的标志cout*n“;while(mksure=1) Process *p,*q;p=new Process;coutp-name;do coutp-readytime;if(p-readytimereadytimep-runtime;if(p-runtimeruntimep-priority;武汉理工大学计算机操作系统课程设计说明书11if(p-prio
16、rityprioritypNext=NULL;if(pHead = NULL) /假如链表为空,加到链表头 pHead=p; else /其他情况 q=pHead;while(q) if(p-name = q-name) coutpNext;if(q) continue;i- else q=pHead;while( q ) if(q-pNext!=NULL) else break; /如果要加入进程提交时间早于头结点,将该节点作为头结点if(q = pHead p-pNext=q; /如果加入的进程提交时间早于 q 节点进程,则将其插入 q 之前else p-pNext=q-pNext;q-p
17、Next=p; coutmksure;if(mksure=1) i+;cout*n“;return pHead;优先级调度算法源程序:武汉理工大学计算机操作系统课程设计说明书12void Highpriority(Process*pHead,int n)Process *p,*cpHead,*p1;Process *flag=NULL;Process *q=NULL;double time=0,j=0,runTime=0,drunTime=0;int xuhao=0;string pnameMAX_NUM;for(int ss=0;ss*n“;coutreadytime) /如果进程提交时间早
18、于要比较的进程,则先执行time=p-readytime; flag=cpHead;while( q q=q-pNext; if(time readytime)/如果上一次结束时间比当前选中要执行进程的结束时间小time=flag-readytime; /则当前进程开始时间为提交时间coutname;coutpriority;coutruntime);coutreadytime + flag-runtime);coutreadytime + flag-runtime)/flag-runtime)readytime + flag-runtime); /当前执行进程的周转时间runTime+=j;
19、 /记录周转时间time += flag-runtime;drunTime=drunTime+j/flag-runtime; /带权周转时间pnamexuhao=flag-name;xuhao+;/将执行过的进程从链表中删除if(flag=cpHead) /最先开始执行的进程就在链表头cpHead=cpHead-pNext;武汉理工大学计算机操作系统课程设计说明书13else /最先开始执行的进程在链表中p1=cpHead;while(p1-pNext!=flag)p1=p1-pNext;p1-pNext=flag-pNext;delete flag; /删除这个进程所占的节点 cout “;
20、 cout*n“;最高响应比调度算法源程序:void Hrn(Process*pHead,int n)Process *p,*cpHead,*p1;Process *flag=NULL;Process *q=NULL;double time=0,j=0,runTime=0, drunTime=0;int xuhao=0;string pnameMAX_NUM;for(int ss=0;ss*n“;coutreadytime) /如果该进程提交时间早于其它进程,则先执行该进程time=p-readytime;flag=cpHead; /用于暂存将要执行的进程/计算当前链表中进程的响应比while
21、(q q=q-pNext; if(time readytime) /如果上一次结束时间比当前选中要执行进程的结束时间小time=flag-readytime; /则当前进程开始时间为提交时间coutname;coutpriority;coutruntime);coutreadytime + flag-runtime);coutreadytime + flag-runtime)/flag-runtime)readytime+flag-runtime); /当前执行进程的周转时间runTime +=j; /记录周转时间time+=flag-runtime;drunTime+=j/flag-runt
22、ime; /带权周转时间pnamexuhao=flag-name;xuhao+;/将执行过的进程从链表中删除if(flag=cpHead) /在链表头cpHead=cpHead-pNext; else /在链表中p1=cpHead;while(p1-pNext!=flag)p1=p1-pNext;p1-pNext=flag-pNext;delete flag; /删除这个进程所占的节点 cout “; cout*n“;武汉理工大学计算机操作系统课程设计说明书15主函数源程序如下:int main() coutdecision;if(decision=1) / 优先级调度算法Highpriori
23、ty(pHead,count);if(decision =2)/最高响应比算法Hrn(pHead,count);if(decision =3) pHead=NULL;pHead=Add(pHead);Output(pHead); if(decision =4) pHead=Destroy(pHead);break; if(decision !=1 武汉理工大学计算机操作系统课程设计说明书16while(again=Y | again=y | (char)again=1);system(“pause“); return 0;复制进程链函数源程序如下:Process * Copy(Process
24、* pHead)Process * p,*cpHead,*q,*temp;cpHead=NULL;q=pHead;p=new Process;int i=1;while(q)p-pNext=NULL;p-name=q-name;p-priority=q-priority;p-readytime=q-readytime;p-runtime=q-runtime;temp=p;if(cpHead=NULL)cpHead=p;q=q-pNext;if(q) p=new Process;if(i=1)cpHead-pNext=p;temp-pNext=p;i+; return cpHead;销毁进程链函
25、数源代码如下:Process* Destroy(Process *pHead)Process *dp,*dq;dp=pHead-pNext;pHead=NULL;while(dp) dq=dp;dp=dp-pNext;delete dq;coutnamereadytimeruntimeprioritypNext;count+; 5. 程序测试5.1 测试用例测试用例的输入进程信息为:进程名 提交时间 运行时间 优先级PP1 1.0 2 1PP2 2.0 1 2PP3 2.5 2 3表 5 1采用优先级调度算法1.0 时刻 只有进程 PP1 提交到达系统,故执行进程 PP13.0 时刻 进程 P
26、P2、PP3 均已到达系统,但由于 PP3 优先级高于 PP2 优先级,故执行进程 PP35.0 时刻 进程 PP3 执行完毕,执行进程 PP26.0 时刻 进程 PP2 执行完毕进程调度顺序为:PP1 PP3 PP2执行信息如表:进程名 提交时间 运行时间 优先级 开始时间 结束时间 周转时间 带权周转时间PP1 1.0 2 1 1.0 3.0 2.0 1.0武汉理工大学计算机操作系统课程设计说明书18PP2 2.0 1 2 5.0 6.0 4.0 4.0PP3 2.5 2 3 3.0 5.0 2.5 1.25表 5 2平均周转时间:8.5/3=2.833平均带权周转时间:6.25/3=2.
27、083采用最高响应比优先调度算法1.0 时刻 只有进程 PP1 提交到达系统,故执行进程 PP13.0 时刻 进程 PP2、PP3 均已到达系统,响应比:RPP2=1+1.0/1=2;RPP3=1+0.5/2=1.25,故执行进程 PP24.0 时刻 进程 PP2 执行完毕,执行进程 PP36.0 时刻 进程 PP3 执行完毕进程调度顺序为:PP1 PP2 PP3执行信息如表:进程名 提交时间 运行时间 优先级 开始时间 结束时间 周转时间 带权周转时间PP1 1.0 2 1 1.0 3.0 2.0 1.0PP2 2.0 1 2 3.0 4.0 2.0 2.0PP3 2.5 2 3 4.0 6
28、.0 3.5 1.75表 5 3平均周转时间:7.5/3=2.5平均带权周转时间:4.75/3=1.5835.2 程运行结果及分析5.2.1 对测试用例的验证输入用例中的进程信息,如图:武汉理工大学计算机操作系统课程设计说明书19图 5 1选择优先级调度算法,执行结果如图:武汉理工大学计算机操作系统课程设计说明书20图 5 2分析 从程序运行结果来看,结果与 5.1 理论分析一直,说明程序运行结果正确!采用最高响应比优先的调度算法,执行结果如图:图 5 3分析 从程序运行结果来看,结果与 5.1 理论分析一直,说明程序运行结果正确!5.2.2 对基本错误处理本程序考虑的基本输入错误信息有:进程
29、提交时间、运行时间、优先级小于零,选择算法操作时未按要求输入;其他异常情况为:进程同名,由于每个进程有一个唯一的武汉理工大学计算机操作系统课程设计说明书21进程控制块(PCB) ,要求进程控制号、进程名字不一样,因此模拟时应考虑到输入进程同名的情况。 当输入进程的提交时间、运行时间、优先级小于零时,程序提示输入错误,要求用户重新输入!程序执行结果如图:图 5 4图 5 5图 5 6 当输入进程与已输入的进程同名时,程序进行检测,并提示用户重新输入该进程信息,执行结果如图:图 5 7武汉理工大学计算机操作系统课程设计说明书22 当进程链创建完毕后,选择相关操作,当未按要求输入时,比如输入非 1、
30、2、3的数字,提示输入错误,并要求用户重新输入,执行结果如下:图 5 85.2.3 其他功能本程序还可以重新创建进程链表,作为下一次调度算法的检测,执行如下图:武汉理工大学计算机操作系统课程设计说明书23图 5 9武汉理工大学计算机操作系统课程设计说明书24图 5 10图 5 11武汉理工大学计算机操作系统课程设计说明书256. 自我评价与总结6.1 自我评价计算机操作系统这门课程是计算机专业一门基础性学科,重要性可见一斑,学好这门课程对以后人生的发展具有深远的影响。而课程设计便是对学习效果的检验。数课程设计不仅可以锻炼我们独立思考问题、解决问题的能力,而且可以培养我们的整体性思维的能力;通过
31、课程设计,使我加深了对操作系统进程调度各个调度算法的再认识,特别是优先级调度算法和最高响应比优先调度算法;巩固了很多操作系统和 C+编程基础性知识,比如:存储结构、信息查找比较、算法设计等。出色的地方本次课程设计,刚开始看到课程设计题目时,感觉有些难度,通过对优先级和最高响应比优先调度算法的再次复习,最终确定了其设计的算法。程序实现了用优先级和最高响应比优先调度算法模拟进程调度,而且结果与理论分析完全一致,说明程序正确,此外对于选中的满足调度算法的进程,如果提交时间比上一次进程执行完毕时的时间还大,则该进程的开始时间为自己的提交时间,而非上一次进程执行完成时的结束时间;同时,考虑到了用户的输入
32、错误,对进程提交时间、运行时间、优先级小于零、选择操作未按要求等输入错误进行了处理;对输入进程同名的情况进行排除并要求用户重新输入。不好的地方程序总虽然考虑了一些用户输入错误,并对其进行处理,但是这种处理是不完善的,只能对如:进程提交时间、运行时间、优先级小于零、选择操作未按要求等输入错误进行了处理,而对进程提交时间、运行时间、优先级、选择操作不为数值等情况进行了处理,这样异常处理是片面的不完善的,对于此种情况,可以用 JAVA 语言来编写这次程序,利用其强大的系统异常和处理机制可以很好的解决上述问题;两种调度算法输出各进程执行情况时,直接将输出语句放在调度算法之中,这样由于两种输出基本上一样
33、,增加了程序的存储开销,可以将输出单独作为一个函数进行输出处理。武汉理工大学计算机操作系统课程设计说明书266.2 经验与收获这次课程设计,我明白了对于编写程序,解题的思路尤为重要。在编写程序之前,如果没有比较清晰的思路,根本不可能编出好的程序。就算马马虎虎的编出来,程序的逻辑性、健壮性、完善性、合理性也不会很强。在编程之前,我们应反复研究题目要求,对题目涉及的情况进行比较充分的分析,以便编写出更加符合题意的程序;其次要充分考虑各种临界情况,对一些错误的输入进行处理。因此在我们编程序之前一定要做好充分的准备,首先要理清自己的思路,然后再将思路分划成几个模块,逐块的写好算法,最后再将所有的模块有
34、机的联系起来,组成一个完整的程序。在成功通过编译的情况下,对程序运行的结果进行系统的分析,检验其正确性,如果有错误,应立即去分析源程序的逻辑错误,直到得到正确的结果。编写过程主要问题:由于两种调度的执行过程为:每次选取一个满足调度条件的进程进行执行,该进程执行完成后即删除该进程,即在创建进程链中删除该进程接点,这样一次调度完成后,原进程链为空,不能再次选择调度算法进行调度;最后通过分析,每次执行一种调度算法时,先用 Copy()函数对原进程链进行深复制,只对复制后的进程链进行型操作,从而保证了原进程链不被修改;纠正上述错误后,程序得以运行,而且对基本的情况,运行结果正确,但是我想到了对于某次进
35、程执行结束时,其余的进程都还未到达的情况,由于考虑欠佳,每次进程执行的开始时间为上一次进程结束时间,这样就带来了问题,对于某次进程执行结束时,其余的进程都还未到达的情况,增加判断提交:即在每次选中要执行的进程开始执行之前先判断一下提交时间与上次进程结束时间大小,若前者大于后者,则修改进程开始时间为自己的提交时间,即增加代码:if(time readytime)time=flag-readytime;。在这次课程设计的过程中,我也遇到了很多难题。在种种的困难中,我明白了在编写程序时要有耐心。如果你没有耐心,即使再好的算法思路也不会得到很好的表达,特别是在调试的过程中,对于各种各样的错误,要特别的
36、有耐心去自习分析原因,特别是一些基本的语法错误,不能一看到错误很多就乱了阵脚,更不能轻易的放弃,半途而废。比如在调试中没有定义某些变量的错误、基本的输入输出错误、数据选取不合理的错误、变量名前后不一的错误、函数返回值的错误等等。其实只要有耐心,你就会发现,在你修改了一个错误之后,其它有的错误也会跟着消失,所以在编译的时候一定要有耐心;武汉理工大学计算机操作系统课程设计说明书27此外对程序执行结果与理论分析不一致的情况更需要耐心去分析源代码的逻辑错误,如刚编写好源程序后,进行调试,发现了很多语法错误,逐个修改后,程序终于可以正常运行,最开始程序每次输出的总周转时间和总带权周转时间总是与最后一个执
37、行进程的周转时间和带权周转时间一样,经过仔细分析才发现,在每次执行一个进程后,应将其周转时间和带权周转时间与上一次进程的周转时间和带权周转时间相加,而不是将本次进程的周转时间和带权周转时间赋给总周转时间和总带权周转时间,即用+=操作符而不是=操作符。6.3 对算法改进的想法本次课程设计完全可以用 JAVA 语言来解决,而且依赖 JAVA 强大的函数库和异常处理机制可以很好的实现课程设计的要求。由于设置了一个 string 数组来保存执行进程的名字,由于数组定义时要求有确定的大小,这样就限制了输入的总进程的个数,解决方法可以用一个链表来保存进程名字。此次的优先级调度算法采用的是静态优先级调度算法
38、,要求用户给定进程的优先级,这在实际操作系统进程调度中并非如此,可以将动态优先级调度算法结合起来,每次先预给定每个进程一个优先级,在执行时根据实际情况而修改优先级。参考文献:计算机操作系统教程(第 3 版) ,张尧学 史美林 张高 编著,清华大学出版社,出版时间:2006.10C+程序设计教程 ,闽联营 何克右 编著,武汉理工大学出版社,出版时间:2005.7武汉理工大学计算机操作系统课程设计说明书28本科生课程设计成绩评定表班级:计算机 班 姓名: 学号:序号 评分项目 满分 实得分1 学习态度认真、遵守纪律 102 设计分析合理性 103 设计方案正确性、可行性、创造性 204 设计结果正确性 405 设计报告的规范性 106 设计验收 10总得分/等级武汉理工大学计算机操作系统课程设计说明书29评语:注:最终成绩以五级分制记。优(90-100 分) 、良(80-89 分) 、中(70-79 分) 、及格(60-69 分) 、60 分以下为不及格指导教师签名:2012 年 1 月 12 日