当前位置:文档之家› 稀疏一元多项式运算器 实验报告 附源程序

稀疏一元多项式运算器 实验报告 附源程序

稀疏一元多项式运算器 实验报告 附源程序
稀疏一元多项式运算器 实验报告 附源程序

信息学院12级杨征元PB12210247 13.10.25

稀疏一元多项式运算器

问题描述:完成一元稀疏多项式运算器,完成多项式创建,显示,复制,求和,求差,求值,销毁,清空,修改,n阶微分,不定积分,定积分操作。函数功能描述如下:

稀疏一元多项式运算器

0.退出退出

1.创建多项式创建并打印

2.显示多项式打印

3.复制多项式复制多项式a至空域b,非空报错

4.求和输入abc位置,c=a+b

5.求差输入abc位置,c=a-b

6.求值输入位置,double x,输出double result

7.销毁多项式销毁,使p[i]为NULL

8.清空多项式清空保留头指针,输出为0

9.修改多项式选择插入,删除,修改(删了再插)

10.n阶微分输入微分位置,阶数,结果存放于原位置

11.不定微分输入积分位置,不定积分,常数C取0

12.定微分输入积分位置,上下限值,输出定积分结果

算法描述:通过主菜单调用函数完成各项功能,函数描述见程序结构描述部分。

数据结构描述:多项式每一项结点定义如下:

typedef struct lnode{

double coef;

int exp;

struct lnode* next;

}lnode,*linklist;

包含指向下一结点指针linklist next,存储系数的数据单元double coef,存储指数的数据单元int exp;结点名lnode,指向结点指针linklist。

每一个多项式由头指针引出,头指针数组lnode* p[N]。每一个单元存储一多项式头指针。当多项式不存在,p[i]=NULL;多项式为空,p[i]->next=NULL,即只存在头指针。

操作函数见程序结构描述部分。

程序结构描述:

函数包括创建结点函数,有序插入函数,打印函数,创建多项式函数,多项式清空函数,多项式销毁函数,求值函数,求和函数,求差函数,复制函数,删除结点函数,修改函数,n 阶微分函数,不定积分函数。对函数原型,功能,借口逐一描述如下:

1.创建结点函数

函数原型:linklist makenode(double coef, int exp)

输入double型系数项,int型指数项,创建lnode结点,返回指向结点的linklist指针。

功能:创建新结点,在复制函数以及输入系数指数插入结点时(修改多项式)

调用。

2.有序插入函数

函数原型:void insert(linklist phead,linklist head)

输入插入结点指针phead以及多项式头指针head,无返回值

功能:新结点phead有序插入头结点为head的多项式内(按指数项降序排列),在创

建,复制,修改函数中调用。

3.打印函数

函数原型:void printlinklist(linklist phead)

输入待打印多项式头指针phead,无返回值

分别打印系数项和指数项,打印系数项是使用%g输入取消无效0,通过特殊情况讨论(如exp=0,exp=1,首项的加号等情况),使多项式输出符合书写习惯。

功能:打印多项式

4.创建多项式

函数原型:linklist creatlist()

返回创建多项式头指针,调用时先在主函数中输入该多项式头指针在头指针数组中位置。

实现:先若该位置无多项式,申请头结点,之后新建数据结点,有序插入头结点对应多项式。

5.清空多项式

函数原型:void linklistclear(linklist head)

输入待清空多项式头结点,无返回值,将p[i]仅保留头结点。

实现:用前后两指针,遍历多项式并逐一删去结点,最后将头指针的next域置NULL。6.销毁多项式

函数原型:void linklistdestroy(linklist &head)

输入待销毁多项式头结点,无返回值,将p[i]置NULL

实现方法类似清空,删去包括head在内结点。

7.多项式求值

函数原型:double linklistvalue(linklist head,double x)

输入待求多项式头结点,变量x值double x,返回double型结果

实现:通过exp求每一项权重,与系数coef相乘,最后累加所有结果。

8.多项式求和

函数原型:void linklistadd(linklist ahead,linklist bhead,linklist &chead)

输入相加两多项式a,b头指针以及输出位置c,无返回值

实现:通过pa,pb遍历a,b,新建c结点对比当前位置a,b exp大小,分别做对应赋值,之后将c结点插入c多项式中(*当c新结点系数为0时不进行插入)

9.多项式求差

函数原型:void linklistsub(linklist ahead,linklist bhead,linklist &chead)

输入相减两多项式a,b头指针以及输出位置c,无返回值

实现完全与求和相同

10.多项式复制

函数原型:linklist linklistcopy(linklist a)

输入待复制多项式头指针linklist a,输出复制结果指针linklist。

遍历多项式a,读取每一结点coef,exp值,调用makenode函数创建新结点,插入多项式b,返回b头指针head。

11.删除多项式中一节点

函数原型:int linklistdelete(linklist head, int m)

输入待删除多项式头指针linklist head,待删除项指数值int m,成功返回1,反之-1 删除head中一指数为m项,修改函数中调用

实现:遍历多项式,若指数项系数为m,free(p)

12.修改多项式

函数原型:void linklistmodify(linklist head)

输入待修改多项式头指针linklist head,无返回值

调用函数时输入1,2,3选择插入结点,删除结点,修改结点操作(删除后插入),分别调用delete函数及insert函数实现。

13.微分

函数原型:void linklistdiff(linklist &head)

输入待微分多项式头指针linklist head,按照求导规则逐项修改系数,指数,并对原常数项结点进行删除操作。实现N阶微分是在主函数中n次调用即可。

14.不定积分

函数原型:void iteintegral(linklist head)

输入多项式头指针linklist head,无返回值

按多项式积分规则逐项修改系数,指数,对不定积分中C取0。

实现定积分是同时调用不定积分函数与求值函数即可。

算法时空分析:无复杂嵌套,均一次遍历即可,对多项式操作复杂度均为O(N)数量级。

调试及结果分析:

选择键面:

创建多项式:

创建并打印,指数为0结束

显示多项式:

判断第一项前不输出+,指数正负1,0修改输出格式

复制多项式:

求和:

说明:为测试一个多项式先加完的情况,选择b多项式指数项系数大于a,在未修改前因访问b->exp,而b=NULL报错。修改分情况讨论。

求差:

求值:

销毁:

清空:

修改:

n阶微分:

验证删除常数项微分功能,选择该实验数据不定积分:

定积分:

遍历每个函数验证可行,一些特殊分支的测试函数不予以列出,调试时主要解决一些健壮性问题以及一些未考虑周全的方面。

实验体会和收货:

1.实验中大部分函数思路较为简单,但存在大量细节问题。如打印多项式中,系数的无效

0去除,打印结果与正常书写习惯的符合性;add函数中某多项式先插完的极端情况;

加减函数中结果为0项的删除;主函数中输入位置i合法性检查等。完善其在各种极端情况下的健壮性很多时候更为耗时,但却是必须的。

2.在写较大函数时应进行分块。本实验完成时,我采取了完成create,print函数后逐一写运

算函数的方法,尽管在单个函数调试时并未有明显障碍,但给之后调用和阅读带来极大不便,以后需要避免。

3.处理这类问题时,最复杂的步骤往往是确定和建立数据结构,本次完成实验的很大一部

分时间花在了基础函数(create,insert,print)的完成上,而非简单的运算函数。

4.测试数据选择需加以仔细思考一方面是有些数据可同时测试多路,提高效率,更重要的

