页面调度算法OPT的模拟实现
页面调度算法模拟实验中遇到的问题

页面调度算法模拟实验中遇到的问题在页面调度算法模拟实验中,可能会遇到以下一些问题:
1、算法选择问题:不同的页面调度算法有不同的优势和适用场景,如FIFO、LRU、OPT等。
在实验中,选择合适的算法是一个挑战。
可能需要考虑内存大小、访问模式、页面访问频率等因素,以确定使用哪种算法进行模拟实验。
2、数据集选择问题:在模拟实验中,需要使用真实或合成的数据集来模拟页面访问的情况。
选择合适的数据集是一个关键问题,需要考虑数据集的规模、访问模式的真实性以及数据集的可用性等因素。
3、实验结果的评估问题:页面调度算法的性能可以通过不同的指标进行评估,如缺页率、命中率、平均访问时间等。
在实验中,选择合适的评估指标以及评估方法是一个重要问题。
4、实验参数的设置问题:在模拟实验中,还需要考虑一些参数的设置,如内存大小、页面大小、进程数量等。
这些参数的选择可能会对实验结果产生影响,需要合理设置以保证实验的可靠性和有效性。
5、实验结果的可视化问题:实验结果的可视化是一个重要的环节,可以通过图表、曲线等形式展示实验结果,以便于对比不同算法的性能表现。
在实验中,实现合适的可视化方式可能会遇到一些技术上的挑战。
这些问题都需要在实验前进行充分的准备和规划,以确保实验的
可靠性和有效性。
同时,也需要注意实验过程中可能遇到的其他问题,并及时进行调整和解决。
实验6 页面调度算法模拟

