1. 程式人生 > >磁碟排程演算法sstf scan cscan C語言實現

磁碟排程演算法sstf scan cscan C語言實現

//先來先服務因為太簡單就沒寫

#include<stdio.h>

#include<time.h>
#include<stdlib.h>
#include<math.h>
void sstf( int *a,int p,int y );//最短尋道優先
void scan( int *a,int m,int y );//電梯掃描演算法
void cscan(int *a,int m ,int y);//迴圈掃描演算法
void hugee(int *a,int m,int y,int value);
int main()
{
int i,a[200],m,n,isprime,y;
printf("                           請選擇您要執行的磁碟排程演算法\n ");
printf("                         **********************************\n");
printf("                          *                                *\n");
printf("                          *                                *\n");
printf("                          *    最短尋道優先  sstf: 1       *\n");
printf("                          *    電梯掃描演算法  scan:2       *\n");
printf("                          *    迴圈掃描演算法 cscan: 3       *\n");
printf("                          *                                *\n");
printf("                          *                                *\n");
printf("                          **********************************\n");
scanf("%d",&isprime);
    if(isprime==1){
printf("請輸入共有多少磁軌 :\n");
scanf("%d",&y);
printf("請輸入當前磁頭所在的磁軌號 :\n");
scanf("%d",&m);
printf("請輸入最大磁軌號 :\n");
scanf("%d",&n);
srand((int)time(0));
printf("這是隨機產生的磁軌數 :\n");
for(i=0;i<y;i++){
a[i]=rand()%n;
printf("%d ",a[i]);
}
printf("\n");
   sstf(a,m,y);
}
    else if(isprime==2){
   printf("請輸入共有多少磁軌 :\n");
scanf("%d",&y);
printf("請輸入當前磁頭所在的磁軌號 :\n");
scanf("%d",&m);
printf("請輸入最大磁軌號 :\n");
scanf("%d",&n);
srand((int)time(0));
printf("這是隨機產生的磁軌數 :\n");
for(i=0;i<y;i++){
a[i]=rand()%n;
printf("%d ",a[i]);
}
printf("\n");
scan(a,m,y);
}
else if(isprime==3){
printf("請輸入共有多少磁軌 :\n");
scanf("%d",&y);
printf("請輸入當前磁頭所在的磁軌號 :\n");
scanf("%d",&m);
printf("請輸入最大磁軌號 :\n");
scanf("%d",&n);
srand((int)time(0));
printf("這是隨機產生的磁軌數 :\n");
for(i=0;i<y;i++){
a[i]=rand()%n;
printf("%d ",a[i]);
}
printf("\n");
cscan(a,m,y);
}
else{
printf("wrong 退出程式!!!!!!!!!!!!\n");
}
    return 0;
}
void sstf(int a[],int p,int y)
{
    int i,j,tempt,x,sum=0;
    printf("磁頭即將要走的磁軌分別為:\n");
    for(i=0;i<y;i++){
        tempt = abs(a[0]-p);
        x = 0;
        for(j=1;j<y-i;j++){//迴圈查詢距離磁頭最近的磁軌
            if(abs(a[j]-p)<tempt){
                x = j;//記錄下來最近距離所對應的磁軌號的陣列的下標
                tempt = abs(a[j]-p);
            }
        }
        sum+=tempt;
        if(i<y-1){
        printf("%d->",a[x]);
}
else{
printf("%d",a[x]);
}
        p = a[x];
        for(j=0;j<y-x-i;j++){//每到一條磁軌,就要在磁軌中去掉當前所在磁軌號
            a[x+j]=a[x+j+1];
   }
    }
    printf("\n");
    printf("磁頭所經過的磁軌道數和為:%d\n",sum);
    printf("磁頭的平均尋道總數為:%.1lf\n",sum*1.0/y);
}
void scan(int *a,int m,int y)
{
int x;
printf("請選擇初始掃描方向 :\n");
printf("外方向:1\n");
printf("內方向: 2\n");
scanf("%d",&x);
if(x==1){
printf("磁頭要經過的磁軌分別為:\n");
hugee(a,m,y,x);
}
if(x==2){
printf("磁頭要經過的磁軌分別為:\n");
hugee(a,m,y,x);
}
if(x!=1&&x!=2){
printf("輸入錯誤,退出程式!!!!!!\n");
}
}
void cscan(int *a,int m,int y)
{
int f,s;
printf("請選擇當前磁頭的移動方向:\n");
printf("向外 : 1       \n");
printf("向裡 : 2       \n");
scanf("%d",&f);
switch(f)
{
case 1:
printf("磁頭要經過的磁軌分別為:\n");
s=f+2;
hugee(a,m,y,s);  
break;
case 2:
printf("磁頭要經過的磁軌分別為:\n");
s=f+2;
hugee(a,m,y,s);
break;
default :
printf("輸入錯誤,退出程式!!!\n");
}
}
void hugee(int *a,int m,int y,int value)
{
int i=0,j=0,t=0,c[200],d[200],e[200],f[200],q1,q2,q3,q4,isprime,sum=0;//sdt
for(i=0,j=0,t=0;i<y;i++){
if(a[i]>=m){
c[j]=a[i];
j++;
t++;
}
}
q1=t;
for(i=0;i<t-1;i++){
for(j=0;j<t-i-1;j++){
if(c[j]>c[j+1]) {
isprime=c[j];
c[j]=c[j+1];
c[j+1]=isprime;
}
}
}
for(i=0,j=0,t=0;i<y;i++){
if(a[i]<m){
d[j]=a[i];
j++;
t++;
}
}
q2=t;
for(i=0;i<t-1;i++){
for(j=0;j<t-i-1;j++){
if(d[j]<d[j+1]) {
isprime=d[j];
d[j]=d[j+1];
d[j+1]=isprime;
}
}
}
for(i=0,j=0,t=0;i<y;i++){
if(a[i]>=m){
e[j]=a[i];
j++;
t++;
}
}
q3=t;
for(i=0,j=0;i<y;i++){
if(a[i]>=m){
}
}
for(i=0;i<t-1;i++){
for(j=0;j<t-i-1;j++){
if(e[j]<e[j+1]) {
isprime=e[j];
e[j]=e[j+1];
e[j+1]=isprime;
}
}
}
printf("\n");
for(i=0,j=0,t=0;i<y;i++){
if(a[i]<m){
f[j]=a[i];
j++;
t++;
}
}
q4=t;
for(i=0;i<t-1;i++){
for(j=0;j<t-i-1;j++){
if(f[j]>f[j+1]) {
isprime=f[j];
f[j]=f[j+1];
f[j+1]=isprime;
}
}
}
printf("\n");
if(value==1){//sdtjdt
sum=abs(c[0]-m);
printf("%d",m);
for(i=0;i<q1;i++){
if((i+1)<q1){
sum+=abs(c[i+1]-c[i]);
}
printf("->%d",c[i]);
}
sum=sum+abs(d[0]-c[q1-1]);
for(i=0;i<q2;i++){
if((i+1)<q2){
sum+=(abs(d[i+1]-d[i]));
}
printf("->%d",d[i]);
}
printf("\n磁頭所經過的磁軌道數和為:%d\n",sum);
    printf("磁頭的平均尋道總數為:%.1lf\n",sum*1.0/y);
}
if(value==2){//jdtsdt
sum=abs(d[0]-m);
printf("%d",m);
for(i=0;i<q2;i++){
if((i+1)<q2){
sum+=abs(d[i+1]-d[i]);
}
printf("->%d",d[i]);
}
sum=sum+abs(c[0]-d[q2-1]);
for(i=0;i<q1;i++){
if((i+1)<q1){
sum+=(abs(c[i+1]-c[i]));
}
printf("->%d",c[i]);
}
printf("\n磁頭所經過的磁軌道數和為:%d\n",sum);
    printf("磁頭的平均尋道總數為:%.1lf\n",sum*1.0/y);
}
if(value==3){//sdtrejdt
sum=abs(c[0]-m);
printf("%d",m);
for(i=0;i<q1;i++){
if((i+1)<q1){
sum+=abs(c[i+1]-c[i]);
}
printf("->%d",c[i]);
}
for(i=0;i<q4;i++){
if((i+1)<q4){
sum+=(abs(f[i+1]-f[i]));
}
printf("->%d",f[i]);
}
printf("\n磁頭所經過的磁軌道數和為:%d\n",sum);
    printf("磁頭的平均尋道總數為:%.1lf\n",sum*1.0/y);
}
if(value==4){//jdtresdt
sum=abs(d[0]-m);
printf("%d",m);
for(i=0;i<q2;i++){
if((i+1)<q2){
sum+=abs(d[i+1]-d[i]);
}
printf("->%d",d[i]);
}
for(i=0;i<q3;i++){
if((i+1)<q3){
sum+=(abs(e[i+1]-e[i]));
}
printf("->%d",e[i]);
}
printf("\n磁頭所經過的磁軌道數和為:%d\n",sum);
    printf("磁頭的平均尋道總數為:%.1lf\n",sum*1.0/y);
}
}