是很多极端情况只有特定函数才能完成测试。

#include

#include

#include

typedef struct lnode{

double coef;

int exp;

struct lnode* next;

}lnode,*linklist;

#define N 20

lnode* p[N]={NULL}; //p[]初始化

linklist makenode(double coef, int exp)

{ //构造结点

linklist p;

p=(linklist)malloc(sizeof(struct lnode));

if(!p) return false;//分配失败

p->coef=coef;p->exp=exp;p->next=NULL;

return p;

}

void insert(linklist phead,linklist head){ //新结点phead有序插入头结点为head的多项式内

if(phead->coef==0)

free(phead);

else{

linklist p,q;

p=head;q=head->next;

while(q){

if(phead->exp>=q->exp)

break; //p做后指针,寻找插入位置

p=q;

q=q->next;

}

if(q&&phead->exp==q->exp){ //若存在exp相同,合并

q->coef+=phead->coef;

free(phead);

if(!q->coef){ //若合并系数为0,删除

p->next=q->next;

free(q);

}

}

else{ //若不存在则插入

phead->next=q;

p->next=phead;

}

}

}

void printlinklist(linklist phead){ //打印,传入p[i] linklist q=phead->next;

int flag=1;

if(!q){

printf("0\n");

return;

}

while(q){

if(q->coef>0&&flag!=1)

printf("+"); //系数大于0且非第一项if(q->coef!=1&&q->coef!=-1){ //coef为0项不会插入printf("%g",q->coef); //省去无意义0

if(q->exp==1)

putchar('X');

else if(q->exp==0);

else if(q->exp)

printf("X^%d",q->exp);

}

else{

if(q->coef==1){

if(!q->exp) putchar('1');

if(q->exp==1) putchar('X');

else if(q->exp==0);

else printf("X^%d",q->exp);

}

if(q->coef==-1){

if(!q->exp) putchar('-1');

if(q->exp==1) putchar('-X');

else if(q->exp==0);

else printf("-X^%d",q->exp);

}

}

q=q->next;

flag++;

}

printf("\n");

}

linklist creatlist(){ //创建,调用时p[i]=creatlist

linklist phead;linklist head; //phead为增加节点指针,head为头指针phead=head=(linklist)malloc(sizeof(struct lnode)); //申请头结点

head->next=NULL;

while(fabs(phead->coef)>1E-8){ //若coef为0结束

phead=(linklist)malloc(sizeof(struct lnode));

printf("input coef exp\n");

scanf("%lf %d",&phead->coef,&phead->exp);

if(phead->coef!=0)

insert(phead,head); //有序插入

}

printlinklist(head);

return head;

}

void linklistclear(linklist head){

linklist p,q;

p=head->next;

q=p->next;

while(p!=NULL){

free(p);

p=q;

if(q!=NULL)

q=q->next;

}

head->next=NULL;

}

void linklistdestroy(linklist &head){

linklist p,q;

p=head;

q=p->next;

while(p!=NULL){

free(p);

p=q;

if(q!=NULL)

q=q->next;

}

head=NULL;

}

double linklistvalue(linklist head,double x){

double sum=0,t; //t:项数权重

int i;

linklist p;

for(p=head->next;p;p=p->next){

t=1;

for(i=p->exp;i!=0;){

if(i<0){

t=t/x;

i++;

}

else{

t=t*x;

i--;

}

}

sum+=p->coef*t;

}

return sum;

}

void linklistadd(linklist ahead,linklist bhead,linklist &chead){

linklist qa,qb,qc,hc;

qa=ahead->next;qb=bhead->next;

hc=(linklist)malloc(sizeof(struct lnode));

hc->next=NULL; //hc为尾结点

chead=hc;

while(qa||qb){ //qa,qb不全为NULL

qc=(linklist)malloc(sizeof(struct lnode)); //qc为新增结点

if(qb==NULL){

qc->coef=qa->coef;

qc->exp=qa->exp;

qa=qa->next;

}

else if(qa==NULL){ //若a或b为null,qa->exp无意义(即一条链已插完),先排除这种情况

qc->coef=qb->coef;

qc->exp=qb->exp;

qb=qb->next;

}

else if(qa->exp>qb->exp){

qc->coef=qa->coef;

qc->exp=qa->exp;

qa=qa->next;

}

else if(qa->exp==qb->exp){

qc->coef=qa->coef+qb->coef;

qc->exp=qa->exp;

qa=qa->next;qb=qb->next;

}

else if(qa->expexp){

qc->coef=qb->coef;

qc->exp=qb->exp;

qb=qb->next;

}

if(fabs(qc->coef)>1E-8){ //coef非0,接入多项式

qc->next=hc->next;

hc->next=qc;

hc=qc;

}

else

free(qc);

}

}

void linklistsub(linklist ahead,linklist bhead,linklist &chead){ //减法linklist qa,qb,qc,hc;

qa=ahead->next;qb=bhead->next;

hc=(linklist)malloc(sizeof(struct lnode));

hc->next=NULL; //hc为尾结点

chead=hc;

while(qa||qb){ //qa,qb不全为NULL

qc=(linklist)malloc(sizeof(struct lnode)); //qc为新增结点

if(qb==NULL){

qc->coef=qa->coef;

qc->exp=qa->exp;

qa=qa->next;

}

else if(qa==NULL){ //若a或b为null,qa->exp无意义(即一条链已插完),先排除这种情况

qc->coef=-qb->coef;

qc->exp=qb->exp;

qb=qb->next;

}

else if(qa->exp>qb->exp){

qc->coef=qa->coef;

qc->exp=qa->exp;

qa=qa->next;

}

else if(qa->exp==qb->exp){

qc->coef=qa->coef-qb->coef;

qc->exp=qa->exp;

qa=qa->next;qb=qb->next;

}

else if(qa->expexp){

qc->coef=-qb->coef;

qc->exp=qb->exp;

qb=qb->next;

}

if(fabs(qc->coef)>1E-8){ //coef非0,接入多项式

qc->next=hc->next;

hc->next=qc;

hc=qc;

}

else

free(qc);

}

}

linklist linklistcopy(linklist a){

linklist qa,bhead;

qa=a->next;

bhead=(lnode*)malloc(sizeof(struct lnode));

bhead->next=NULL;

while(qa){

insert(makenode(qa->coef,qa->exp),bhead);

qa=qa->next;

}

return bhead;

}

int linklistdelete(linklist head, int m){//删除head中的一个结点,指数为m linklist p,q;

if(!head||!head->next) return -1;

p=head;q=p->next;

while(q&&m!=q->exp){

p=p->next;q=q->next;

}

if(!q) return -1;

else{

p->next=q->next; free(q);

}

return 1;

}

void linklistmodify(linklist head){

int flag,exp;

double coef;

printf("操作选择:\n1.删除结点\n2.增加结点\n3.修改结点\n");

scanf("%d",&flag);

switch(flag){

case 1:{

printf("输入删除结点指数值: ");

scanf("%d",&exp);

linklistdelete(head,exp);

break;}

case 2:{

printf("输入增加结点指数值系数: ");

scanf("%d %lf",&exp,&coef);

insert(makenode(coef,exp),head);

break;}

case 3:{

printf("输入指数修改后系数: ");

scanf("%d %lf",&exp,&coef);

linklistdelete(head,exp);

insert(makenode(coef,exp),head);

break;}

}

}

void linklistdiff(linklist &head){

linklist p=head->next;

while(p!=NULL){

if(p->exp==0){

linklistdelete(head,0);

break;

}

else {

p->coef*=p->exp;

p->exp-=1;

p=p->next;

}

}

}

void iteintegral(linklist head){

linklist p=head->next;

while(p!=NULL){

p->exp+=1;

p->coef=p->coef/p->exp;

p=p->next;

}

}

int main(){

int flag,i;

printf("*************************************************\n");

printf("* 稀疏一元多项式运算器*\n");

printf("* 0.退出*\n");//退出

printf("* 1.创建多项式*\n");//创建并打印

printf("* 2.显示多项式*\n");//打印

printf("* 3.复制多项式*\n");//复制多项式a至空域b,非空报错

printf("* 4.求和*\n");//输入abc位置,c=a+b

printf("* 5.求差*\n");//输入abc位置,c=a-b

printf("* 6.求值*\n");//输入位置,double x,输出double result

printf("* 7.销毁多项式*\n");//销毁,使p[i]为NULL

printf("* 8.清空多项式*\n");//清空保留头指针,输出为0

printf("* 9.修改多项式*\n");//选择插入,删除,修改(删了再插)

printf("* 10.n阶微分*\n");

printf("* 11.不定微分*\n");

printf("* 12.定微分*\n");

printf("*************************************************\n");

while(1){

printf("键入数字选择操作:");

scanf("%d",&flag);

switch(flag){

case 0:{

printf("thanks for using\n");

return 0;}

case 1:{

printf("input location:");

scanf("%d",&i);

if(p[i-1]==NULL)

p[i-1]=creatlist();

else

printf("空间已被占用\n");

break;}

case 2:{

printf("输入显示位置:");

scanf("%d",&i);

if(p[i-1]!=NULL)

printlinklist(p[i-1]);

else

printf("该位置无多项式\n");

break;}

case 3:{

int j;

printf("input 原位置复制位置: ");

scanf("%d %d",&i,&j);

if(p[i-1]!=NULL&&p[j-1]==NULL)

p[j-1]=linklistcopy(p[i-1]);

else

printf("输入位置空或输出位置满");

break;}

case 4:{

int j,k;

printf("输入a,b位置,以及输出c位置: ");

scanf("%d %d %d",&i,&j,&k);

if(p[i-1]!=NULL&&p[j-1]!=NULL&&p[k-1]==NULL) linklistadd(p[i-1],p[j-1],p[k-1]);

else printf("位置被占用或原多项式不存在\n");

break;}

case 5:{

int j,k;

printf("输入a,b位置,以及输出c位置: ");

scanf("%d %d %d",&i,&j,&k);

if(p[i-1]!=NULL&&p[j-1]!=NULL&&p[k-1]==NULL) linklistsub(p[i-1],p[j-1],p[k-1]);

else printf("位置被占用或原多项式不存在\n");

break;}

case 6:{

printf("输入多项式位置: ");

scanf("%d",&i);

if(p[i-1]!=NULL){

double tempx;

printf("输入x值: ");

scanf("%lf",&tempx);

printf("结果为%g\n",linklistvalue(p[i-1],tempx));

}

else

printf("该位置无多项式\n");

break;}

case 7:{

printf("输入删除位置: ");

scanf("%d",&i);

if(p[i-1]!=NULL)

linklistdestroy(p[i-1]);

else

printf("该位置无多项式\n");

break;}

case 8:{

printf("输入清空位置:");

scanf("%d",&i);

if(p[i-1]!=NULL)

linklistclear(p[i-1]);

else

printf("该位置不存在多项式\n");

break;}

case 9:{

printf("输入修改对象位置: ");

scanf("%d",&i);

if(p[i-1]!=NULL)

linklistmodify(p[i-1]);

else

printf("对应位置为空\n");

break;}

case 10:{

printf("输入微分位置: ");

scanf("%d",&i);

printf("输入求导阶数: ");

int n,j;

scanf("%d",&n);

if(p[i-1]!=NULL){

for(j=0;j

linklistdiff(p[i-1]);

}

else

printf("该位置无多项式\n");

break;}

case 11:{

printf("输入不定积分位置: ");

scanf("%d",&i);

if(p[i-1]!=NULL)

iteintegral(p[i-1]);

else

printf("该位置无多项式\n");

break;}

case 12:{

printf("输入定积分位置: ");

scanf("%d",&i);

double j1,j2;

printf("输入上下限: ");

scanf("%lf %lf",&j1,&j2);

if(p[i-1]!=NULL){

iteintegral(p[i-1]);

printf(" %g \n",linklistvalue(p[i-1],j1)-linklistvalue(p[i-1],j2));

}

else

printf("该位置无多项式\n");

break;}

}

}

}

基本运算器实验模板

计算机科学与技术系 实验报告 专业名称计算机科学与技术 课程名称计算机组成原理 项目名称基本运算器实验 班级 学号 姓名 同组人员无 实验日期 2016.5.17

一、实验目的与要求 (一) 实验目的: (1) 了解运算器的组成结构。 (2) 掌握运算器的工作原理。 (二) 实验要求: (1)实验之前,应认真准备,写出实验步骤和具体设计内容,否则实验效率会特别低,一次实验时间根本无法完成实验内容,即使基本作对了,也很难说懂得了些什么重要教学内容。 (2)应在实验前掌握所有控制信号的作用,写出实验预习报告并带入实验室。 (3)实验过程中,应认真进行实验操作,既不要因为粗心造成短路等事故而破坏设备,又要仔细思考实验有关内容,把自己想不明白的问题通过实验理解清楚。 二、实验逻辑原理图与分析 2.1 画实验逻辑原理图 xxxxxxxxxx xxxxxxxxxx 多路开关 判零 A=xx LOG=xx SHF=xx ART=xx 进位 B=xx & &

2.2 逻辑原理图分析 1)运算器内部含有三个独立运算部件,分别为算术、逻辑和移位运算部件,要 处理的数据存于暂存器A和暂存器B,三个部件同时接受来自A 和B 的数据(有些处理器体系结构把移位运算器放于算术和逻辑运算部件之前,如ARM)。 2)各部件对操作数进行何种运算由控制信号S3…S0和CN 来决定,任何时候, 多路选择开关只选择三部件中一个部件的结果作为ALU 的输出。如果是影响进位的运算,还将置进位标志FC,在运算结果输出前,置ALU 零标志。 ALU 中所有模块集成在一片CPLD 中。 三、数据通路图及分析 1、逻辑运算

数据结构实验报告,一元多项式资料

数据结构课程设计报告

目录 一、任务目标,,,,,,,,,,,, 3 二、概要设计,,,,,,,,,,,, 4 三、详细设计,,,,,,,,,,,, 6 四、调试分析,,,,,,,,,,,, 8 五、源程序代码,,,,,,,,,, 8 六、程序运行效果图与说明,,,,, 15 七、本次实验小结,,,,,,,,, 16 八、参考文献,,,,,,,,,,, 16

任务目标 分析(1) a. 能够按照指数降序排列建立并输出多项式 b.能够完成两个多项式的相加,相减,并将结果输入要求:程序所能达到的功能: a.实现一元多项式的输入; b.实现一元多项式的输出; c.计算两个一元多项式的和并输出结果; d.计算两个一元多项式的差并输出结果;除任务要求外新增乘法: 计算两个一元多项式的乘积并输出结果 (2)输入的形式和输入值的范围:输入要求:分行输入,每行输入一项,先输入多项式的指数,再输入多项式的系数,以0 0 为结束标志,结束一个多项式的输入。 输入形式: 2 3 -1 2 3 0 1 2 0 0 输入值的范围:系数为int 型,指数为float 型 3)输出的形式: 第一行输出多项式1; 第二行输出多项式2; 第三行输出多项式 1 与多项式 2 相加的结果多项式; 第四行输出多项式 1 与多项式 2 相减的结果多项式;第五行输出多项式 1 与多项式 2 相乘的结果多项式 二、概要设计 程序实现 a. 功能:将要进行运算的二项式输入输出;

b. 数据流入:要输入的二项式的系数与指数; c.数据流出:合并同类项后的二项式; d.程序流程图:二项式输入流程图; e.测试要点:输入的二项式是否正确,若输入错误则重新输入

基本运算器实验定稿版

基本运算器实验 HUA system office room 【HUA16H-TTMS2A-HUAS8Q8-HUAH1688】

计算机科学与技术系 实验报告 专业名称计算机科学与技术 课程名称计算机组成原理 项目名称基本运算器实验 班级 学号 姓名 同组人员 实验日期 一、实验目的与要求 实验目的 (1)了解运算器的组成结构 (2)掌握运算器的工作原理 实验要求

(1)实验之前,应认真准备,写出实验步骤和具体设计内容,否则实验效率会很低,一次实验时间根本无法完成实验任务; (2)应在实验前掌握所以控制信号的作用,写出实验预习报告并带入实验室; (3)实验过程中,应认真进行实验操作,既不要因为粗心造成短路等事故而损坏设备,又要自习思考实验有关内容; (4)实验之后,应认真思考总结,写出实验报告,包括实验步骤和具体实验结果,遇到的问题和分析与解决思路。还应写出自己的心得体会,也可以对教学实验提出新的建议等。实验报告要上交老师。 二、实验逻辑原理图与分析 画实验逻辑原理图 逻辑原理图分析 上图为运算器原理图。如图所示运算器内部含有三个独立运算部件,分别为算术、逻辑和移位运算部件,要处理的数据存于暂存器A和暂存器B,三个部件同时接受来自A 和B的数据(有些处理器体系结构把移位运算器放于算术和逻辑运算部件之前,如ARM),各部件对操作数进行何种运算由控制信号S3…S0和CN来决定(三选一开关),任何时候,多路选择开关只选择三部件中一个部件的结果作为ALU的输出。如果是影响进位的运算,还将置进位标志FC,在运算结果输出前,置ALU零标志FZ。ALU中所有模块集成在一片CPLD中。

计算机组成原理实验-运算器组成实验报告

计算机组成原理课程实验报告 9.3 运算器组成实验 姓名:曾国江 学号: 系别:计算机工程学院 班级:网络工程1班 指导老师: 完成时间: 评语: 得分:

9.3运算器组成实验 一、实验目的 1.熟悉双端口通用寄存器堆的读写操作。 2.熟悉简单运算器的数据传送通路。 3.验证运算器74LS181的算术逻辑功能。 4.按给定数据,完成指定的算术、逻辑运算。 二、实验电路 ALU-BUS# DBUS7 DBUS0 Cn# C 三态门(244) 三态门(244)ALU(181) ALU(181) S3S2S1S0M A7A6A5A4F7F6F5F4 F3F2F1F0B3B2B1B0 Cn+4 Cn Cn Cn+4 LDDR2T2 T2 LDDR1LDRi T3 SW-BUS# DR1(273) DR2(273) 双端口通用寄存器堆RF (ispLSI1016) RD1RD0RS1RS0WR1WR0 数据开关(SW7-SW0)数据显示灯 A3A2A1A0B7B6B5B4 图3.1 运算器实验电路 LDRi T3A B 三态门 R S -B U S # 图3.1示出了本实验所用的运算器数据通路图。参与运算的数据首先通过实验台操作板上的八个二进制数据开关SW7-SW0来设置,然后输入到双端口通用寄存器堆RF 中。

RF(U30)由一个ispLSI1016实现,功能上相当于四个8位通用寄存器,用于保存参与运算的数据,运算后的结果也要送到RF中保存。双端口寄存器堆模块的控制信号中,RS1、RS0用于选择从B端口(右端口)读出的通用寄存器,RD1、RD0用于选择从A端口(左端口)读出的通用寄存器。而WR1、WR0用于选择写入的通用寄存器。LDRi是写入控制信号,当LDRi=1时,数据总线DBUS上的数据在T3写入由WR1、WR0指定的通用寄存器。RF的A、B端口分别与操作数暂存器DR1、DR2相连;另外,RF的B端口通过一个三态门连接到数据总线DBUS上,因而RF中的数据可以直接通过B端口送到DBUS 上。 DR1和DR2各由1片74LS273构成,用于暂存参与运算的数据。DR1接ALU的A输入端口,DR2接ALU的B输入端口。ALU由两片74LS181构成,ALU的输出通过一个三态门(74LS244)发送到数据总线DBUS上。 实验台上的八个发光二极管DBUS7-DBUS0显示灯接在DBUS上,可以显示输入数据或运算结果。另有一个指示灯C显示运算器进位标志信号状态。 图中尾巴上带粗短线标记的信号都是控制信号,其中S3、S2、S1、S0、M、Cn#、LDDR1、LDDR2、ALU_BUS#、SW_BUS#、LDRi、RS1、RS0、RD1、RD0、WR1、WR0都是电位信号,在本次实验中用拨动开关K0—K15来模拟;T2、T3为时序脉冲信号,印制板上已连接到实验台的时序电路。实验中进行单拍操作,每次只产生一组T1、T2、T3、T4时序脉冲,需将实验台上的DP、DB开关进行正确设置。将DP开关置1,DB开关置0,每按一次QD 按钮,则顺序产生T1、T2、T3、T4一组单脉冲。 三、实验设备 1.TEC-5计算机组成实验系统1台 2.逻辑测试笔一支(在TEC-5实验台上) 3.双踪示波器一台(公用) 4.万用表一只(公用) 四、实验任务 1、按图3.1所示,将运算器模块与实验台操作板上的线路进行连接。由于运 算器模块内部的连线已由印制板连好,故接线任务仅仅是完成数据开关、控制信号

计算机组成原理运算器实验—算术逻辑运算实验

实验报告 、实验名称 运算器实验—算术逻辑运算实验 、实验目的 1、了解运算器的组成原理。 2、掌握运算器的工作原理。 3、掌握简单运算器的数据传送通路。 4、验证运算功能发生器( 74LS181)的组合功能 三、实验设备 TDN-CM++ 计算机组成原理教学实验系统一套,导线若干四、实验原理 实验中所用的运算器数据通路如图1-1 所示。其中两片74LSl81以串行方式构成8 位字长的ALU,ALU 的输出经过一个三态门(74LS245)和数据总线相连。三态门由ALU-R 控制,控制运算器运算的结果能否送往总线,低电平有效。为实现双操作数的运算,ALU 的两个数据输入端分别由二个锁存器DR1、DR2 (由74LS273实现)锁存数据。要将数据总线上的数据锁存到DRl、DR2 中,锁存器的控制端LDDR1 和DDR2必须为高电平,同时由T4 脉冲到来。 数据开关“( INPUT DEVICE")用来给出参与运算的数据,经过三态 (74LS245) 后送入数据总线,三态门由SW—B控制,低电平有效。数据显示灯“( BUS UNIT") 已和数据总线相连,用来显示数据总线上的内容。 图中已将用户需要连接的控制信号用圆圈标明(其他实验相同,不再说明),其中除T4 为脉冲信号外,其它均为电平信号。由于实验电路中的时序信号均已连至“W/R UNIT ”的相应时序信号引出端,因此,在进行实验时,只需将“W /R UNIT"的T4接至“ STATE UNIT ”的微动开关KK2 的输入端,按动微动开关,即可获得实验所需的单脉冲。 ALU 运算所需的电平控制信号S3、S2、S1、S0 、Cn、M、LDDRl、 LDDR2 、ALU-B 、SW-B均由“ SWITCH UNIT ”中的二进制数据开关来模拟,其中Cn、ALU —B、SW 一 B 为低电平有效LDDR1 、LDDR2 为高电平有效。 对单总线数据通路,需要分时共享总线,每一时刻只能由一组数据送往总线。