实验五:页面调度算法模拟一、实验目的1、熟悉操作系统页面调度算法2、编写程序模拟最佳置换、LRU等页面调度算法,体会页面调度算法原理二、实验基本原理1、页面的含义:分页存储管理将一个进程的逻辑地址空间分成若干大小相等的片,称为页面或页。
2、页面置换算法的含义:在进程运行过程中,若其所要访问的页面不在内存而需把它们调入内存,但内存已无空闲空间时,为了保证该进程能正常运行,系统必须从内存中调出一页程序或数据,送磁盘的对换区中。
但应将哪个页面调出,须根据一定的算法来确定。
通常,把选择换出页面的算法称为页面置换算法(Page_Replacement Algorithms)。
3、置换算法一个好的页面置换算法,应具有较低的页面更换频率。
从理论上讲,应将那些以后不再会访问的页面换出,或将那些在较长时间内不会再访问的页面调出。
常见置换算法:①最佳置换算法(Optimal):它是由Belady于1966年提出的一种理论上的算法。
其所选择的被淘汰页面,将是以后永不使用的或许是在最长(未来)时间内不再被访问的页面。
采用最佳置换算法,通常可保证获得最低的缺页率。
但由于人目前还无法预知一个进程在内存的若干个页面中,哪一个页面是未来最长时间内不再被访问的,因而该算法是无法实现的,便可以利用此算法来评价其它算法。
②先进先出(FIFO)页面置换算法:这是最早出现的置换算法。
该算法总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面予以淘汰。
该算法实现简单只需把一个进程已调入内存的页面,按先后次序链接成一个队列,并设置一个指针,称为替换指针,使它总是指向最老的页面。
③ LRU置换算法:LRU置换算法是选择最近最久未使用的页面予以淘汰。
二、实验参考程序先进先出页面调度算法模拟/*--------------------------------------------------------------------------- 程序说明:1、main函数在调用时会先产生一串随机数列,并存放在list[N]中;2、然后mian函数调用IsInBuf函数,把当前读到的单词x和buf[i]中的内容进行比较。
OPT、FIFO、LRU算法的实现

OPT、FIFO、LRU算法的实现⼀、实验⽬的1. 了解虚拟存储技术的特点,掌握虚拟存储请求页式存储管理中⼏种基本页⾯置换算法的基本思想和实现过程,并⽐较它们的效率。
2. 了解程序设计技术和内存泄露的原因⼆、实验内容模拟实现请求页式存储管理的⼏种基本页⾯置换算法最佳淘汰算法(OPT)先进先出的算法(FIFO)最近最久未使⽤算法(LRU)三、实验原理1. 虚拟存储系统UNIX中,为了提⾼内存利⽤率,提供了内外存进程对换机制;内存空间的分配和回收均以页为单位进⾏;⼀个进程只需将其⼀部分(段或页)调⼊内存便可运⾏;还⽀持请求调页的存储管理⽅式。
当进程在运⾏中需要访问某部分程序和数据时,发现其所在页⾯不在内存,就⽴即提出请求(向CPU发出缺中断),由系统将其所需页⾯调⼊内存。
这种页⾯调⼊⽅式叫请求调页。
为实现请求调页,核⼼配置了四种数据结构:页表、页框号、访问位、修改位、有效位、保护位等。
2. 页⾯置换算法当CPU接收到缺页中断信号,中断处理程序先保存现场,分析中断原因,转⼊缺页中断处理程序。
该程序通过查找页表,得到该页所在外存的物理块号。
如果此时内存未满,能容纳新页,则启动磁盘I/O将所缺之页调⼊内存,然后修改页表。
如果内存已满,则须按某种置换算法从内存中选出⼀页准备换出,是否重新写盘由页表的修改位决定,然后将缺页调⼊,修改页表。
利⽤修改后的页表,去形成所要访问数据的物理地址,再去访问内存数据。
整个页⾯的调⼊过程对⽤户是透明的。
最佳淘汰算法(OPT):选择永不使⽤或在未来最长时间内不再被访问的页⾯予以替换。
先进先出的算法(FIFO):选择在内存中驻留时间最久的页⾯予以替换。
最近最久未使⽤算法(LRU):选择过去最长时间未被访问的页⾯予以替换。
3. ⾸先⽤srand( )和rand( )函数定义和产⽣指令序列,然后将指令序列变换成相应的页地址流,并针对不同的算法计算出相应的命中率。
(1)通过随机数产⽣⼀个指令序列,共320条指令。
操作系统页面置换算法(opt,lru,fifo,clock)实现

操作系统页⾯置换算法(opt,lru,fifo,clock )实现选择调出页⾯的算法就称为页⾯置换算法。
好的页⾯置换算法应有较低的页⾯更换频率,也就是说,应将以后不会再访问或者以后较长时间内不会再访问的页⾯先调出。
常见的置换算法有以下四种(以下来⾃操作系统课本)。
1. 最佳置换算法(OPT)最佳(Optimal, OPT)置换算法所选择的被淘汰页⾯将是以后永不使⽤的,或者是在最长时间内不再被访问的页⾯,这样可以保证获得最低的缺页率。
但由于⼈们⽬前⽆法预知进程在内存下的若千页⾯中哪个是未来最长时间内不再被访问的,因⽽该算法⽆法实现。
最佳置换算法可以⽤来评价其他算法。
假定系统为某进程分配了三个物理块,并考虑有以下页⾯号引⽤串: 7, 0, 1, 2, 0, 3, 0, 4, 2, 3, 0, 3, 2, 1, 2, 0, 1, 7, 0, 1进程运⾏时,先将7, 0, 1三个页⾯依次装⼊内存。
进程要访问页⾯2时,产⽣缺页中断,根据最佳置换算法,选择第18次访问才需调⼊的页⾯7予以淘汰。
然后,访问页⾯0时,因为已在内存中所以不必产⽣缺页中断。
访问页⾯3时⼜会根据最佳置换算法将页⾯1淘汰……依此类推,如图3-26所⽰。
从图中可以看出⾤⽤最佳置换算法时的情况。
可以看到,发⽣缺页中断的次数为9,页⾯置换的次数为6。
图3-26 利⽤最佳置换算法时的置换图2. 先进先出(FIFO)页⾯置换算法优先淘汰最早进⼊内存的页⾯,亦即在内存中驻留时间最久的页⾯。
该算法实现简单,只需把调⼊内存的页⾯根据先后次序链接成队列,设置⼀个指针总指向最早的页⾯。
但该算法与进程实际运⾏时的规律不适应,因为在进程中,有的页⾯经常被访问。
图3-27 利⽤FIFO 置换算法时的置换图这⾥仍⽤上⾯的实例,⾤⽤FIFO 算法进⾏页⾯置换。
进程访问页⾯2时,把最早进⼊内存的页⾯7换出。
然后访问页⾯3时,再把2, 0, 1中最先进⼊内存的页换出。
页面调度算法(FIFO,LRU,OPT)

if( CompareQueue( Q,page ) ) { t--;DeQueue(Q,e);EnQueue(Q,e);flag = 1;break; }
if( flag == 0 ) { DeQueue( Q,x );
flag = 0;
}
cout << "缺页中断数为:" << endl;
cout << "w = " << w << endl;
delete [] a;
}
main()
{
int m,n;
cout << "输入页面数:" << endl;
cin >> m;
LinkQueue Q;
int page, t = 0,flag = 0,x;
InitQueue( Q );
for( int i = 1;i <= m;i++ )
{
page = a[ i ];
t++;
if( t <= n ) { EnQueue( Q,page );
}
cout << endl;
VisitQueue( Q );
cout << ":";
}
flag = 0;
}
cout << "缺页中断数为:" << endl;
cout << "t= " << t << endl;
实验三 页面调度算法

实验报告院(系):数学与计算机科学学院专业班级:学号:姓名:实验地点:实验日期:年月日一、实验目的及要求通过本实验可以加深理解有关虚拟存储器的工作原理,进一步体会和了解页面替换算法的具体实现方法。
二、实验环境PC /Windows系统/Visual C++6.0三、实验内容①实现三种算法:先进先出;OPT;LRU②页面序列从指定的文本文件(TXT文件)中取出③输出:第一行:每次淘汰的页面号,第二行:显示缺页的总次数/*全局变量*/int mSIZE; /*物理块数*/int pSIZE; /*页面号引用串个数*/static int memery[10]={0}; /*物理块中的页号*/static int page[100]={0}; /*页面号引用串*/static int temp[100][10]={0}; /*辅助数组*//*置换算法函数*/void FIFO();void LRU();void OPT();/*辅助函数*/void print(unsigned int t);void designBy();void download();void mDelay(unsigned int Delay);/*先进先出页面置换算法*/void FIFO(){int memery[10]={0};int time[10]={0}; /*记录进入物理块的时间*/int i,j,k,m;int max=0; /*记录换出页*/int count=0; /*记录置换次数*//*前mSIZE个数直接放入*/for(i=0;i<mSIZE;i++){memery[i]=page[i];time[i]=i;for(j=0;j<mSIZE;j++)temp[i][j]=memery[j];}for(i=mSIZE;i<pSIZE;i++){/*判断新页面号是否在物理块中*/for(j=0,k=0;j<mSIZE;j++){if(memery[j]!=page[i])k++;}if(k==mSIZE) /*如果不在物理块中*/{count++; /*计算换出页*/max=time[0]<time[1]?0:1;for(m=2;m<mSIZE;m++)if(time[m]<time[max])max=m;memery[max]=page[i];time[max]=i; /*记录该页进入物理块的时间*/ for(j=0;j<mSIZE;j++)temp[i][j]=memery[j];}else{for(j=0;j<mSIZE;j++)你temp[i][j]=memery[j];}}compute();print(count);}/*最近最久未使用置换算法*/void LRU(){int memery[10]={0};int flag[10]={0}; /*记录页面的访问时间*/int i,j,k,m;int max=0; /*记录换出页*/int count=0; /*记录置换次数*//*前mSIZE个数直接放入*/for(i=0;i<mSIZE;i++){memery[i]=page[i];flag[i]=i;for(j=0;j<mSIZE;j++)temp[i][j]=memery[j];}for(i=mSIZE;i<pSIZE;i++){/*判断新页面号是否在物理块中*/for(j=0,k=0;j<mSIZE;j++){if(memery[j]!=page[i])k++;elseflag[j]=i; /*刷新该页的访问时间*/ }if(k==mSIZE) /*如果不在物理块中*/{count++; /*计算换出页*/ max=flag[0]<flag[1]?0:1;for(m=2;m<mSIZE;m++)if(flag[m]<flag[max])max=m;memery[max]=page[i];flag[max]=i; /*记录该页的访问时间*/ for(j=0;j<mSIZE;j++)temp[i][j]=memery[j];}elsefor(j=0;j<mSIZE;j++)temp[i][j]=memery[j];}compute();print(count);}/*最佳置换算法*/void OPT(){int memery[10]={0};int next[10]={0}; /*记录下一次访问时间*/int i,j,k,l,m;int max; /*记录换出页*/int count=0; /*记录置换次数*//*前mSIZE个数直接放入*/for(i=0;i<mSIZE;i++){memery[i]=page[i];for(j=0;j<mSIZE;j++)temp[i][j]=memery[j];}for(i=mSIZE;i<pSIZE;i++){ /*判断新页面号是否在物理块中*/ for(j=0,k=0;j<mSIZE;j++){if(memery[j]!=page[i])k++;}if(k==mSIZE) /*如果不在物理块中*/{count++;/*得到物理快中各页下一次访问时间*/for(m=0;m<mSIZE;m++){for(l=i+1;l<pSIZE;l++)if(memery[m]==page[l])break;next[m]=l;}/*计算换出页*/max=next[0]>=next[1]?0:1;for(m=2;m<mSIZE;m++)if(next[m]>next[max])max=m;/*下一次访问时间都为pSIZE,则置换物理块中第一个*/ memery[max]=page[i];for(j=0;j<mSIZE;j++)temp[i][j]=memery[j];}elsefor(j=0;j<mSIZE;j++)temp[i][j]=memery[j];}compute();print(count);}四、实验步骤页面置换:在地址映射过程中,若在页面中发现所要访问的页面不在内存中,则产生缺页中断。
FIFO LRU OPT页面置换算法的模拟实现(已调试)

