中南大学 计算机体系结构实验报告
- 格式:docx
- 大小:268.78 KB
- 文档页数:16
实验2 UML实验(2)实验学时: 2每组人数: 1实验类型: 3 (1:基础性2:综合性3:设计性4:研究性)实验要求: 1 (1:必修2:选修3:其它)实验类别: 3 (1:基础2:专业基础3:专业4:其它)一、实验目的1. 学习类图的绘制;2. 学习从系统需求中识别类,并构建相应的面向对象模型;3. 学习使用顺序图描述对象之间的交互;4. 学习使用活动图为业务流程建模;5. 学习使用PowerDesigner实现正向工程和逆向工程。
二、实验内容1. 根据以下描述绘制类图,再正向工程生成Java源代码(也可生成其他面向对象语言的源代码,如C++或C#等):图形(Shape)可分为圆形(Circle)、矩形(Rectangle)、椭圆形(Ellipse)等具体图形,在Shape 类中提供了一个抽象的draw()方法用于绘制图形,而在具体的图形类中实现该抽象draw()方法。
提供一个图形工厂类(ShapeFactory),该类提供一个静态方法createShape(char type),其返回类型为Shape,参数type为所需绘制图形对应的代码,例如“c”表示圆形,“r”表示矩形,“e”表示椭圆形等,在createShape()方法中,可以使用条件语句来判断所需绘制图形的类型,并根据参数的不同返回不同的具体形状对象。
【注:“创建关系”是一种特殊的“依赖关系”】2. 根据以下描述绘制类图:某商场会员管理系统包含一个会员类(Member),会员的基本信息包括会员编号、会员姓名、联系电话、电子邮箱、地址等,会员可分为金卡会员(GoldMember)和银卡会员(SilverMember)两种,不同类型的会员在购物时可以享受不同的折扣;每个会员可以拥有一个或多个订单(Order),每一个订单又可以包含至少一条商品销售信息(ProductItem),商品销售信息包括订单编号、商品编号、商品数量、商品单价和折扣等;每一条商品销售信息对应一类商品(Product),商品信息包括商品编号、商品名称、商品单价、商品库存量、商品产地等。
计算机体系结构实验报告实验目的:1.掌握计算机体系结构的基本概念和组成部分2.学会使用模拟器对计算机性能进行测试和优化3.理解计算机指令的执行过程和流水线工作原理4.掌握计算机性能指标的测量方法和分析技巧实验材料和工具:1.一台个人电脑2.计算机体系结构模拟器3.实验指导书和实验报告模板实验步骤:1.搭建计算机系统:根据实验指导书提供的指导,我们搭建了一个简单的计算机系统,包括中央处理器(CPU)、内存和输入输出设备。
2.编写测试程序:我们编写了一段简单的测试程序,用于测试计算机系统的性能。
3.运行测试程序:我们使用模拟器运行测试程序,并记录测试结果。
模拟器可以模拟计算机的执行过程,并提供各种性能指标的测量功能。
4.分析和优化:根据测试结果,我们对计算机系统的性能进行分析,并尝试优化系统设计和测试程序,以提高性能。
实验结果:通过测试程序的运行和性能指标的测量,我们得到了如下结果:1.计算机的时钟频率:根据模拟器显示的结果,我们得知计算机的时钟频率为1000MHz。
2. 指令执行时间:我们计算了测试程序的平均执行时间,得到了结果为5ms。
4.流水线效率:我们通过模拟器提供的流水线分析功能,得到了计算机流水线的平均效率为80%。
实验分析:根据测试结果1.提高时钟频率:通过增加时钟频率可以加快计算机的运行速度。
我们可以尝试调整计算机硬件的设计和制造工艺,提高时钟频率。
2.优化指令执行过程:我们可以通过优化指令的执行过程,减少执行时间。
例如,并行执行多个指令、增加指令缓存等。
3.提高流水线效率:流水线是提高计算机性能的关键技术,我们可以通过增加流水线级数和优化流水线结构,提高流水线效率。
4.增加并行计算能力:并行计算是提高计算机性能的重要途径,我们可以尝试增加计算机的并行计算能力,例如增加处理器核心的数量。
实验总结:通过本次实验,我们深入了解了计算机体系结构的工作原理和性能指标。
通过模拟器的使用,我们学会了对计算机性能进行测试和进行性能优化的方法。
中南⼤学数据结构实验报告1(线性表)实验⼀线性表的操作算法⼀、实验⽬的:1了解线性表的逻辑结构和存储结构,以及定义在逻辑结构上的各种基本运算2分别以数组和链表为存储结构,实现线性表的插⼊,删除,查找,排序,合并等操作⼆、实验内容:⽤C/C++语⾔编写程序,分别以数组和链表为存储结构,完成以下功能:1输⼊数据,创建⼀个线性表2可在线性表的任意位置插⼊新结点3可删除线性表的任意⼀个结点4可在线性表中查找结点5将线性表从⼩⾄⼤排序6将两个线性表合并三、详细设计:顺序表#includeusing namespace std;#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define OVERFLOW -2typedef int Status;typedef int ElemType;#define LIST_INIT_SIZE 100#define LISTINCREMENT 10typedef struct { //结构体ElemType *elem;int length;int listsize;}SqList;SqList Lx;Status InitList_Sq(SqList &L) //分配空间{ L.elem=new ElemType[LIST_INIT_SIZE];if(!L.elem)exit(OVERFLOW);L.length =0;L.listsize=LIST_INIT_SIZE;return OK;}Status ListInsert(SqList &L,int i,ElemType e) //插⼊新元素{ int *q,*p;ElemType *newbase; if(i<1 || i>L.length+1) return ERROR;if(L.length>=L.listsize){ newbase=new ElemType[L.listsize+LISTINCREMENT];if(!newbase) exit(OVERFLOW);L.elem=newbase;L.listsize+=LISTINCREMENT;}q=&(L.elem[i-1]);for (p=&(L.elem[L.length-1]);p>=q;--p)*(p+1)=*p;*q=e;++L.length;return OK;}Status Listlength(SqList L) //长度{ int *p=L.elem; //判断线形表是否存在while(p){ return (L.length); }}Status GetElem(SqList L, int i,ElemType &e) //取元素{ if(i<1 || i>L.length)return ERROR;else{ e=L.elem[i-1];return e;}}void MergeList(SqList La,SqList Lb,SqList &Lc) //合并{ ElemType ai,bj;InitList_Sq(Lc);int i=1,j=1,k=0;int La_len,Lb_len;La_len=Listlength(La);Lb_len=Listlength(Lb);while((i<=La_len)&&(j<=Lb_len)){ GetElem(La,i,ai);GetElem(Lb,j,bj);if(ai<=bj){ ListInsert(Lc,++k,ai);++i; }else{ ListInsert(Lc,++k,bj);++j; }}while(i<=La_len){ GetElem(La,i++,ai);ListInsert(Lc,++k,ai);}while(j<=Lb_len){ GetElem(Lb,j++,bj);ListInsert(Lc,++k,bj);}}void show(SqList L,int i) //显⽰{ int j;ElemType k;cout<<"顺序表显⽰如下:"<for(j=0;j{ k=L.elem[j];cout<"; }if(j==i-1 && i>0){ k=L.elem[j]; cout<cout<}void create(SqList &L,int n) //输⼊元素{ int e; for(int i=0;i{ cin>>e;L.elem[i]=e;L.length=i+1; }}Status ListDelete_Sq(SqList &L,int i,ElemType &e) //删除{ ElemType *p, *q; if(i<1 || i>L.length) return ERROR;p=&(L.elem[i-1]);e=*p;q=L.elem+L.length-1;for(++p;p<=q;++p) *(p-1)=*p;--L.length;return OK;}Status Listxiugei(SqList &L,int i,ElemType &e) //修改{ if(i<1 || i>L.length) return ERROR;else{ L.elem[i-1]=e;return OK; }}void shuru(SqList &L1) //顺序表的创建{ int a;InitList_Sq(L1);cout<<"请输⼊顺序表的长度:";cin>>a;cout<<"请输⼊顺序表的元素(共"<create(L1,a);show(L1,a);}void shanchu(SqList &L1) //删除顺序表⾥的元素{ int a;int j; ElemType e1;a=L1.length;cout<<"请选择所要删除元素的位置:";cin>>j;while(j<0||j>Listlength(L1)){ cout<<"输⼊有误,请重新输⼊"<cout<<"请选择所要删除元素的位置:";cin>>j; }ListDelete_Sq(L1,j,e1);cout<<"修改后的顺序表数据:"<show(L1,a-1);}void charu(SqList &L1) //插⼊元素到顺序表⾥{ int a; int j; ElemType e1; a=L1.length;cout<<"请选择所要插⼊元素的位置:";cin>>j;while(j<0||j>Listlength(L1)){ cout<<"输⼊有误,请重新输⼊"<cout<<"请选择所要插⼊元素的位置:";cin>>j; }cout<<"要插⼊的元素:";cin>>e1;ListInsert(L1,j,e1);cout<<"修改后的顺序表数据:"<show(L1,a+1);}void hebing(SqList &L3) //合并两个顺序表{ SqList L1,L2;int a,b;InitList_Sq(L1); InitList_Sq(L2);cout<<"请输⼊第⼀个有序表的长度:"; cin>>a;cout<<"请输⼊第⼀个有序表的元素(共"<create(L1,a);show(L1,a);cout<<"请输⼊第⼆个有序表的长度:"; cin>>b;cout<<"请输⼊第⼆个有序表的元素(共"<create(L2,b);show(L2,b);MergeList(L1,L2,L3);cout<<"合并后的有序表如下:"; show(L3,a+b);}void main() //主菜单{ int choice;for(;;){ cout<<"顺序表的基本操作"<cout<<"1.顺序表的创建"<cout<<"2.顺序表的显⽰"<cout<<"3.顺序表的长度"<cout<<"4.插⼊元素到顺序表⾥"<cout<<"5.删除顺序表⾥的元素"<cout<<"6.合并两个顺序表"<cout<<"7.退出系统"<cout<<"请选择:";cin>>choice;switch(choice){ case 1: shuru(Lx);break;case 2: show(Lx,Lx.length);break;case 3: cout<<"顺序表的长度:"<case 4: charu(Lx);break;case 5: shanchu(Lx);break;case 6: hebing(Lx);break;case 7: cout<<"退出系统!"<default : cout<<"输⼊有误,请重新选择"< }}链表#includeusing namespace std;#define true 1#define false 0#define ok 1#define error 0#define overflow -2typedef int Status;typedef int ElemType;typedef struct LNode //存储结构{ ElemType data;struct LNode *next;}LNode,*LinkList;void CreateList(LinkList &L,int n) //尾插法创建单链表{ LinkList p;L=new LNode;L->next=NULL; //建⽴⼀个带头结点的单链表LinkList q=L; //使q指向表尾for(int i=1;i<=n;i++){ p=new LNode;cin>>p->data;p->next=NULL;q->next=p;q=p; }}Status GetElem(LinkList L,int i,ElemType &e)//取第i个元素{ LinkList p=L->next;int j=1;while(p&&j{ p=p->next;++j; }if(!p||j>i) return error; //第i个元素不存在e=p->data;return ok;}Status LinkInsert(LinkList &L,int i,ElemType e) //插⼊{ LinkList p=L;int j=0;while(p&&j{ p=p->next;++j; } //寻找第i-1个结点 if(!p||j>i-1)return error; //i⼩于1或者⼤于表长加1 LinkList s=new LNode; //⽣成新结点s->data=e;s->next=p->next; //插⼊L中p->next=s;return ok;}Status ListDelete(LinkList &L,int i,ElemType &e) // 删除{ LinkList p=L;LinkList q;int j=0;while(p->next&&j{ //寻找第i个结点,并令p指向其前驱 p=p->next;++j; }if(!(p->next)||j>i-1) return error; //删除位置不合理q=p->next;p->next=q->next; //删除并释放结点e=q->data;delete(q);return ok;}void MergeList(LinkList &La,LinkList &Lb,LinkList &Lc) { //合并两个顺序链表LinkList pa,pc,pb; pa=La->next;pb=Lb->next;Lc=pc=La;while(pa&&pb){ if(pa->data<=pb->data){ pc->next=pa;pc=pa;pa=pa->next; }else{ pc->next=pb;pc=pb;pb=pb->next; }}pc->next=pa?pa:pb;delete(Lb);}void show(LinkList L) //显⽰{ LinkList p;p=L->next;while(p){ cout<data<<"-->";p=p->next; }cout<}int Length(LinkList L,int i) //表长{ i=0;LinkList p=L->next;while(p){ ++i;p=p->next; }return i;}void xiugai(LinkList L) //修改{ int i,j=1;ElemType k;ElemType e,m;LinkList p=L->next;cout<<"请输⼊要修改的元素位置(0 cin>>i;GetElem(L,i,e);cout<<"该位置的元素:"<cout<<"修改后的元素值:";cin>>k;while(p&&j{ p=p->next;++j; }m=p->data;p->data=k;cout<<"修改后的单链表显⽰如下:"< show(L);}void hebing() //合并两个单链表{ int a,b;LinkList La,Lb,Lc;cout<<"请输⼊第⼀个有序链表的长度:"<cin>>a;cout<<"请输⼊第⼀个有序链表的元素共("< CreateList(La,a);show(La);cout<<"请输⼊第⼆个有序链表的长度:"< cin>>b;cout<<"请输⼊第⼆个有序链表的元素共("< CreateList(Lb,b);show (Lb);MergeList(La,Lb,Lc);cout<<"合并后的有序链表如下:"<show(Lc);}void main() //主函数{ int select;int x;ElemType y;LinkList list;for(;;){ cout<<"单链表的基本操作"<cout<<"1.单链表的创建"<cout<<"2.单链表的显⽰"<cout<<"3.单链表的长度"<cout<<"4.插⼊元素到单链表⾥"<cout<<"5.删除单链表⾥的元素"<cout<<"6.合并两个单链表"<cout<<"7.退出系统"<cout<<"请选择:";cin>>select;switch(select){ case 1:cout<<"请输⼊单链表的长度:"< cin>>x;cout<<"请输⼊"<CreateList(list,x);break;case 2: cout<<"单链表显⽰如下:"<show(list);break;case 3: int s;cout<<"单链表的长度为:"<break;case 4: cout<<"请选择要插⼊的位置:"; cin>>x; while(x<0||x>Length(list,s)){ cout<<"输⼊有误,请重新输⼊"<cout<<"请选择所要插⼊元素的位置:"; cin>>x; }cout<<"要插⼊的元素值:";cin>>y;LinkInsert( list,x,y);cout<<"插⼊后单链表显⽰如下:"<show(list);break;case 5: cout<<"请选择要删除的位置:"; cin>>x; while(x<0||x>Length(list,s)){ cout<<"输⼊有误,请重新输⼊"<cout<<"请选择所要删除元素的位置:"; cin>>x; }ListDelete(list,x,y);cout<<"要删除的元素值:"<cout<<"删除后的单链表显⽰如下:"<show(list);break;case 6: hebing();break;case 7: exit(0);break;default : cout<<"输⼊有误,请重新输⼊"< break;}}}四、实验结果:顺序表链表。
中南大学《计算机原理与汇编》实验报告学生姓名学号专业班级指导教师雷向东学院信息科学与工程学院完成时间 2010年12月实验2 算术逻辑运算实验一、实验目的1.掌握简单运算器的组成以及数据传送通路。
2.验证运算功能发生器(74LS181)的组合功能。
二、实验设备74LS181(两片),74LS273(两片), 74LS245(一片),开关若干,灯泡若干,单脉冲一片。
三、实验原理实验中的运算器由两片74LS181以并/串形式构成8位字长的ALU。
运算器的输出经过一个三态门(74LS245)和数据总线相连,运算器的两个数据输入端分别由两个锁存器(74LS373)锁存,锁存器的输入连至数据总线,数据开关用来给出参与运算的数据(A和B),并经过一个三态门(74LS245)和数据显示灯相连,显示结果。
74LS181:完成加法运算。
74LS273:输入端接数据开关,输出端181。
在收到上升沿的时钟信号前181和其输出数据线之间是隔断的。
在收到上升沿信号后,其将输出端的数据将传到181,同时,作为触发器,其也将输入的数据进行保存。
因此,通过增加该芯片,可以通过顺序输入时钟信号,将不同寄存器中的数据通过同一组输出数据线传输到181芯片的不同引脚之中。
74LS245:相当于181的输出和数据显示灯泡组件之间的一个开关,在开始实验后将其打开,可以使181的运算结果输出并显示到灯泡上。
四、实验步骤及结果分析1.选择实验设备:根据实验原理图,将所需要的组件从组件列表中拖到实验设计流程栏中。
图1 运算器实验流程图2.搭建实验流程:将已选择的组件进行连线(鼠标从一个引脚的端点拖动到另一组件的引脚端,即完成连线)。
搭建好的实验流程图如图1所示。
具体操作如下:①将74LS273芯片的0-7号引脚(数据端从低到高)及9号引脚(复位端)接到开关上,8号引脚接至单脉冲组件,左右两个74LS273芯片分别保存参与运算的数据A和B。
接着把两个74LS273组件的11-14号引脚(数据的低四位)分别接到74LS181组件(左)的0-7号引脚上,其中0-3号引脚为A的低四位,4-7号引脚为B的低四位。
CENTRAL SOUTH UNIVERSITY软件体系结构实验报告学生姓名周建权班级学号 0909121915指导教师穆帅设计时间2014年11月实验一系统的用例模型一、实验目的1.熟悉用例图的基本功能和使用方法。
2.锻炼结合给定题目,进行有效需求分析的能力。
3.掌握如何使用建模工具绘制用例图的方法。
二、实验器材1.计算机一台。
2.UML建模工具,比如软件Rational Rose 或StarUML。
三、实验内容在理解用例图的基本功能和使用方法的基础上,结合具体问题,完成对系统的需求建模,得到用例模型后,应针对每个用例进行业务分析,说明其具体的业务流程。
用Rational Rose或StarUML工具软件绘制系统的用例图.下文以Rational Rose为例讲解基本步骤。
四、实验步骤1.结合实际给定题目,完成系统的需求建模。
2.针对每个用例进行业务分析。
以图书管理系统中“删除读者信息"用例为例来说明实验具体步骤。
(1)分析:在图书管理系统中,管理员首先登录系统,系统验证通过后,管理方可向系统查询数据,在查询后,系统会给出提示,有没有找到相关的数据,管理员根据系统查询的返回结果,进行下一步的操作,就是删除读者,在删除的过程中,系统会对查询得到的结果判断该记录是否可以删除,若可以删除,则给删除提示,若不能删除,也给相关的提示信息。
(2)根据分析结果,书写业务流程,一般包含以下信息:①管理员在录入界面,输入待删除的读者名;②“业务逻辑”组件在数据库中,查找待删除的读者名;③如果不存在,则显示出错信息,返回步骤①,如果存在则继续;④“业务逻辑”组件判断“待删除的读者”是否可以删除;⑤如果不可以,则显示出错信息,返回步骤⑧,如果可以则继续;⑥在数据库中,删除相关信息;⑦显示删除成功信息;⑧结束。
3.根据分析结果,绘制用例图.以图书管理系统中“删除读者信息"用例为例说明具体绘图步骤:(1)在用例图上双击main,出现如图1。
实验3 创建型设计模式实验实验学时: 2每组人数: 1实验类型: 3 (1:基础性 2:综合性 3:设计性 4:研究性)实验要求: 1 (1:必修 2:选修 3:其它)实验类别: 3 (1:基础 2:专业基础 3:专业 4:其它)一、实验目的1.熟练使用面向对象设计原则对系统进行重构;2.熟练使用PowerDesigner和任意一种面向对象编程语言实现几种常见的创建型设计模式,包括简单工厂模式、工厂方法模式、抽象工厂模式和单例模式,理解每一种设计模式的模式动机,掌握模式结构,学习如何使用代码实现这些模式。
二、实验内容1.在某图形库API中提供了多种矢量图模板,用户可以基于这些矢量图创建不同的显示图形,图形库设计人员设计的初始类图如下所示:Circle+ + + + +init ()setColor ()fill ()setSize ()display ()...: void: void: void: void: voidTriangle+++++init ()setColor ()fill ()setSize ()display ()...: void: void: void: void: voidRectangle+++++init ()setColor ()fill ()setSize ()display ()...: void: void: void: void: voidClient在该图形库中,每个图形类(如Circle、Triangle等)的init()方法用于初始化所创建的图形, setColor()方法用于给图形设置边框颜色,fill()方法用于给图形设置填充颜色,setSize()方法用于设置图形的大小,display()方法用于显示图形。
客户类(Client)在使用该图形库时发现存在如下问题:①由于在创建窗口时每次只需要使用图形库中的一种图形,因此在更换图形时需要修改客户类源代码;②在图形库中增加并使用新的图形时需要修改客户类源代码;③客户类在每次使用图形对象之前需要先创建图形对象,有些图形的创建过程较为复杂,导致客户类代码冗长且难以维护。
实验1 UML实验(1)实验学时: 2每组人数: 1实验类型: 3 (1:基础性2:综合性3:设计性4:研究性)实验要求: 1 (1:必修2:选修3:其它)实验类别: 3 (1:基础2:专业基础3:专业4:其它)一、实验目的1.学会安装和使用建模工具PowerDesigner,熟练使用PowerDesigner绘制常用的UML 图形,熟悉常用的UML符号;2.构建用例模型来描述软件需求,包括绘制用例图,撰写用例文档并制作用例检查矩阵;3. 绘制状态图描述对象的状态及转换。
二、实验内容1. 某酒店订房系统描述如下:(1) 顾客可以选择在线预订,也可以直接去酒店通过前台服务员预订;(2) 前台服务员可以利用系统直接在前台预订房间;(3) 不管采用哪种预订方式,都需要在预订时支付相应订金;(4) 前台预订可以通过现金或信用卡的形式进行订金支付,但是网上预订只能通过信用卡进行支付;(5) 利用信用卡进行支付时需要和信用卡系统进行通信;(6) 客房部经理可以随时查看客房预订情况和每日收款情况。
绘制该酒店订房系统的用例图。
2. 根据以下场景绘制用例图:某企业为了方便员工用餐,为企业餐厅开发了一个订餐系统(COS:Cafeteria Ordering System),企业员工可通过企业内联网使用该系统。
该系统功能描述如下:(1) 企业的任何员工都可以查看菜单和今日特价;(2) 系统的顾客是注册到系统的员工,可以在线订餐(以下操作均需先登录)、注册工资支付、修改订餐信息和删除订餐信息,在注册工资支付时需要通过工资系统进行身份验证;(3) 餐厅员工是特殊的顾客,可以进行备餐(系统记录备餐信息)、生成付费请求和请求送餐,其中对于注册使用工资支付的顾客生成付费请求并发送给工资系统;(4) 菜单管理员是餐厅员工的一种,可以管理菜单;(5) 送餐员也是餐厅员工的一种,可以打印送餐说明、记录送餐信息(如送餐时间)以及记录收费(对于没有注册工资支付的顾客,由送餐员收取现金后记录)。
ECUST《计算机体系结构》实验报告专业计算机班级计071姓名xxx学号xxx成绩指导教师xxx计算机实验教学中心实验一一、实验名称FIFO先进先出存储器实验实验地点一教211 实验日期2010-5-25二、实验目的掌握FIFO 存储器的工作特性和读写方法。
三、实验设备PC 机一台,TD-CMX 实验系统一套。
四、实验原理本实验用FPGA 芯片来实现一个简单的8 位×4 的FIFO,本实验用FPGA 芯片来实现一个简单的8 位×4 的FIFO,器件的接口信号如图3-2-1,内部逻辑图如下图3-2-2。
其各信号的功能为:EMPTY:FIFO 存储器空标志,高电平有效。
FULL:FIFO 存储器满标志,高电平有效。
RST:清FIFO 存储器为空。
FIFOWR:FIFO 存储器写入信号,低电平有效。
FIFORD:FIFO 存储器读信号,低电平有效。
ID0~ID7:FIFO 存储器输入数据线。
OD0~OD7:FIFO 存储器输出数据线。
内部逻辑图设计的顶层原理图如下:五、实验操作及运行结果(1)按照上述功能要求及管脚说明,进行FPGA 芯片设计,其引脚电路图如图3-2-4 所示。
(2)关闭电源,按图3-2-5 实验连线图接线。
确保接线正确后打开实验系统的电源。
(3)编辑、编译所设计的程序,打开实验系统电源,将下载电缆插入FPGA 单元的JTAG 口,把生成的SOF 文件下载到FPGA 单元中去。
(4)接线图中B03 和B04 是FIFO 空状态、满状态指示信号,分别接到扩展单元指示灯E0、E1 上,用来反映FIFO 当前的状态。
注意:系统总清后FIFO 输出的数据是无效的,因为当FIFO 总清后,读计数器的输出被清零,此时多路开关选择输出C0 中的数据,而C0 中的数据是不确定的。
当第一次对FIFO 进行写操作后,FIFO 输出的数据开始有效。
简单的说,空标志位无效时,FIFO 的输出有效。
计算机体系结构实验报告实验⼆结构相关⼀、实验⽬的:通过本实验,加深对结构相关的理解,了解结构相关对CPU性能的影响。
⼆、实验内容:1. ⽤WinDLX模拟器运⾏程序structure_d.s 。
2. 通过模拟,找出存在结构相关的指令对以及导致结构相关的部件。
3. 记录由结构相关引起的暂停时钟周期数,计算暂停时钟周期数占总执⾏周期数的百分⽐。
4. 论述结构相关对CPU性能的影响,讨论解决结构相关的⽅法。
三、实验程序structure_d.sLHI R2, (A>>16)&0xFFFF 数据相关ADDUI R2, R2, A&0xFFFFLHI R3, (B>>16)&0xFFFFADDUI R3, R3, B&0xFFFFADDU R4, R0, R3loop:LD F0, 0(R2)LD F4, 0(R3)ADDD F0, F0, F4 ;浮点运算,两个周期,结构相关ADDD F2, F0, F2 ; <- A stall is found (an example of how to answeryour questions)ADDI R2, R2, #8ADDI R3, R3, #8SUB R5, R4, R2BNEZ R5, loop ;条件跳转TRAP #0 ;; Exit <- this is a comment !!A: .double 1, 2, 3, 4, 5, 6, 7, 8, 9, 10B: .double 1, 2, 3, 4, 5, 6, 7, 8, 9, 10四、实验过程打开软件,load structure_d.s⽂件,进⾏单步运⾏。
经过分析,此程序⼀次循环中共有五次结构相关。
(R-stall 数据相关Stall- 结构相关)1)第⼀个结构相关:addd f2,,f0,f2由于前⾯的数据相关,导致上⼀条指令addd f0,f0,f4暂停在ID阶段,所以下⼀条指令addd f2,,f0,f2发⽣结构相关,导致相关的部件:译码部件。
计算机体系结构实验报告——实验二1.实验目的:通过本实验,熟练掌握WinDLX模拟器的操作和使用,清楚WinDLX五段流水线在执行具体程序时的流水情况,熟悉DLX指令集结构及其特点。
2.实验内容:(1)用WinDLX模拟器执行程序gcm.s。
该程序从标准输入读入两个整数,求他们的greatest common measure,然后将结果写到标准输出。
该程序中调用了input.s中的输入子程序。
(2).给出两组数6、3和6、1,分别在main+0x8(add r2,r1,r0)、gcm.loop(seg r3,r1,r2)和result+0xc(trap0x0)设断点,采用单步和连续混合执行的方法完成程序,注意中间过程和寄存器的变化情况,然后单击主菜单execute/display dlx-i/0,观察结果。
3.实验程序求最大公约数程序:gcm.s;***********WINDLX Ex.1:Greatest common measure*************;------------------------------------------------------------------------;Program begins at symbol main;requires module INPUT;Read two positive integer numbers from stdin,calculate the gcm;and write the result to stdout;------------------------------------------------------------------------.data;***Prompts for inputPrompt1:.asciiz“First Number:”Prompt2:.asciiz“Second Number:“;***Data for printf-TrapPrintfFormat:.asciiz“gcM=%d\n\n”.align2PrintfPar:.word PrintfFormatPrintfValue:.space4.text.global mainmain:;***Read two positive integer numbers into R1and R2 addi r1,r0,Prompt1jal InputUnsigned;read uns.-integer into R1add r2,r1,r0;R2<-R1addi r1,r0,Prompt2jal InputUnsigned;read uns.-integer into R1Loop:;***Compare R1and R2seq r3,r1,r2;R1==R2?bnez r3,Resultsgt r3,r1,r2;R1>R2?bnez r3,r1Greaterr2Greater:;***subtract r1from r2sub r2,r2,r1j Loopr1Greater:;***subtract r2from r1sub r1,r1,r2j LoopResult:;***Write the result(R1)sw PrintfValue,r1addi r14,r0,PrintfPartrap5;***endtrap0该程序中调用了input.s中的输入子程序。
实验一流水线中的相关一.实验目的1. 熟练掌握WinDLX模拟器的操作和使用,熟悉DLX指令集结构及其特点;2. 加深对计算机流水线基本概念的理解;3. 进一步了解DLX基本流水线各段的功能以及基本操作;4. 加深对数据相关、结构相关的理解,了解这两类相关对CPU性能的影响;5. 了解解决数据相关的方法,掌握如何使用定向技术来减少数据相关带来的暂停。
二.实验平台WinDLX模拟器三.预备知识1. WinDLXWinDLX模拟器是一个图形化、交互式的DLX流水线模拟器,能够演示DLX流水线是如何工作的。
该模拟器可以装载DLX汇编语言程序(后缀为“.s”的文件),然后单步、设断点或是连续执行该程序。
CPU的寄存器、流水线、I/O和存储器都可以用图形表示出来,以形象生动的方式描述DLX流水线的工作过程。
模拟器还提供了对流水线操作的统计功能,便于对流水线进行性能分析。
有关WinDLX的详细介绍,见WinDLX教程。
2. 熟悉WinDLX指令集和WinDLX源代码的编写3. 复习和掌握教材中相应的内容(1)DLX基本流水线(2)流水线的结构相关与数据相关结构相关:当指令在重叠执行过程中,硬件资源满足不了指令重叠执行的要求,发生资源冲突时,将产生“结构相关”。
数据相关:当一条指令需要用到前面指令的执行结果,而这些指令均在流水线中重叠执行时,就可能引起“数据相关”。
(3)定向技术的主要思想:在发生数据相关时,等待前面计算结果的指令并不一定真的马上就用到该计算结果,如果能够将该计算结果从其产生的地方直接送到其他指令需要它的地方,就可以避免暂停。
四.实验内容及结果1. 用 WinDLX 模拟器执行下列三个程序(任选一个):求阶乘程序 fact.s求最大公倍数程序 gcm.s求素数程序 prim.s分别以步进、连续、设置断点的方式运行程序,观察程序在流水线中的执行情况,观察CPU 中寄存器和存储器的内容。
熟练掌握WinDLX 的操作和使用。
实验七1.需求分析本实验目的是使读者,掌握常用排序方法的基本思想,通过实验加深理解各种排序算法,通过实验掌握各种排序方法的时间复杂度分析,了解各种排序方法的优缺点及适用范围。
1.排序算法的实现(设计性实验)问题描述排序是计算机领域的一项重要技术,是程序设计中的一种重要运算。
它的功能是将一个数据元素的任意序列重新排列成一个按键有序的序列。
学习和研究各种排序方法是计算机工作者的一项重要工作课题。
基本要求随机产生n个整数(依次为n赋值100、200、300、1 000和2 000),将其存于数组A[1..n]中。
对主要算法(顺序查找、插入排序、归并排序、堆排序和快速排序)进行实验比较,计算出平均比较次数c n、平均移动次数m n及执行时间t n。
c n和m n由程序自动计算,t n由系统时间计算。
对实验结果数据进行对比分析。
测试数据由随机数生成器决定。
实现提示(1) 设计一个驱动程序,其任务是,随机输入一组原始数据A[1..n],对于查找还需准备一个键码值(可以随机产生,也可在A[1..n]中按索引号挑选若干有代表性的数据)。
对每组原始数据,分别调用查找或排序算法过程。
(2) 为了自动计算c n和m n需要在每个算法过程中的适当位置插入计数操作。
手工计算每个算法的执行时间t n时,为了减少计时误差,删除所插入的计数操作,并按n的大小确定一个K,对每个查找或排序算法过程反复调用K次,在调用开始前设置一个计时起点t0,在K次调用执行后可打印信息。
设计时的终点为t1,则(t1t0)/K便是算法的大致执行时间。
选作内容对不同的输入表长做试验,观察含义相同的变量相对于表长的变化关系,还可以对稳定性做验证。
2.统计成绩(综合性实验)问题描述给出n个学生的m门考试的成绩表,每个学生的信息由学号、姓名及各科成绩组成。
对学生的考试成绩进行有关统计,并打印统计表。
基本要求(1) 按总数高低次序,打印出名次表,分数相同的为同一名次。
实验4 结构型设计模式实验实验学时: 2每组人数: 1实验类型: 3 (1:基础性 2:综合性 3:设计性 4:研究性)实验要求: 1 (1:必修 2:选修 3:其它)实验类别: 3 (1:基础 2:专业基础 3:专业 4:其它)一、实验目的熟练使用PowerDesigner和任意一种面向对象编程语言实现几种常见的结构型设计模式,包括适配器模式、组合模式和外观模式,理解每一种设计模式的模式动机,掌握模式结构,学习如何使用代码实现这些模式。
二、实验内容1. 现有一个接口DataOperation定义了排序方法sort(int[]) 和查找方法search(int[], int),已知类QuickSort的quickSort(int[])方法实现了快速排序算法,类BinarySearch 的binarySearch(int[], int)方法实现了二分查找算法。
试使用适配器模式设计一个系统,在不修改源代码的情况下将类QuickSort和类BinarySearch的方法适配到DataOperation接口中。
绘制类图并编程实现。
(要求实现快速排序和二分查找,使用对象适配器实现)2. Windows Media Player和RealPlayer是两种常用的媒体播放器,它们的API结构和调用方法存在区别。
现在你的应用程序需要支持这两种播放器API,而且在将来可能还需要支持新的媒体播放器,请问如何设计该应用程序绘制类图并编程模拟实现。
3. 使用组合模式设计一个杀毒软件(AntiVirus)的框架,该软件既可以对某个文件夹(Folder)杀毒,也可以对某个指定的文件(File)进行杀毒,文件种类包括文本文件TextFile、图片文件ImageFile、视频文件VideoFile。
绘制类图并编程模拟实现。
4. 某教育机构组织结构如下图所示:在该教育机构的OA系统中可以给各级办公室下发公文,试采用组合模式设计该机构的组织结构,绘制相应的类图并编程模拟实现,在客户端代码中模拟下发公文。
计算机系统结构实验报告计算机系统结构实验报告一、引言计算机系统结构是计算机科学中的重要领域,它研究计算机硬件和软件之间的关系,以及如何设计和优化计算机系统的组成部分。
本实验旨在通过实际操作和观察,深入了解计算机系统结构的原理和实践应用。
二、实验目的本次实验的主要目的是通过搭建一个简单的计算机系统,实践理论知识,加深对计算机系统结构的理解。
具体目标包括:1. 学习和掌握计算机系统的基本组成部分,如中央处理器(CPU)、内存、输入输出设备等。
2. 理解计算机指令的执行过程,包括指令的获取、解码和执行。
3. 掌握计算机系统的性能评估方法,如时钟周期、吞吐量和响应时间等。
三、实验过程1. 搭建计算机系统首先,我们需要准备计算机系统的各个组成部分。
将中央处理器、内存、输入输出设备等逐一连接起来,确保它们能够正常工作。
然后,将操作系统安装到计算机系统中,以便后续的实验操作。
2. 执行指令在搭建好计算机系统后,我们可以开始执行指令了。
通过输入指令,计算机系统将按照指令的要求进行相应的操作。
我们可以观察指令的执行过程,包括指令的获取、解码和执行。
同时,我们还可以通过性能评估方法,如时钟周期、吞吐量和响应时间等,评估计算机系统的性能。
3. 优化计算机系统在观察和评估计算机系统的性能后,我们可以根据实验结果进行优化。
例如,我们可以调整计算机系统的硬件配置,提升计算机的运行速度和效率。
另外,我们还可以优化指令的执行顺序和算法,以提高计算机系统的整体性能。
四、实验结果与分析通过实验,我们可以得到计算机系统的性能数据,并进行相应的分析。
例如,我们可以计算计算机系统的时钟周期,以及每秒钟能够执行的指令数量。
通过对这些数据的分析,我们可以了解计算机系统的性能瓶颈,并采取相应的优化措施。
五、实验总结本次实验通过搭建计算机系统、执行指令、优化系统等步骤,深入了解了计算机系统结构的原理和实践应用。
通过实验,我们学习到了计算机系统的基本组成部分,以及指令的执行过程。
计算机体系结构实验报告第一篇:计算机体系结构概述计算机体系结构是计算机学科中的一个重要分支,它研究的是计算机的硬件组成和工作原理,包括计算机的处理器、存储器、输入输出设备、总线等。
计算机体系结构的研究可以帮助我们理解计算机的工作原理,优化计算机的性能,提升计算机的能力。
计算机体系结构可以分为两个方面:指令集体系结构和微体系结构。
其中,指令集体系结构是指计算机的操作系统能够直接识别和执行的指令集合,它们是应用程序的编程接口;而微体系结构是指通过硬件实现指令集合中的指令,在底层支持指令集合的操作。
指令集体系结构和微体系结构是密切相关的,因为指令集体系结构会影响微体系结构的设计和实现。
目前,计算机体系结构主要有三种类型:单处理器体系结构、多处理器体系结构和分布式计算体系结构。
其中,单处理器体系结构是指所有的指令和数据都存放在同一台计算机中,这种体系结构的优点是操作简单、易于管理,但是主频存在瓶颈,无法很好地发掘多核的性能优势;多处理器体系结构是指多个计算机共享同一块物理内存,因此可以方便地实现负载均衡和任务协作,但是存在通信延迟和数据一致性问题;分布式计算体系结构则是指通过互联网将多个计算机连接成一个网络,可以在全球范围内共享计算资源,但是通信成本和数据安全问题需要考虑。
总之,计算机体系结构是计算机学科中的重要分支,它研究计算机的硬件组成和工作原理,帮助我们理解计算机的工作原理,优化计算机性能,提升计算机能力。
第二篇:计算机指令集体系结构计算机指令集体系结构,简称ISA(Instruction Set Architecture),是指计算机能够识别和执行的指令集合。
ISA是计算机指令的编程接口,定义了一组指令和地址模式,以及寄存器和内存的组织方式,它是计算机软件和硬件协同工作的关键接口之一。
ISA可以分为两类:精简指令集体系结构(RISC,Reduced Instruction Set Computer)和复杂指令集体系结构(CISC,Complex Instruction Set Computer)。
计算机体系结构课程设计学院:信息科学与工程学院专业班级:指导老师:学号:姓名:.目录实验1 对指令操作码进行霍夫曼编码 (3)一、实验目的 (3)二、实验内容 (3)三、设计思路 (4)四、关键代码 (4)五、实验截图 (5)六、源代码 (5)实验2 使用LRU 方法更新Cache (8)一、实验目的 (8)二、实验内容 (8)三、设计思路 (9)四、程序截图 (9)五、实验代码 (9)实验总结 (16)参考文献 (16).实验1 对指令操作码进行霍夫曼编码一、实验目的了解和掌握指令编码的基本要求和基本原理二、实验内容1. 使用编程工具编写一个程序,对一组指令进行霍夫曼编码,并输出最后的编码结果以及对指令码的长度进行评价。
与扩展操作码和等长编码进行比较。
2. 问题描述以及问题分析举例说明此问题,例如:P1 P2 P3 P4 P5 P6 P70.45 0.30 0.15 0.05 0.03 0.01 0.01下表所示:对此组指令进行 HUFFMAN 编码正如下图所示:最后得到的HUFFMAN 编码如下表所示:最短编码长度为:H=0.45*1+0.30*2+0.15*3+0.05*4+0.03*5+0.01*6+0.01*6=-1.95.要对指令的操作码进行 HUFFMAN 编码,只要根据指令的各类操作码的出现概率构造HUFFMAN 树再进行 HUFFAM 编码。
此过程的难点构造 HUFFMAN 树,进行 HUFFAM 编码只要对你所生成的 HUFFMAN 树进行中序遍历即可完成编码工作。
三、设计思路观察上图,不难看出构造 HUFFMAN 树所要做的工作:1、先对各指令操作码的出现概率进行排序,构造一个有序链表。
2、再取出两个最小的概率节点相加,生成一个生的节点加入到链表中,同时从两表中删除此两个节点。
3、在对链表进行排序,链表是否只有一个节点,是则 HUFFAN 树构造完毕,否则继续做 2 的操作。
计算机系统结构专业实习报告一、实习背景与目的随着信息技术的快速发展,计算机系统结构作为一门涵盖了计算机硬件和软件等多个方面的学科,在我国的高等教育体系中占据了重要的地位。
为了更好地将理论知识与实践相结合,提高自身综合素质和实际操作能力,我选择了计算机系统结构专业实习,以便为今后的学术研究和职业生涯打下坚实基础。
本次实习的主要目的是:1. 深入了解计算机系统结构的基本原理和组成部件;2. 熟悉各类计算机硬件设备的工作原理和性能指标;3. 掌握计算机系统组装、维护和调试的基本技能;4. 提高团队协作能力和沟通交流能力。
二、实习内容与过程1. 实习前的准备在实习开始前,我们参加了由指导老师举办的实习动员大会,了解了实习的要求、内容以及注意事项。
同时,我们还自学了相关教材和资料,为实习打下了理论知识基础。
2. 实习过程中的主要任务与收获实习过程中,我们主要完成了以下任务:1. 参观实验室和机房,了解各类计算机硬件设备及其功能;2. 学习计算机系统组装、维护和调试的基本技能;3. 参与实验室科研项目,协助导师进行数据分析和实验验证;4. 撰写实习日记和总结报告,记录实习过程中的所学所得。
具体收获如下:1. 熟悉了计算机系统结构的基本原理和组成部件,如CPU、内存、硬盘、显卡等;2. 掌握了计算机系统组装、维护和调试的基本技能,如安装操作系统、配置网络、排查故障等;3. 了解了实验室科研项目的工作流程,提高了科研素养;4. 增强了团队协作能力和沟通交流能力。
3. 实习中遇到的困难与解决方案在实习过程中,我们遇到了一些困难,如:1. 部分硬件设备的原理和操作较为复杂,一开始难以掌握;2. 实验室科研项目中的某些技术问题需要花费较长时间解决;3. 实习任务较重,时间紧张,难以兼顾学业与实习。
针对上述困难,我们采取了以下解决方案:1. 请教老师和同学,共同探讨,逐步掌握硬件设备的原理和操作;2. 利用课余时间深入学习相关技术,提高解决问题的能力;3. 合理安排时间,加强与团队成员的沟通,提高团队协作效率。
实验3 设计模式实验二实验学时: 4每组人数: 1实验类型: 3 (1:基础性2:综合性3:设计性4:研究性)实验要求: 1 (1:必修2:选修3:其它)实验类别: 3 (1:基础2:专业基础3:专业4:其它)一、实验目的熟练使用PowerDesigner和任意一种面向对象编程语言实现几种常见的行为型设计模式,包括职责链模式、命令模式、观察者模式和策略模式,理解每一种设计模式的模式动机,掌握模式结构,学习如何使用代码实现这些模式。
二、实验内容1. 某企业的SCM(Supply Chain Management,供应链管理)系统中包含一个采购审批子系统。
该企业的采购审批是分级进行的,即根据采购金额的不同由不同层次的主管人员来审批,主任可以审批5万元以下(不包括5万元)的采购单,副董事长可以审批5万元至10万元(不包括10万元)的采购单,董事长可以审批10万元至50万元(不包括50万元)的采购单,50万元及以上的采购单就需要开董事会讨论决定。
如下图所示:采购人员主任副董事长董事长董事会金额<5万元5万元≤金额<10万元10万元≤金额<50万元金额≥50万元试使用职责链模式设计并模拟实现该系统。
2. 房间中的开关是命令模式的一个实例,现用命令模式来模拟开关的功能,可控制对象包括电灯和电风扇,绘制相应的类图并编程模拟实现。
3. 某软件公司欲开发一个基于Windows平台的公告板系统。
系统提供一个主菜单(Menu),在主菜单中包含了一些菜单项(MenuItem),可以通过Menu类的addMenuItem()方法增加菜单项。
菜单项的主要方法是click(),每一个菜单项包含一个抽象命令类,具体命令类包括OpenCommand(打开命令),CreateCommand(新建命令),EditCommand(编辑命令)等,命令类具有一个execute()方法,用于调用公告板系统界面类(BoardScreen)的open()、create()、edit()等方法。
中南大学计算机网络——课程设计报告姓名:周建权学号:0909122820班级:信安1202目录第一章概要设计 (3)1.1设计目的、任务与要求 (3)1.2 开发环境简介 (3)第二章设计的基本概念和原理 (5)2.1 数据库 (5)2.2 MVC架构模式 (5)2.3 Web应用服务器 (6)第三章系统分析设计 (6)3.1 系统功能 (6)3.2 系统构架 (7)第四章系统实现 (9)4.1 数据库设计 (9)4.2 系统公共模块设计 (11)4.3 前台销售模块详细设计 (12)4.4 后台管理模块详细设计 (14)第五章完成情况 (15)5.1前台基本功能界面 (15)5.2后台基本功能界面 (20)第六章使用说明 (22)6.1网站访问方式 (22)第七章总结 (22)第八章参考文献 (22)第一章概要设计1.1设计目的、任务与要求电子商务(Electronic Commerce)是在Internet开放的网络环境下,基于浏览器/服务器应用方式,实现消费者的网上购物、商户之间的网上交易和在线电子支付的一种新型的商业运营模式。
Internet上的电子商务可以分为三个方面:信息服务、交易和支付。
主要内容包括:电子商情广告;电子选购和交易、电子交易凭证的交换;电子支付与结算以及售后的网上服务等。
主要交易类型有企业与个人的交易(B to C方式)和企业之间的交易(B to B方式)两种。
参与电子商务的实体有四类:顾客(个人消费者或企业集团)、商户(包括销售商、制造商、储运商)、银行(包括发卡行、收单行)及认证中心。
电子商务是Internet 爆炸式发展的直接产物,是网络技术应用的全新发展方向。
Internet本身所具有的开放性、全球性、低成本、高效率的特点,也成为电子商务的内在特征,并使得电子商务大大超越了作为一种新的贸易形式所具有的价值,它不仅会改变企业本身的生产、经营、管理活动,而且将影响到整个社会的经济运行与结构。
计算机体系结构课程设计学院:信息科学与工程学院专业班级:指导老师:学号:姓名:目录实验1 对指令操作码进行霍夫曼编码 (3)一、实验目的 (3)二、实验内容 (3)三、设计思路 (4)四、关键代码 (4)五、实验截图 (5)六、源代码 (5)实验2 使用LRU 方法更新Cache (8)一、实验目的 (8)二、实验内容 (8)三、设计思路 (9)四、程序截图 (9)五、实验代码 (9)实验总结 (16)参考文献 (16)实验1 对指令操作码进行霍夫曼编码一、实验目的了解和掌握指令编码的基本要求和基本原理二、实验内容1. 使用编程工具编写一个程序,对一组指令进行霍夫曼编码,并输出最后的编码结果以及对指令码的长度进行评价。
与扩展操作码和等长编码进行比较。
2. 问题描述以及问题分析举例说明此问题,例如:下表所示:对此组指令进行 HUFFMAN 编码正如下图所示:最后得到的HUFFMAN 编码如下表所示:最短编码长度为:H=0.45*1+0.30*2+0.15*3+0.05*4+0.03*5+0.01*6+0.01*6=-1.95.要对指令的操作码进行 HUFFMAN 编码,只要根据指令的各类操作码的出现概率构造HUFFMAN 树再进行 HUFFAM 编码。
此过程的难点构造 HUFFMAN 树,进行 HUFFAM 编码只要对你所生成的 HUFFMAN 树进行中序遍历即可完成编码工作。
三、设计思路观察上图,不难看出构造 HUFFMAN 树所要做的工作:1、先对各指令操作码的出现概率进行排序,构造一个有序链表。
2、再取出两个最小的概率节点相加,生成一个生的节点加入到链表中,同时从两表中删除此两个节点。
3、在对链表进行排序,链表是否只有一个节点,是则 HUFFAN 树构造完毕,否则继续做 2 的操作。
为此设计一个工作链表(链表的元素时类,此类的功能相当结构。
)、HUFFMAN 树节点、HUFFMAN 编码表节点。
四、关键代码哈夫曼树重点在于如何排列权值大小不同的结点的顺序private int leafNum; //叶子结点个数 private HaffmanNode[] hnodes; //哈夫曼树的结点数组public HaffManCode(double[] weight) //构造指定权值集合的哈夫曼树 {int n = weight.length; //n个叶子结点 this.leafNum = n;this.hnodes = new HaffmanNode[2*n-1]; //n个叶子结点的哈夫曼树共有2n-1个结点for(int i=0; i<n; i++) //结点数组初始化有n个叶子结点 this.hnodes[i] = new HaffmanNode(weight[i]);for(int i=0; i<n-1; i++) //构造n-1个2度结点,每循环一次,构造一个2度结点 { double min1, min2; int x1, x2;min1 = min2 = Integer.MAX_VALUE; //选择最小和次最小权值,初值为最大权值x1 = x2 = -1; //记录两个无父母的最小权值结点下标 for(int j=0; j<n+i; j++) //查找两个无父母的最小权值结点 {if(hnodes[j].weight<min1 && hnodes[j].parent==-1) {min2 = min1; x2 = x1;min1 = hnodes[j].weight; //min1记下最小权值x1 = j; //x1记下最小权值结点的下标 }else if(hnodes[j].weight<min2 && hnodes[j].parent==-1) {min2 = hnodes[j].weight;x2 = j; //x2记下次最小权值结点的下标}}五、实验截图六、源代码public class huffman {private String str;public huffman(String str){this.str=str;}/*** 创建节点类* @param args*/class Node{Node left;Node right;int data;char c;String code="";}/*** 节点数组(字符串类)* @param args*/public void creatTree(){//先去掉重复的字符串,若不存在将字符加在strRepeat中String strRepeat="";for(int i=0;i<str.length();i++){char c=str.charAt(i);//判断是否存在if(strRepeat.indexOf(c)==-1){ //找到字符位置并返回字符所在的位置strRepeat+=c;}}//统计字符出现的次数并建立节点Node[] nodes=new Node[strRepeat.length()]; //定义了一个nodes数组//存储节点的坐标值int s=0;for(int i=0;i<strRepeat.length();i++){char c=strRepeat.charAt(i);int count=getCount(str,c); //c在string中出现的次数Node node=new Node();node.data=count;node.c=c;nodes[s++]=node;}//创建哈弗曼树while(nodes.length>1){sort(nodes);Node node=new Node();Node n1=nodes[0];Node n2=nodes[1];node.data=n1.data+n2.data;node.left=n1;node.right=n2;//改变节点数组长度Node[] nodes2=new Node[nodes.length-1];for(int i=2;i<nodes.length;i++){nodes2[i-2] = nodes[i];}nodes2[nodes2.length-1]=node;nodes=nodes2;}Node root=nodes[0];printCode(root,"");}/*** 统计字符出现的次数get方法*/private int getCount(String str,char c){int count = 0;for(int i=0;i<str.length();i++){if(c==str.charAt(i))count++;}return count;}/*** 冒泡排序法* @param nodes*/public void sort(Node[] nodes){for(int i=0;i<nodes.length;i++){for(int j=i+1;j<nodes.length;j++){if(nodes[i].data>=nodes[j].data){//交换节点对象Node temp=nodes[i];nodes[i]=nodes[j];nodes[j]=temp;}}}}/*** 打印编码* @param args*/public void printCode(Node node,String code){if(node != null){if(node.left==null && node.right==null)System.out.println(node.c+"..."+node.data+"的编码是:"+code);printCode(node.left,code+""+0);printCode(node.right,code+""+1);}}public static void main(String[] args) {String str="add bate";huffman hf=new huffman(str);hf.creatTree();}}实验2 使用LRU 方法更新Cache 一、实验目的了解和掌握寄存器分配和内存分配的有关技术。
二、实验内容LRU置换算法是选择最近最久未使用的页面予以置换。
该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来经历的时间T,当须淘汰一个页面时,选择现有页面中T值最大的,即最近最久没有访问的页面。
这是一个比较合理的置换算法。
举例说明此问题,例如:有一个CACHE采用组相连映象方式。
每组有四块,为了实现LRU置换算法,在快表中为每块设置一个2位计数器。
我们假设访问序列为“1,1,2,4,3,5,2,1,6,7,1,3”。
在访问CACHE的过程中,块的装入,置换及命中时,具体情况如下表所示:三、设计思路LRU 置换算法是选择最近最久未使用的页面予以置换。
该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来经历的时间T,当须淘汰一个页面时,选择现有页面中T 值最大的,即最近最久没有访问的页面。
这是一个比较合理的置换算法。
四、程序截图五、实验代码import java.awt.*;import java.awt.event.*;import javax.swing.*;import javax.swing.table.*;public class lru extends Frame {public static void main(String[] args) {JFrame.setDefaultLookAndFeelDecorated(true);lru lruc = new lru();uchFrame();}JLabel jlabel2;JTextField jtf2;JButton jb_input;JScrollPane jsp;JTable jt;DefaultTableModel dtm;static int list = 1, count = list - 1;int time1 = 0;int time2 = 0;int time3 = 0;int time4 = 0;public void lauchFrame() {this.setLayout(null);this.setBounds(100, 100, 540, 320);//this.setBackground(Color.cyan);this.setVisible(true);jlabel2 = new JLabel("请输入第" + list + "个访问页面:");jtf2 = new JTextField();jb_input = new JButton("输入");jlabel2.setBounds(20, 50, 140, 20);jtf2.setBounds(155, 50, 50, 20);jb_input.setBounds(240, 50, 60, 20);this.add(jlabel2);this.add(jtf2);this.add(jb_input);this.addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e) {System.exit(0);}});jb_input.addActionListener(new InputActionListener());Object[] title = {"访问序列","Cache块0", "Cache块1", "Cache块2", "Cache块3", "状态"};dtm = new DefaultTableModel(title, 0);jt = new JTable(dtm);jsp = new JScrollPane(jt);jsp.setBounds(50, 80, 440, 197);jsp.setBackground(Color.black);this.add(jsp);}class InputActionListener implements ActionListener { //没有输入值,提示public void actionPerformed(ActionEvent e) {if(jtf2.getText().equals("")) {Object[] options = { "OK" };JOptionPane.showOptionDialog(null, "输入错误,请按提示输入!", "警告",JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE,null, options, options[0]);}list++;if(count < 4) {//count记录装入cache块的页面数switch(count) {case 0://cache块中没有装入页面的情况dtm.addRow(new Object[]{jtf2.getText(), jtf2.getText(), "", "", "", "装入"});time2++;time3++;time4++;count++;jtf2.setText("");jlabel2.setText("请输入第" + list + "个访问页面:");break;case 1://cache块中装入一个页面的情况if(jtf2.getText().equals(jt.getValueAt(list-3, 1))) {//要访问的页面刚好在cache0中dtm.addRow(new Object[]{jtf2.getText(),jt.getValueAt(list-3, 1), "", "", "", "命中"});time2++;time3++;time4++;jtf2.setText("");jlabel2.setText("请输入第" + list + "个访问页面:");} else {//要访问的页面不在cache块中dtm.addRow(new Object[]{jtf2.getText(),jt.getValueAt(list-3, 1), jtf2.getText(), "", "", "装入"});time1++;time2 = 0;time3++;time4++;count++;jtf2.setText("");jlabel2.setText("请输入第" + list + "个访问页面:");}break;case 2://cache块中装入两个页面的情况if(jtf2.getText().equals(jt.getValueAt(list-3, 1))) {//要访问的页面刚好在cache0中dtm.addRow(new Object[]{jtf2.getText(),jt.getValueAt(list-3, 1), jt.getValueAt(list-3, 2), "", "", "命中"});time1 =0;time2++;time3++;time4++;jtf2.setText("");jlabel2.setText("请输入第" + list + "个访问页面:");} else if(jtf2.getText().equals(jt.getValueAt(list-3, 2))) {//要访问的页面刚好在cache1中dtm.addRow(new Object[]{jtf2.getText(),jt.getValueAt(list-3, 1), jt.getValueAt(list-3, 2), "", "", "命中"});time1++;time2 = 0;time3++;time4++;jtf2.setText("");jlabel2.setText("请输入第" + list + "个访问页面:");} else {//要访问的页面不在cache块中dtm.addRow(new Object[]{jtf2.getText(),jt.getValueAt(list-3, 1), jt.getValueAt(list-3, 2), jtf2.getText(), "", "装入"});time1++;time2++;time3 =0;time4++;count++;jtf2.setText("");jlabel2.setText("请输入第" + list + "个访问页面:");}break;case 3://cache块中装入三个页面的情况if(jtf2.getText().equals(jt.getValueAt(list-3, 1))) {//要访问的页面刚好在cache0中dtm.addRow(new Object[]{jtf2.getText(),jt.getValueAt(list-3, 1), jt.getValueAt(list-3, 2), jt.getValueAt(list-3, 3), "", "命中"});time1 = 0;time2++;time3++;time4++;jtf2.setText("");jlabel2.setText("请输入第" + list + "个访问页面:");} else if(jtf2.getText().equals(jt.getValueAt(list-3, 2))) {//要访问的页面刚好在cache1中dtm.addRow(new Object[]{jtf2.getText(),jt.getValueAt(list-3, 1), jt.getValueAt(list-3, 2), jt.getValueAt(list-3, 3), "", "命中"});time1++;time2 =0;time3++;time4++;jtf2.setText("");jlabel2.setText("请输入第" + list + "个访问页面:");} else if(jtf2.getText().equals(jt.getValueAt(list-3, 3))) {//要访问的页面刚好在cache2中dtm.addRow(new Object[]{jtf2.getText(),jt.getValueAt(list-3, 1), jt.getValueAt(list-3, 2), jt.getValueAt(list-3, 3), "", "命中"});time1++;time2++;time3 = 0;time4++;jtf2.setText("");jlabel2.setText("请输入第" + list + "个访问页面:");}else {//要访问的页面不在cache块中dtm.addRow(new Object[]{jtf2.getText(),jt.getValueAt(list-3, 1), jt.getValueAt(list-3, 2), jt.getValueAt(list-3, 3),jtf2.getText(), "装入"});time1++;time2++;time3++;time4 = 0;count++;jtf2.setText("");jlabel2.setText("请输入第" + list + "个访问页面:");}break;}} else {//四个cache块都装满的情况if(jtf2.getText().equals(jt.getValueAt(list-3, 1))) {//要访问的页面刚好在cache0中dtm.addRow(new Object[]{jtf2.getText(), jt.getValueAt(list-3, 1), jt.getValueAt(list-3, 2), jt.getValueAt(list-3, 3), jt.getValueAt(list-3, 4), "命中"});System.out.println(1);time1 = 0;time2++;time3++;time4++;jtf2.setText("");jlabel2.setText("请输入第" + list + "个访问页面:");} else if(jtf2.getText().equals(jt.getValueAt(list-3, 2))) {//要访问的页面刚好在cache1中dtm.addRow(new Object[]{jtf2.getText(), jt.getValueAt(list-3, 1), jt.getValueAt(list-3, 2), jt.getValueAt(list-3, 3), jt.getValueAt(list-3, 4), "命中"});System.out.println(2);time1++;time2 = 0;time3++;time4++;jtf2.setText("");jlabel2.setText("请输入第" + list + "个访问页面:");} else if(jtf2.getText().equals(jt.getValueAt(list-3, 3))) {//要访问的页面刚好在cache2中dtm.addRow(new Object[]{jtf2.getText(), jt.getValueAt(list-3, 1), jt.getValueAt(list-3, 2), jt.getValueAt(list-3, 3), jt.getValueAt(list-3, 4), "命中"});System.out.println(3);time1++;time2++;time3 = 0;time4++;jtf2.setText("");jlabel2.setText("请输入第" + list + "个访问页面:");} else if(jtf2.getText().equals(jt.getValueAt(list-3, 4))) {//要访问的页面刚好在cache3中dtm.addRow(new Object[]{jtf2.getText(), jt.getValueAt(list-3, 1), jt.getValueAt(list-3, 2), jt.getValueAt(list-3, 3), jt.getValueAt(list-3, 4), "命中"});System.out.println(4);time1++;time2++;time3++;jtf2.setText("");jlabel2.setText("请输入第" + list + "个访问页面:");}else {//要访问的页面不在cache块中if(time1>time2 && time1>time3 && time1>time4) {//如果cache0的页面最长时间没有被访问,新页面置换cache0中页面dtm.addRow(new Object[]{jtf2.getText(), jtf2.getText(),jt.getValueAt(list-3, 2), jt.getValueAt(list-3, 3), jt.getValueAt(list-3, 4), "置换"});time1 = 0;time2++;time3++;time4++;jtf2.setText("");jlabel2.setText("请输入第" + list + "个访问页面:");} else if(time2>time1&& time2>time3&& time2>time4) {//如果cache1的页面最长时间没有被访问,新页面置换cache1中页面dtm.addRow(new Object[]{jtf2.getText(),jt.getValueAt(list-3, 1), jtf2.getText(), jt.getValueAt(list-3, 3),jt.getValueAt(list-3, 4), "置换"});time1++;time2 = 0;time3++;time4++;jtf2.setText("");jlabel2.setText("请输入第" + list + "个访问页面:");} else if(time3>time1&& time3>time2&& time3>time4) {//如果cache2的页面最长时间没有被访问,新页面置换cache2中页面dtm.addRow(new Object[]{jtf2.getText(),jt.getValueAt(list-3, 1), jt.getValueAt(list-3, 2), jtf2.getText(),jt.getValueAt(list-3, 4), "置换"});time1++;time2++;time3 = 0;time4++;jtf2.setText("");jlabel2.setText("请输入第" + list + "个访问页面:");} else if(time4>time1&& time4>time2&& time4>time3) {//如果cache3的页面最长时间没有被访问,新页面置换cache3中页面dtm.addRow(new Object[]{jtf2.getText(),jt.getValueAt(list-3, 1), jt.getValueAt(list-3, 2), jt.getValueAt(list-3, 3),jtf2.getText(), "置换"});time1++;time2++;time4 = 0;jtf2.setText("");jlabel2.setText("请输入第" + list + "个访问页面:");}}}}}}实验总结体系结构属于计算机整个的结构,涉及计算机的整个结构,从底层到高层,每层的原理,结构及实现,是一门比较抽象的学科,通过这次的几个实验,让我对计算机的编码和页面的替换算法有了更深层次的理解。