运算器部件实验报告

实验一运算器部件实验报告 班级姓名学号日期 一、实验目的 ●熟悉与深入理解4位运算器芯片Am2901的功能和内部组成,运行中要求 使用的控制信号及其各自的控制作用。 ●熟悉与深入理解用4片4位的运算器芯片构成16位的运算器部件的具体方 案,各数据位信号、各控制位信号的连接关系。 ●熟悉与深入理解用2片GAL20v8芯片解决ALU最低位的进位输入信号和 最高、最低位的移位输入信号、实现4位的标志位寄存器的方案,理解为什么这些功能不能在运算器芯片之内实现而要到芯片之外另外处理。 ●明确教学计算机的运算器部件,使用总计24位的控制信号就完全确定了它 的全部运算与处理功能,脱机运算器实验中可以通过24位的微型开关提供这些控制信号。 二、实验说明 脱机运算器实验,是指让运算器从教学计算机整机中脱离出来,此时,它的全部控制与操作均需通过24位的微型开关来完成,通过开关、按键控制教学机的运算器完成指定的运算功能,并通过指示灯观察运算结果。 三、实验要求 1、实验之前认真预习,写出预习报告,包括操作步骤,实验过程所用数据和运行结果等 2、实验过程当中,要仔细进行,防止损坏设备,分析可能遇到的各种现象,判断结果是否正确,记录运行结果 3、实验之后,认真写出实验报告,包括对遇到的各种现象的分析,实验步骤和实验结果,自己在这次实验的心得体会与收获。 四、实验所使用到的控制信号 AM2901所用的控制信号

1、将教学机设置为单步、16位、脱机状态下,即把教学机左下方的5个控制开关置为1XX00。 2、按一下RESET按键,进行初始化。 3、按照指定功能给出控制信号和数据信息,观察各信号指示灯状态。 4、按压START键,给出脉冲信号,观察各信号灯状态。 六、实验内容 1、下表中所列操作在教学机上进行运算器脱机实验。并将结果填入表中。 运算器功能所用到的控制信号

嵌入式--计算器--实验报告

计算器设计实验报告 一、实验设计主要分工 04009320 文斌:算法设计,LCD显示。 04** 张希:界面(按钮控件)设计,文件内容读取。 共同调试、完善设计。 二、程序设计实现功能效果 (1)支持整数、小数基本加减乘除运算; (2)有优先级的判别计算。优先级由高到低一次为括号运算、乘除运算、加减运算。(3)支持键盘输入和触摸屏输入; (4)能读取指定目录下文本内容(内容为计算表达式)并计算得出结果,将内容和结果显示在LCD上。 程序任务开始后,等待键盘或触摸屏的输入。输入键有0~9数字键、+-*/()运算符、del退格键、clear清屏键、read读指定目录文本内容并计算键、enter'='键、‘.’小数点键。 每当有字符输入时,触摸屏相应键显示“AAA”,100ms后恢复原相应按键符号,同时LCD 屏幕上显示相应字符。当输入'del'键时,屏幕显示去掉最后一位字符。当输入'='号后,得出计算结果,结果显示于表达式的下一行。若是除零错误,则结果显示为“/0ERROR!”。若有非法字符(触摸点不能识别为设计按键符则视为非法字符),则结果输出为“Syntax Error!!”。若表达式有运算符连续输入,则忽略前面的运算符,只取最后一位运算符计算,正常显示数字结果。当输入'clear'键时,情况显示区域。当输入'read'键时,从指定目录文本文件中读取表达式并计算。将表达式内容和计算结果显示在LCD上。 三、程序算法实现 1、计算算法 首先将输入的0~9数字、+-*/()运算符的内容存储于一个全局变量cal[number]中, 表达为中缀表达式。用void str2repol()函数,将输入字符串cal[number]转换成逆波 兰表达式并存于全局数组char repol[maxs]中。str2repol()函数中缀表达式转成逆波兰 后缀表达式算法如下: (1)首先构造一个运算符栈stack[maxs],此运算符在栈内遵循越往栈顶优先级越高的 原则。

计算机组成原理实验报告运算器组成存储器

计算机组成原理实验报告 一、实验1 Quartus H的使用 一.实验目的 掌握Quartus H的基本使用方法。 了解74 1 38(3:8)译码器、74244、74273的功能。 利用Quartus H 验证74138 (3: 8)译码器、74244、74273 的功能。 二.实验任务 熟悉Quartus H中的管理项目、输入原理图以及仿真的设计方法与流程。新建项目,利用原理编辑方式输入74138、74244、74273的功能特性,依照其功能表分别进行仿真,验证这三种期间的功能。 三.74138、74244、74273的原理图与仿真图 1.74138 的原理图与仿真图 74244的原理图与仿真图 1.

