📄 新建 文本文档 (4).txt
字号:
#include "string.h"
#include "stdio.h"
//#include
const int PAGES=256; //定义总块数
const int WORD=16; //定义存储单元的位数
const int ROW=PAGES/WORD; //定义总字数
typedef struct node{
char jobname[20];
int num;
int nums[PAGES];
struct node *next;
}jobs;
int table[ROW][WORD];
int freenum=0;
jobs *head;
//初始化函数
void initial()
{
int i,j;
jobs *p;
for(i=0;i<=ROW;i++) //初始化位示图
for(j=0;j<=WORD;j++)
{
table[i][j]=0;
freenum++;
}
p=new jobs; //初始化作业表头
strcpy(p->jobname,"jhead");
p->num=0;
p->next=NULL;
head=p;
}
//读入位示图初始数据
void readData()
{
int i,j;
FILE *fp;
char fname[20];
printf("请输入初始位示图数据文件名:");
scanf("%s",fname);
if((fp=fopen(fname, "r"))==NULL)
printf( "文件不能打开!\n" );
else
{
for(i=0;i<ROW;i++)
{
for(j=0;j<WORD;j++)
{
fscanf(fp,"%d",&table[i][j]);
// fread(&table[i],2,WORD,fp);
// for(j=0;j<WORD;i++)
// {
// printf("%d",table[i][j]);
if(table[i][j]==0) freenum++;
}
}
/*for(i=0;i<ROW;i++)
{
for(j=0;j<WORD;j++)
{
printf("%d ",table[i][j]);
}
}*/
}
}
//新加入作业函数
void addjob()
{
char name[20];
jobs *p;
int a,i,j,k=0;
printf("请输入新增的作业名:");
scanf("%s",name);
printf("新增作业所需内存块数:");
scanf("%d",&a);
if(a<=freenum)
{
p=new jobs;
strcpy(p->jobname,name);
p->num=a;
//j=0;
for(i=0;k<a&&i<ROW;i++)
{
for(j=0;k<a&&j<WORD;j++)
{
// while(table[i][j]==1)
//{
// j++;
// if(table[i][j]==1) i++;
// }
if(table[i][j]==0)
{
p->nums[k]=i * WORD + j;
k++;
table[i][j]=1;
}
}
}
p->next=head->next;
head->next=p;
freenum-=a;
printf("作业分配成功!\n");
}
else printf("错误,当前剩余的物理块数小于所需的页数,请稍候再试!");
}
//完成作业回收函数
void finish()
{
char name[20];
jobs *p,*q;
int n,i,j,a,k;
printf("请输入完成的作业名:");
scanf("%s",name);
p=head->next;
q=head;
while(p!=NULL)
{
if(strcmp(p->jobname,name)==0)
{
// q=q->next;
break;
}
q=p;
p=p->next;
}
//p=q->next;
a=p->num;
for(k=0;k<a;k++)
{
n=p->nums[k];
i=n/WORD;
j=n%WORD;
table[i][j]=0;
printf("该作业所占用的%d号物理块已回收成功!\n",n);
}
freenum+=a;
q->next=p->next;
delete p;
printf("回收完毕!\n");
}
//显示当前位示图函数
void view_table()
{
int i,j;
printf("当前位示图如下:\n");
printf("━━━━━━━━━━━━━━━━━━━━━━━━━━\n");
for(i=0;i<ROW;i++)
{
for(j=0;j<WORD;j++)
printf("%d ",table[i][j]);
printf("\n");
}
printf("━━━━━━━━━━━━━━━━━━━━━━━━━━━\n");
}
//显示所有页表函数
void view_pages()
{
jobs *p;
int i;
p=head->next;
if(p==NULL) printf("当前没有用户作业");
else
printf("当前所有的用户作业页表情况如下:\n");
while(p!=NULL)
{
printf("作业名:%s ,所用块数:%d\n",p->jobname,p->num);
printf("为本作业所分配的物理块是:");
for(i=0;i<p->num;i++) printf("%d号物理块---",p->nums[i]);
printf("\n");
p=p->next;
}
}
//显示版权信息函数
void mversion()
{
printf(" |--------------------------------------------------|\n");
printf(" | 页式内存管理系统模拟程序 |\n");
printf(" |--------------------------------------------------|\n");
printf(" |菜单: (0)退出 (1)添加作业 |\n");
printf(" | |\n");
printf(" | (2)回收作业 (3)查看位示图 |\n");
printf(" | |\n");
printf(" | (4)查看内存分配情况 |\n");
printf(" |--------------------------------------------------|\n");
}
void main()
{
int t=1,chioce;
mversion();
initial();
readData();
//printf("请选择:");
//scanf("%d",&chioce);
while(t==1)
{
printf("\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n");
printf("请选择菜单:");
scanf("%d",&chioce);
switch(chioce)
{
case 1: addjob(); break;
case 2: finish(); break;
case 3: view_table();break;
case 4: view_pages(); break;
case 0: t=0;break;
default: printf("选择错误!\n");
}
}
}
test.txt文本的内容如下:
1 1 0 0 1 1 1 0 1 0 1 1 0 1 1 0
0 1 0 1 0 1 0 0 0 1 0 0 1 1 0 0
0 1 0 1 0 0 1 0 1 0 0 0 0 1 0 1
1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 0
1 1 0 0 1 1 1 0 1 1 1 1 0 1 1 0
0 1 0 1 0 1 0 0 0 1 0 0 1 1 0 0
0 1 0 1 0 0 1 0 1 0 0 0 0 1 0 1
1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 0
1 1 0 0 1 0 0 0 1 0 1 1 0 1 1 0
0 1 0 1 0 1 0 0 0 1 0 0 1 1 0 0
0 1 0 1 0 0 1 0 1 0 0 0 0 1 0 1
1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 0
1 1 0 0 1 0 1 0 1 0 1 1 0 1 1 0
0 1 0 1 0 1 0 0 0 1 0 0 1 1 0 0
0 1 0 1 0 1 1 0 1 0 0 0 0 1 0 1
1 0 1 0 1 1 0 1 0 1 0 0 1 1 0 0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -