进程调度模拟
——优先级法、最高响应比优先调度算法(可编辑)
进程调度模拟设计——优先级法、最高响应比优先调度
算法
学号:课 程 设 计
目 进程调度模拟设计??优先级法、最高响应比优先调度算
法
学 院 计算机科学与技术
专 业
班 级
姓 名
指导教师 吴利军
2013 年 1 月 15 日
课程设计任务书
学生姓名:
指导教师:吴利军 工作单位: 计算机科学与技术学院 题 目: 进程调度模拟设计??优先级法、最高响应比优先调度
算法
初始条件:
1.预备内容:阅读操作系统的处理机管理章节内容,对进程调度的功能以及进程调度算法有深入的理解。
2.实践准备:掌握一种计算机高级语言的使用。
要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)
1.模拟进程调度,能够处理以下的情形:
? 能够选择不同的调度算法(要求中给出的调度算法);
? 能够输入进程的基本信息,如进程名、优先级、到达时间和运行时间等;
? 根据选择的调度算法显示进程调度队列;
? 根据选择的调度算法计算平均周转时间和平均带权周转时间。
2.设计报告内容应说明:
? 需求分析;
? 功能设计(数据结构及模块说明);
? 开发平台及源程序的主要部分;
? 测试用例,运行结果与运行情况分析;
? 自我评价与总结:
i)你认为你完成的设计哪些地方做得比较好或比较出色;
ii)什么地方做得不太好,以后如何改正;
iii)从本设计得到的收获(在编写,调试,执行过程中的经验和教训);
iv)完成本题是否有其他方法(如果有,简要说明该方法);
时间安排:
设计安排一周:周1、周2:完成程序分析及设计。
周2、周3:完成程序调试及测试。
周4、周5:验收、撰写课程设计报告。
(注意事项:严禁抄袭,一旦发现,一律按0分记)
指导教师签名: 年 月日
系主任(或责任教师)签名: 年 月日
进程调度模拟设计
优先级法、最高响应比优先调度算法
1.设计目的与实现功能
模拟进程调度,使程序能够完成:能够输入若干进程,包括进程的一些基本信息,如进程名、优先级、到达时间和运行时间等,选择不同的调度算法(优先级法或者最高响应比法),选择算法后,根据选择的调度算法显示进程调度队列;根据选择的调度算法计算平均周转时间和平均带权周转时间。
2.需求分析
2.1实验原理 最高响应比优先算法(HRN):最高响应比是对先来先服务和最短进程优先法德一种综合平衡。HRN调度策略同时考虑每
个进程的等待时间长短和估计需要的执行时间长短,从中选出响应比最高的进程投入执行。
响应比R定义如下:
RW+T/T1+W/T
其中T为该进程的估计需要的执行时间,W为进程在后备状态队列的等待时间。每当要进行进程调度是,系统计算每个进程的响应比,选择其中R最大者投入执行。
优先级法:系统和用户按某种原则为进程制定一个优先级来表示该进程所享有的调度优先权。根据优先级的高低来对进程加以调度。
3. 数据结构
3.1主要结构及函数
struct timer //时间类型
byte hour;
byte minute;
typedef struct process//进程结构
char name[20];//进程名
byte rank; //进程等级
timer time_in;//进程到达的时间
byte use_time;//运行需要消耗时间
timer time_start;//开始运行时刻
byte used_time; //已经运行的时间
timer time_end; //进程结束时刻
bool flag; //进程运行完成标志,完成true
process,*process_ptr;
bool searchprocess process_n[]//查看是否所有进程都执行完
bool comparetimer time1,timer time2 //比较两个时间类型的大小
void paixvprocess process_n[]//进程按优先级有大到小排序,规定rank越小优先级越高
void printf_lastprocess process_n[]//打印结果
void grade_firstprocess process_n[]//抢占式优先级调度算法
void HRNprocess process_n[]//最高响应比优先算法
优先级调度的思路: 这里设计的是一个抢占式优先级调度设一个标志位作为时钟,时间一分分地走,通过每次扫描各个进程的状态,确定这一分钟该哪个进程执行,在这之间要记录某个进程的开始时间、已运行时间和结束最后,到每个进程都执行过,完成优先级调度。
最高响应比优先调度的思路: 每次调度前都计算每个作业的
响应比,从而选择其中最大者投入运行。
3.2
图
4. 源程序的主要部分
4.1查看是否所有进程都执行完
bool searchprocess process_n[] forint i0;in;i++
ifprocess_n[i].flagfalse return false;
return true;
//比较两个时间类型的大小
bool comparetimer time1,timer time2 iftime1.hourtime2.hour
return true;
else iftime1.hourtime2.hour&&time1.minutetime2.minute
return true;
else
return false;
4.2进程按优先级有大到小排序,规定rank越小优先级越高 void paixvprocess process_n[] int i,j;
process temp;
fori0;in-1;i++
forj0;jn-i-1;j++
ifprocess_n[j].rankprocess_n[j+1].rank
tempprocess_n[j];
process_n[j]process_n[j+1]; process_n[j+1]temp;
4.3打印结果
void printf_lastprocess process_n[]
float a[];//记录每个进程的周转时间 float b[];//记录每个
进程的带权周转时间
float out_a0; float out_b0;printf"进程名 进程级别 提交
时间 运行时间 开始时间 完成时间 周转时间 带权周转时间
\n";forint i0;in;i++
a[i]floatprocess_n[i].time_end.hour-process_n[i].time_in.hour*60+process_n[i].time_end.minute-process_n[i].time_in.minute;b[i]a[i]/process_n[i].use_time;out_a+a[i];out_b+b[i];printf"%4s\t%4d\t",process_n[i].name,process_n[i].rank;printf" ";ifprocess_n[i].time_in.hour10
printf"0%d",process_n[i].time_in.hour;else
printf"%d",process_n[i].time_in.hour;printf":";ifprocess_n[i].time_in.minute10
printf"0%d\t",process_n[i].time_in.minute;else
printf"%d\t",process_n[i].time_in.minute;/////////////////////////////////////////////////////////////////////////////
/////////////////////printf"%4d\t",process_n[i].use_time; //////////////////////////////////////////////////////////////////////////////////////////////////ifprocess_n[i].time_start.hour10 printf"0%d",process_n[i].time_start.hour;else printf"%4d",process_n[i].time_start.hour;printf":";ifprocess_n[i].time_start.minute10
printf"0%d\t",process_n[i].time_start.minute;else printf"%d\t",process_n[i].time_start.minute;/////////////////////////////////////////////////printf"
";/////////////////////////////////////////////////ifprocess_n[i].time_end.hour10
printf"0%d",process_n[i].time_end.hour;else
printf"%d",process_n[i].time_end.hour;printf":";ifprocess_n[i].time_end.minute10
printf"0%d\t",process_n[i].time_end.minute;else printf"%d\t",process_n[i].time_end.minute;
//////////////////////////////////////////////////////////////////////////////////////////////printf"%.2f\t",a[i];printf"%.2f\n",b[i];
out_aout_a/n;
out_bout_b/n;
printf"平均周转时间为:%f\n",out_a;
printf"平均带权周转时间为:%f\n",out_b;
4.4抢占式优先级调度算法
/******************************************** * 抢占式优先级调度算法 *
********************************************/ void grade_firstprocess process_n[]
int i;bool flag;//标志位,用于控制当前时间while1
flagtrue;
fori0;in;i++
ifcomparecurrent,process_n[i].time_in&&!process_n[i].fl
ag
flagfalse;
//获取开始运行时间
ifprocess_n[i].time_start.hour0&&process_n[i].time_star
t.minute0
process_n[i].time_startcurrent;
//记录进程已经运行的时间
process_n[i].used_time++;
//时钟继续一分一分走
current.minute++;
ifcurrent.minute60
current.hour+1;
current.minute0;
//运行完成后,记录完成时间
ifprocess_n[i].used_timeprocess_n[i].use_time
process_n[i].flagtrue;
process_n[i].time_endcurrent; break;
ifflag
current.minute++;
ifcurrent.minute60
current.hour+1;
current.minute0;
ifsearchprocess_n
break;
else
continue;
4.5最高响应比优先算法
/*****************************************************
* 最高响应比优先算法 *
*****************************************************/
void HRNprocess process_n[] float flag_xiangxi[];//记录进程的响应比
//找到最小的时间作为当前基准时间
currentprocess_n[0].time_in;
forint i1;in;i++
ifcomparecurrent,process_n[i].time_in
currentprocess_n[i].time_in;
///////////////////////////////////////
while!searchprocess_n
float temp0;
forint i0;in;i++
ifcomparecurrent,process_n[i].time_start&&process_n[i].flagfalse
flag_xiangxi[i]floatcurrent.hour-process_n[i].time_in.hour*60+current.minute-process_n[i].time_in.minute/process_n[i].use_time; ifflag_xiangxi[i]temp
tempflag_xiangxi[i];
forint j0;jn;j++
ifcomparecurrent,process_n[j].time_start&&process_n[j].flagfalse&&tempflag_xiangxi[j]
process_n[j].time_startcurrent;
//.r*60+current.minute+process_n[j].use_time/60;
//.r*60+current.minute+process_n[j].use_time%60;
process_n[j].time_endcurrent;
process_n[j].flagtrue;
break;
4.6主函数
int main
int one_two;
process process_n[]; process process_n_other[]; char time_string[10]; char FLAG_exit;
while1
printf"请输入进程个数:";
scanf"%d",&n;fflushstdin; forint i0;in;i++
printf"请输入第%d个进程的参数:\n",i+1; printf"进程名:";
scanf"%s",process_n[i].name; fflushstdin;
printf"进程等级:";
scanf"%d",&process_n[i].rank; fflushstdin;
printf"提交时间:";
scanf"%s",&time_string; fflushstdin;
whilestrlentime_string!5
printf"输入格式不符合要求!请重新输入\n"; printf"提交
时间:"; scanf"%s",&time_string; fflushstdin; int atime_string[0]-48*10+time_string[1]-48; whilea24
printf"输入格式不符合在24小时内的要求!请重新输入\n";
printf"提交时间:"; scanf"%s",&time_string; fflushstdin;
atime_string[0]-48*10+time_string[1]-48; process_n[i].time_in.houra;
atime_string[3]-48*10+time_string[4]-48; whilea60
printf"输入格式不符合在60分钟内的要求!请重新输入\n";
printf"提交时间:";
scanf"%s",&time_string;fflushstdin; atime_string[3]-48*10+time_string[4]-48; process_n[i].time_in.minutea;printf"执行时间:";
scanf"%d",&process_n[i].use_time; fflushstdin;
process_n[i].flagfalse;
L1: printf"请你选择你将采用的调度算法:\n";
printf"1--优先级调度\n2--最高响应比优先算法\n";
printf"如果想退出程序请输入其他\n";
scanf"%d",&one_two;fflushstdin; ifone_two1 current.hour0;
current.minute0;
fori0;in;i++
process_n_other[i]process_n[i]; paixvprocess_n_other;
grade_firstprocess_n_other;
printf_lastprocess_n_other;
printf"是否退出程序?退出请输入y\n";
scanf"%c",&FLAG_exit;
fflushstdin;
ifFLAG_exit'y'||FLAG_exit'Y'
return 0;
else
goto L1;
else ifone_two2
current.hour0;current.minute0;
fori0;in;i++
process_n_other[i]process_n[i]; HRNprocess_n_other; printf_lastprocess_n_other; printf"
是否退出程序?退出请输入y\n"; scanf"%c",&FLAG_exit;
fflushstdin; ifFLAG_exit'y'||FLAG_exit'Y'
return 0; else
goto L1;
else
return 0;
return 0;
5.测试
输入测试用例:
名称优先级 到达时间 运行时间(分)
A 2 12:35 30
B 3 12:20 25
C 4 12:39 20
D 1 12:40 22
优先级算法
分析如下:
第3级别B进程开始运行,但由于是抢占式的,在12:35时,也就是B运行15分钟后,有第2级别的A进程到来,A只运行5分钟后,D到来,由于D是最高级别,D可以运行完,此时是13:02,A继续进行25分钟,完成A,之后B再运行10分钟,完成B,最后运行C。
优先级算法
分析如下:
B进程先到,所以先把B进程完成,也就到时间12:45,此时A、C、D进程都到了,
如果运行A:
RW+T/T1+W/T(12:45+30-12:35)/304/31.333如果运行C:
RW+T/T1+W/T(12:45+20-12:39)/2013/101.3
如果运行D:
R W+T/T1+W/T(12:45+22-12:40)/2227/221.22
由于A的响应比最大,所以先运行A,
同理,A运行之后
如果运行C:
RW+T/T1+W/T(13:15+20-12:39)/7>2014/52.8
如果运行D:
RW+T/T1+W/T(13:15+22-12:40)/2257/222.59
故运行C,最后运行D
6.自我评价与总结
6.1自我认为出色的地方
在这次的操作系统课程设计中,我设计的进程的结构是合理的,
其中进程结束与否这个标志位对程序的运行起到了很大的作用,结构
如下:
typedef struct process//进程结构
char name[20];//进程名
byte rank; //进程等级
timer time_in;//进程到达的时间
byte use_time;//运行需要消耗时间
timer time_start;//开始运行时刻
byte used_time; //已经运行的时间
timer time_end; //进程结束时刻
bool flag; //进程运行完成标志,完成true
process,*process_ptr;
优先级调度的算法实现过程中,取一个参考时钟对实现抢占式的优先级起到了很大的作用,原本想实现非抢占式的优先级调度,后来想挑战一下自己,就选择抢占式的算法,在实现过程中遇到一些问题,但很好的锻炼了自己。
在最高响应比优先采用另外一个数组flag_xainxi[]来记录每个进程响应比,通过比较每个响应比的大小确定下一个执行的进程,没有在进程中的结构体中添加字段来反映响应比,简化了结构。
6.2不足之处
采用数组形式实现的,输入的进程的个数是有限的,不能动态的增加,可以采用链表的形式,结合malloc,realloc函数来实现动态增加进程。本程序也使用大量的for循环,不宜大数据量的计算,影响了程序的运行速度,以后要仔细观察,进行代码优化。
6.3总结
通过这次课程设计,巩固了知识,对进程调度的理解更加深刻,同时也对C语言的基本语言有了重新的认识,开阔了自己的思维。这些经典的进程调度算法很值得我自己动手去模拟、去实现,所以在做了
这两个进程调度算法后,我又去模拟实现了磁盘的电梯调度和最短时间优先调度算法以及页式调度中的最近最久未使用(LRU)算法,感觉模拟这些并不困难,但在操作系统中实现这些算法就涉及的是真正的进程和硬件设备了,去实现一个操作系统还是比较难的。但这些模拟让我明白操作系统怎么管理进程运行,管理内存空间的,也让我明白了自己的不足,为以后的深入学习奠定了基础。
7、源码
//优先级法、最高响应比优先调度算法
#include
#include
#include
typedef unsigned char byte;
#define 20
//时间类型
struct timer
byte hour;
byte minute;
;
timer current; //标志当前时间
int n; //输入的进程数
byte FLAG; //标志当前选择的是抢占式优先--1,//还是最高响应比--2
//进程结构
typedef struct process char name[20];//进程名
byte rank; //进程等级 timer time_in;//进程到达的时间 byte use_time;//运行需要消耗时间
timer time_start;//开始运行时刻
byte used_time; //已经运行的时间
timer time_end; //进程结束时刻
bool flag; //进程运行完成标志,完成true process,*process_ptr;
//查看是否所有进程都执行完
bool searchprocess process_n[] forint i0;in;i++
ifprocess_n[i].flagfalse return false;
return true;
//比较两个时间类型的大小
bool comparetimer time1,timer time2
iftime1.hourtime2.hour return true;
else iftime1.hourtime2.hour&&time1.minutetime2.minute
return true;
else
return false;
//进程按优先级有大到小排序
//规定rank越小优先级越高
void paixvprocess process_n[]
int i,j;
process temp;
fori0;in-1;i++
forj0;jn-i-1;j++
ifprocess_n[j].rankprocess_n[j+1].rank tempprocess_n[j];
process_n[j]process_n[j+1]; process_n[j+1]temp;
//打印结果
void printf_lastprocess process_n[]
float a[];//记录每个进程的周转时间 float b[];//记录每个
进程的带权周转时间
float out_a0; float out_b0;printf"进程名 进程级别 提交
时间 运行时间 开始时间 完成时间 周转时间 带权周转时间
\n";forint i0;in;i++
a[i]floatprocess_n[i].time_end.hour-process_n[i].time_in.hour*60+process_n[i].time_end.minute-process_n[i].time_in.minute;b[i]a[i]/process_n[i].use_time;out_a+a[i];out_b+b[i
];printf"%4s\t%4d\t",process_n[i].name,process_n[i].rank;printf" ";ifprocess_n[i].time_in.hour10
printf"0%d",process_n[i].time_in.hour;else
printf"%d",process_n[i].time_in.hour;printf":";ifprocess_n[i].time_in.minute10
printf"0%d\t",process_n[i].time_in.minute;else
printf"%d\t",process_n[i].time_in.minute;//////////////////////////////////////////////////////////////////////////////////////////////////printf"%4d\t",process_n[i].use_time; //////////////////////////////////////////////////////////////////////////////////////////////////ifprocess_n[i].time_start.hour10 printf"0%d",process_n[i].time_start.hour;else printf"%4d",process_n[i].time_start.hour;printf":";ifprocess_n[i].time_start.minute10
printf"0%d\t",process_n[i].time_start.minute;else printf"%d\t",process_n[i].time_start.minute;/////////////////////////////////////////////////printf"
";/////////////////////////////////////////////////ifprocess_n[i].time_end.hour10
printf"0%d",process_n[i].time_end.hour;else
printf"%d",process_n[i].time_end.hour;printf":";ifprocess_n[i].time_end.minute10
printf"0%d\t",process_n[i].time_end.minute;else printf"%d\t",process_n[i].time_end.minute;
//////////////////////////////////////////////////////////////////////////////////////////////printf"%.2f\t",a[i];printf"%.2f\n",b[i];
out_aout_a/n;
out_bout_b/n;
printf"平均周转时间为:%f\n",out_a;
printf"平均带权周转时间为:%f\n",out_b;
/********************************************
* 抢占式优先级调度算法 *
********************************************/
void grade_firstprocess process_n[]
int i;bool flag;//标志位,用于控制当前时间while1
flagtrue;
fori0;in;i++
ifcomparecurrent,process_n[i].time_in&&!process_n[i].flag
flagfalse;
//获取开始运行时间
ifprocess_n[i].time_start.hour0&&process_n[i].time_start.minute0
process_n[i].time_startcurrent;
//记录进程已经运行的时间
process_n[i].used_time++; //时钟继续一分一分走
current.minute++;
ifcurrent.minute60
current.hour+1;
current.minute0;
//运行完成后,记录完成时间
ifprocess_n[i].used_timeprocess_n[i].use_time
process_n[i].flagtrue; process_n[i].time_endcurrent; break;
ifflag
current.minute++;
ifcurrent.minute60
current.hour+1;
current.minute0;
ifsearchprocess_n
break;
else
continue;
/***************************************************** * 最高响应比优先算法 *
*****************************************************/ void HRNprocess process_n[]
float flag_xiangxi[];//记录进程的响应比
//找到最小的时间作为当前基准时间
currentprocess_n[0].time_in;
forint i1;in;i++
ifcomparecurrent,process_n[i].time_in
currentprocess_n[i].time_in;
///////////////////////////////////////
while!searchprocess_n
float temp0;
forint i0;in;i++
ifcomparecurrent,process_n[i].time_start&&process_n[i].
flagfalse
flag_xiangxi[i]floatcurrent.hour-process_n[i].time_in.h
our*60+current.minute-process_n[i].time_in.minute/process_n
[i].use_time; ifflag_xiangxi[i]temp
tempflag_xiangxi[i];
forint j0;jn;j++
ifcomparecurrent,process_n[j].time_start&&process_n[j].
flagfalse&&tempflag_xiangxi[j] process_n[j].time_startcurrent; //.r*60+current.minute+process_n[j].use_time/60;
//.r*60+current.minute+process_n[j].use_time%60;
process_n[j].time_endcurrent; process_n[j].flagtrue;
break;
//主函数
int main
int one_two;
process process_n[];
process process_n_other[]; char time_string[10];
char FLAG_exit;
while1
printf"请输入进程个数:";
scanf"%d",&n;fflushstdin; forint i0;in;i++
printf"请输入第%d个进程的参数:\n",i+1; printf"进程名:";
scanf"%s",process_n[i].name; fflushstdin;
printf"进程等级:";
scanf"%d",&process_n[i].rank;
fflushstdin;
printf"提交时间:";
scanf"%s",&time_string;
fflushstdin;
whilestrlentime_string!5
printf"输入格式不符合要求!请重新输入\n"; printf"提交
时间:"; scanf"%s",&time_string; fflushstdin; int atime_string[0]-48*10+time_string[1]-48; whilea24
printf"输入格式不符合在24小时内的要求!请重新输入\n";
printf"提交时间:"; scanf"%s",&time_string; fflushstdin;
atime_string[0]-48*10+time_string[1]-48; process_n[i].time_in.houra;
atime_string[3]-48*10+time_string[4]-48; whilea60
printf"输入格式不符合在60分钟内的要求!请重新输入\n";
printf"提交时间:";
scanf"%s",&time_string;fflushstdin; atime_string[3]-48*10+time_string[4]-48; process_n[i].time_in.minutea;printf"执行时间:";
scanf"%d",&process_n[i].use_time; fflushstdin;
process_n[i].flagfalse; L1: printf"请你选择你将采用的调度算法:\n"; printf"1--优先级调度\n2--最高响应比优先算法\n"; printf"如果想退出程序请输入其他\n";
scanf"%d",&one_two;fflushstdin; ifone_two1
current.hour0;
current.minute0;
fori0;in;i++
process_n_other[i]process_n[i]; paixvprocess_n_other;
grade_firstprocess_n_other;
printf_lastprocess_n_other; printf"是否退出程序?退出请输入y\n";
scanf"%c",&FLAG_exit;
fflushstdin;
ifFLAG_exit'y'||FLAG_exit'Y' return 0;
else
goto L1;
else ifone_two2
current.hour0;current.minute0; fori0;in;i++
process_n_other[i]process_n[i]; HRNprocess_n_other; printf_lastprocess_n_other; printf"
是否退出程序?退出请输入y\n"; scanf"%c",&FLAG_exit;
fflushstdin; ifFLAG_exit'y'||FLAG_exit'Y'
return 0; else
goto L1;
else
return 0;
return 0;
//磁盘调度
#include
#include
#define 20
int run_number;//记录实际柱面数
int run[]; //记录每道的磁道序列
int run_jilu[];
int daoshu;
bool FLAG_USED[];
int abs_LONGTH[];
int abs_numberint a,int b
ifab
return a-b;
else
return b-a;
int cmpconst void *a,const void *b int x*int *a;
int y*int *b;
return xy?-1:xy?1:0;
//电梯算法,当flagfalse向下走
void SCANint run[],int run_jilu[],int run_begin,bool flag
int jilu,j;bool flag_tfalse;//如果开始位置在序列中就继续
执行,否则加入其中forint i0;irun_number;i++ ifrun_beginrun[i]
break; ifirun_number run_number+1; run[run_number-1]run_begin;//快排序
qsortrun,run_number,sizeofint,cmp;fori0;irun_number;i++
ifrun_beginrun[i]
jilui;
break;
ifflagfalsej0; forijilu;i0;i-- run_jilu[j]run[i];
j++;
ifi0flag_ttrue;
ifflag_ttrue
forijilu+1;irun_number;i++
run_jilu[j]run[i]; j++;
daoshurun_begin-run[0]+run[run_number-1]-run[0];ifflagtrue j0; forijilu;irun_number;i++ run_jilu[j]run[i]; j++;ifi0flag_ttrue;ifflag_ttrueforijilu-1;i0;i-- run_jilu[j]run[i];
j++;daoshurun[run_number-1]-run_begin+run[run_number-1]-run[0];
//
bool end_notbool a[]
forint i0;irun_number;i++
ifa[i]false
return false;
return true;
//最短寻道时间算法
void SSTFint run[],int run_jilu[],int run_begin
int jilu,temp,flag;
flag0;
run_jilu[flag]run_begin;
daoshu0; //如果开始位置在序列中就继续执行,否则加入其中
forint i0;irun_number;i++
ifrun_beginrun[i]
break;
ifirun_number
run_number+1;
run[run_number-1]run_begin; fori0;irun_number;i++ FLAG_USED[i]false;
fori0;irun_number;i++ ifrun_beginrun[i]
jilui;
break;
FLAG_USED[jilu]true; //当没走完时
while!end_notFLAG_USED forint j0;jrun_number;j++ abs_LONGTH[j]abs_numberrun_begin,run[j];
forj0;jrun_number;j++ ifFLAG_USED[j]false
tempabs_LONGTH[j];
break;
fori0;irun_number;i++ iftempabs_LONGTH[i]&&FLAG_USED[i]false
tempabs_LONGTH[i];
fori0;irun_number;i++
iftempabs_LONGTH[i]&&FLAG_USED[i]false run_beginrun[i];
flag++; run_jilu[flag]run_begin; FLAG_USED[i]true;
break;
forflag0;flagrun_number-1;flag++ daoshu+abs_numberrun_jilu[flag+1],run_jilu[flag];
int main
int run_begin,as,at;
bool flag;
printf"请输入柱面数:";
scanf"%d",&run_number;
printf"请输入各道磁道数\n"; forint i0;irun_number;i++
scanf"%d",&run[i];
printf"请输入开始磁道数:";
scanf"%d",&run_begin;
printf"请选择寻道方式1--电梯算法,2--最短寻道";
scanf"%d",&at;
whileat!1&&at!2
printf"请选择寻道方式1--电梯算法,2--最短寻道";
scanf"%d",&at;
ifat1
printf"请输入走向(1--上,2??
下):";scanf"%d",&as;whileas!1&&as!2printf"请输入走向(1--
上,2??下):"; scanf"%d",&as; ifas1 flagtrue; ifas2 flagfalse; SCANrun,run_jilu,run_begin,flag;
ifat2
SSTFrun,run_jilu,run_begin;
printf"走道次序:"; fori0;irun_num