#include<iostream.h>
#include<conio.h>
void main() {
//Getting Framesize and Page count
int fs, n;
cout << "\n Enter Framesize:";
cin >> fs;
cout << "\n Enter No of pages:";
cin >> n;
int d = fs + 2;
int cf[50][50];
int i, j, k, l, p, q, tc, z, w;
int temp[50];
//Getting pages
cout << "\n Enter Pages";
for (i = 0; i < n; i++) {
cin >> cf[i][0];
}
//Initilizing all frames to -1
for (i = 0; i < n; i++) {
for (j = 2; j < d; j++) {
cf[i][j] = -1;
}
}
w = -1;
//FIFO Algorithm
for (i = 0; i < n; i++) {
//Copy old page frame from 2nd iteration
if (i != 0) {
for (j = 2; j < d; j++) {
cf[i][j] = cf[i - 1][j];
}
}
//Considering page is not presesnt
p = 0;
//Checking if page is already present or not
for (j = 2; j < d; j++) {
if (cf[i][j] == cf[i][0])
p = 1; //page found
}
//If page found then count it as hit
if (p == 1) {
cf[i][1] = 1;
}
//Else use FIFO to replace the page
else {
//Check for blank location
z = 0;
for (l = 2; l < d; l++) {
if ((cf[i][l] == -1) && (z == 0)) {
cf[i][l] = cf[i][0];
z = 1;
}
}
cf[i][1] = 0; //Counting it as miss
//If blank loction not found
if (z == 0) {
tc = 0;
//initilize temp array by -1
for (l = 0; l < 50; l++) {
temp[l] = -1;
}
//copy page sequence to temp
for (k = 0; k <= i; k++) {
if (cf[k][1] == 0) {
temp[tc] = cf[k][0];
//cout<<"\nAdded in temp:"<<temp[tc];
tc++;
}
}
z = 0;
//check which page is added first by comparing temp with frame
w = w + 1;
for (l = w; l < 50; l++) {
for (k = 2; k < d; k++) {
if ((temp[l] == cf[i][k]) && (z != 1)) {
z = 1;
//cout<<"\n"<<l;
q = temp[l];
}
}
}
//replace page
z = 0;
for (l = 2; l < d; l++) {
if ((cf[i][l] == q) && (z == 0)) {
cf[i][l] = cf[i][0];
z = 1;
}
}
}
}
}
int hc = 0;
int mc = 0;
cout << " \n Answer";
cout << "\nPage\tHM\n";
for (i = 0; i < n; i++) {
for (j = 0; j < d; j++) {
cout << cf[i][j];
cout << "\t";
}
if (cf[i][1] == 0)
mc++;
if (cf[i][1] == 1)
hc++;
cout << "\n";
}
cout << "\n Hits:" << hc;
cout << "\n Miss:" << mc;
getch();
}