实验2运算器组成实验 一、 实验目的 1. 掌握算术逻辑运算单元(ALU 的工作原理。 2. 熟悉简单运算器的数据传送通路。 3. 验证4位运算器(74181)的组合功能。 4. 按给定数据,完成几种指定的算术和逻辑运算。 二、 实验电路 附录中的图示出了本实验所用的运算器数据通路图。 8位字长的ALU 由2 片74181构成。2片74273构成两个操作数寄存器 DR1和DR2用来保存参 与运算的数据。DR1接ALU 的A 数据输入端口,DR2接 ALU 的B 数据输入端 口,ALU 的数据输出通过三态门74244发送到数据总线BUS7-BUS 上。参与 运算的数据可通过一个三态门74244输入到数据总线上,并可送到DR1或 DR2 暂存。 图中尾巴上带粗短线标记的信号都是控制信号。除了 T4是脉冲信号外,其 4. 74273的原理图与仿真图、

他均为电位信号。nCO, nALU-BUS nSW-BU鈞为低电平有效。 三、实验任务按所示实验电路,输入原理图,建立.bdf 文件。 四. 实验原理图及仿真图 ,然后利用ALU的直通功能,检查DR1 DR2中是否保存了所置的数。 其实验原理图如下: 波形图如下: 实验 3 半导体存储器原理实验 (一)、实验目的 (1)熟悉静态随机存储器RAM和只读存储器ROM勺工作特性和使用方法; (2)熟悉半导体存储器存储和读出数据的过程; (3)了解使用半导体存储器电路时的定时要求。 (二)、实验要求 利用Quartus H器件库提供的参数化存储单元,设计一个由128X8 位的RAM和128X8位的ROM勾成的存储器系统。请设计有关逻辑电路,要求仿真通过,并设计波形文件,验证该存储器系统的存储与读出。 (三)、实验原理图与仿真图 ram内所存储的数据: rom 内所存储的数据: 仿真图如下: (四)心得体会 本次试验中,我们应该熟练掌握Quartus H软件的使用方法;熟悉静态随机存储器RAM和只读存储器RO啲工作特性和使用方法;熟悉半导体存储器存

C++一元多项式合并实验报告

实验二一元多项式相加问题本实验的目的是进一步熟练掌握应用链表处理实际问题的能力。 一、问题描述 一元多项式相加是通过键盘输入两个形如P 0+P 1 X1+P 2 X2+···+PnX n的多项式,经过程序运算后在屏幕上输出它 们的相加和。 二、数据结构设计 分析任意一元多项式的描述方法可知,一个一元多项式的每一个子项都由“系数—指数”两部分组成,所以可将它抽象成一个由“系数—指数对”构成线性表,由于对多项式中系数为0的子项可以不记录他的数值,对于这样的情况就不再付出存储空间来存放它了。基于这样的分析,可以采取一个带有头结点的单链表来表示一个一元多项式。具体数据结构定义为: typedef struct node { float ce; //系数域 float ex; //指数域 struct node *next; //指针域 }lnode,*linklist; 三功能(函数)设计 1、输入并建立多项式的功能模块 此模块要求按照指数递增的顺序和一定的输入格式输入各个系数不为0的子项的“系数—指数对”,输入一个子项建立一个相关的节点,当遇到输入结束标志时结束输入,而转去执行程序下面的部分。 屏幕提示: input ce & ex and end with 0: ce=1 ex=2 ce=0 ex=0 //输入结束标志 input ce & ex and end with 0: ce=2 ex=2 ce=0 ex=0 //输入结束标志 输入后程序将分别建立两个链表来描述两个一元多项式: A=X^2 B=2X^2 这两个多项式的相加的结果应该为: C=3X^2 2、多项式相加的功能模块 此模块根据在1中建立的两个多项式进行相加运算,并存放在以C为头指针的一个新建表中。可以采用以下方法进行设计: 开始时a,b分别指向A,B的开头,如果ab不为空,进行判断:如果a所指的结点的指数和b所指的结点的指数相同,将它们的系数相加做成C式中的一项,如果不一样则将小的一项加到C中。 if(a->ex==b->ex) //判断指数是否相等 {s->ce=a->ce+b->ce; if(s->ce!=0) s->ex=a->ex; else delete s; a=a->next; b=b->next; }

java计算器实验报告

Java计算器实验报告 计算机032 胡勇健 03095218 2005年5月5日

目录 1.设计名称与要求 2.各模块功能的介绍和实现3.系统的特色和不足4.参考书

一. 实验名称及其要求: A)名称: java计算器的设计 B)要求:1.实验目的:图形界面设计。 熟悉java.awt包中的组件,掌握图形界面设计方法,理解委托事件处理模型。 2.题意: 请设计并实现Windows系统中“计算器”的窗口及功能。 3.实验要求: (1)设计图形界面添加菜单:窗口上添加各种组件及菜单,并处理组件及菜单的事件监听程序。 (2)运算:实现多种运算,保证运算正确性。 二.各模块功能的介绍和实现: A)GUI图形界面的组件: a)所用到的Java类库包: java.awt.*; 基本的图形界面组件来源于awt包。 java.awt.event.*; 事件的属性处理来源于awt.event包。 javax.swing.*; swing组件增加了awt包中所不具备的各种优越功能。 java.awt.datatransfer.*; 用于计算器与外部的程序进行复制粘贴。 b)所用的各部分图形组件的定义: Frame mainFrame; //主框架 JTextField answerText; //显示计算结果 JTextField memoryState; //显示计算器内存的使用情况MenuBar menuGroup; //菜单栏 Menu editMenu,viewMenu,helpMenu; //编辑,查看,帮助菜单 MenuItem copyItem,pasteItem; //复制,粘贴 MenuItem standardModel; //标准型 CheckboxMenuItem numGroup; //数字分组 MenuItem aboutCal; //关于计算器 Button buttonBackSpace,buttonCE,buttonC; //退格,清除,清空按钮 Button buttonMC,buttonMR,buttonMS,buttonMADD; //内存操作按钮 Button buttonNum[]; //数字按钮 Button buttonAdd,buttonSub,buttonMul,buttonDiv; //+,-,*,/ Button buttonDot,buttonSign,buttonEqual; //. +/- =

计算机组成原理实验1-运算器

《计算机组成原理》 实验报告 实验一运算器实验

一、实验目的 1.掌握运算器的组成及工作原理; 2.了解4位函数发生器74LS181的组合功能,熟悉运算器执行算术操 作和逻辑操作的具体实现过程; 3.验证带进位控制的74LS181的功能。 二、实验环境 EL-JY-II型计算机组成原理实验系统一套,排线若干。 三、实验内容与实验过程及分析(写出详细的实验步骤,并分析实验结果) 实验步骤:开关控制操作方式实验 1、按图1-7接线图接线: 连线时应注意:为了使连线统一,对于横排座,应使排线插头上的箭头面向自己插在横排座上;对于竖排座,应使排线插头上的箭头面向左边插在竖排座上。 图1-1 实验一开关实验接线图 2、通过数据输入电路的拨开关开关向两个数据暂存器中置数: 1)拨动清零开关CLR,使其指示灯。再拨动CLR,使其指示灯亮。置ALU-G =1:关闭ALU的三态门;再置C-G=0:打开数据输入电路的三态门; 2)向数据暂存器LT1(U3、U4)中置数:

(1)设置数据输入电路的数据开关“D15……D0”为要输入的数值; (2)置LDR1=1:使数据暂存器LT1(U3、U4)的控制信号有效,置LDR2=0:使数据暂存器LT2(U5、U6)的控制信号无效; (3)按一下脉冲源及时序电路的【单脉冲】按钮,给暂存器LT1送时钟,上升沿有效,把数据存在LT1中。 3)向数据暂存器LT2(U5、U6)中置数: (1)设置数据输入电路的数据开关“D15……D0”为想要输入的数值; (2)置LDR1=0:数据暂存器LT1的控制信号无效;置LDR2=1:使数据暂存器LT2的控制信号有效。 (3)按一下脉冲源及时序电路的“单脉冲”按钮,给暂存器LT2送时钟,上升沿有效,把数据存在LT2中。 (4)置LDR1=0、LDR2=0,使数据暂存器LT1、LT2的控制信号无效。 4)检验两个数据暂存器LT1和LT2中的数据是否正确: (1)置C-G=1,关闭数据输入电路的三态门,然后再置ALU-G=0,打开ALU 的三态门; (2)置“S3S2S1S0M”为“F1”,数据总线显示灯显示数据暂存器LT1中的数,表示往暂存器LT1置数正确; (3)置“S3S2S1S0M”为“15”,数据总线显示灯显示数据暂存器LT2中的数,表示往暂存器LT2置数正确。 3、验证74LS181的算术和逻辑功能: 按实验步骤2往两个暂存器LT1和LT2分别存十六进制数“1234H”和“5678H”,在给定LT1=1234H、LT2=5678H的情况下,通过改变“S3S2S1S0MCn”的值来改变运算器的功能设置,通过数据总线指示灯显示来读出运算器的输出值F,填入上表中,参考表1-1的功能表,分析输出F值是否正确。分别将“AR”开关拨至“1”和“0”的状态,观察进位指示灯“CY”的变化并分析原因。 实验结果表为:

