第一篇:长整数四则运算实验报告
一、需求分析
设计一个实现任意长的整数间进行四则运算的程序,要求完成长整数的加、减运算,乘除运算可选做。在这里长整数没有范围限制,可任意长。运算后的进位、借位等都要进行正确处理,可实现动态的输入,实时的输出。
测试数据:0、0; 输出“0”
2345,6789、-7654,3211; 输出“1,0000,0000” 1,0000,0000,0000、9999,9999; 输出“9999,0000,0001” 1,0001,0001、;1,0001,0001; 输出“0” 自选数据:1,1111;1,1111 输出“0”
二、概要设计
1、数据结构
利用双向循环链表来实现对长整数的存储。
选择该数据结构来完成长整数的加减运算是因为 a.要对长整数进行运算,需要对长整数进行存储,选择用链表对长整数存储。b.存储的顺序是从左到右,运算的顺序则是从右到左,为操作方便选择循环链表。
c.在运算过程中有进位和借位的操作。
2、使用算法
定义双向循环链表,存储数据,进行计算。(默认较长的数作为被加数、被减数)
三、详细设计
typedef struct DoubleNode //定义链表元素
void InitNode(DLNode **head)//初始化链表
int InsertNode(DLNode *head,int n,DataType x)//向链表第N个位置插入元素X int digit(int n)//判断整数N有几位
void PrintNode(DLNode *head)//打印链表 void DestroyNode(DLNode **head)//销毁链表 void add(DLNode *h1,DLNode *h2)//两数相加 void jian(DLNode *h1,DLNode *h2)//两数相减 int main()//入口函数
四、调试分析
由于在程序设计时,对于指针的不了解,编程时使用双重指针,无形中给自己增添了更多麻烦。老师在检查的过程中指出并教导了这一点。
五、测试结果
1、输入0和0做加法运算,输出“0”,结果如下图:
2、输入2345,6789和-7654,3211做减法运算,输出“1,0000,0000”,结果如下图:
3、输入1,0000,0000,0000和9999,9999做减法运算,输出“9999,0000,0001”,结果如下图:
4、输入1,0001,0001和1,0001,0001做减法运算,输出“0”,结果如下图:
5、输入1,1111和1,1111做减法运算,输出“0”结果如下图:
六、心得体会
本次实验主要是针对双向链表的练习,通过这次试验我们大家对于双向循环链表有了更深刻的记忆。另在讲解的过程中,老师指出了我们在编程中存在的不足点,我们对于指针跟双重指针有了更清晰的认识。在与同学的交流中,也更清楚的认清了 自己的不足,以后会更加努力的。
七、附录
#include
printf(“0”);printf(“%d”,p->data);p=p->next;} printf(“n”);} void DestroyNode(DLNode **head){ DLNode *p,*p1;p=(*head)->next;while(p!=*head){ p1=p;p=p->next;free(p1);} free(p);head=NULL;} void add(DLNode *h1,DLNode *h2)//两数相加 { DLNode *p1=h1->prior,*p2=h2->prior;while(p1!=h1&&p2!=h2)//每个链表元素相加 { p1->data+=p2->data;p1=p1->prior;p2=p2->prior;} p1=h1->prior;while(p1!=h1->next)//处理链表元素 { if(p1->data>=10000){ p1->prior->data+=p1->data/10000;p1->data%=10000;} if(p1->data<0)//处理负数 { if(h1->next!=0){ p1->prior->data-=1;p1->data+=10000;} } p1=p1->prior;} if(h1->next->data>=10000)//处理最前面的数 { InsertNode(h1,0,h1->next->data/10000);h1->next->next->data%=10000;} if(h1->data<=-10000){ InsertNode(h1,0,h1->next->data/10000);h1->next->next->data%=-10000;} PrintNode(h1);} void jian(DLNode *h1,DLNode *h2)//两数相减 { DLNode *p1=h1->prior,*p2=h2->prior;while(p1!=h1&&p2!=h2)//每个链表元素相减 { p1->data-=p2->data;p1=p1->prior;p2=p2->prior;} p1=h1->prior;while(p1!=h1->next)//处理链表元素 { if(p1->data>=10000){ p1->prior->data+=p1->data/10000;p1->data%=10000;} if(p1->data<0)//处理负数 { if(h1->next!=0){ p1->prior->data-=1;p1->data+=10000;} } p1=p1->prior;} if(h1->next->data>=10000)//处理最前面的数 { InsertNode(h1,0,h1->next->data/10000);h1->next->next->data%=10000;} if(h1->data<=-10000){ InsertNode(h1,0,h1->next->data/-10000);h1->next->next->data%=-10000;} PrintNode(h1);} int main()//入口函数 { DLNode *head1,*head2;InitNode(&head1);InitNode(&head2);char data1[N],data2[N];char d1[10],d2[10];int i,j,k;int xun;while(1){ printf(“输入数据:n”);scanf(“%s %s”,data1,data2);InitNode(&head1);InitNode(&head2);i=0;k=0;while(data1[i]!=';')//将数1用链表储存 { for(j=0;j<10;j++)d1[j]=0;j=0;while(data1[i]!=';'&&data1[i]!=',')d1[j++]=data1[i++];if(data1[i]==',')i++;if(data1[0]=='-')//处理正负数
j=-(int)fabs(atoi(d1));//将字符串转换成整数 else j=atoi(d1);InsertNode(head1,k++,j);} i=0;k=0;while(data2[i]!=';')//将数2用链表储存 { for(j=0;j<10;j++)
d2[j]=0;j=0;while(data2[i]!=';'&&data2[i]!=',')d2[j++]=data2[i++];if(data2[i]==',')i++;if(data2[0]=='-')//处理正负数
j=-(int)fabs(atoi(d2));else j=atoi(d2);InsertNode(head2,k++,j);} printf(“选择加减法:1—加法,2-减法n”);scanf(“%d”,&xun);switch(xun){ case 1:if(strlen(data1)>strlen(data2))//较长的数作为被加数
add(head1,head2);else add(head2,head1);break;case 2:if(strlen(data1)>strlen(data2))//较长的数作为被减数
jian(head1,head2);else jian(head2,head1);break;default:break;} DestroyNode(&head1);DestroyNode(&head2);} return 0;}
第二篇:长整数加减运算实验报告
长整数加减的运算
一、需求分析
问题描述:
设计一个实现任意长的整数进行加法运算的演示程序
基本要求:
利用双向循环链表实现长整数的存储,每个结点含一个整型变量。任何整型变量的范围是 -(2 15 -1)~(2 15 -1)。输入输出形式:按照中国对于长整数的表示习惯,每四位是一组,组间用逗号隔开
更高要求:
(1)长整数的减法
(2)多个长整数的连续加减法,并带括号等。具体方式可以参见表达式的求值部分,利用栈
测试数据:
(1)0;0;应输出“0”
(2)-2345,6789;-7654,3211;应输出“-1,0000,0000”
(3)-9999,9999;1,0000,0000,0000;应输出“9999,0000,0001”(4)1,0001,0001;-1,0001,0001;应输出“0”(5)1,0001,0001;-1,0001,0000;应输出“1”
(6)-9999,9999,9999;-9999,9999,9999;应输出“-1,9999,9999,9998”(7)1,0000,9999,9999;1;应输出“1,0001,0000,0000”
一、概要设计
1.数据结构
此实验采用的数据结构是双向循环链表。这样可以很容易的找到他的前驱以及它的后继。节点采用结构体类型,代码如下:typedef struct Node // 双向链表的结构体定义
{
int data;
struct Node *prior;struct Node *next;}DLNode;
2.使用函数
1)void ListInitiate(DLNode **head)
操作结果:初始化一个头结点为head的双向循环链表; 2)int ListLength(DLNode *head)
操作结果:计算以head为头结点的链表的长度 3)int ListInsert(DLNode *head,int i,int x)
操作结果:将节点数据为x的节点插到第i个位置上去。4)int abs(int x)
操作结果:绝对值函数,返回x的绝对值。5)int InputNumber(DLNode *head)
操作结果:将从键盘中接收数据并把得到的数据存入以head为头结点的链表中。四位一存,中间以逗号区分,结束符为分号。6)void OutputNumber(DLNode *head,int sign)
操作结果:将以head为头结点的链表中的所有数据输出到显示屏上,7)void add(DLNode *head1,DLNode *head2,DLNode *head3)操作结果:实现正数加正数的加法操作。8)int change(DLNode *head1,DLNode *head2)
操作结果:判断存在俩个链表中的数的大小,如何head1中的数大于head2中的数那么返回值为0,反之返回值为1,相等时返回值为2; 9)void method(DLNode *head1,DLNode *head2,int x)
操作结果:计算正数乘以正数的乘法运算。
10)void minus(DLNode *head1,DLNode *head2,DLNode *head3)操作结果:计算正数减正数的减法运算。
11)void yunsuan(DLNode *head1,DLNode *head2,DLNode *head3,char ch)
操作结果:正数,负数,加法,减法。计算式共分为八种运算,在这之前我已经实现了二种运算,那么这个函数就是把这八种运算按照一定的规则转化成已经实现的二种运算来实现完整的加减法运算。
12)void chengfa(DLNode *head1,DLNode *head2)
操作结果:在乘法中我只是实现了正数乘以正数的运算,那么这个函数就是通过调用method函数按照一定的规则来实现完整的乘法运算。13)void main()
操作结果:主函数。调用以上的各个函数来引导用户进行长整数的加法运算,加法运算,乘法运算。
二、详细设计
1.数据结构详细设计
typedef struct Node // 双向链表的结构体定义 {
int data;struct Node *prior;struct Node *next;}DLNode;双向循环链表的节点由三个部分组成,第一是数据部分data存储此节点的数据,第二是此节点的前驱指针部分*prior指向此节点的前驱,第三是此节点的后继指针部分*next指向此节点的后继。数据部分我们约定它为整形变量,前驱后继指针均为结构体Node类型。2.链表初始化函数:
void ListInitiate(DLNode **head)//双向链表的初始化 {
} if((*head=(DLNode *)malloc(sizeof(DLNode)))==NULL)exit(0);(*head)->prior=*head;(*head)->next=*head;
初始化之前需要定义一个类型为Node型的头结点变量,经过函数后完成链表的初始化即:头节点的前驱指针指向自己,同时他的后继指针也指向自己。3.计算已知的链表长度:
int ListLength(DLNode *head)//双向链表的表长 {
DLNode *p=head;int size=0;while(p->next!=head){
} p=p->next;size++;return size;} 此函数计算的是已知链表的长度。主要思想:从头结点开始寻找下一个节点,找到计数器加一。直到再次寻找到头结点时停止,计算完毕。
4.插入函数:
int ListInsert(DLNode *head,int i,int x)//双向链表的数据插入,i表示是插入的第几个元素 {
DLNode *p,*s;int j;p=head->next;j=0;while(p!=head&&j
} if(j!=i){
} if((s=(DLNode *)malloc(sizeof(DLNode)))==NULL)exit(0);s->data=x;s->prior=p->prior;//插入 p->prior->next=s;s->next=p;p->prior=s;return 1;printf(“n插入位置不合法!”);return 0;p=p->next;j++;
} 此函数是已知一双向链表实现在第i个位置插入data为x的节点。函数需要注意的是在什么位置插入才是合法的,在就是在该节点指针时的顺序不要搞错。5.绝对值函数:
int abs(int x){
} if(x<0)return-x;else return x;此函数是实现求一个整数的绝对值。设计这么一个函数主要是考虑到在存储负数的时候头结点应该变为正整数,然后通过其他手段变相实现那种运算。6.读入数据并插入对应的链表函数:
int InputNumber(DLNode *head)//读入输入的数据 {
int input,i=0;//第i个节点 char c;scanf(“%d%c”,&input,&c);while(1){
if(input<0&&i==0)//输入数为负且是第一个节点 {
} else if(input>=0&&i==0)//输入数为正且是第一个节点 {
} else {
} if(head->next->data>=0){
} //input=-1*input;ListInsert(head,i,input);ListInsert(head,i,input);//非第一个节点 else head->data=1;//将长整数的符号保存在头结点中 ListInsert(head,i,input);//插入数据 head->data=0;//将长整数的符号保存在头结点中 //input=abs(input);//取输入数字的绝对值 ListInsert(head,i,input);//插入数据
}
} return 1;i++;if(c==';')break;//遇到数据输入完成标志,跳出循环 scanf(“%d%c”,&input,&c);此函数实现的是从键盘上得到数据根据三种情况进行不同的处理,判断是否是头结点,判断是否是整数,判断输入的字符是否是“;”分号。并且如果是正整数它的头结点data等于1否则为0。
7.输出函数
void OutputNumber(DLNode *head,int sign){ DLNode *r=head->next;while(r->data==0&&r!=head->prior){
r=r->next;} if(sign==1){
printf(“结果是:”);} else {
printf(“结果是:-”);}
printf(“%d”,r->data);
r=r->next;
while(r!=head)
{
if(r->data<10)
{
printf(“,000”);
printf(“%d”,r->data);
}
else if(r->data<100)
{
printf(“,00”);
printf(“%d”,r->data);
}
else if(r->data<1000){
//从表尾输出数据元素
}
} printf(“n”);
} else { } r=r->next;
printf(“,%d”,r->data);printf(“,0”);printf(“%d”,r->data);此函数实现的是将最后的结果输出到显示屏上,经过判断数据的正负和数据的范围来进行不同的处理,以保证在显示屏上显示的是正确的格式。
8.不完整加法函数(只可实现正数加上正数)
void add(DLNode *head1,DLNode *head2,DLNode *head3){ int z=0;
if(p1==head1&&p2!=head2){
while(p2!=head2){
e=p2->data+z;if(e>=10000){ z=1;int e;DLNode *p1,*p2;p1=head1->prior;p2=head2->prior;while(p1!=head1&&p2!=head2){ e=p1->data+p2->data+z;
}
if(e>=10000){
} else z=0;ListInsert(head3,0,e);p1=p1->prior;p2=p2->prior;z=1;e=e%10000;
} else z=0;ListInsert(head3,0,e);p2=p2->prior;e=e%10000;} if(z==1)ListInsert(head3,0,z);} else if(p1!=head1&&p2==head2){
while(p1!=head1){ e=p1->data+z;
if(e>=10000){
} z=1;e=e%10000;else z=0;p1=p1->prior;ListInsert(head3,0,e);} if(z==1)ListInsert(head3,0,z);} else{ if(z==1)ListInsert(head3,0,z);} } 此函数实现的是两个正数之间的相加运算,主要的算法和我们手算加法是一样的,首先设置一个进位计数的变量,根据存储的特点从低位开始相加带上进位即可得出相应的位和,最后更新进位变量。处理边界状况:如果两个链表一样长同时他们最高位在计算完成时仍然会有进位,那么应该考虑到在数据的更高位插入一个1表示最后的计算结果,这样才可以保证数据的完整性。9.判断俩正数大小函数:
int change(DLNode *head1,DLNode *head2){
int length1,length2,r=2;length1=ListLength(head1);DLNode *p1,*p2;p1=head1->next;p2=head2->next;length2=ListLength(head2);
if(length1>length2){
} else if(length1 } else { } return r;} int i=0;for(i=0;i } if(p1->data>p2->data){ } else if(p2->data>p1->data){ } else { } p1=p1->next;p2=p2->next;r=2;r=1;return r;break;r=0;return r;break;r=1;return r;r=0;return r;此函数实现的是判断俩个正数的大小。考虑俩正数的在链表中所占存储单元的多少,多的一定大,当他们一样长时,一位一位的比较直到找到一个节点中的data比另一个链表的对应节点的data大为止。如果最后仍是一样大那么这两个数就是一样大的。返回值为自己约定的参数r等于2表示俩数一样大,等于1表示第二个数大,等于 0表示第一个数大。 10.乘法函数: void method(DLNode *head1,DLNode *head2,int x){ void minus(DLNode *head1,DLNode *head2,DLNode *head3);DLNode *temp1;DLNode *temp2;DLNode *temp3;DLNode *temp4;DLNode *temp5;int e,z=0,i,j;ListInitiate(&temp1);ListInitiate(&temp2);ListInitiate(&temp3);ListInsert(temp2,0,0);DLNode *p1,*p2;p1=head1->prior;p2=head2->prior;for(i=0;i while(p1!=head1){ } if(z!=0)ListInsert(temp1,0,z);for(j=0;j } else z=0;ListInsert(temp1,0,e);p1=p1->prior;z=e/10000;e=e-z*10000;ListInitiate(&temp4);ListInsert(temp4,0,0);ListInitiate(&temp5); } p1=head1->prior;p2=p2->prior;}OutputNumber(temp2,x);此函数实现的是俩个整数的乘法运算。模仿手算乘法,乘数的每一位分别和被乘数相乘得到的结果相加,注意的是在每次乘完相加时注意把低位的空缺补上0,以保证数据可以按位相加。在每一位乘法时需要注意一定要加上低位的进位以及改变进位的值,这样才能保证每一位诚出来的结果是正确的。11.减法函数: void minus(DLNode *head1,DLNode *head2,DLNode *head3){ int z=0,x=-1;int e;DLNode *p1,*p2;p1=head1->prior;p2=head2->prior;x=change(head1,head2);if(x==0){ while(p1!=head1&&p2!=head2){ } p1->data=p1->data+z;p1->data=p1->data+z;if(p1->data>=p2->data){ } else { } e=10000+p1->data-p2->data;ListInsert(head3,0,e);z=-1;e=p1->data-p2->data;ListInsert(head3,0,e);p1=p1->prior;p2=p2->prior;z=0;p1=p1->prior;p2=p2->prior;while(p1!=head1){ e=p1->data; ListInsert(head3,0,e); p1=p1->prior;} else if(x==1){ p2=head1->prior;while(p1!=head2&&p2!=head1){ } p1->data=p1->data+z;p1->data=p1->data+z;if(p1->data>=p2->data){ } else { } e=10000+p1->data-p2->data;ListInsert(head3,0,e);z=-1;e=p1->data-p2->data;ListInsert(head3,0,e);p1=p1->prior;p2=p2->prior;z=0;p1=head2->prior;} p1=p1->prior;p2=p2->prior;while(p1!=head2){ e=p1->data;p1=p1->prior;ListInsert(head3,0,e);} head3->next->data=-1*head3->next->data;} else { } } head3->next->data=0;此函数实现的是两个正数的减法运算。整个函数分为俩大部分,第一部分处理第一个数大于第二个数,第而部分是处理第二个数大于第一个数。在这个为题上我自己想了好长 时间,感觉俩部分可以 结合成一部分,但是由于本人的知识所限没有想出更好的办法,这使得代码量增加了足足一倍之多。仍然模仿手算减法,先找到俩数字中最大的那个,用大的减去小的。最后判断符号位。12.整合八种情况函数: void yunsuan(DLNode *head1,DLNode *head2,DLNode *head3,char ch){ DLNode *p1,*p2;p1=head1->next;p2=head2->next;if(head1->data==1&&head2->data==1){ } else if(head1->data==1&&head2->data==0){ } else if(head1->data==0&&head2->data==1){ } if(ch=='+'){ } else { } head1->next->data*=-1;head2->next->data*=-1;add(head1,head2,head3);head3->next->data*=-1;head1->next->data*=-1;minus(head2,head1,head3);if(ch=='+'){ } else { } head2->next->data*=-1;add(head1,head2,head3);head2->next->data*=-1;minus(head1,head2,head3);if(ch=='+')add(head1,head2,head3);else minus(head1,head2,head3); else { } } 此函数实现的是八种情况的整合。八种情况分别是正数加正数、正数加负数、正数减正数、正数减负数、负数加负数、负数加正数、负数减正数、负数减负数。此函数调用已经做好的正数加正数和正数减正数函数判断符号位,根据一定的规则实现八种运算。if(ch=='+'){ } { } head1->next->data*=-1;head2->next->data*=-1;minus(head2,head1,head3);head1->next->data*=-1;head2->next->data*=-1;add(head1,head2,head3);head3->next->data*=-1;else 13.整合乘法运算函数: void chengfa(DLNode *head1,DLNode *head2){ int i;if((head1->next->data*head2->next->data)<0){ } else { } } 此函数实现的是乘法运算的完整运算。调用已经实现的正数乘以正数的函数来计算函数值,在判断最head1->next->data=abs(head1->next->data);head2->next->data=abs(head2->next->data);i=1;method(head1,head2,i);head1->next->data=abs(head1->next->data);head2->next->data=abs(head2->next->data);i=0;method(head1,head2,i); 终的函数符号,得到最和的结果。 14.主函数: void main(){ } 此函数是主函数。主要的作用是为用户做一个提示,如何完成自己想要的运算。同时调用各个函数实现运算。char ch,ch1;while(1){ } //int w=-1;DLNode *a,*b,*c;ListInitiate(&a);ListInitiate(&b);ListInitiate(&c);printf(“请输入数A(以分号结束):”);InputNumber(a);//printf(“n”);printf(“请输入数B(以分号结束):”);InputNumber(b);//w=change(a,b);printf(“请选择操作符:<+,-,*>:n”);scanf(“%s”,&ch1);if(ch1=='+'||ch1=='-'){ } else if(ch1=='*')chengfa(a,b);else printf(“此版本不支持%c运算”,ch1);printf(“要继续吗?(y/n):”);scanf(“%s”,&ch);if(ch=='Y'||ch=='y'){ } else exit(0);printf(“n”);continue;yunsuan(a,b,c,ch1);OutputNumber(c,1); 三、调试分析 1.调试过程中遇到的问题 在函数编写之前我首先写出了所有函数的框架以及各个函数之间的关系,根据逐步求精的思想来完善整个程序。即使是这样我仍然遇到了不少错误。 例如:在实现正数减正数时,我一开始没有分为以上所说的俩个部分,而是把俩个部分整合到一起实现一个大函数,但是在我运行调试时结果大不如人意,出现的都是匪夷所思的数字,我根本就推算不出这些数字是怎么来的。没有办法我只好在另辟途径来完成函数的实现。于是我就分作两个部分来实现,这样逐步追踪可以使思绪更加清晰,所付出的代价是代码量增加。 四、使用说明和测试结果 1.使用说明 用户在使用该程序时,只需按照程序中的规定进行即可实现长整数的加减运算,具体使用步骤如下: 1)点击运行按钮,在DOS窗口下按照规定输入的数字需要从低位开始数四位一组用逗号隔开。输入第一个数字。2)同上输入第二个数; 3)选择要对这两个长整数进行的运算。 4)两个操作数与运算符选择完毕后,按回车键即可得到运算结果。2.测试结果 1)考虑边界数字,输入0和0做加法运算,输出“0”,结果如下图: 2)考虑加法进位(包括低位向高位的进位以及高位仍有进位情况),结果如下图: 3)考虑减法进位并且数A小于数B以及数A大于数B,结果如下图: 4)乘法结果为正数以及负数两种情况,结果如下图: 5)本试验要求的数据 0、0; 输出“0”(已证明) 2345,6789、-7654,3211; 输出“1,0000,0000” 1,0000,0000,0000、9999,9999; 输出“9999,0000,0001” 1,0001,0001、;1,0001,0001; 输出“0” 五、心得体会 本次试验是我感觉到了理论应用与实践的意义,以前我们也做过类似的题目,所以在试验中我感觉还是比较顺利的但是还是花了我十七个小时左右才完成。根据模块化思想来把握整体结构会使自己的思路更加清晰,更加明了。得到的东西往往是说不出来的只有自己心理面最清楚。 六、附录 程序的完整代码清单: #include int data;struct Node *prior;struct Node *next;}DLNode;void ListInitiate(DLNode **head)//双向链表的初始化 { if((*head=(DLNode *)malloc(sizeof(DLNode)))==NULL)exit(0);(*head)->prior=*head; } int ListLength(DLNode *head)//双向链表的表长 { } int ListInsert(DLNode *head,int i,int x)//双向链表的数据插入,i表示是插入的第几个元素 { } int abs(int x){ if(x<0)return-x;DLNode *p,*s;int j;p=head->next;j=0;while(p!=head&&j } if(j!=i){ } if((s=(DLNode *)malloc(sizeof(DLNode)))==NULL)exit(0);s->data=x;s->prior=p->prior;//插入 p->prior->next=s;s->next=p;p->prior=s;return 1;printf(“n插入位置不合法!”);return 0;p=p->next;j++;DLNode *p=head;int size=0;while(p->next!=head){ } p=p->next;size++;(*head)->next=*head;return size; } int InputNumber(DLNode *head)//读入输入的数据 { } void OutputNumber(DLNode *head,int sign)//从表尾输出数据元素 { DLNode *r=head->next;while(r->data==0&&r!=head->prior){ r=r->next;int input,i=0;//第i个节点 char c;scanf(“%d%c”,&input,&c);while(1){ } return 1;if(input<0&&i==0)//输入数为负且是第一个节点 { } else if(input>=0&&i==0)//输入数为正且是第一个节点 { } else { } i++;if(c==';')break;//遇到数据输入完成标志,跳出循环 scanf(“%d%c”,&input,&c);if(head->next->data>=0){ } //input=-1*input;ListInsert(head,i,input);ListInsert(head,i,input);//非第一个节点 else head->data=1;//将长整数的符号保存在头结点中 ListInsert(head,i,input);//插入数据 head->data=0;//将长整数的符号保存在头结点中 //input=abs(input);//取输入数字的绝对值 ListInsert(head,i,input);//插入数据 else return x; } void add(DLNode *head1,DLNode *head2,DLNode *head3){ int z=0;int e;DLNode *p1,*p2;} if(sign==1){ } else { } printf(“%d”,r->data);r=r->next;while(r!=head){ } printf(“n”); if(r->data<10){ } else if(r->data<100){ } else if(r->data<1000){ } else { } r=r->next; printf(“,%d”,r->data);printf(“,0”);printf(“%d”,r->data); printf(“,00”);printf(“%d”,r->data);printf(“,000”);printf(“%d”,r->data);printf(“结果是:-”);printf(“结果是:”); p1=head1->prior;p2=head2->prior;while(p1!=head1&&p2!=head2) if(p1==head1&&p2!=head2){ while(p2!=head2){ e=p2->data+z;if(e>=10000){ } else z=0;ListInsert(head3,0,e);p2=p2->prior;z=1;e=e%10000;{ e=p1->data+p2->data+z; } if(e>=10000){ } else z=0;ListInsert(head3,0,e);p1=p1->prior;p2=p2->prior;z=1;e=e%10000;} if(z==1)ListInsert(head3,0,z);} else if(p1!=head1&&p2==head2){ while(p1!=head1){ e=p1->data+z; if(e>=10000){ } z=1;e=e%10000;else z=0;p1=p1->prior;ListInsert(head3,0,e);} if(z==1)ListInsert(head3,0,z);} else{ } int change(DLNode *head1,DLNode *head2){ int length1,length2,r=2;length1=ListLength(head1);DLNode *p1,*p2;p1=head1->next;p2=head2->next;if(length1>length2){ } else if(length1 } else { int i=0;for(i=0;i if(p1->data>p2->data){ } else if(p2->data>p1->data){ } else { p1=p1->next;p2=p2->next;r=1;return r;break;r=0;return r;break;r=1;return r;r=0;return r;if(z==1)ListInsert(head3,0,z);} length2=ListLength(head2); } void method(DLNode *head1,DLNode *head2,int x){ void minus(DLNode *head1,DLNode *head2,DLNode *head3);DLNode *temp1;DLNode *temp2;DLNode *temp3;DLNode *temp4;DLNode *temp5;int e,z=0,i,j;ListInitiate(&temp1);ListInitiate(&temp2);ListInitiate(&temp3);ListInsert(temp2,0,0);DLNode *p1,*p2;p1=head1->prior;p2=head2->prior;for(i=0;i while(p1!=head1){ } if(z!=0)ListInsert(temp1,0,z);for(j=0;j } else z=0;ListInsert(temp1,0,e);p1=p1->prior;z=e/10000;e=e-z*10000;ListInitiate(&temp4);ListInsert(temp4,0,0);ListInitiate(&temp5); } return r; } } r=2; } void minus(DLNode *head1,DLNode *head2,DLNode *head3){ int z=0,x=-1;int e;DLNode *p1,*p2;p1=head1->prior;p2=head2->prior;x=change(head1,head2);if(x==0){ while(p1!=head1&&p2!=head2){ } p1->data=p1->data+z;p1->data=p1->data+z;if(p1->data>=p2->data){ } else { } e=10000+p1->data-p2->data;ListInsert(head3,0,e);z=-1;e=p1->data-p2->data;ListInsert(head3,0,e);p1=p1->prior;p2=p2->prior;z=0; add(temp1,temp2,temp3);temp1=temp4;temp2=temp3;temp3=temp5;z=0;p1=head1->prior;p2=p2->prior;}OutputNumber(temp2,x);p1=p1->prior;p2=p2->prior;while(p1!=head1){ e=p1->data;p1=p1->prior;ListInsert(head3,0,e);} } } void yunsuan(DLNode *head1,DLNode *head2,DLNode *head3,char ch){ DLNode *p1,*p2;p1=head1->next;p2=head2->next;if(head1->data==1&&head2->data==1)else if(x==1){ p2=head1->prior;while(p1!=head2&&p2!=head1){ } p1->data=p1->data+z;p1->data=p1->data+z;if(p1->data>=p2->data){ } else { } e=10000+p1->data-p2->data;ListInsert(head3,0,e);z=-1;e=p1->data-p2->data;ListInsert(head3,0,e);p1=p1->prior;p2=p2->prior;z=0;p1=head2->prior;p1=p1->prior;p2=p2->prior;while(p1!=head2){ e=p1->data;p1=p1->prior;ListInsert(head3,0,e);} head3->next->data=-1*head3->next->data;} else { } head3->next->data=0; { } else if(head1->data==1&&head2->data==0){ } else if(head1->data==0&&head2->data==1){ } else { if(ch=='+'){ } { head1->next->data*=-1;head1->next->data*=-1;head2->next->data*=-1;add(head1,head2,head3);head3->next->data*=-1;if(ch=='+'){ } else { } head1->next->data*=-1;head2->next->data*=-1;add(head1,head2,head3);head3->next->data*=-1;head1->next->data*=-1;minus(head2,head1,head3);if(ch=='+'){ } else { } head2->next->data*=-1;add(head1,head2,head3);head2->next->data*=-1;minus(head1,head2,head3);if(ch=='+')add(head1,head2,head3);else minus(head1,head2,head3);else } void chengfa(DLNode *head1,DLNode *head2){ } void main(){ char ch,ch1;while(1){ //int w=-1;DLNode *a,*b,*c;ListInitiate(&a);ListInitiate(&b);ListInitiate(&c);printf(“请输入数A(以分号结束):”);InputNumber(a);//printf(“n”);printf(“请输入数B(以分号结束):”);InputNumber(b);//w=change(a,b);printf(“请选择操作符:<+,-,*>:n”);scanf(“%s”,&ch1);if(ch1=='+'||ch1=='-'){ yunsuan(a,b,c,ch1);int i;if((head1->next->data*head2->next->data)<0){ } else { } head1->next->data=abs(head1->next->data);head2->next->data=abs(head2->next->data);i=1;method(head1,head2,i);head1->next->data=abs(head1->next->data);head2->next->data=abs(head2->next->data);i=0;method(head1,head2,i); } } head2->next->data*=-1;minus(head2,head1,head3); } } } else if(ch1=='*')chengfa(a,b);else printf(“此版本不支持%c运算”,ch1);printf(“要继续吗?(y/n):”);scanf(“%s”,&ch);if(ch=='Y'||ch=='y'){ } else exit(0);printf(“n”);continue;OutputNumber(c,1); 整数简便运算工程车人体的人特大号 教学目的 1、使学生进一步理解减法性质,加法运算定律,乘法运算定律,除法性质.2、通过复习整理,提高学生的计算能力,发展思维能力和思维灵活性,沟通知识间的联系。 .教学重点:理解运算的性质和定律.教学难点:沟通知识间的联系和发展思淮能力.7教学过程: 一、导入揭示课题。 二、复习整理: (一)、整理加减法的简便运算。 1、出示: 734+98 56+78+44 (63+71)+29(1)、学生练习 (2)、说说简算的依据.(2)、随生回答板书。 2、出示: 385-199 836-265-35 412-73-312(1)、学生独立练习。 (2)、较对方法同上.(二)、整理乘除法的简便运算。 1、出示: 25×26×4 139×125×8 (200+2)×36 148×25(1)、学生讨论 (2)、学生汇报计算方法 (3)、说说你是根据什么道理? 2、随生回答板书。 3、出示:2700÷25÷4 225÷25(1)、学生讨论 (2)、汇报计算方法 (3)、为什么? 随生回答板书。 三、巩固提高。 1、出示:想一想:下列各题怎样计算较简便。374-(74+83) 27-59+58 102×236-236×2 8÷7+6÷7 28÷9-10÷9 2300÷4÷23 4500×25÷45(1)、学生讨论 (2)、同组同学互说简算的根据.(3)、问:这些方法与什么运算定律或运算性质有联系.2、随生回答板。 四、作业(略).板书设计(略) 三、整数简便运算的整理课的设计思路及教后摘记: (一)、设计思路:、本课是在学生学习了应用积、商不变性质简便运算之后系统复习、整理整数的加减乘除法的简便计算方法。以归纳、概括、疏理运算性质和运算定律,沟通知识间的联系,发展学生思维能力为指导思想。、学过程的设计努力体现学生的主体地位。师生协作、同学间的合作的教学方法。努力开发学生的智力,为发展思维能力、提高计算能力、拓展学生的知识。 (二)、教后摘记: 1、从整堂课的完成情况来看,教学目标达成,教学思想得以体现,教师在教学中只充当“朋友”的角色,创设了融洽和谐的师生关系和活跃的课堂气氛。 2、教学中实施了小组讨论教法,针对学生所提出的向题充分展开讨论,激发引导学习小组积极讨论,培养了学生良好的思维能力,以及积极的个性心理品质,以发展性、主休性、民主性的原则也得以体现。使学生在与其他人的交往过程中学到了巧妙的计算方法,也使自己的见解得到别人的认可,体验到成功的乐趣,同时也培养了团结的精神。课题:整数加减法的简便算法 教学内容:加减法的运算规律及其应用 教学目标: 1、使学生初步认识加数和加数交换位置和不变,与从一个数里连续减去两个数,等于从这个数里减去两个数的和的运算规律。 2、学会应用这种规律进行简便计算。 3、培养学生分析、综合和抽象的思维能力,以及合理、灵活地进行计算的能力。教学过程: 一、复习引新 1、口算 48+52= 237+63= 74+26= 85+15= 128+175+25= 64+78+36= 439+302= 2、引入新课。刚才我们用简便方法,很快算出这些题的得数,这节课我们继续学习加减法的一些简便算法。(板书课题)通过学习,要能步认识减法运算中的一些规律,并能应用这些规律进行简便计算,进一步提高计算的能力。 二、教学新课 1.教学减法的运算规律。(1)、出示题目,读题。 指名学生口答解题算式,老师板书一种方法的算式和结果。 提问:第一种算法是怎样想的?求还剩多少米,还可以怎样算?(学生口答,老师板书算式和结果)第二种算法又是怎样想的? 这两种算法都是求的什么问题?从一个数里连续减去两个数,实际上就是从这个数里减去什么?所以两种算法的结果怎样?说明哪两个式子相等?[板书:360—87一113=360一(87十113)] 提问:从360里减去87和113这两个数,等于从360里减去什么?(2)题组的计算、比较。用小黑板出示第68页下面的题组。 请大家在课本上把这几道算式计算一下,看看每组里的两个算式的结果有什么关系,在o里填上适当的符号。 让学生口答练习结果,老师在o里板书等号。 提问:从第一组两个算式里可以看出从30里减去4和6两个数,等于从30里减去什么?第二组呢?第三组呢?(3)归纳运算规律。 在这三组算式里,每组算式之间都有什么共同特点?你发现了什么规律? 总结出运算规律,并让学生看课本上的结语读一读。(4)根据规律填空。 563—174—26=563—(174o26)342—69—31=342—(o)1284一(600+7)=1284—600 o 7 324—(24+198)=324— o 456—102=456—100 o 2 提问:前两题为什么o里都填加号?第三、四题为什么o里都填减号?为什么456一102等于456—100—27 说明:应用这一规律,可以使一些计算简便。2.教学简便算法。 出示例题。提问:这道题里两个减数可以凑成怎样的数?根据刚才学习的减法运算规律,怎样算比较简便?为什么? 谁再来说一说,这道题用简便算法可以怎样想? 按照这样想的过程,黑板上的题怎样算?(板书简便算法的计算过程)小结:例1里两个减数可以凑成整百数,就先求出两个减数的和200,再从724里减去这两个减数的和。这样算比较简便。 (2)计算724——(224+30)。出示题目。 提问:这道题是724减去两个数的和,大家看一看这三个数,先算加法会简便吗?你发现从724里先减去哪个数比较简便?为 什么?接下来再怎样算?为什么还要用减法减去307 谁来说一说这道题怎样计算?(老师板书计算过程)板书时结合提问:为什么等于724—224—307并说明这是把刚才的规律反过来应用。 小结:这道题是一个数减去两个数的和,由于724减去224可以口算,所以就反过来应用刚才的规律,从724里先减去224,再减去30。这样算比较简便。 (评析:这里补充了这一类型的练习题进行讲解,不仅使学生认识这一运算规律还可以反过来应用,加深了对这一规律的理解,还可以为下面例2的教学作好铺垫,使学生进一步领会和掌握应用这一规律使计算简便的关键。)(3)出示例2。提问:减数301接近几百?可以看做哪两个数的和?这样,400—301就可以写成400减去哪两个数的和?[板书:=400一(300+1)]现在你能看出怎样算比较简便吗?(板书计算过程)谁能说一说,这道题用简便算法是怎样想的? 追问:这里是怎样用刚才学到的规律的?(反过来用)小结:当减数接近整百数又比整百数稍大一点时,可以把它看成是几百加几的和,反过来应用刚才的规律,先减去几百,再减去几,这样算比较简便。 三、巩固练习1.“练一练” (1)指名两人板演左边两题的连减题,其余学生做在课本上。集体订正。提问学生是怎样想的。 (2)指名两人板演右边两题,其余学生做在课本上。集体订正。提问学生是怎样想的。 (3)提问:这里四道题的简便算法,第一步得到的都是怎样的数? 指出:这里应用减法的运算规律简便计算,关键是看能不能先得到整百数再减。如果能先得到整百数,就可以应用规律使计算简便。 四、课堂小结 今天学习的减法运算的规律是什么?应用这个规律进行简便计算时,关键要看什么? 简便计算小练习 1、三年级3个班为学校修补图书。一班修补了47本,二班修补了42本,三班修补了58本。三个班共修补图书多少本?(用两种方法解答) 2、2、学校买来新书254本。其中故事书86本,文艺书114本,其余的是科技书,科技书多少本?(用两种方法解答) 3、一辆客车上有乘客54人,到达某站时,先下去28人,又上来36人。这时客车上有乘客多少人? 4、用简便方法计算 (1)15+36+35 (2)18+19+12 (3)48+25+75 (4)18+46+54 5、用简便方法计算 (1)145+67-45 (2)132+29-32 (3)116-48+84 (4)156+28-156 6、在□里填上适当的数 (1)47+98=47+□-□ (2)177-97=177-□+□(3)78+201=78+□+□ (4)211-101=211-□-□ 7、在○里填上适当的符号 (1)739-(239+278)=739○239○278(2)968-257-143=968○(257○143)(3)645-(145+273)=645○145○273(4)898-543-257=898○(543○257) 8、用简便方法计算(1)、100-54-46 (2)234-(134+45) (3)127+99 (4)232+208 9、用简便方法计算 (1)2+4+6+8+10+11+12 (2)1+3+5+7+9+11+13+15 实验报告 课程名称:___模拟电子技术实验____________指导老师:_ _成绩:__________________ 实验名称: 实验13 基本运算电路 实验类型:__________ 同组学生姓名:__________ 一、实验目的和要求(必填) 二、实验内容和原理(必填) 三、主要仪器设备(必填) 四、操作方法和实验步骤 五、实验数据记录和处理 六、实验结果与分析(必填) 七、讨论、心得 一.实验目的和要求 1、研究集成运放组成的比例、加法和积分等基本运算电路的功能。 2、掌握集成运算放大电路的三种输入方式。 3、了解集成运算放大器在实际应用时应考虑的一些问题。 4、理解在放大电路中引入负反馈的方法和负反馈对放大电路各项性能指标的影响。二.实验内容和原理 1.实现两个信号的反相加法运算。2.实现同相比例运算。3.用减法器实现两信号的减法运算。4.实现积分运算。5.用积分电路将方波转换为三角波。 运放μa741介绍 : 集成运算放大器(简称集成运放)是一种高增益的直流放大器,它有二个输入端。根据输入电路的不同,有同相输入、反相输入和差动输入三种方式。 集成运放在实际运用中,都必须用外接负反馈网络构成闭环放大,用以实现各种模拟运算。 μa741引脚排列: 三.主要仪器设备 示波器、信号发生器、晶体管毫伏表 运算电路实验电路板 μa741、电阻电容等元件 四.操作方法和实验步骤 1.实现两个信号的反相加法运算 ?r frf v?v?vos1s2??r2 ?r1? 通过该电路可实现两个信号的反相加法运算。为了消除运放输入偏置电流及其漂移造成的运算误差,需在运放同相端接入平衡电阻r3,其阻值应与运放反相端地外接等效电阻相等,即要求r3=r1//r2//rf。 测量出输入和输出信号的幅值,并记录示波器波形。 注意事项: ①被加输入信号可以为直流,也可以选用正弦、方波或三角波信号。但在选取信号的频率和幅度时,应考虑运放的频响和输出幅度的限制。 ②为防止出现自激振荡和饱和失真,应该用示波器监视输出电压波形。 ③为保证电路正确,应对输出直流电位进行测试,即保证零输入时为零输出。2.实现同相比例运算 电路特点是输入电阻比较大,电阻r同样是为了消除偏置电流的影响,故要求 r= rl//rf。?rf ? ?v?o ?1?r??vs 1?? 实验步骤: (1)测量输入和输出信号幅值,验证电路功能。(2)测出电压传输特性,并记录曲线。电压传输特性是表征输入输出之间的关系曲线,即 vo= f(vs)。 同相比例运算电路的输入输出成比例关系。但输出信号的大小受集成运放的最大输出电压幅度的限制,因此输入输出只在一定范围内是保持线性关系的。电压传输特性曲线可用示波器来观察。 (3)测量出输入和输出信号的幅值,并记录示波器波形。3.用减法器实现两信号的减法运算 差分放大电路即减法器,为消除运放输入偏执电流的影响,要求r1=r2、rf=r3。v?rf?v? v?os2s1 r1 把实验数据及波形填入表格。实验注意事项同前。4.实现积分运算 1 vo? ? r1c vt ??s r1c ?vdt s t 电路原理: 积分电路如上图所示,在进行积分运算之前,将图中k1闭合,通过电阻r2的负反馈作用,进行运放零输出检查,在完成零输出检查后,须将k1打开,以免因r2的接入而造成积分误差。 k2的设置一方面为积分电容放电提供通路,将其闭合即可实现积分电容初始电压vc(0)=0。另一方面,可控制积分起始点,即在加入信号vs后,只要k2一打开,电容就将被恒流充电,电路也就开始进行积分运算。p.4 实验名称:____实验13 基本运算电路 姓名: 学号: 实验步骤: 用示波器观察输出随时间变化的轨迹,记录输入信号参数和示波器观察到的输出波形。 (1)先检查零输出,将电容c放电;(2)将示波器按钮置于适当位置: ? 将光点移至屏幕左上角作为坐标原点; ? y轴输入耦合选用“dc”; ? 触发方式采用“norm”; (3)加入输入信号(直流),然后将k2打开,即可看到光点随时间的移动轨迹。5.用积分电路将方波转换为三角波 电路如图所示。图中电阻r2的接入是为了抑制由iio、vio所造成的积分漂移,从而稳定运放的输出零点。在t<<τ2(τ2=r2c)的条件下,若vs为常数,则vo与t 将近似成线性关系。因此,当vs为方波信号并满足tp<<τ2时(tp为方波半个周期时间),则vo将转变为三角波,且方波的周期愈小,三角波的线性愈好,但三角波的幅度将随之减小。 实验步骤及数据记录: 接三种情况加入方波信号,用示波器观察输出和输入波形,记录线性情况和幅度的变化。? tp<<τ2 ? tp ≈τ2 ? tp>>τ2 五、实验数据记录与处理、实验结果与分析 1、反相加法运算 p.5 实验名称:____实验13 基本运算电路 姓名: 学号: 由于 ?rf?rf vo???v?v?rs1rs2??=-(10vs1+10vs2)?1? 2 理论上vo=11.2v,实际vo=9.90v,相对误差11.6%。 误差分析:①检查零输入时,vo=0.5v左右(即使仿真也有几百微伏),并非完全为零,因此 加上信号测量时会有 一定的误差。 ②测量vo过程中,毫伏表示数时有时无,通过按压电路板与接线处都会使毫伏表示数产生一定的波动,可见电路本身并不稳定。本实验读数是毫伏表多次稳定在该数值时读取,但依然不可避免地由于电路元件实际值存在一定的误差范围、夹子连接及安放位置导致的读数不稳定、以及部分视差原因,导致误差的存在。 2、同比例运算 20v ?rf?v?由于 o ? ? ? v s=11vo,理论上vo=5.61v,相对误差0.2%。误差分析同前。? 1?r1?? 0v-20v 0v v(vo)v(vi)0.4v 0.8v 1.2v 1.6v 2.0v 输出信号的大小受集成运放的最大输出电压幅度的限制,由仿真结果可见,输入输出在0-1.3v内是保持线性关系的。篇二:比例求和运算电路实验报告 比例求和运算电路实验报告 一、实验目的①掌握用集成运算放大器组成比例求和电路的特点和性能; ②学会用集成运算放大电路的测试和分析方法。 二、实验仪器 ①数字万用表;②示波器;③信号发生器。 三、实验内容 ⅰ.电压跟随器 实验电路如图6-1所示: 理论值:ui=u+=u-=u 图6-1 电压跟随器 按表6-1内容实验并记录。 表6-1 ⅱ.反相比例放大电路 实验电路如图6-2所示: 理论值:(ui-u-)/10k=(u--uo)/100k且u+=u-=0故uo=-10ui 图6-2 反相比例放大器 1)按表6-2内容实验并测量记录: 表6-2 发现当ui=3000 mv时误差较大。2)按表6-3要求实验并测量记录: 表6-3 其中rl接于vo与地之间。表中各项测量值均为ui=0及ui=800mv 时所得该项测量值之差。 ⅲ.同相比例放大器 电路如图6-3所示。理论值:ui/10k=(ui-uo)/100k故uo=11ui 图6-3 同相比例放大电路 1)按表6-4和6-5实验测量并记录。 表6-5 ⅳ.反相求和放大电路 实验电路如图6-4所示。理论值:uo=-rf/r*(ui1+ui2) 图6-4 反相求和放大器 按表6-6内容进行实验测量,并与预习计算比较。 表6-6 ⅴ.双端输入差放放大电路 实验电路如图6-5所示。 理论值:uo=(1+rf/r1)*r3/(r2+r3)*u2-rf/r1*u1篇三:集成运放基本运算电路实验报告 实验七 集成运放基本运算电路 一、实验目的 1、研究由集成运算放大器组成的比例、加法、减法和积分等基本运算电路的功能。 2、了解运算放大器在实际应用时应考虑的一些问题。 二、实验原理 集成运算放大器是一种具有高电压放大倍数的直接耦合多级放大电路。当外部接入不同的线性或非线性元器件组成输入和负反馈电路时,可以灵活地实现各种特定的函数关系。在线性应用方面,可组成比例、加法、减法、积分、微分、对数等模拟运算电路。 理想运算放大器特性 在大多数情况下,将运放视为理想运放,就是将运放的各项技术指标理想化,满足下列条件的运算放大器称为理想运放。 开环电压增益 aud=∞ 输入阻抗 ri=∞ 输出阻抗 ro=0 带宽 fbw=∞ 失调与漂移均为零等。 理想运放在线性应用时的两个重要特性:(1)输出电压uo与输入电压之间满足关系式 uo=aud(u+-u-) 由于aud=∞,而uo为有限值,因此,u+-u-≈0。即u+≈u-,称为“虚短”。(2)由于ri=∞,故流进运放两个输入端的电流可视为零,即iib=0,称为“虚断”。这说明运放对其前级吸取电流极小。 上述两个特性是分析理想运放应用电路的基本原则,可简化运放电路的计算。 基本运算电路 1.加法器是指输出信号为几个输入信号之和的放大器。用数学式子表示为: y = x1+ x2+ ?? + xn i1+ i2+ i3 +?? + in = if vi1vi2vv ??i3in= if r r r r 于是有v0 = ? rfr(vi1 +vi2 +vi3 +??+vin)如果各电阻的阻值不同,则可作为比例加法器,则有 rfrf?rf? v0???vi1?vi2vin? r2rn?r1? 2、减法器是指输出信号为两个输入信号之差的放大器。用数学关系表示时,可写为:y = x1-x2 下图为减法器的基本结构图。由于 va = vb rfv?vava?v0 i2?i1??ifvb?vi2 r1rfr1?rf(已知r3 = rf)r 所以 v0?f?vi1?vi2? r1 3、积分器是指输出信号为输入信号积分后的结果,用数学关系表示为: y? ?xdt t 右图是最基本的积分器的结构图。这里反馈网络的一个部分用电容来代替电阻,则有: ii?ic ? ? 上式表示了输出信号是输入信号积分的结果。 4、微分器。微分是积分的反运算,微分器是指输出信号为输入信号微分运 dx 算的结果。用数学式子表示为: y? dt 下图示出微分器的基本原理图,利用“虚断”和和“虚短”的概念,可以建立以下关系式: 三、实验设计要求 要求根据实验原理设计反相加法运算电路、减法运算电路、积分运算电路,并设计数据记录表格。 1、整理实验数据,画出波形图(注意波形间的相位关系)。 2、将理论计算结果和实测数据相比较,分析产生误差的原因。 3、分析讨论实验中出现的现象和问题。实验提示:实验前要看清运放组件各管脚的位置;切忌正、负电源极性接反和输出端短路,否则将会损坏集成块。 四、实验参考方案 1.反相比例放大电路 2.反相加法运算电路 1)按下图连接实验电路。2)调节信号源的输出。用交流毫伏表或示波器测量输入电压vi及a、b点 电压va和vb,及输出电压vo,数据记入表5-2。3.减法运算电路 六、思考题 为了不损坏集成块,实验中应注意什么问题? 答;实验前要看清运放组件各管脚的位置;切忌正、负电源极性接反和输出端短路,否则将会损坏集成块。 误差分析 1.在测定时,我们只测量了一次,没有多次测量取平均值。可能会给实验带来一定的误差。2.由于实验器材的限制,手动调节,存在较大误差,3.本次试验使用了示波器,实验仪器自身会产生误差; 4.实验电路板使用次数较多,电阻值、电容值会有误差;篇四:实验六 比例求和运算电路实验报告 《模拟电子技术》 实验报告 篇五:实验四 比例求和运算电路实验报告 实验四 比例求和运算电路 一、实验目的 1.掌握用集成运算放大器组成比例、求和电路的特点及性能。2.学会上述电路的测试和分析方法。 二、实验仪器 1.数字万用表 2.信号发生器 3.双踪示波器 其中,模拟电子线路实验箱用到直流稳压电源模块,元器件模组以及“比例求和运算电路”模板。 三、实验原理 (一)、比例运算电路 1.工作原理 a.反相比例运算,最小输入信号uimin等条件来选择运算放大器和确定外围电路元件参数。 如下图所示。10kω 输入电压ui经电阻r1加到集成运放的反相输入端,其同相输入端经电阻r2 接地。输出电压uo经rf接回到反相输入端。通常有: r2=r1//rf 由于虚断,有 i+=0,则u+=-i+r2=0。又因虚短,可得:u-=u+=0 由于i-=0,则有i1=if,可得: ui?u?u??uo ? r1rf uorf? aufur1 i由此可求得反相比例运算电路的电压放大倍数为: ??u ?rif?i?r1?ii? 反相比例运算电路的输出电阻为:rof=0 输入电阻为:rif=r1 b.同相比例运算 10kω 输入电压ui接至同相输入端,输出电压uo通过电阻rf仍接到反相输入端。r2的阻值应为r2=r1//rf。根据虚短和虚断的特点,可知i-=i+=0,则有 u?? 且 u-=u+=ui,可得: r1 ?uo?ui r1?rfauf? r1 ?uo r1?rf uor?1?f uir1 同相比例运算电路输入电阻为: rif?输出电阻: rof=0 ui ?? ii 以上比例运算电路可以是交流运算,也可以是直流运算。输入信号如果是直流,则需加调零电路。如果是交流信号输入,则输入、输出端要加隔直电容,而调零电路可省略。 (二)求和运算电路 1.反相求和 根据“虚短”、“虚断”的概念 rrui1ui2u ???o uo??(fui1?fui2)r1r2r1r2rf 当r1=r2=r,则 uo??rf(ui1?ui2)r 四、实验内容及步骤 1、.电压跟随电路 实验电路如图1所示。按表1内容进行实验测量并记录。 理论计算: 得到电压放大倍数: 即:ui=u+=u-=u 图1 电压跟随器 从实验结果看出基本满足输入等于输出。 2、反相比例电路 理论值:(ui-u-)/10k=(u--uo)/100k且u+=u-=0故uo=-10ui。实验电路如图2所示: 图2:反向比例放大电路 (1)、按表2内容进行实验测量并记录.表2:反相比例放大电路(1) (2)、按表3进行实验测量并记录。 量值之差。 测量结果:从实验数据1得出输出与输入相差-10倍关系,基本符合理论,实验数据(2) 主要验证输入端的虚断与虚短。 3、同相比例放大电路 理论值:ui/10k=(ui-uo)/100k故uo=11ui。实验原理图如下: 图3:同相比例放大电路 (1)、按表4和表5内容进行实验测量并记录 表4:同相比例放大电路(1) 4、反相求和放大电路 理论计算:uo=-rf/r*(ui1+ui2)实验原理图如下: 5、双端输入求和放大电路 理论值:uo=(1+rf/r1)*r3/(r2+r3)*u2-rf/r1*u1 实验原理图如下: 五、实验小结及感想 1.总结本实验中5种运算电路的特点及性能。电压跟随电路:所测得的输出电压基本上与输入电压相等,实验数据准确,误差很小。 反向比例放大器,所测数据与理论估算的误差较小,但当电压加到3v时,理论值与实际值不符,原因是运算放大器本身的构造。 整数四则混合运算 (二)1.有一批货,用卡车6小时运了90吨,以这样的速度又运了3小时才运完,这批货有多少吨? 2.甲、乙两人同时工作,甲每小时加工120个零件,乙每小时加工140个零件,他们工作了5小时,一共可以加工多少个零件? 3.一条裤子108元,一件上衣比裤子贵67元,买3套这样的衣服需要多少元? 4.一块长方形的地,宽是15米,长比宽的2倍还多5米,这块地的面积是多少平方米? 5.每辆卡车每次能运货6吨,18辆这样的卡车9次可运货多少吨? 6.在运动会上进行大型团体体操表演,一共8个方阵,每个方阵12行,每行12人,一共有多少人参加表演? 7.两个工人加工晶体管,甲每小时加工22个,乙比甲每小时少加工2个,每人每天工作8小时,两人5天可以加工多少个晶体管? 8.某校一年级有学生96人,二、三年级有学生共280人,四年级有学生168人,平均每个年级有学生多少人? 9.公共汽车上原有乘客38人,到东村站后有12人下车,又有4人上车,汽车上现在有多少人? 10.四一班有作文540篇,四二班有作文450篇,每30篇作文装订成一本作文集。四一班比四二班要多装订几本作文集? 11.期末考试,聪聪的语文和英语两科平均成绩是94分。他的数学需得多少分才能使三科的平均成绩达到96分? 12.学校新买了12套故事书,每套60元,还买了22套科技书,每套45元,学校新买故事书和科技书一共用了多少元? 13.24只母鸡9个月共产蛋5616个,平均每只母鸡每月产蛋多少个? 14.5台抽水机6小时抽水8400吨,平均每台抽水机每小时抽水多少吨? 15.4个打字员5分钟完成一份3600字的稿件,平均每个打字员每分钟打多少字? 16.王明家有4口人,每月(按30天计算)需生活费1080元,王明家平均每人每天需生活费多少元? 17.某运输队每辆汽车每天运煤15吨,照这样的计算,用8辆汽车6天可以运煤多少吨? 18.某运输队8辆汽车6天运煤720吨,照这样的计算,平均每辆汽车每天可以运煤多少吨? 19.某玩具厂15个工人5天能生产900个玩具,平均每个工人每天能生产多少个玩具? 20.植树小组4个人8天能栽树416棵,平均每个人每天栽树多少棵? 21.同学们做纸花,15人3小时能做540朵,平均每人每小时能做多少朵? 22.一个缝纫小组25人8天一共可以做400套衣服,平均每人每天做多少套衣服? 23.1只青蛙一个月(按30天计算)能吃害虫2100只,平均每只青蛙每天能吃多少只害虫? 24.5名同学的体重分别是32千克、39千克、43千克、40千克和31千克,这5名同学的平均体重是多少千克? 25.甲乙丙丁四位同学为学校捐书,甲乙两人共捐38本,丙丁两人共捐70本,平均每人捐书多少本? 26.一只鸵鸟3小时跑162千米,自行车4小时行112千米,鸵鸟每小时比自行车快多少千米? 27.电影院有25排座位,每排有32个座位,现在学校共有759人到电影院看演出,还剩多少个座位? 28.四年级有31名学生,两个学期共用练习本248本,平均每人每学期用多少本练习本? 29.学校选一些同学参加合唱表演,男生站成3行,每行18人;女生站成6行,每行也是18人,一共有多少人参加合唱表演? 30.王师傅每小时能做55个零件,李师傅每小时能做60个零件,他们各工作8小时,一共可以加工多少个零件? 31.一列火车5小时行驶475千米,一辆汽车6小时行驶228千米,汽车每小时比火车慢多少千米? 32.一箱鸡蛋40千克,一箱鸭蛋42千克,30箱鸡蛋和30箱鸭蛋共重多少千克? 33.某小学组织科技活动小组,低年级有48人参加,高年级有56人参加,如果每8人组成一个小组,一共可以组成多少个小组? 34.服装厂两个生产小组共同加工一批儿童服装,6天完成,第一生产小组加工了348套,第二生产小组加工了288套,平均每天第一生产小组比第二生产小组多加工多少套儿童服装? 35.四年级同学糊纸盒,一班有41人,二班有49人,平均每人糊5个,一共可以糊多少个? 36.一辆客车和一辆小汽车都行驶4小时,客车行驶180千米,小汽车行驶272千米,客车比小汽车平均每小时少行驶多少千米? 37.商店运来一批水果。其中橘子720千克,苹果700千克,橘子每30千克装一筐,苹果每25千克装一筐,运来的橘子比苹果少多少筐? 38.小红和小兰看同一本故事书,小红6天看了138页,在相同的时间里小兰看了108页,小红比小兰平均每天多看多少页? 39.王师傅每天做150个零件,李师傅每天做165个零件,两人各做6天,王师傅比李师傅少做多少个零件?王师傅和李师傅共做多少个零件? 40.小明和小红比赛踢毽子,小明每分钟踢65下,小红每分钟踢89下,他们踢了5分钟,小明比小红少踢多少下? 41.水果店运来一批水果,其中375千克香蕉,500千克梨,如果每25千克水果装一筐,香蕉比梨少装几筐? 42.有两部爱国主义影片,第一部放映48分钟,第二部放映37分钟,每分钟放映25米,这两部影片共长多少米?第一部比第二部长多少米? 43.粮店运来大米和面粉各63袋,大米每袋25千克,面粉每袋30千克,运来的面粉比大米多多少千克? 44.一列火车4小时行416千米,一辆汽车3小时行156千米,火车的速度是汽车的几倍?第三篇:整数简便运算教案
第四篇:运算电路实验报告
第五篇:整数四则混合运算应用题