标签:计数器 list 线性表 ret while 移动 选择 default div
测试结果
流程图
代码实现:
#include<stdio.h> #include <math.h> #define INF 999999 typedef struct { int pid;//磁道号 bool time;//计数器 //int *element;//线性表的起始地址 }SeqList; /**********SSTF算法*********/ void SSTF(int n,SeqList *L,int temp){ int i; int k=0; int m=n; double sum=0; int min=INF; printf("---------------------------------\n"); printf("| 下一个磁道号 | 移动的磁道数 |\n"); printf("---------------------------------\n"); while(m){ for(i=0;i<n;i++){ if(abs(temp-L[i].pid)<min&&(L[i].time==true)){ min=abs(temp-L[i].pid); k=i; } } L[k].time=false; sum+=min; printf("|%d\t\t|%d\t\t|\n",L[k].pid,min); temp=L[k].pid; m--; min=INF; } printf("---------------------------------\n"); printf("平均寻道长度为:%0.2lf\n",sum/(double)n); } /**********SCAN算法*********/ void Sort(int *a,int n) { for (int i = 0; i < n; i++) { for (int j = i+1; j < n; j++) { if (a[j] < a[i]){ int temp=a[j];a[j]=a[i];a[i]=temp; } } } } void SCAN(int n,SeqList *L,int temp){ int i; int k1=0,k2=0; double sum=0; int min; int a[100],b[100]; for(i=0;i<n;i++){ if(L[i].pid<temp) a[k1++]=L[i].pid; else b[k2++]=L[i].pid; L[i].time=false; } Sort(a,k1); Sort(b,k2); printf("---------------------------------\n"); printf("| 下一个磁道号 | 移动的磁道数 |\n"); printf("---------------------------------\n"); for(i=0;i<k2;i++){ min=b[i]-temp; temp=b[i]; printf("|%d\t\t|%d\t\t|\n",b[i],min); sum+=min; } for(i=k1-1;i>=0;i--){ min=abs(a[i]-temp); temp=a[i]; printf("|%d\t\t|%d\t\t|\n",a[i],min); sum+=min; } printf("---------------------------------\n"); printf("平均寻道长度为:%0.2lf\n",sum/(double)n); } /**********CSCAN算法*********/ void CSCAN(int n,SeqList *L,int temp){ int i; int k1=0,k2=0; double sum=0; int min; int a[100],b[100]; for(i=0;i<n;i++){ if(L[i].pid<temp) a[k1++]=L[i].pid; else b[k2++]=L[i].pid; L[i].time=false; } Sort(a,k1); Sort(b,k2); printf("---------------------------------\n"); printf("| 下一个磁道号 | 移动的磁道数 |\n"); printf("---------------------------------\n"); for(i=0;i<k2;i++){ min=b[i]-temp; temp=b[i]; printf("|%d\t\t|%d\t\t|\n",b[i],min); sum+=min; } for(i=0;i<k1;i++){ min=abs(a[i]-temp); temp=a[i]; printf("|%d\t\t|%d\t\t|\n",a[i],min); sum+=min; } printf("---------------------------------\n"); printf("平均寻道长度为:%0.2lf\n", sum/(double)n); } int main(){ int k; int i; int temp=100;//当前磁道位置 printf("\n=================="); printf("\n= 1.SSTF算法 =" ); printf("\n= 2.SCAN算法 ="); printf("\n= 3.CSCAN算法 ="); printf("\n= 0.结束程序 ="); printf("\n=================="); do { printf("\n 请选择: \n"); scanf("%d", &k); switch(k) { case 1:{ int n; SeqList L1[100]; printf("请输入磁道请求数:\n"); scanf("%d",&n); printf("请输入磁道请求序列:\n"); for(i=0;i<n;i++){ scanf("%d",&L1[i].pid); L1[i].time=true; } printf("当前磁头所在位置为%d\n",temp); SSTF(n,L1,temp); break; } case 2:{ int n; SeqList L2[100]; printf("请输入磁道请求数:\n"); scanf("%d",&n); printf("请输入磁道请求序列:\n"); for(i=0;i<n;i++){ scanf("%d",&L2[i].pid); L2[i].time=true; } printf("当前磁头所在位置为%d\n",temp); SCAN(n,L2,temp); break; } case 3:{ int n; SeqList L3[100]; printf("请输入磁道请求数:\n"); scanf("%d",&n); printf("请输入磁道请求序列:\n"); for(i=0;i<n;i++){ scanf("%d",&L3[i].pid); L3[i].time=true; } printf("当前磁头所在位置为%d\n",temp); CSCAN(n,L3,temp); break; } default:return 0; } }while(k!=0); return 0; }
标签:计数器 list 线性表 ret while 移动 选择 default div
原文地址:https://www.cnblogs.com/xiaojiansuibi/p/13171520.html