运算器实验报告模板

脱机运算器实验报告 理论课教师姓名:高金山实验指导教师:刘万成 组号:姓名:闫麟阁学号:12281212 实验目的: (1)了解脱机操作下AM2901运算器的功能与控制信号的使用,了解运算器AM2901的内部结构及工作时序,观察运算器运算的结果对状态标志的影响。 (2)深入了解AM2901运算器的功能与具体用法,掌握用AM2901完成各种运算操作时各控制信号的使用,观察指令执行的结果对状态标志的影响;了解4片AM2901的级联方式,深化运算器部件的组成、设计、控制与使用等诸项知识。 实验内容: 1.将教学机左下方的5个拨动开关置为1XXOO(单步、16位、脱机);先按一下“RESET”按键,再按一下“START”按键,进行初始化。 2.接下来,按下表所列的操作在机器上进行运算器脱机实验,将结果填入表中:其中D1取为0101H,D2取为1010H;通过两个12位的红色微型开关向运算器提供控制信号,通过16位数据开关向运算器提供数据,通过指示灯观察运算结果及状态标志。 运算器实验(1) 实验结果分析(每人选择2个操作运算进行控制信号取值和运算结果值的分析):

此式的功能是R0∨R1然后将值赋给R1,由于有两个值,所以A、B口均有对应地址输入,B 对应的是R0,所以B的地址为0001,A对应的是R1,所以A的地址为0000。因为最后的值存储到B口多对应的地址并输出,所以I8-I6所选值为011;该式实现的是并运算,所以I5-I3所选值为011;数据来源是A和B,所以I2-I0所选值为001。 该式接受ALU的标志位输出的值,所以SST所选值为001;该式执行的并(SUB),所以SSH SCI 所选值为000。 因为R0=0101,R1=1010,所以按START前ALU的输出值为0F0F,故输出值为0F0F。 此时的功能是实现R0的逻辑左移功能,由于只有一个值,所以只有B口有对应地址输入,B对应的是R0,所以B的地址为0000。因为最后的值存储到B口对应的地址并输出,所以I8-I6所选值为111,;该式实现的是逻辑左移,所以I5-I3取000(加法);数据来源是B,所以I2-I0所选值为011。 该式是左移操作,另三个标志不变,所以SST所选值为110;SSH SCI所选值为100。 因为R0=FEFE,实现逻辑左移后补0,所以按START之前R0为FEFE,按START后R0变为FDFC。 运算器实验(2) 实验步骤 将教学机左下方的5个拨动开关置为1XX00(单步、16位、脱机);先按一下“RESET”按键,再按一下“START”按键,进行初始化。接下来,按下表所列的操作在机器上进行运算器脱机实验,将结果填入表中:

一元多项式相加完整实验报告

一元多项式相加实验报告 一元多项式的相加

一实验内容 根据所学的数据结构中线性结构(线性表)的逻辑特性和物理特性及相关算法,应用于求解一个具体的实际问题----------两个多项式相加 二需求分析 1掌握线性结构的逻辑特性和物理特性。 2建立一元多项式。 3将一元多项式输入,并存储在内存中,并按照指数降序排列输出多项式。 4能够完成两个多项式的加减运算,并输出结果。 三概要设计 1 本程序所用到的抽象数据类型: typedef OrderedLinkList polynomial; // 用带表头结点的有序链表表示多项式 结点的数据元素类型定义为: typedef struct { // 项的表示 float coef; // 系数 int expn; // 指数 term, ElemType; V oid AddPolyn(polynomail&Pa,polynomail&Pb) Position GetHead() Position NextPos(LinkList L,Link p) Elem GetCurElem(Link p) int cmp(term a term b) Status SetCurElem(Link&p, ElemType e) Status DelFirst(Link h, Link &q) Status ListEmpty(LinkList L) Status Append(LinkList&L, Link S) FreeNode() 2 存储结构

一元多项式的表示在计算机内用链表来实现,同时为了节省存储空间,只存储其中非零的项,链表中的每个节点存放多项式的系数非零项。它包含三个域,分别存放多项式的系数,指数,以及指向下一个项的指针。 创建一元多项式链表,对运算中可能出现的各种情况进行分析,实现一元多项式的相加相减操作。 3 模块划分 a) 主程序;2)初始化单链表;3)建立单链表; 4)相加多项式 4 主程序流程图 四详细设计 根据一元多项式相加的运算规则:对于两个一元多项式中所有指数相同的项,对应系数相加,若其和不为零,则构成“和多项式”中的一项,对

实验一 运算器实验(1)

级班学号姓名 实验报告 实验一运算器实验 一、实验目的: 1、掌握简单运算器的数据传送通路; 2、验证运算功能发生器(74LS181)的组合功能; 3、验证带进位控制的算术运算功能发生器的功能; 4、按指定数据完成几种指定的算术运算。 二、实验设备 DVCC-C5JH计算机组成原理教学实验系统一台,排线若干。 三、实验原理 1、实验中所用的运算器数据通路图如附A图1-3所示。其中运算器由两片74LS181以并/串形式构成8位字长的ALU。运算器的输出经过一个三态门(74LS245)和数据总线相连,运算器的两个数据输入端分别由二个锁存器(74LS373)锁存,锁存器的输入连至数据总线,数据开关(“INPUT DEVICE”)用来给出参与运算的数据,并经过一三态门(74LS245)和数据总线相连,数据显示灯(“BUS UNIT”)已和数据总线相连,用来显示数据总线内容。 2、控制信号说明: T4:脉冲信号;实验时,将W/R UNIT的T4接至STATE UNIT的微动开关KK2的输出端,按动微动开关,即可获得实验所需的单脉冲。 S3~S0、M:运算器的功能控制信号;可参见74181芯片的功能表P64。 Cn:进位控制信号,低电平有效。 LDDR1、LDDR2:数据寄存器DR1和DR2的数据装载控制信号,高电平有效。ALU-B:该控制信号控制是否将ALU的结果送到总线上,低电平有效。

SW-B :三态门开关信号,控制是否打开三态门,低电平有效。 四、实验内容 1、算术逻辑运算实验: 实验步骤: ①按图1-2连接路线,仔细检查无误后,接通电源; ②用二进制数码开关向DR1和DR2寄存器置数。 A )数据开关置01100101; B )设置switch unit :ALU-B=1 SW-B=0 LDDR1=1 LDDR2=0 C )按动KK2给出一个单脉冲信号,即T4=┎┒ D )数据开关置10100111; E )设置switch unit :LDDR1=0 LDDR2=1 F )按动KK2给出一个单脉冲信号。 ③检验DR1和DR2中存的数是否正确: A )设置switch unit :SW-B=1 ALU-B=0 B )设置switch unit :当S 3S 2S 1S 0M=00000,总线显示灯显示DR1中的数,而 置为S 3S 2S 1S 0M=01010,总线显示灯显示DR2中的数。 ④验证74LS181的算术运算和逻辑运算功能:[给定A=(DR1)=65 H ,B=(DR2)=A7 H] A )改变运算器的功能设置,观察运算器的输出,填入下表: DR1 DR2 S 3S 2S 1S 0 M=1(算术运算) M=0(逻辑运算) Cn=1 (无进位) Cn=0 (有进位) 65 A7 0000 01100101 01100110 10011010 65 A7 0001 11100111 11101000 00011000 65 A7 0010 01111101 01111110 10000010 65 A7 0011 11111111 00000000 00000000 65 A7 0100 10100101 10100110 11011010 65 A7 0101 00100111 00101000 01011000

