当前位置:首页 » 编程语言 » 先进先出算法c语言
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

先进先出算法c语言

发布时间: 2022-02-21 03:31:51

A. c语言编写页面置换算法

//熬夜弄出来的,记得加分哦
#include<stdio.h>
void Print(int bc[],int blockCount)
{
for(int i=0;i<blockCount;i++)
{
printf("%d ",bc[i]);
}
printf("\n");
}

bool Travel(int bc[],int blockCount,int x)
{
bool is_found=false;
int i;
for(i=0;i<blockCount;i++)
{
if(bc[i]==x)
{
is_found=true;
break;
}
}
return is_found;
}

void FIFO(int pc[],int bc[],int pageCount,int blockCount)
{
printf("0:FIFO置换算法\n");
int i;
if(pageCount<=blockCount)
{
printf("缺页次数为0\n");
printf("缺页率为0\n");
}
else
{
int noPage=0;
int p=0;
for(i=0;i<pageCount;i++)
{

//printf("引用页:%d\n",pc[i]);
if(!Travel(bc,blockCount,pc[i]))
{
if(i<blockCount)
{
bc[i]=pc[i];
}
else
{
if(p==blockCount)
{
p=0;
}
bc[p]=pc[i];
p++;

}
noPage++;
//printf("物理块情况:\n");
//Print(bc,blockCount);
}
//printf("\n");
}
printf("FIFO缺页次数为:%d\n",noPage);
printf("FIFO缺页率为:%.2f%%\n",(float)noPage/pageCount*100);
}
}

int FoundMaxNum(int a[],int n)
{
int k,j;
k=a[0];
j=0;
for (int i=0;i<n;i++)
{
if(a[i]>=k)
{
k=a[i];
j=i;
}
}
return j;
}

void LRU(int pc[],int bc[],int pageCount,int blockCount)
{
printf("1:LRU置换算法\n");
if(pageCount<=blockCount)
{
printf("缺页次数为0\n");
printf("缺页率为0\n");
}
else
{
int noPage=0;
int i,j,m;
int bc1[100];
for(i=0;i<blockCount;i++)
{
bc1[i]=0;
}
for(i=0;i<pageCount;i++)
{
// printf("引用页:%d\n",pc[i]);
if(!Travel(bc,blockCount,pc[i]))
{
if(i<blockCount)
{
bc[i]=pc[i];
for(int p=0;p<=i;p++)
{
bc1[p]++;
}
}
else
{
for(j=0;j<blockCount;j++)
{
bc1[j]++;
}
int k=FoundMaxNum(bc1,blockCount);
bc[k]=pc[i];
bc1[k]=1;

}
noPage++;
//printf("物理快情况:\n");
//Print(bc,blockCount);
}
else if(Travel(bc,blockCount,pc[i]))
{
if(i<blockCount)
{
for(j=0;j<=i;j++)
{
bc1[j]++;
}
for(m=0;m<=i;m++)
{
if(bc[m]==pc[i])
{
break;
}
}
bc1[m]=1;
bc[m]=pc[i];

}
else
{
for(j=0;j<blockCount;j++)
{
bc1[j]++;
}
for(m=0;m<blockCount;m++)
{
if(bc[m]==pc[i])
{
break;
}
}
bc1[m]=1;
bc[m]=pc[i];
}
}
//printf("\n");
}
printf("LRU缺页次数为:%d\n",noPage);
printf("LRU缺页率为:%.2f%%\n",(float)noPage/pageCount*100);
}
}

void Optiomal(int pc[],int bc[],int pageCount,int blockCount)
{
printf("2:最佳置换算法\n");
if(pageCount<=blockCount)
{
printf("缺页次数为0\n");
printf("缺页率为0\n");
}
else
{
int noPage=0;
int i,j,k;
for(i=0;i<pageCount;i++)
{
// printf("引用页:%d\n",pc[i]);
if(!Travel(bc,blockCount,pc[i]))
{
if(i<blockCount)
{
bc[i]=pc[i];
}
else
{
int max=0;
int blockIndex;;
for(j=0;j<blockCount;j++)
{
for(k=i;k<pageCount;k++)
{
if(bc[j]==pc[k])
{
break;
}
}
if(k>=max)
{
max=k;
blockIndex=j;
}
}
bc[blockIndex]=pc[i];

}
noPage++;
//printf("物理快情况:\n");
//Print(bc,blockCount);
}
//printf("\n");
}
printf("OPT缺页次数为:%d\n",noPage);
printf("OPT缺页率为:%.2f%%\n",(float)noPage/pageCount*100);
}
}

