You are on page 1of 9

#include <stdio.

h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>

#define MAX_TAREAS 5
#define MAX_LINEAS 600
#define LINEAS_PAG 100

struct Memoria
{
int marco;
int loc;
int edo;
struct Memoria *nxt;
};

struct Marco
{
int id;
int loc;
struct Marco *nxt;
};

struct Tarea
{
int id;
int lineas;
int locPMT;
struct Marco *marco;
struct Tarea *nxt;
};

int totalMarcos = 0;

struct Memoria mapaMemoria = {0,0, 1, NULL };

struct Tarea tablaTarea = { 1,0, 0, NULL};

void crearMapaMemoria();
void crearTablaTarea();
void asignarMemoria();
void imprimirMapaMemoria();
void imprimirTablaTarea();
void imprimirMarcos();

int main()
{
crearMapaMemoria();
crearTablaTarea();

imprimirMapaMemoria();
imprimirTablaTarea();

asignarMemoria();

imprimirMapaMemoria();
imprimirMarcos();
getch();

return 0;
}

void crearMapaMemoria()
{
int tamMem = 0,TAM_MARCO=0,Particion=0;

printf("Capacidad de memoria (KB): ");


scanf("%i", &tamMem);

printf("Defina la particion del marco en: [1]Bytes [2]KB: ");


scanf("%d",&Particion);

if(Particion==1)
{
TAM_MARCO=512;
totalMarcos = (tamMem * 1024) / TAM_MARCO;
}

if(Particion==2)
{
printf("Defina el tamaño del marco: ");
scanf("%d",&TAM_MARCO);
totalMarcos = tamMem/TAM_MARCO;
}

struct Memoria *memRef = &mapaMemoria;

for (int i = 1; i < totalMarcos; i++) {


memRef->nxt = new(Memoria);

memRef->nxt->marco = i;
memRef->nxt->loc = i * TAM_MARCO;
memRef->nxt->edo = i > 1 ? 0 : 1;
memRef->nxt->nxt = NULL;

memRef = memRef->nxt;
}
}

void crearTablaTarea()
{
srand(time(NULL));

if (tablaTarea.lineas == 0) {
tablaTarea.lineas = (rand() % MAX_LINEAS) + 1;
}

struct Tarea *tareaRef = &tablaTarea;

for (int i = 2; i <= MAX_TAREAS; i++) {


tareaRef->nxt = new(Tarea);

tareaRef->nxt->id = i;
tareaRef->nxt->lineas = (rand() % MAX_LINEAS) + 1;
tareaRef->nxt->locPMT = i;
tareaRef->nxt->marco = NULL;
tareaRef->nxt->nxt = NULL;

tareaRef = tareaRef->nxt;
}

tareaRef = &tablaTarea;

do {
int totalLineas = tareaRef->lineas;
int totalMarcos = int(totalLineas / LINEAS_PAG);

if (totalLineas % LINEAS_PAG > 0) {


totalMarcos++;
}

tareaRef->marco = new(Marco);

tareaRef->marco->id = 0;
tareaRef->marco->loc = 0;
tareaRef->marco->nxt = NULL;

struct Marco *marcoRef = tareaRef->marco;

for (int j = 1; j < totalMarcos; j++) {


marcoRef->nxt = new(Marco);

marcoRef->nxt->id = j;
marcoRef->nxt->loc = 0;
marcoRef->nxt->nxt = NULL;

marcoRef = marcoRef->nxt;
}

tareaRef = tareaRef->nxt;
} while (tareaRef != NULL);
}

void asignarMemoria()
{
struct Tarea *tareaRef = &tablaTarea;
struct Memoria *memoriaRef = mapaMemoria.nxt->nxt;

int marcoDisponible = totalMarcos - 2;

while (tareaRef != NULL) {


int conteoMarcos = 0;
struct Marco *marcoRef = tareaRef->marco;

while (marcoRef != NULL) {


conteoMarcos++;
marcoRef = marcoRef->nxt;
}

if (conteoMarcos <= marcoDisponible) {


marcoRef = tareaRef->marco;

while (marcoRef != NULL) {


marcoRef->loc = memoriaRef->loc;
memoriaRef->edo = 1;

marcoRef = marcoRef->nxt;
memoriaRef = memoriaRef->nxt;
}
marcoDisponible -= conteoMarcos;
}

tareaRef = tareaRef->nxt;
}
}

