用c++语言编写FIFO代码

用c++语言编写FIFO代码,第1张

以下是C++语言编写的通讯录源代码!#include<iostream>

using namespace std

#include<stdio.h>

class person

{ public:

char name[10],sex[4],tel[11],add[20],postnum[10],e_mail[20],QQ[11],kind[10]//kind 类别:朋友,同学...

public:

person()

{}

void input()

{ cout<<"请输入 名字,性别,电话,地址,邮政编码 邮箱 QQ 类别"<<endl

cin>>name>>sex>>tel>>add>>postnum>>e_mail>>QQ>>kind}

void save()

{ FILE *out

out=fopen("e:\\person.txt","a")

fprintf(out,"%s %s %s %s %s %s %s %s\n",name,sex,tel,add,postnum,e_mail,QQ,kind)

cout<<"信息已保存至 e:\\person.txt\n"

fclose(out)

}

void output()

{ cout<<name<<" "<<sex<<" "<<tel<<" "<<add<<" "<<postnum<<" "<<e_mail<<" "<<QQ<<" "<<kind<<endl

}

}

void main()

{ person people[30]int i,int num=0,p_num=0//num 输入的people 个数

do

{ cout<<"请输入0-5来选择\n 1 输入 2 查询 3 按姓名排序 4 按姓名,电话进行修改 5按姓名,电话进行删除 0 退出\n"

cin>>i

switch(i)

{ case 0:{}break

case 1://对信息进行 输入和保持至文件

{

people[p_num].input()people[p_num].save()num++p_num++

}break

case 2://查询

{ cout<<" 1 根据姓名查询\n 2 电拍链兆话\n 3 地址\n 4 类别 \n 5 所有\n"

int jcin>>唤梁j

switch(j)

{ case 1://姓名

{ cout<<"请输入您要查询的姓名: \n"

char q_name[20]cin>>q_namebool flag=false

for(int t=0t<numt++)

if(strcmp(people[t].name,q_name)==0)

{cout<<"姓名为:"<<q_name<<"的袭租信息如下:\n"people[t].output()flag=truebreak}

if(flag==false)cout<<"没有找到"<<q_name<<"的信息\n"

}break

case 2://电话

{ cout<<"请输入电话..."<<endl

char q_tel[11]cin>>q_telbool flag=false

for(int t=0t<numt++)

if(strcmp(people[t].tel,q_tel)==0)

{cout<<"电话为:"<<q_tel<<"的信息如下:\n"people[t].output()flag=truebreak}

if(flag==false)cout<<"没有找到"<<q_tel<<"的信息\n"

}break

case 3://地址

{ cout<<"请输入地址..."<<endl

char q_add[20]cin>>q_addbool flag=false

for(int t=0t<numt++)

if(strcmp(people[t].add,q_add)==0)

{cout<<"地址为:"<<q_add<<"的信息如下:\n"people[t].output()flag=true}

if(flag==false)cout<<"没有找到"<<q_add<<"的信息\n"

}break

case 4://类别

{ cout<<"请输入类别..."<<endl

char q_kind[20]cin>>q_kindbool flag=false

for(int t=0t<numt++)

if(strcmp(people[t].kind,q_kind)==0)

{cout<<"类别为:"<<q_kind<<"的信息如下:\n"people[t].output()flag=true}

if(flag==false)cout<<"没有找到"<<q_kind<<"的信息\n"

}break

case 5://所有人

{ cout<<" 所有人的信息如下:\n"

for(int t=0t<numt++)

people[t].output()

}break

default:

cout<<"您的输入有误"<<endlbreak

}}break

case 3://姓名排序

{ person sortint t

for( t=0t<numt++)

{for(int s=t+1s<nums++)//person类里的数据成员不是堆资源所以不用拷贝构造函数<br> if(strcmp(people[t].name,people[s].name)>0)<br> { <br> sort=people[t]people[t]=people[s]people[s]=sort<br> }

}

cout<<"按姓名从小到大排序后......"<<endl

for(int n=0n<numn++)

people[n].output()

}break

case 4://按姓名 电话 修改

{ cout<<" 请输入1-2 1 按姓名修改 2按电话修改\n"

int jcin>>j

switch(j)

{ case 1://姓名修改

{ cout<<"请输入您要修改的人的姓名:\n"

char s_name[20]cin>>s_name

for(int t=0t<numt++)

if(strcmp(people[t].name,s_name)==0)

{ person s_peoplecout<<"\n请依次输入修改后的信息:名字,性别,电话,地址,邮政编码 邮箱 QQ 类别\n"

s_people.input()

people[t]=s_peoplebreak

}

cout<<"修改成功.....\n"

}break

case 2://电话修改

{ cout<<"请输入您要修改的人的电话:\n"

char s_tel[20]cin>>s_tel

for(int t=0t<numt++)

if(strcmp(people[t].tel,s_tel)==0)

{ person s_people_tel

cout<<"\n请依次输入修改后的信息:名字,性别,电话,地址,邮政编码 邮箱 QQ 类别\n"

s_people_tel.input()

people[t]=s_people_telbreak

}

cout<<"修改成功.....\n"

}break

}

}break

case 5://按姓名 电话 删除

{ cout<<" 请输入1-2 1 按姓名删除 2按电话删除\n"

int jcin>>j

switch(j)

{ case 1://姓名删除

{ cout<<"请输入您要删除的人的姓名:\n"

char s_name[20]cin>>s_name

for(int t=0t<numt++)

if(strcmp(people[t].name,s_name)==0)

{ int j=t+1

for(jj<numj++)

{ people[t]=people[j]

t++

}

break

}

num--cout<<s_name<<" 已成功删除....\n"

}break

case 2://电话删除

{ cout<<"请输入您要删除的人的电话:\n"

char s_tel[20]cin>>s_tel

for(int t=0t<numt++)

if(strcmp(people[t].tel,s_tel)==0)

{ int j=t+1

for(jj<numj++)

{ people[t]=people[j]

t++

}

break

}

num--cout<<"删除成功....\n"

}break

}

}break

default:

break

}

}

while(i!=0)

}