int main()
{
int pageCount,blockCount,i,pc[100];
printf("输入页面数\n");
scanf("%d",&pageCount);
printf("输入页面走向\n");
for(i=0;i<pageCount;i++)
{
scanf("%d",&pc[i]);
}
blockCount=3;//物理块数
int bc1[100];
printf("\n");
FIFO(pc,bc1,pageCount,blockCount);
int bc2[100];
printf("\n");
LRU(pc,bc2,pageCount,blockCount);
int bc3[100];
printf("\n");
Optiomal(pc,bc3,pageCount,blockCount);
return 0;
}

B. 先画出算法流程图,再编程实现:输入一个班n位同学《C语言程序设计》课程的考试成绩

原、创,提、供、知、网、查、重,确、保、质、量。

C. 页面调度先进先出算法(FIFO) C语言描述

7,0,1 //先把三个页面放入主存 0,1,2//缺少页面2,把2放入,页面7出 1,2,0 2,0,3//缺少页面3,放入3,页面1出 2.3.0 3,0,4//缺少页面4,放入4,页面2出 0,4,2//缺少页面2,放入2,页面3出 4,2,3//缺少页面3,放入3,页面0出 2,3,0//缺少页面0,放入0,页面4出 2,0,3 0,3,2 3,2,1//缺少页面1,放入1,页面0出 3,1,2

D. c语言fifo算法后几个数据输出错误

你的算法不对,for里面再嵌套一个for循环实现先进先出

E. c语言算法的四种描述方法的特点

列表:普通的数组形式、链表形式队列:先进先出,删除在队首,添加在队尾栈:后进先出,添加和删除都在栈顶实现线性的数据结构的主要特点是首无前驱,尾无后继,中间的元素有唯一的前驱和后继

F. c语言中优先级队列如何实现优先级相同的元素先进先出

最原始的办法:
1,用链表实现队列
2,队列的添加是从链表尾向前遍历
T* newNode;
T* tmp = (T*)tail;
while (tmp != NULL) {
if (newNode->pri > tmp->pri) {
tmp = tmp->prev;
continue;
}
else if (newNode->pri <= tmp->pri) {
newNode->next = tmp->next;

tmp->next->prev = newNode;
tmp->next = newNode;
newNode->prev = tmp;
}
}
3,取队列时从链表头开始取

G. 高手啊 求救求救啊帮我用c语言编写个先进先出的算法 急需啊

呵,是出圈问题吧

设有n个人围坐一圈并按顺时针方向从1到n编号,从第s个人开始进行1到m的报数,报数到第m个人,此人出圈,再从他的下一个人重新开始1到m的报数,如此进行下去直到所有的人都出圈为止。现要求按出圈次序,每10人一组,给出这n个人的顺序表。编制函数Josegh()实现此功能并调用函数WriteDat()把结果p输出

到文件JOSE.OUT中。

设 n = 100, s = 1,m = 10。

(1) 将1到n个人的序号存入一维数组p中;

(2) 若第i个人报数后出圈,则将p[i]置于数组的倒数第i个位置上,而原来第i+1个至倒数第i个元素依次向前移动一个位置;

(3) 重复第(2)步直至圈中只剩下p[1]为止。

注意:部分源程序存放在文件prog1.c中。

请勿改动主函数main()和输出数据函数WriteDat()的内容。

#include <stdio.h>

#define N 100

#define S 1

#define M 10

int p[100], n, s, m ;

void WriteDat(void) ;

void Josegh(void)

{ int i,j,s1,w;

s1=s;

for(i=1; i<=n; i++)

p[i-1]=i;

for(i=n; i>=2; i--)

{ s1=(s1+m-1)%i;

if(s1==0) s1=i;

w=p[s1-1];

for(j=s1; j<i; j++)

p[j-1]=p[j];

p[i-1]=w;

}

}

void main()

{

m = M ;

n = N ;

s = S ;

Josegh() ;

WriteDat() ;

}

void WriteDat(void)

{

int i ;

FILE *fp ;

fp = fopen("jose.out", "w") ;

for(i = N - 1 ; i >= 0 ; i--) {

printf("%4d ", p[i]) ;

fprintf(fp, "%4d", p[i]) ;

if(i % 10 == 0) {

printf("\n") ;

fprintf(fp, "\n") ;

}

}

fclose(fp) ;

}
回答者:镠金 - 秀才 二级 11-16 00:21

提问者对于答案的评价:
嘿嘿太谢谢了~学习了,努力中

H. 怎么样实现分页管理的缺页调度clock算法C语言代码

这个程序我做过,现在给你!!写了很久的!!

