- #include<stdio.h>
- #include<iostream.h>
- #include<string.h>
- const int PAGES=256; //定义总块数
- const int WORD=32; //定义字长
- const int WORDNUM=PAGES/WORD; //定义总字数
- typedef struct node{
- char jobname[20];
- int num;
- int nums[PAGES];
- struct node *next;
- }jobs;
- int table[WORDNUM][WORD];
- int freenum=0;
- jobs *head;
- //初始化函数
- void initial(){
- int i,j;
- jobs *p;
- //初始化位示图
- for(i=0;i<WORDNUM;i++){
- for(j=0;j<WORD;j++){
- table[i][j]=0;
- }
- }
- //初始化作业表头
- p=new jobs;
- strcpy(p->jobname,"null");
- p->num=0;
- p->next=NULL;
- head=p;
- }
- //读入位示图初始数据
- void readData()
- {
- int i,j;
- FILE *fp;
- char fname[20];
- cout<<"请输入初始位示图数据文件名:"<<endl;
- cin>>fname;
- if((fp=fopen(fname,"r"))!=NULL){
- for(i=0;i<WORDNUM;i++){
- for(j=0;j<WORD;j++){
- fscanf(fp,"%d",&table[i][j]);
- if(table[i][j]==1)
- freenum++;
- }
- }
- cout<<"初始位示图"<<endl;
- for(i=0;i<WORDNUM;i++){
- for(j=0;j<WORD;j++){
- cout<<table[i][j]<<" ";
- }
- cout<<endl;
- }
- cout<<"总空闲块数:"<<freenum;
- }
- else{
- cout<<"文件不能打开"<<endl;
- }
- }
- //新加入作业函数
- void add()
- {
- char jobname[20];
- int num;
- jobs *p;
- int i,j,k=0;
- cout<<"请输入新增的作业名:";
- cin>>jobname;
- cout<<"新增作业所需页数:";
- cin>>num;
- if(num<=freenum){
- freenum-=num;
- p=new jobs;
- strcpy(p->jobname,jobname);
- p->num=num;
- for(k=0;k<num;k++){
- i=0;
- j=0;
- while(table[i][j]==1){
- j=0;
- while(table[i][j]==1)j++;
- if(table[i][j]==1)
- i++;
- }
- p->nums[k]=i*WORD+j;
- table[i][j]=1;
- }
- p->next=head->next;
- head->next=p;
- }
- else{
- cout<<"错误,当前剩余页数小于所需页数,请稍候再试:)"<<endl;
- }
- }
- //完成作业函数
- void finish()
- {
- char jobname[20];
- jobs *p,*q;
- int n,i,j,num,k;
- cout<<"请输入完成的作业名:";
- cin>>jobname;
- p=head->next;
- q=head;
- while(p!=NULL){
- if(strcmp(p->jobname,jobname)){
- q=q->next;
- }
- p=p->next;
- }
- p=q->next;
- num=p->num;
- for(k=0;k<num;k++){
- n=p->nums[k];
- i=n/WORD;
- j=n%WORD;
- table[i][j]=0;
- }
- freenum+=num;
- q->next=p->next;
- delete p;
- }
- //显示当前位示图函数
- void view_table()
- {
- int i,j;
- cout<<"当前位示图"<<endl;
- for(i=0;i<WORDNUM;i++){
- for(j=0;j<WORD;j++){
- cout<<table[i][j]<<" ";
- }
- cout<<endl;
- }
- cout<<"总空闲块数:"<<freenum<<endl;
- }
- //显示所有页表函数
- void view_pages()
- {
- jobs *p;
- int i;
- p=head->next;
- if(p==NULL)cout<<"当前没有用户作业"<<endl;
- else
- cout<<"当前所有的用户作业页表情况"<<endl;
- while(p!=NULL){
- cout<<"作业名:"<<p->jobname<<" 所用块数:"<<p->num<<endl;
- cout<<"本作业所点块的序列是:"<<endl;
- for(i=0;i<p->num;i++){
- cout<<p->nums[i]<<" ";
- }
- cout<<endl;
- p=p->next;
- }
- }
- //显示版权信息函数
- void version()
- {
- cout<<endl<<endl;
- cout<<" ┏━━━━━━━━━━━━━━━━━━━━━━━┓"<<endl;
- cout<<" ┃ 页式内存管理系统模拟程序 ┃"<<endl;
- cout<<" ┠───────────────────────┨"<<endl;
- cout<<" ┃ (c)All Right Reserved Neo ┃"<<endl;
- cout<<" ┃sony006@163.com ┃"<<endl;
- cout<<" ┃version 2004 build 1122┃"<<endl;
- cout<<" ┗━━━━━━━━━━━━━━━━━━━━━━━┛"<<endl;
- cout<<endl<<endl;
- }
- void main()
- {
- int t=1,chioce;
- version();
- initial();
- readData();
- while(t==1){
- cout<<endl<<"==========================================="<<endl;
- cout<<" 页式内存管理系统模拟程序"<<endl;
- cout<<"==========================================="<<endl;
- cout<<"1.加入新作业 2.完成作业 3.显示当前内存位示图 4.显示所有作业页表 0.退出"<<endl;
- cout<<"请选择:";
- cin>>chioce;
- switch(chioce){
- case 1:
- add();
- break;
- case 2:
- finish();
- break;
- case 3:
- view_table();
- break;
- case 4:
- view_pages();
- break;
- case 0:
- t=0;
- break;
- default:
- cout<<"选择错误"<<endl;
- }
- }
- }
- //该片段来自于http://www.codesnippet.cn/detail/100120131505.html
来源: http://www.codesnippet.cn/detail/100120131505.html