interface bag

{

public void add(Object thing)

public Object remove()

}

LIFO的

class LIFOBag implements Bag {

private Object[] stack

private int stackTop = 0

public LIFOBag(int size) {

stack = new Object[size]

}

public void add(Object thing) {

if (stackTop == stack.length - 1) {

throw new RuntimeException("裂带stack overflow!")

} else {

stackTop++

stack[stackTop] = thing

}

}

public Object remove() {

Object o

if (stackTop == 0) {

o = null

} else {

o = stack[stackTop]

stackTop--

}

return o

}

public static void main(String[] args) {

Bag bag = new LIFOBag(50)

for(int i = 0i<50i++) {

bag.add(i)

Object o = bag.remove()

System.out.println(o)

}

}

}

FIFO的

class FIFOBag implements Bag {

private Object[] queue

private int first = 0

private int last = 0

public FIFOBag(int size) {

queue = new Object[size]

}

/* 模拟循塌源悔环队列 */

public void add(Object thing) {

if (first == last + 1 || (first == 0 &&last == queue.length-1)) {

throw new RuntimeException("团正queue overflow!")

} else {

// 向队尾添加

last++

if(last == queue.length) {

last = 0

}

queue[last] = thing

}

}

public Object remove() {

Object o

if (first == last) {

o = null

} else {

o = queue[first]

first++

if(first == queue.length) {

first = 0

}

}

return o

}

}

/*

* Created on 2004-12-25

*

* TODO To change the template for this generated file go to

* Window - Preferences - Java - Code Style - Code Templates

*/

/**

* @Michelangelo

*

* TODO To change the template for this generated type comment go to

* Window - Preferences - Java - Code Style - Code Templates

*/

import java.util.*