#include<stdafx.h>
#include<stdlib.h>
#include<stdio.h>
#define n 64//实验中假定主存的长度
#define m 4//实验中假定每个作业分得主存块块数
int p[m];//定义页
int head=0;
struct
{
short int lnumber;//页号
short int flag;//表示该页是否在主存,"1"表示在主存,"0"表示不在主存
short int pnumber;//该页所在主存块的块号
short int write;//该页是否被修改过,"1"表示修改过,"0"表示没有修改过
short int dnumber;//该页存放在磁盘上的位置,即磁盘块号
short int times;//被访问的次数,用于LRU算法
}page[n];//定义页表
//各个函数的实现如下:
void computer()
{
int i;
for(i=0;i<n;i++)
{
page[i].lnumber = i;
page[i].flag = 0;
page[i].pnumber = 10000;//用10000表示为空
page[i].write = 0;
page[i].dnumber = i;
page[i].times = 0;
}//初始化页表

for(i=0;i<m;i++)
{
page[i].pnumber = i;
}

for(i=0;i<m;i++)
{
p[i] = i;
page[i].flag = 1;
}//初始化页
}
void showpagelist()
{
int i;
printf("\n页号\t是否在主存中\t块 号\t是否被修改过\t磁盘块号\t访问次数\n");
for(i=0;i<n;i++)
{
printf("%d\t%d\t\t%d\t\t%d\t\t%d\t\t%d\n",page[i].lnumber,page[i].flag,page[i].pnumber,page[i].write,page[i].dnumber,page[i].times);
}
}
void showpage()
{
int i;
for(i=0;i<m;i++)
{
printf("\t%d\n",p[i]);
}
}
void transformation() //缺页中断处理
{
unsigned logicAddress,logicNumber,innerAddress,physicsAddress,physicsNumber;
int i, fail = 0;
int method,temppage=0;
short int times = 10000;
printf("请输入一个逻辑地址(四位十六进制数):");
scanf("%x",&logicAddress);//读入逻辑地址
logicNumber = logicAddress >> 10;//得到页号
printf("页号为:%ld\n",logicNumber);
innerAddress = logicAddress & 0x03ff;//得到页内地址
printf("页内地址为:%ld\n",innerAddress);
for(i=0;i<n;i++)
{
if(logicNumber==(unsigned)page[i].lnumber)
{
if(page[i].flag == 1)
{
printf("请求的页面在主存中!\n");
page[i].times++;
physicsNumber = page[i].pnumber;//由页号得到块号
printf("请求的主存块号为:%ld\n",physicsNumber);
physicsAddress = physicsNumber << 10 |innerAddress;//得到物理地址
printf("请求的物理地址为:%ld",physicsAddress);//输出物理地址
break;
}
else
{
printf("请求的页面不在主存中! 将进行缺页中断处理!\n请选择算法!\n");
printf("1.先进先出\n2.最近最少用\n请选择置换算法:");
scanf("%d",&method);
if(method == 1) //采用先进先出算法
{
printf("采用先进先出算法!\n");
fail = p[head];
printf("第%d页将被替换!\n",fail);
p[head] = logicNumber;
head = (head+1) % m;
if(page[fail].write == 1)
printf("第%d页曾被修改过!\n",fail);
page[fail].flag = 0;
page[logicNumber].flag = 1;
page[logicNumber].write = 0;
page[logicNumber].pnumber = page[fail].pnumber;
page[fail].pnumber = 10000;
page[logicNumber].times++;
break;
}
else if(method == 2) //采用最近最少用算法
{
printf("采用最近最少用算法!\n");
for(i=0;i<n;i++)
{
if(page[i].flag == 1)
{
if(page[i].times<times)
{
times = page[i].times;
temppage = page[i].lnumber;
}
}
}
printf("第%d页将被替换!\n",temppage);
for(i=0;i<m;i++)
{
if(p[i] == temppage)
{
p[i] = logicNumber;
}
}
if(page[temppage].write == 1)
printf("第%d页曾被修改过!\n",temppage);
page[temppage].flag = 0;
page[logicNumber].flag = 1;
page[logicNumber].write = 0;
page[logicNumber].pnumber = page[temppage].pnumber;
page[temppage].pnumber = 10000;
page[logicNumber].times++;
break;
}
else
{
printf("你输入有误,即将退出!");
exit(1);
}
}
}
}
}
void main()
{
char c,d,flag='y';
printf("页表正在初始化中...,3秒钟后为你显示页和页表!\n");
computer();
showpage();
showpagelist();
while(flag == 'y' || flag == 'Y')
{
transformation();
printf("是否显示页和页表?(Y/N)");
c = getchar();
c = getchar();
if(c=='Y'||c=='y')
{
showpage();
showpagelist();
}
else
{
while(c=='N'||c=='n')
{
printf("\n是否继续进行请求分页?(Y/N)");
d = getchar();
d = getchar();
if(d=='Y'||d=='y')
{
transformation();
printf("\n是否显示页和页表?(Y/N)");
c = getchar();
c = getchar();
if(c=='Y'||c=='y')
{
showpage();
showpagelist();
}
}
else if (d=='N'||d=='n')
exit(1);
else
printf("输入错误!\n");
}
}
printf("\n是否继续进行请求分页?(Y/N)");
flag = getchar();
flag = getchar();

}
}