操作系统之FIFO、LRU、OPT模拟实现1.FIFO算法#include<stdio.h>int main(int argc, char *argv[]){int i,j,k,k2,t;int n1; //memory page numberint n2; //requested page numberint pageseq[100]; //access page sequenceint mempages[10][2]; //memory pages//mempages[i][0] is page NO, mempages[i][1] is loading sequence No.int n3; //number of loaded pages in memoryint n4; //missing pages countint replacedPage;//Input dataprintf("Input memory page number for each process:");scanf("%d",&n1);if(n1<1){printf("Memory page number error!\n");return 1;}printf("Now, Input page access sequence.\n");printf("Input requested page number firstly:");scanf("%d",&n2);printf("%d pages are waiting for access.\n",n2);for(i=0 ;i<n2; i++){printf("%d-th page is:",i+1);scanf("%d",&t);pageseq[i] = t;}//FIFOn3 = 0;//number of loaded pages in memoryn4 = 0;//missing page count//replace pagesfor(i = 0; i<n2; i++){for(j = 0 ;j<n3; j++){if(mempages[j][0] == pageseq[i]) //page is in memorybreak;}if(j == n3 && n3 < n1) //not found in memory,but there are empty memory pages{mempages[n3][0] = pageseq[i];mempages[n3][1] = i+1;n3++;n4++;}else if(j == n3) //page is not in memory,pick up one for replacement{//find the page with minimal loading sequence No.int minv;minv = mempages[0][1];k2 = 0;for(k=1; k<n3; k++){if(minv > mempages[k][1]){k2 = k;minv = mempages[k][1];}}//replace mempages[k2][0] by pageseq[i]replacedPage = mempages[k2][0];mempages[k2][0] = pageseq[i];mempages[k2][1] = i+1;n4++; //missing page countingprintf("page %d in, page %d out. %d-th missing page.\n",pageseq[i],replacedPage,n4);}else{//page is in memoryprintf("page %d is in memory.\n",pageseq[i]);}}printf("Totally %d missing pages!\n",n4);return 0;}2.LRU#include<stdio.h>int main(int argc, char *argv[]){int i,j,k,k2,t;int n1; //memory page numberint n2; //requested page numberint pageseq[100]; //access page sequenceint mempages[10][2]; //memory pages//mempages[i][0] is page NO, mempages[i][1] is loading sequence No.int n3; //number of loaded pages in memoryint n4; //missing pages countint replacedPage;//Input dataprintf("Input memory page number for each process:");scanf("%d",&n1);if(n1<1){printf("Memory page number error!\n");return 1;}printf("Now, Input page access sequence.\n");printf("Input requested page number firstly:");scanf("%d",&n2);printf("%d pages are waiting for access.\n",n2);for(i=0 ;i<n2; i++){printf("%d-th page is:",i+1);scanf("%d",&t);pageseq[i] = t;}//LRUn3 = 0;//number of loaded pages in memoryn4 = 0;//missing page count//replace pagesfor(i = 0; i<n2; i++){for(j = 0 ;j<n3; j++){if(mempages[j][0] == pageseq[i]) //page is in memory{mempages[j][1]=i+1;break;}}if(j == n3 && n3 < n1) //not found in memory,but there are empty memory pages{mempages[n3][0] = pageseq[i];mempages[n3][1] = i+1;n3++;n4++;}else if(j == n3) //page is not in memory,pick up one for replacement{//find the page with minimal loading sequence No.int minv;minv = mempages[0][1];k2 = 0;for(k=1; k<n3; k++){if(minv > mempages[k][1]){k2 = k;minv = mempages[k][1];}}//replace mempages[k2][0] by pageseq[i]replacedPage = mempages[k2][0];mempages[k2][0] = pageseq[i];mempages[k2][1] = i+1;n4++; //missing page countingprintf("page %d in, page %d out. %d-th missing page.\n",pageseq[i],replacedPage,n4);}else{//page is in memoryprintf("page %d is in memory.\n",pageseq[i]);}}printf("Totally %d missing pages!\n",n4);return 0;}3.OPT#include<stdio.h>int main(int argc, char *argv[]){int i,j,k,k2,t;int n1; //memory page numberint n2; //requested page numberint pageseq[100]; //access page sequenceint mempages[10][2]; //memory pages//mempages[i][0] is page NO, mempages[i][1] is loading sequence No.int n3; //number of loaded pages in memoryint n4; //missing pages countint replacedPage;//Input dataprintf("Input memory page number for each process:");scanf("%d",&n1);if(n1<1){printf("Memory page number error!\n");return 1;}printf("Now, Input page access sequence.\n");printf("Input requested page number firstly:");scanf("%d",&n2);printf("%d pages are waiting for access.\n",n2);for(i=0 ;i<n2; i++){printf("%d-th page is:",i+1);scanf("%d",&t);pageseq[i] = t;}//FIFOn3 = 0;//number of loaded pages in memoryn4 = 0;//missing page count//replace pagesfor(i = 0; i < n2; i++){for(j = 0 ;j < n3; j++){if(mempages[j][0] == pageseq[i]) //page is in memorybreak;}if(j == n3 && n3 < n1) //not found in memory,but there are empty memory pages{mempages[n3][0] = pageseq[i];mempages[n3][1] = i+1;n3++;n4++;}else if(j == n3) //page is not in memory,pick up one for replacement{//find the page with minimal loading sequence No.int max;int t;for(j = 0 ;j < n3; j++){for( t = i+1; t < n2; t++){if( mempages[j][0] == pageseq[t] ){mempages[j][1] = t;break;}}if( t == n2 )mempages[j][1] = n2+1;}//int max;max = mempages[0][1];k2 = 0;for(k=1; k<n3; k++){if( mempages[k][1] > max ){k2 = k;max = mempages[k][1];}}//replace mempages[k2][0] by pageseq[i]replacedPage = mempages[k2][0];mempages[k2][0] = pageseq[i];//mempages[k2][1] = i+1;n4++; //missing page countingprintf("page %d in, page %d out. %d-th missing page.\n",pageseq[i],replacedPage,n4);}else{//page is in memoryprintf("page %d is in memory.\n",pageseq[i]);}}printf("Totally %d missing pages!\n",n4);return 0;}。
操作系统——页面调度算法