void imprimirMapaMemoria()
{
char *titulos[] = {
"NO. MARCO",
"LOC. MARCO",
"EDO"
};
int titulosTam = sizeof titulos / sizeof titulos[0];

struct Memoria *memoriaRef = &mapaMemoria;

printf("\nMAPA DE MEMORIA: \n\n");

printf("%c", 218);

for (int i = 0; i < titulosTam; i++) {


int tamCelda = 0;

if (strlen(titulos[i]) <= 5) {
tamCelda = 5;
} else {
tamCelda = strlen(titulos[i]);
}

for (int j = 0; j < tamCelda; j++) printf("%c", 196);

if (i < titulosTam - 1) {
printf("%c", 194);
} else {
printf("%c", 191);
}
}

printf("\n");

printf("%c", 179);
for (int i = 0; i < titulosTam; i++) printf("%*s%c", 5, titulos[i], 179);
printf("\n");

printf("%c", 195);

for (int i = 0; i < titulosTam; i++) {


int tamCelda = 0;

if (strlen(titulos[i]) <= 5) {
tamCelda = 5;
} else {
tamCelda = strlen(titulos[i]);
}

for (int j = 0; j < tamCelda; j++) printf("%c", 196);

if (i < titulosTam - 1) {
printf("%c", 197);
} else {
printf("%c", 180);
}
}

printf("\n");

do {
printf("%c", 179);

printf("%*i%c", 9, memoriaRef->marco, 179);


printf("%*i%c", 10, memoriaRef->loc, 179);
printf("%*i%c", 5, memoriaRef->edo, 179);

printf("\n");

memoriaRef = memoriaRef->nxt;

if (memoriaRef != NULL) {
printf("%c", 195);

for (int i = 0; i < titulosTam; i++) {


int tamCelda = 0;

if (strlen(titulos[i]) <= 5) {
tamCelda = 5;
} else {
tamCelda = strlen(titulos[i]);
}

for (int j = 0; j < tamCelda; j++) printf("%c", 196);

if (i < titulosTam - 1) {
printf("%c", 197);
} else {
printf("%c", 180);
}
}
} else {
printf("%c", 192);

for (int i = 0; i < titulosTam; i++) {


int tamCelda = 0;

if (strlen(titulos[i]) <= 5) {
tamCelda = 5;
} else {
tamCelda = strlen(titulos[i]);
}

for (int j = 0; j < tamCelda; j++) printf("%c", 196);


if (i < titulosTam - 1) {
printf("%c", 193);
} else {
printf("%c", 217);
}
}
}

printf("\n");

} while (memoriaRef != NULL);


}

void imprimirTablaTarea()
{
char *titulos[] = {
"TAREA",
"NO. LINEAS",
"LOC. PMT"
};
int titulosTam = sizeof titulos / sizeof titulos[0];

struct Tarea *tareaRef = &tablaTarea;

printf("\nTABLA DE TAREAS: \n\n");

printf("%c", 218);

for (int i = 0; i < titulosTam; i++) {


for (int j = 0; j < strlen(titulos[i]); j++) printf("%c", 196);

if (i < titulosTam - 1) {
printf("%c", 194);
} else {
printf("%c", 191);
}
}

printf("\n");

printf("%c", 179);
for (int i = 0; i < titulosTam; i++) printf("%*s%c", 5, titulos[i], 179);
printf("\n");

printf("%c", 195);

for (int i = 0; i < titulosTam; i++) {


for (int j = 0; j < strlen(titulos[i]); j++) printf("%c", 196);

if (i < titulosTam - 1) {
printf("%c", 197);
} else {
printf("%c", 180);
}
}

printf("\n");
do {
printf("%c", 179);

printf("%*i%c", 5, tareaRef->id, 179);


printf("%*i%c", 10, tareaRef->lineas, 179);
printf(" %0*iB%c", 5, tareaRef->locPMT, 179);

printf("\n");

tareaRef = tareaRef->nxt;

if (tareaRef != NULL) {
printf("%c", 195);

for (int i = 0; i < titulosTam; i++) {


for (int j = 0; j < strlen(titulos[i]); j++) printf("%c", 196);

if (i < titulosTam - 1) {
printf("%c", 197);
} else {
printf("%c", 180);
}
}
} else {
printf("%c", 192);

for (int i = 0; i < titulosTam; i++) {


for (int j = 0; j < strlen(titulos[i]); j++) printf("%c", 196);

if (i < titulosTam - 1) {
printf("%c", 193);
} else {
printf("%c", 217);
}
}
}

printf("\n");

} while (tareaRef != NULL);


}

void imprimirMarcos()
{
char *titulos[] = {
"PAGINA",
"MARCO"
};
int titulosTam = sizeof titulos / sizeof titulos[0];
struct Tarea *tareaRef = &tablaTarea;

printf("\nTABLA DE MARCOS: \n");

while (tareaRef != NULL) {


struct Marco *marcoRef = tareaRef->marco;

printf("\nJ%i\n\n", tareaRef->id);

printf("%c", 218);
for (int i = 0; i < titulosTam; i++) {
for (int j = 0; j < strlen(titulos[i]); j++) printf("%c", 196);

if (i < titulosTam - 1) {
printf("%c", 194);
} else {
printf("%c", 191);
}
}

printf("\n");

printf("%c", 179);
for (int i = 0; i < titulosTam; i++) printf("%*s%c", 5, titulos[i], 179);
printf("\n");

printf("%c", 195);

for (int i = 0; i < titulosTam; i++) {


for (int j = 0; j < strlen(titulos[i]); j++) printf("%c", 196);

if (i < titulosTam - 1) {
printf("%c", 197);
} else {
printf("%c", 180);
}
}

printf("\n");

while (marcoRef != NULL) {


printf("%c", 179);

printf("%*i%c", 6, marcoRef->id, 179);


printf("%*i%c", 5, marcoRef->loc, 179);

printf("\n");

marcoRef = marcoRef->nxt;

if (marcoRef != NULL) {
printf("%c", 195);

for (int i = 0; i < titulosTam; i++) {


for (int j = 0; j < strlen(titulos[i]); j++) printf("%c",
196);

if (i < titulosTam - 1) {
printf("%c", 197);
} else {
printf("%c", 180);
}
}
} else {
printf("%c", 192);

for (int i = 0; i < titulosTam; i++) {


for (int j = 0; j < strlen(titulos[i]); j++) printf("%c",
196);

if (i < titulosTam - 1) {
printf("%c", 193);
} else {
printf("%c", 217);
}
}
}

printf("\n");
}

printf("\n");

tareaRef = tareaRef->nxt;
}
}

You might also like