public class TestReplacement {

/**

*

*/

private final int ArraySize=20

private int digitalArray[]=new int [ArraySize]

//private int digitalArray[]={1,2,3,4,2,1,5,6,2,1,2,3,7,6,3,2,1,2,3,6}

private static final int frameSize[]={1,2,3,4,5,6,7}

private static int errorCount=0

Vector frame=new Vector()

public TestReplacement() {

super()

// TODO Auto-generated constructor stub

}

public static void main(String[] args) {

TestReplacement aT=new TestReplacement()

aT.generateRandomDigit()

aT.output()

System.out.println("-------------Using FIFO--------------")

System.out.println()

for(int i=0i<frameSize.lengthi++){

System.out.println("Frame size: "+frameSize[i]+"\n")

aT.initFrameForFIFO(frameSize[i])

aT.FIFOReplace(frameSize[i])

System.out.println("Total errors found: "+errorCount)

System.out.println("\n************************************\n")

errorCount=0

}

System.out.println()

System.out.println("----------------Using LRU----------------")

System.out.println()

for(int i=0i<frameSize.lengthi++){

System.out.println("Frame size: "+frameSize[i]+"\n")

aT.initFrameForLRU(frameSize[i])

aT.LRUReplace(frameSize[i])

System.out.println("Total errors found: "并桥液+errorCount)

System.out.println("绝物\n************************************\n")

errorCount=0

}

}

public void generateRandomDigit(){

for(int i=0i<ArraySizei++){

digitalArray[i]=(int)Math.round(Math.random()*9)

}

}

public void output(){

System.out.println("随消芦机序列:")

for(int i=0i<ArraySizei++){

System.out.print(" "+digitalArray[i])

}

System.out.println()

}

public void initFrameForFIFO(int fS){

frame.removeAllElements()

for(int i=0i<fSi++){

frame.addElement(new Couple(fS-i))

}

}

public void initFrameForLRU(int fS){

frame.removeAllElements()

for(int i=0i<fSi++){

frame.addElement(new Couple(0))

}

}

public void LRUReplace(int fS){

boolean findThesame=false

int pre=-1//存放刚刚查找到的位置

int flag=-1

for(int j=0j<digitalArray.lengthj++){

boolean match=false

for(int i=0i<fSi++){

if(((Couple)frame.elementAt(i)).value==digitalArray[j]){

((Couple)frame.elementAt(i)).time=0

match=true//是否找到匹配

System.out.println(j+": find "+((Couple)frame.elementAt(i)).value+" "+"at location "+i)

System.out.println()

flag=i

break

}

}

if(match==true&&flag!=pre){

for(int i=0i<fSi++){

if(i!=flag){

((Couple)frame.elementAt(i)).time--

}

}

pre=flag

}

else if(match==false){

int temp=0

int index=0

for(int i=0i<fSi++){

if(((Couple)frame.elementAt(i)).time<temp){

temp=((Couple)frame.elementAt(i)).time

index=i

}

}

for(int i=0i<fSi++){

if(i!=index){

((Couple)frame.elementAt(i)).time--

}

else{

((Couple)frame.elementAt(i)).time=0

System.out.print(j+": replace "+((Couple)frame.elementAt(i)).value+" ")

System.out.print("at location "+index+" ")

((Couple)frame.elementAt(i)).value=digitalArray[j]

System.out.println("with "+((Couple)frame.elementAt(i)).value)

errorCount++

System.out.println("error count"+errorCount)

System.out.println()

}

}

}

}

}

public void FIFOReplace(int fS){

//boolean blank=true//是否开始的已填充完

int i=0

for(int j=0j<digitalArray.lengthj++){

boolean match=false

for(i=0i<fSi++){

if(((Couple)frame.elementAt(i)).value==digitalArray[j]){

match=true//是否找到匹配

System.out.println(j+": find "+((Couple)frame.elementAt(i)).value+" "+"at location "+i)

break

}

}

if(match==false){

int temp=0

int index=-1

for(i=0i<fSi++){

if(((Couple)frame.elementAt(i)).time>temp){

temp=((Couple)frame.elementAt(i)).time

index=i

}

}

for(i=0i<fSi++){

if(i==index){

System.out.print(j+": replace "+((Couple)frame.elementAt(i)).value+" ")

System.out.print("at location "+i+" ")

((Couple)frame.elementAt(i)).value=digitalArray[j]

System.out.println("with "+((Couple)frame.elementAt(i)).value)

((Couple)frame.elementAt(i)).time=1

errorCount++

System.out.println("error count"+errorCount)

System.out.println()

}

else{

((Couple)frame.elementAt(i)).time++

}

}

}

}

}

}

class Couple{

public int value=-1

public int time=-1

public Couple(int t){

time=t

}

}

算法思想:用Vector来模拟页表,而扔进去的Couple的个数就是表的大小。Couple 中的Time设置衰老时间(FIFO)或未使用周期(LRU),Value为请求序列中digitalArray[]的值。序列长为20由随机函数产生的0-9的整型值。frameSize[]中存放的是页表的大小(也就是对应着扔几个Couple进去啦)

FIFO:初始化时先清空然后放Couple,将他们的Time属性按放的顺序分别置为frameSize,frame-1,frame-2.......1.数值越大放的越早,value通通置-1。接下来的工作就是对value和time的处置。若在vector中的couple的value里找到了value匹配则pass。如果没有找的话就从中time里找最老的,(谁的time最大就最老),找到后把它的value变成相应的请求的页面值,把它的time=1.对于不是最老的呢,就把他们的岁数都加一吧。

LRU:初始化时先清空然后放Couple,将他们的Time属性置-1,value通通置-1。接下来处理请求序列了。若在value里找到对应的页面话就把对应的Time置0。其他的Couple对应的time- -。如果没有找到的话就找一个最近使用的最少的啦(就是对应的time最负的那个),找到以后就把它的Value换成请求的页面值并且把它的time置0.与此同时,其他的time--。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/12425923.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-23
下一篇2023-05-23

发表评论

登录后才能评论

评论列表(0条)

    保存