#include <stdio.h>
#include <string.h>
int max;
int z[N]; //记录需调用页面数
typedef struct
{
int a[N];
int b[N]; //记录Optimal算法中最近需求页面数或记录LRU前面相同页面的位置
int top; // 物理块内页数
}sq;
int get()
{
int i,a=0;
char str[N];
char *p;
printf("请输入页面号引用串:");
getchar();
gets(str);
printf("%s\n",str);
p = strtok(str," ,");
while(p)
{
i=atoi(p)+1;
z[a]=i;
a++;
p=strtok(NULL," ,");
}
return 0;
}
int print(sq list)
{
int i;
for(i=0;i<list.top;i++)
{
printf(" %d ",list.a[i]-1);
}
printf("\n**********\n");
return 0;
}
int Optimal(sq list) //最佳置换算法
{
int i,j,x,y,n,k=0; //记录Optimal算法中最近需求页面数
list.top=0;
for(i=0;z[i]!='\0';i++)
{
for(j=0;j<list.top;j++)//查看物理块内是否有该页
if(list.a[j]==z[i])
break;
if(j>=list.top) //产生缺页
{
if(list.top==max)//物理块满页
{
for(x=0;x<max;x++) //计算已有位置数据
{
for(y=i;z[y]!='\0';y++)
{
if( list.a[x]==z[y])
{
list.b[x]=y;
break;
}
else
list.b[x]=y;
}
}
for(n=0;n<max;n++)
k=0;
for(n=1;n<max;n++) //求出替换位置
{
if(list.b[k]<list.b[n])
{
list.b[k]=list.b[n];
k=n;
}
}
}
list.a[k++]=z[i];
if(list.top<max)
list.top++;
}
printf("%d\t\n",z[i]);
print(list);
}
return 0;
}
int FIFO1(sq list) //FIFO 先进先出算法;
{
int i,j,k=0;
list.top=0;//
for(i=0;z[i]!='\0';i++)
{
for(j=0;j<k;j++) //查看物理块内是否有该页
if(list.a[j]==z[i])
break;
if(j>=k) //产生缺页
{
if(k>=max)//物理块满页
{
k-=max;
}
list.a[k++]=z[i];
if(list.top<max)
list.top++;
}
printf("%d\t\n",z[i]);
print(list);
}
return 0;
}
int FIFO2(sq list) //FIFO 先进先出算法;
{
int i,j,k=0;
list.top=0;
for(i=0;z[i]!='\0';i++)
{
if(k>=max)
k=k-max;
for(j=0;j<max;j++)
if(list.a[j]==z[i])
break;
if(j>k)
{
list.a[k++]=z[i];
if(list.top<max)
list.top++;
}
printf("%d\t\n",z[i]);
print(list);
}
return 0;
}
int LRU(sq list) //LRU最近最久未使用最少使用
{
int i,j,x,y,n,k=0;
list.top=0;
for(i=0;z[i]!='\0';i++)
{
for(j=0;j<list.top;j++)//查看物理块内是否有该页
if(list.a[j]==z[i])
break;
if(j>=list.top) //产生缺页
{
if(list.top==max)
{
for(x=0;x<max;x++) //计算已有位置数据
{
for(y=i;y>=0;y--)
{
if( list.a[x]==z[y])
{
list.b[x]=y;
break;
}
else
list.b[x]=y;
}
}
for(n=0;n<max;n++)
k=0;
for(n=1;n<max;n++) //求出替换位置
{
if(list.b[k]>list.b[n])
{
list.b[k]=list.b[n];
k=n;
}
}
}
list.a[k++]=z[i];
if(list.top<max)
list.top++;
}
printf("%d\t\n",z[i]);
print(list);
}
return 0;
}
int catalog(sq list)//目录
{
int i;
printf("\t**************************\n");
printf("\t* 目录 *\n");
printf("\t* *\n");
printf("\t* 1:Optimal算法; *\n");
printf("\t* 2:FIFO算法; *\n");
printf("\t* 3:LRU算法; *\n");
printf("\t* *\n");
printf("\t**************************\n");
printf("请输入算法序号:");
scanf("%d",&i);
switch(i)
{
case 1:
Optimal(list);
break;
case 2:
FIFO2(list);
break;
case 3:
LRU(list);
break;
default:
printf("输入错误");
}
return 0;
}
int main()
{
char again;
do {
printf("\n请输入一个物理块中页面个数:");
scanf("%d",&max);
sq list;
get();
catalog(list);
printf("Continue...(Y/N): ");
do{
again = getch();
}while(again!='Y' && again!='y' && again!='N' && again!='n');
}while(again=='Y' || again=='y');
return 0;
}
#include <string.h>
#include <stdlib.h>
//页面置换算法
#define N 100int max;
int z[N]; //记录需调用页面数
typedef struct
{
int a[N];
int b[N]; //记录Optimal算法中最近需求页面数或记录LRU前面相同页面的位置
int top; // 物理块内页数
}sq;
int get()
{
int i,a=0;
char str[N];
char *p;
printf("请输入页面号引用串:");
getchar();
gets(str);
printf("%s\n",str);
p = strtok(str," ,");
while(p)
{
i=atoi(p)+1;
z[a]=i;
a++;
p=strtok(NULL," ,");
}
return 0;
}
int print(sq list)
{
int i;
for(i=0;i<list.top;i++)
{
printf(" %d ",list.a[i]-1);
}
printf("\n**********\n");
return 0;
}
int Optimal(sq list) //最佳置换算法
{
int i,j,x,y,n,k=0; //记录Optimal算法中最近需求页面数
list.top=0;
for(i=0;z[i]!='\0';i++)
{
for(j=0;j<list.top;j++)//查看物理块内是否有该页
if(list.a[j]==z[i])
break;
if(j>=list.top) //产生缺页
{
if(list.top==max)//物理块满页
{
for(x=0;x<max;x++) //计算已有位置数据
{
for(y=i;z[y]!='\0';y++)
{
if( list.a[x]==z[y])
{
list.b[x]=y;
break;
}
else
list.b[x]=y;
}
}
for(n=0;n<max;n++)
k=0;
for(n=1;n<max;n++) //求出替换位置
{
if(list.b[k]<list.b[n])
{
list.b[k]=list.b[n];
k=n;
}
}
}
list.a[k++]=z[i];
if(list.top<max)
list.top++;
}
printf("%d\t\n",z[i]);
print(list);
}
return 0;
}
int FIFO1(sq list) //FIFO 先进先出算法;
{
int i,j,k=0;
list.top=0;//
for(i=0;z[i]!='\0';i++)
{
for(j=0;j<k;j++) //查看物理块内是否有该页
if(list.a[j]==z[i])
break;
if(j>=k) //产生缺页
{
if(k>=max)//物理块满页
{
k-=max;
}
list.a[k++]=z[i];
if(list.top<max)
list.top++;
}
printf("%d\t\n",z[i]);
print(list);
}
return 0;
}
int FIFO2(sq list) //FIFO 先进先出算法;
{
int i,j,k=0;
list.top=0;
for(i=0;z[i]!='\0';i++)
{
if(k>=max)
k=k-max;
for(j=0;j<max;j++)
if(list.a[j]==z[i])
break;
if(j>k)
{
list.a[k++]=z[i];
if(list.top<max)
list.top++;
}
printf("%d\t\n",z[i]);
print(list);
}
return 0;
}
int LRU(sq list) //LRU最近最久未使用最少使用
{
int i,j,x,y,n,k=0;
list.top=0;
for(i=0;z[i]!='\0';i++)
{
for(j=0;j<list.top;j++)//查看物理块内是否有该页
if(list.a[j]==z[i])
break;
if(j>=list.top) //产生缺页
{
if(list.top==max)
{
for(x=0;x<max;x++) //计算已有位置数据
{
for(y=i;y>=0;y--)
{
if( list.a[x]==z[y])
{
list.b[x]=y;
break;
}
else
list.b[x]=y;
}
}
for(n=0;n<max;n++)
k=0;
for(n=1;n<max;n++) //求出替换位置
{
if(list.b[k]>list.b[n])
{
list.b[k]=list.b[n];
k=n;
}
}
}
list.a[k++]=z[i];
if(list.top<max)
list.top++;
}
printf("%d\t\n",z[i]);
print(list);
}
return 0;
}
int catalog(sq list)//目录
{
int i;
printf("\t**************************\n");
printf("\t* 目录 *\n");
printf("\t* *\n");
printf("\t* 1:Optimal算法; *\n");
printf("\t* 2:FIFO算法; *\n");
printf("\t* 3:LRU算法; *\n");
printf("\t* *\n");
printf("\t**************************\n");
printf("请输入算法序号:");
scanf("%d",&i);
switch(i)
{
case 1:
Optimal(list);
break;
case 2:
FIFO2(list);
break;
case 3:
LRU(list);
break;
default:
printf("输入错误");
}
return 0;
}
int main()
{
char again;
do {
printf("\n请输入一个物理块中页面个数:");
scanf("%d",&max);
sq list;
get();
catalog(list);
printf("Continue...(Y/N): ");
do{
again = getch();
}while(again!='Y' && again!='y' && again!='N' && again!='n');
}while(again=='Y' || again=='y');
return 0;
}