首页 > 编程语言 >页面置换算法的c语言实现

页面置换算法的c语言实现

时间:2023-05-22 13:11:06浏览次数:60  
标签:int res 置换 flag break 算法 printf 100 页面

#include<bits/stdc++.h>
using namespace std;
int n;//物理块号数
int len,op;//进程数
int a[100];//存储进程执行的先后顺序;
int res[100][100];//存放进程执行的结果数组
int optfind[100],optflag[100];
int lruflag[1000];
int nru_value[100],nru_r[100],nru_m[100];
void print(){
printf("运行结果图示为:\n");
for(int i=1;i<=len;i++) printf("%2d",a[i]);
printf("\n");
for(int j=1;j<=n;j++){
for(int i=1;i<=len;i++){
printf("%2d",res[i][j]);
}
printf("\n");
}
}
void fifo()
{
for(int i=1;i<=len;i++)
{
if(i!=1){
int temp=res[i-1][n];
for(int j=2;j<=n;j++){
if(res[i-1][j-1]!=-1) res[i][j]=res[i-1][j-1];
}
if(temp!=-1) res[i][1]=temp;
}else{
res[1][1]=a[1];continue;
}
int flag=0;
for(int j=1;j<=n;j++){
if(res[i][j]==a[i]) flag=j;
}
if(flag!=0){
int temp=res[i][flag];
for(int j=2;j<=flag;j++){
res[i][j]=res[i][j-1];
}
res[i][1]=temp;
}else{
for(int j=2;j<=n;j++){
if(res[i-1][j-1]!=-1) res[i][j]=res[i-1][j-1];
}
res[i][1]=a[i];
}
}
print();
}

void opt(){
for(int i=1;i<=len;i++)
{
if(i<=3){
for(int j=1;j<=i;j++){
if(j==i) res[i][j]=a[i];
else res[i][j]=res[i-1][j];
}
continue;
}
for(int j=1;j<=n;j++) res[i][j]=res[i-1][j];

int flag=0;
for(int j=1;j<=n;j++){
if(res[i][j]==a[i]) flag=1;
}
if(flag==1) continue;
for(int j=1;j<=n;j++){
optfind[j]=999;//初始化opt的寻找数组
optflag[j]=0;
}
for(int j=1;j<=n;j++){
for(int k=i;k<=len;k++){
if(res[i-1][j]==a[k]){
optfind[j]=k;
optflag[j]=1;
}
if(optflag[j]==1) break;
}
}
int minnum=optfind[1],minflag=1;
for(int j=2;j<=n;j++){
minnum=min(minnum,optfind[j]);
minflag=j;
}
res[i][minflag]=a[i];
}
print();
}
void nru(){//最久未使用,同lru
for(int i=1;i<=len;i++)
{
if(i<=3){
for(int j=1;j<=i;j++){
if(j==i) res[i][j]=a[i];
else res[i][j]=res[i-1][j];
}
continue;
}
for(int j=1;j<=n;j++) res[i][j]=res[i-1][j];
int flag=0;
for(int j=1;j<=n;j++){
if(res[i][j]==a[i]) flag=1;
}
if(flag==1) continue;
int cnt=0,wantnum;
for(int j=0;j<=100;j++) lruflag[j]=0;
for(int k=i-1;k>=1;k--){
if(lruflag[a[k]]==0){
cnt++;
lruflag[a[k]]=1;
}
if(cnt==n){
wantnum=a[k];break;
}
}
for(int j=1;j<=n;j++){
if(res[i][j]==wantnum){
res[i][j]=a[i];break;
}
}
}
print();
}
void lru(){
for(int i=1;i<=len;i++)
{
if(i<=3){
for(int j=1;j<=i;j++){
if(j==i) res[i][j]=a[i];
else res[i][j]=res[i-1][j];
}
continue;
}
for(int j=1;j<=n;j++) res[i][j]=res[i-1][j];
int flag=0;
for(int j=1;j<=n;j++){
if(res[i][j]==a[i]) flag=1;
}
if(flag==1) continue;
int cnt=0,wantnum;
for(int j=0;j<=100;j++) lruflag[j]=0;
for(int k=i-1;k>=1;k--){
if(lruflag[a[k]]==0){
cnt++;
lruflag[a[k]]=1;
}
if(cnt==n){
wantnum=a[k];break;
}
}
for(int j=1;j<=n;j++){
if(res[i][j]==wantnum){
res[i][j]=a[i];break;
}
}
}
print();
}
int main()
{
// 7 0 1 2 0 3 0 4 2 3 0 3 2 1 2 0 1 7 0 1
printf("请输入物理块号数n:");
scanf("%d",&n);
printf("请输入进程的数量len:");
scanf("%d",&len);
for(int i=0;i<=len;i++)
for(int j=0;j<=n;j++) res[i][j]=-1;
printf("请输入个数字代表即将分配的进程顺序:\n");
for(int i=1;i<=len;i++) scanf("%d",&a[i]);
printf("请选择采用什么页面置换算法:\n1.OPT\n2.NRU\n3.FIFO\n4.LRU\n");
scanf("%d",&op);
switch(op){
case 1:{
opt();
break;
}
case 2:{
nru();
break;
}
case 3:{
fifo();
break;
}
case 4:{
lru();
break;
}
default:printf("输入错误不合规范!\n");
}
}