计算机组成原理运算器实验报告

计算机组成原理实验一 运算器实验 一、实验目的: 1、掌握简单运算器的数据传输方式。 2、验证运算功能发生器(74LS181)及进位控制的组合功能。 二、实验要求: 完成不带进位及带进位算数运算实验、逻辑运算实验,了解算数逻辑运算单元的运用。 三、实验原理: 74LS181是4位算术逻辑运算器,用两个74LS181并联可以实

现8位运算,为了实现双操作的运算,ALU 的输入端分别由两个锁存器DR1,DR2锁存数据。数据显示灯和数据总线相连接,用来显示数据总线上的内容。由于实验电路中的时序信号均已连接至W /RUIT相应的时序信号引出端,只要微动开关,即可获得实验所需的单脉冲。 四、 实验连接: 1.八位运算器控制信号连接: S3,S2,S1,S0,M ,/CN ,LDDR1,LDDR2,LDCZY ,/SW-B ,/ALU-B ,Cn+4 Cn+4I 2.完成连接并检查无误后接通电源。 五、实验仪器状态设定: 在闪动的“P.”状态下按动“增址”命令键,使LED 显示器自左向右第一位显示提示符“H ”,表示本装置已进入手动单元实验状态。 五、 实验项目: (一)算数运算实验 拨动二进制数据开关向DR1和DR2寄存器置数(灯亮为1,灯灭为0)。 步骤如下: [CBA=001] [LDDR1=1] [LDDR1=0] [LDDR2=0] [LDDR2=1] 数据开关 (01100101) 三态门 寄存器DR1 (01100101) 数据开关 (10100111) 寄存器DR2 (10100111)

[“按STEP”] [“按STEP”] 然后检查数据: 1.关闭数据输入三态门(CBA=000) 2.打开ALU输出三态门(CBA=010) 3.当置S3,S2,S1,S0,M为11111时,总线指示灯显示DR1中的数 4.当置S3,S2,S1,S0,M为10101时,总线指示灯显示DR2中的数 算数运算(不带进位)实验: 置CBA=010,S3,S2,S1,S0,M,/CN为100101,LDCZY=0,则数据总线指示灯显示00001100(0CH) (二)进位控制实验 (1)进位标志清零 CBA=000 置S3,S2,S1,S0,M为00000 置/CN为0,LDCZY为1 按STEP (2)向DR1和DR2置数(同上) (3)验证进位运算及进位锁存功能,使/CN=1,LDCZY=1,来进行算数运算。 给定DR1=65,DR2=A7,改变运算器功能(逻辑或非运算方法见逻辑运算实验),得到运算器输出记录如下: DR1 DR2 S3 S2 S1 S0 M=0 (算数运算) M=1 (逻辑运算)CN=1 无进位 CN=0 有进位 65 A7 0000 F=(65)F=(66)F=(9A) 0001 F=(E7)F=(E8)F=(18) 0010 F=(7D)F=(7E)F=(82) 0011 F=(FF)F=(0)F=(0) 0100 F=(A5)F=(A6)F=(82) 0101 F=(27)F=(B8)F=(58) 0110 F=(BD)F=(-42)F=(C2) 0111 F=(3F)F=(40)F=(40) 1000 F=(8A)F=(E3)F=(BF) 1001 F=(C)F=(10D)F=(3D) 1010 F=(A2)F=(BE)F=(A7) 1011 F=(25)F=(7D)F=(7D) 1100 F=(CA)F=(CB)F=(1) 1101 F=(4C)F=(DD)F=(7D) 1110 F=(E2)F=(E3)F=(77) 1111 F=(64)F=(65)F=(65)

一元多项式的运算

数据结构课程设计实验报告 专业班级: 学号: 姓名: 2011年1月1日

题目:一元多项式的运算 1、题目描述 一元多项式的运算在此题中实现加、减法的运算,而多项式的减法可以通过加法来实现(只需在减法运算时系数前加负号)。 在数学上,一个一元n次多项式P n(X)可按降序写成: P n(X)= P n X^n+ P(n-1)X^(n-1)+......+ P1X+P0 它由n+1个系数惟一确定,因此,在计算机里它可以用一个线性表P来表示: P=(P n,P(n-1),......,P1,P0) 每一项的指数i隐含在其系数P i的序号里。 假设Q m(X)是一元m次多项式,同样可以用一个线性表Q来表示: Q=(q m,q(m-1),.....,q1,q0) 不是一般性,假设吗吗m

计算机组成原理实验-运算器实验报告

1.逻辑运算 (1)S3S2S1S0=0000时,F=A,例如:当A=00010101,B=01101001时 F=00010101; 当A=01011000时,B=01011110时 F=01011000 (2)S3S2S1S0=0001时,F=B,例如: 当A=10110111,B=01110010时 F=01110010 当A=11100011,B=01010110 F=01010110 (3)S3S2S1S0=0010时,F=AB。例如:当A=10110010,B=10010111时 F=10010010 当A=11000011,B=00111100时 F=00000000 (4)S3S2S1S0=0011时,F=A+B。例如:当A=00110101,B=11001010时, F=11111111 当A=01011011,B=11000101时 F=11011111 (5)S3S2S1S0=0100时,F=/A。例如:

当A=00110100,B=11010010时, F=11001011 当A=01001111,B=10100101时 F=10110000 2.移位运算 (1)S3S2S1S0=0101时,F=A逻辑右移B(取低三位)位。例如: 当A=01000101,B=00000010时, F=00010001 当A=01011011,B=00000101时 F=00000010 (2)S3S2S1S0=0110时,F=A逻辑左移B(取低三位)位。例如: 当A=00110101,B=00000011时, F=10101000 当A=01101011,B=00000001时 F=11010110 (3)S3S2S1S0=0111时,F=A算术右移B位。例如:当A=01110101,B=00000010时, F=00011101 当A=01000111,B=00000101时

两个一元多项式相加-c++版

《数据结构》实验报告 ——两个一元多项式相加 一、实验题目:两个一元多项式相加 二、实验内容: 根据所学的数据结构中线性结构(线性表)的逻辑特性和物理特性及相关算法,应用于求解一个具体的实际问题----------两个多项式相加 三、设计思想: (1)建立两个顺序列表,分别用来表示两个一元多项式;顺序列表奇数位,存储该多项式的系数;顺序列表的偶数位,存储该相应多项式的指数。 (2)用成员函数merg(qList&l2)实现两多项式的相加。实现的大致方法为:比较第二个多项式列表与第一个多项式列表的偶数位的数值大小(指数),如果 相同,则将他们的前一位数(系数)相加;如果不同,就将他的前一位数(系 数)及它自己(指数)插入第一个多项式列表的后面。 (3)建立函数shu(double a[],int j)实现多项式的输入。 四、源程序代码 #include "stdafx.h" #include using namespace std; template class List { private: Telem * elem; int curlen; int maxlen; public: List(int maxsz=100):maxlen(maxsz) { curlen=0; elem=new Telem{maxlen}; }; List(Telem a[],int n,int maxsz=100):maxlen(maxsz) { curlen=n; elem=new Telem[maxlen]; for(int i=0;i

相关主题
文本预览
相关文档 最新文档