操作系统——页⾯调度算法在之前系列的博客中介绍了页⾯调度算法的原理:这⾥编写代码模拟⼀些页⾯调度算法的实现。
(1)最佳淘汰算法——OPT(Optimal)这是Belady贝莱迪于1966年提出的⼀种理论上的算法。
该算法每次都淘汰以后永不使⽤的,或者过最长的时间后才会被访问的页⾯。
显然,采⽤这种算法会保证最低的缺页率,但它是⽆法实现的,因为它必须知道页⾯“将来”的访问情况。
不过,该算法仍有⼀定意义,可作为衡量其他算法优劣的⼀个标准。
(2)先进先出淘汰算法——FIFO这是最早出现的淘汰算法。
总是淘汰最先进⼊内存的页⾯。
它实现简单,只需把进程中已调⼊内存的页⾯,按先后次序链成⼀个队列,并设置⼀个所谓的替换指针,使它总是指向内存中最⽼的页⾯。
(3)最近最久未使⽤算法——(LRU, Least Recently Used)根据页⾯调⼊内存后的使⽤情况,选择内存中最久未使⽤的页⾯被置换。
这是局部性原理的合理近似,性能接近最佳算法。
OPT算法使⽤页⾯将要被访问的时间,LRU算法使⽤页⾯最后⼀次被访问的时间。
⼆者唯⼀的差别是:OPT是向前看的,⽽LRU是向后看的。
#include<cstdio>#include<cstring>#include<algorithm>using namespace std;int N;//进程虚页数int M;//内存块个数int page[100];//进程虚页int block[100];//内存块int weight[100];//当前内存块在后⾯出现的次数int success;//命中次数int fail;//未命中次数void FIFO(){int i,j;int flag;int pos=0;int success=0;int fail=0;for(i=0; i<N; i++){flag =0;for(j=1; j<=M; j++){if(page[i]==block[j])//命中{flag=1;success++;pos--;break;}}if(flag==0){fail++;block[pos%M+1]=page[i];}pos++;for(j=1; j<=M; j++){printf("%d ",block[j]);}printf("\n");}printf("命中次数为:%d\n",success);printf("未命中次数为:%d\n",fail);}void OPT(){int i,j,k;int flag;int success=0;int fail=0;int needReplace;for(i=0; i<N; i++){flag=0;for(j=1; j<=M; j++){if(page[i]==block[j])//命中{flag=1;success++;}}if(flag==0)//未命中{fail++;for(j=1; j<=M; j++) //若内存块未满,先将内存块填满 {if(block[j]==0){block[j]=page[i];break;}}int minCnt=100;memset(weight,0,sizeof(weight));if(j>M)//若内存块已满,需要进⾏调度{for(k=i+1; k<N; k++) //向后{for(j=1; j<=M; j++){if(block[j]==page[k]){weight[j]=N-k;//越靠近,权值越⼤break;}}}for(j=1; j<=M; j++) //找权值最⼩的那⼀个{if(weight[j]<=minCnt){minCnt=weight[j];needReplace=j;}}block[needReplace]=page[i];//替换掉权值最⼩的 }}for(j=1; j<=M; j++){printf("%d ",block[j]);}printf("\n");}printf("命中次数为:%d\n",success);printf("未命中次数为:%d\n",fail);}void LRU(){int i,j;int flag;int success=0;int fail=0;int needReplace;for(i=0; i<N; i++){flag=0;for(j=1; j<=M; j++){if(page[i]==block[j])//命中{flag=1;success++;}}if(flag==0)//未命中{fail++;for(j=1; j<=M; j++) //现将内存块填满{if(block[j]==0){block[j]=page[i];break;}}if(j>M)//内存块已满,需要进⾏调度{//向前找,需要替换的页⾯为i-MneedReplace=page[i-M];for(j=1; j<=M; j++){if(block[j]==needReplace)//找到后替换掉 {block[j]=page[i];break;}}}}for(j=1; j<=M; j++){printf("%d ",block[j]);}printf("\n");}printf("命中次数为:%d\n",success);printf("未命中次数为:%d\n",fail);}int main(){printf("请输⼊进程执⾏时页⾯访问个数:\n");scanf("%d",&N);printf("请输⼊空闲内存块的个数:\n");scanf("%d",&M);printf("请输⼊进程执⾏时页⾯访问次序:\n");memset(page,0,sizeof(page));memset(block,0,sizeof(block));int i;int needReplace;for(i=0; i<N; i++){scanf("%d",&page[i]);}printf("采⽤最佳淘汰算法OPT:\n");OPT();memset(block,0,sizeof(block));printf("采⽤先进先出淘汰算法FIFO:\n");FIFO();memset(block,0,sizeof(block));printf("采⽤最近最久未使⽤淘汰算法LRU:\n");LRU();return0;}/*123232152453252*/。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计(1)报告(2009 / 2010 学年第二学期)题目(1):文本文件编辑程序题目(2):页面调度算法OPT的模拟实现专业计算机科学与技术学生姓名陈炳阳班级学号B07030523指导教师张琳指导单位计算机学院计算机科学与技术系日期2010.05.24-2010.06.04指导教师成绩评定表学生姓名陈炳阳班级学号B07030531 专业计算机科学与技术评分内容评分标准优秀良好中等差平时成绩认真对待课程设计,遵守实验室规定,上机不迟到早退,不做和设计无关的事设计成果设计的科学、合理性功能丰富、符合题目要求界面友好、外观漂亮、大方程序功能执行的正确性程序算法执行的效能设计报告设计报告正确合理、反映系统设计流程文档内容详实程度文档格式规范、排版美观验收答辩简练、准确阐述设计内容,能准确有条理回答各种问题,系统演示顺利。
评分等级指导教师简短评语指导教师签名日期2010.06.11 备注评分等级有五种:优秀、良好、中等、及格、不及格题目一:文本文档编辑器一、课题内容和要求采用JAVA SW ING,设计可用于文本文件编辑的程序,要求能正确打开和保存文本文件,能进行文本的修改等功能。
二、需求分析本次试验,,本人使用了MyEclipse程序,熟悉了许多头文件的作用。
三、概要设计1、由于要有文本输入和保存,因此要新建一个文本文档private JFrame frame;private JTextArea textarea;private String filename;public void createEditor() {JMenuBar menubar = new JMenuBar();JMenu menufile = new JMenu("文件");JMenuItem menunew = new JMenuItem("新建");menunew.addActionListener(this);menufile.add(menunew);建立菜单,实现打开,输入,保存,JMenuItem menunew = new JMenuItem("新建");menunew.addActionListener(this);menufile.add(menunew);JMenuItem menuopen = new JMenuItem("打开");menuopen.addActionListener(this);menufile.add(menuopen);JMenuItem menusave = new JMenuItem("保存");menusave.addActionListener(this);menufile.add(menusave);主函数public static void main(String args[]) {JTextEditor te = new JTextEditor();te.createEditor();}};四、详细设计实验源代码package com.demo;import java.awt.BorderLayout;import java.awt.GridLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.File;import java.io.FileReader;import java.io.FileWriter;import java.io.PrintWriter;import javax.swing.JDialog;import javax.swing.JFileChooser;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JMenu;import javax.swing.JMenuBar;import javax.swing.JMenuItem;import javax.swing.JPanel;import javax.swing.JTextArea;public class JTextEditor extends WindowAdapter implements ActionListener {private JFrame frame;// 主窗体private JTextArea textarea;// 文本输入区域private String filename;// 打开的文件名public void createEditor() {// 建立文件菜单JMenuBar menubar = new JMenuBar();JMenu menufile = new JMenu("文件");// 新建菜单JMenuItem menunew = new JMenuItem("新建");menunew.addActionListener(this);menufile.add(menunew);// 打开菜单JMenuItem menuopen = new JMenuItem("打开");menuopen.addActionListener(this);menufile.add(menuopen);// 保存菜单JMenuItem menusave = new JMenuItem("保存");menusave.addActionListener(this);menufile.add(menusave);// 另存为菜单JMenuItem menusave2 = new JMenuItem("另存为..."); menusave2.addActionListener(this);menufile.add(menusave2);// 退出菜单menufile.addSeparator();JMenuItem menuexit = new JMenuItem("退出");menuexit.addActionListener(this);menufile.add(menuexit);menubar.add(menufile);// 建立帮助菜单JMenu menuhelp = new JMenu("帮助");JMenuItem menuabout = new JMenuItem("关于");menuabout.addActionListener(this);menuhelp.add(menuabout);menubar.add(menuhelp);// 主窗口frame = new JFrame("Java文本编辑器");frame.setJMenuBar(menubar);textarea = new JTextArea();frame.add("Center", textarea);frame.addWindowListener(this);// 注册窗口关闭监听器frame.setSize(600, 400);frame.setVisible(true);}// 菜单选择事件public void actionPerformed(ActionEvent e) {try {if (e.getActionCommand() == "新建") {textarea.setText("");} else if (e.getActionCommand() == "打开") { // 选择文件JFileChooser dlg = new JFileChooser();int result = dlg.showOpenDialog(frame);if (result == JFileChooser.APPROVE_OPTION) {File file = dlg.getSelectedFile();filename = file.getAbsolutePath();// 读取文件FileReader fr = new FileReader(filename);BufferedReader br = new BufferedReader(fr);String str = "";while (br.ready()) {int c = br.read();str += (char) c;}textarea.setText(str);br.close();fr.close();frame.setTitle("Java文本编辑器 - " + filename); }} else if (e.getActionCommand() == "保存") { // 写入文件File file = new File(filename);FileWriter fos = new FileWriter(file, true);BufferedWriter bos = new BufferedWriter(fos);PrintWriter pos = new PrintWriter(bos);// 写入对象数据pos.print(textarea.getText());// 关闭输出流bos.close();pos.close();fos.close();} else if (e.getActionCommand() == "另存为...") { // 选择文件JFileChooser dlg = new JFileChooser();int result = dlg.showOpenDialog(frame);if (result == JFileChooser.APPROVE_OPTION) {File file = dlg.getSelectedFile();// 写入文件FileWriter fos = new FileWriter(file, true);BufferedWriter bos = new BufferedWriter(fos);PrintWriter pos = new PrintWriter(bos);// 写入对象数据pos.print(textarea.getText());// 关闭输出流bos.close();pos.close();fos.close();}} else if (e.getActionCommand() == "退出") {System.exit(0);} else if (e.getActionCommand() == "关于") {// 显示关于对话框final JDialog dialog = new JDialog(frame, "关于", true); dialog.setSize(267, 117);dialog.setLayout(new GridLayout(2, 1));// 窗口关闭事件dialog.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) {dialog.dispose();}});// 显示消息JPanel topPanel = new JPanel();JLabel label = new JLabel("Java文本编辑器");topPanel.add(label, BorderLayout.NORTH);dialog.add(topPanel);dialog.setVisible(true);}} catch (Exception ex) {ex.printStackTrace();}}// 关闭窗体事件public void windowClosing(WindowEvent e) {System.exit(0);}// 主函数public static void main(String args[]) {JTextEditor te = new JTextEditor();te.createEditor();}}}五、测试数据及其结果分析测试结果(如下图所示):文本编辑器界面输入存储功能结果分析:能基本实现输入保存功能,由于余下时间仓促,未能调试实现字体,复制,粘贴等功能1、算法分析:首先新建一个文件菜单,在次基础上继续建新建,打开,保存,另存为,退出菜单.建立菜单选择时间以便选择文件,读取文件.陆续建立写入文件,写入对象数据,关闭输出最后关闭对象窗体六、调试过程中的问题FileReader fr = new FileReader(filename);BufferedReader br = new BufferedReader(fr);String str = "";while (br.ready()) {int c = br.read();str += (char) c;}textarea.setText(str);br.close();fr.close();frame.setTitle("Java文本编辑器 - " + filename);}} else if (e.getActionCommand()="保存")发现最后一句有问题改成} else if (e.getActionCommand()=="保存")七、课程设计总结由于未使用过JA V A进行程序的编写,因此,本次试验开始时无从下手。