标签:int,res,置换,flag,break,算法,printf,100,页面
From: https://www.cnblogs.com/xiaolou296512/p/17420351.html

相关文章

  • 代码随想录算法训练营第十三天|239. 滑动窗口最大值、347. 前 K 个高频元素
    【参考链接】239.滑动窗口最大值【注意】 1.使用单调队列的经典题目。2.大顶堆每次只能弹出最大值,无法移除其他数值,造成大顶堆维护的不是滑动窗口里面的数值了。所以不能用大顶堆。3.需要一个队列,放进去窗口里的元素,然后随着窗口的移动,队列也一进一出,每次移动之后,队列告诉......
  • 【React工作记录五十八】函数方式渲染页面
     前言我是歌谣我有个兄弟巅峰的时候排名c站总榜19叫前端小歌谣曾经我花了三年的时间创作了他现在我要用五年的时间超越他今天又是接近兄弟的一天人生难免坎坷大不了从头再来歌谣的意志是永恒的放弃很容易但是坚持一定很酷导语项目中添加按钮的两种方式编辑核心实现代码......
  • 【算法题】二维数组打印
    链接:https://www.nowcoder.com/questionTerminal/6fadc1dac83a443c9434f350a5803b51有一个二维数组(n*n),写程序实现从右上角到左下角沿主对角线方向打印。(注:主对角线方向为从左上角指向右下角这一斜线的方向)给定一个二位数组arr及题目中的参数n,请返回结果数组。 数......
  • 【算法题】骆驼命名法
    题目链接:https://www.nowcoder.com/questionTerminal/aed1c7bbc2604e7c9661a2348b0541b8?answerType=1&f=discussion从C/C++转到Java的程序员,一开始最不习惯的就是变量命名方式的改变。C语言风格使用下划线分隔多个单词,例如“hello_world”;而Java则采用一种叫骆驼命名法的规则:除......
  • 《数据结构与算法》之数据的顺存储
    导言:数据结构中,对一些数据序列我们使用的是顺序的方式存储,比较常见的有数组,链表,这些都是最基本的顺序存储的结构,我们会用几个简单的例子来描述顺序存储的方式和演变我们知道顺序存储中有链表,有链表我们就必须知道指针,所以我们先复习一下指针,再来看顺序存储一.指针在C语言中,我......
  • 算法学习记录(模拟枚举贪心题单):[NOIP2007]字符串的展开(未AC,明天找bug)
    题目链接https://ac.nowcoder.com/acm/contest/20960/1001解题思路很简单的模拟题,以后写模拟要先分两大类,元素在某个集合中存不存在的问题,再细分。未AC代码#include<iostream>#include<string>usingnamespacestd;//碰到'-'的展开条件:// 1.减号两侧同为小写字母......
  • 取名算法之用JAVA实现姓名测试
    一文中我谈到了名字的重要性。 作为易学高手的我(大师♂罗莊)对告诉各位码农如何制作取名系统 负有不可推卸的责任。 本次课程没有什么难度,就是根据名字笔画来计算天地人三才格 笔画的五行算法已经在上一讲说过,就是去十位数,个位来判断五行 取名算法之用JAVA实现汉字五......
  • 高精度算法
    先来看一下每个数据类型可表示的数据范围当我们要表示的数很长时,无法用数据类型表示,可以用数组存储单精度:能用一个内置类型存储的整数高精度:不能用内置类型存储的大整数,通常用数组存储每一个数位建议使用小端存储(个位放在最前面)(原因:大端存储虽然看似更直观,但是当处理进位时就会遇到......
  • #球钟算法题解以及代码完成
    球钟问题描述:球钟是一个利用球的移动来记录时间的简单装置。它有三个可以容纳若干个球的指示器:分钟指示器,五分钟指示器,小时指示器。若分钟指示器中有2个球,5分钟指示器中有6个球,小时指示器中有5个球,则时间为5:32。       工作原理:每过一分钟,球钟就会从球队列的队首......
  • 【计算机视觉1】----- 图像增强算法(对比度增强、直方图均衡化)
    直方图均衡化直方图修正(HistogramEqualization)是一种常见的图像增强技术,它通过重新分布图像像素的灰度值来增强图像的对比度和亮度。直方图修正的基本思想是将图像的灰度值范围映射到一个更广泛的范围,从而使图像的灰度级分布更加均匀。注意,在运行代码之前,请确保已安装并配置了Ope......