第一篇:长整数加减运算实验报告
长整数加减的运算
一、需求分析
问题描述:
设计一个实现任意长的整数进行加法运算的演示程序
基本要求:
利用双向循环链表实现长整数的存储,每个结点含一个整型变量。任何整型变量的范围是 -(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); 一、需求分析 设计一个实现任意长的整数间进行四则运算的程序,要求完成长整数的加、减运算,乘除运算可选做。在这里长整数没有范围限制,可任意长。运算后的进位、借位等都要进行正确处理,可实现动态的输入,实时的输出。 测试数据: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;} 《加减混合运算》教学设计 陕西省平利县城关镇小学 殷诗英 教学设想 根据小学生的特点在课的开始就运用情境导入新课唤起学 生的兴趣激发学生的学习积极性再通过生活中具体的例子让学生 观察问题发现问题解决问题 这样教学既尊重学生的选择又能 达到教学目的体现了学生的主体地位, 最后让学生进一步解决生活 中的问题把数学和实际生活联系起来既运用了新知识解决实际问 题又体现了新《课标》的精神。 教材分析 本节内容是学生学习了100以内连加连减的基础上教学 的教材安排了一个学生们生活中常见的公共汽车5路车停 在站点有乘客上车有乘客下车的情景为主题的加减混 合运算内容包括“做一做”两道练习都是对加减混合运算 的巩固。本节内容是以一幅情景图反映数学问题有利于学 生将数学知识和生活实际结合起来并在生活中发现问题 解决问题从而发展学生解决问题的能力。 教学目标 1.掌握两位数加减混合运算的竖式书写方法能够运用所 学的100以内的减法知识解决生活中的一些简单的实 际问题。 2.培养学生自学能力和尝试精神。 3.通过创设生活化的情境使学生感受到数学与生活的密 切联系。培养学生的数学情感和团结协作的好品质。 教学重点难点看懂图意并能正确表达 教学方法情景设置导入法 小组合作交流和练习指导法 多媒体展示辅助教学法。 教学准备自制多媒体课件 教学手段多媒体课件 学习方式自主探索和小组合作交流相结合教学过程 一 情景导入多媒体展示 1小朋友帮老爷爷收西瓜图 师提问看图说说图意你想提出什么数学问题呢怎样解决 同桌交流解决方法。 汇报交流结果。说出这道题用连加计算 巩固连加竖式计算方法。学生板演。 2老爷爷运西瓜图 让学生看图提问老爷爷收了那么多西瓜准备怎么处理呢说说你看图发现了那些数学信息猜猜老爷爷想让我们帮他要解决什么问 题呢 学生讨论解决问题的方法。 汇报交流。怎样列式怎样计算呢和前面的题比较一下说说这个 是用连减来解决的。 二 探究体验 课件出示公共汽车停在站点情景图。有乘客上车有乘客下 车 2引导学生仔细观察说说你知道了什么你还想知道什么根 据学生回答师出示有关数据 引导学生根据看到的情景提出有关的数学问题。引导学生列出加减混合运算式 思考要想知道现在车上有多少人该怎样列式 生说师板书67-25+28 67+28-25 5请学生说说列式的理由。让学生弄清楚要求车上现在有多少人 就是要从原来车上的67人去掉下车的25人还要把上车的28人加 上揭示本节课题“加减混合运算” 引导学生探究加减混合算式的竖式计算方法。借助前面学过的连减计算方法类推出算是67-25+28的竖式写法。同桌交流 师巡视指导点拨 组织全班交流计算方法方法让学生自己选择喜欢哪一种就用哪 一种师指导竖式计算。小结这节课我们学会了什么以后遇到这样的问题我们能用我 们所学的数学知识来解决吗 三 实践应用 1组织学生完成第28页“做一做” 两名板演 56+34-20 78-24+39 生独立完成集体订正练习五 5题看谁算的又对又快 3夺红旗游戏分小组每个成员依次按顺序计算出结果看哪个小 组完成的又对又快 四 布置作业 练习五7题 板书设计 加减混合运算 67-25+28 67+28-25 通过这次“国培计划”远程项目的培训,使我提高了认识,理清了思路,学到了新的教学理念,找到了自身的差距和不足。下面是小编整理的国培学习心得心得体会范文,欢迎借鉴!2016年国培学习心得体会一 在金秋十月,我有幸参加了国培计划农村骨干教师培训学习。首先我要感谢领导给了我这个普通的小学数学教师这样一个难得的学习机会,这次培训给我留 下了深刻的印象。“玉不琢,不成器。人不学,不知礼。”这次培训收获最大的是前辈们对我思想上的冲击。每天的感觉是幸福而又充实的,因为每一天都要面对不 同风格的名师,每一天都能听到不同类型的讲座,每一天都能感受到思想火花的冲击。 目前全方位的新课程改革很多时候让我们无所适从,我们很多时候感到茫然,感到束手无策,而这次培训学习犹如为我们打开了一扇窗,拨云见日,使我在一次次的感悟中豁然开朗。 综观目前我的教学,最注重的似乎就是学生的学习成绩,简单的说就是学生的考试分数,它就是我们教师的生命。于是整天围着学生转,课内效益不高,就利用课外补,花了大量时间,出现了学生累我更累的局面。 反思我的课堂,忽视了学生的心理特点和已有的数学经验。常常以成人的眼光审视严谨系统的数学,并以自己多年习惯了的教学方式将数学“成人化”地呈现在孩子们面前。 如何使我们的数学课堂愈发显得真实、自然、厚重而又充满着人情味,作为数学老师的我更要关注的是蕴藏在数学课堂中那些只可意会、不可言传,只有身临其境的教 师和孩子们才能分享的东西,要关注那些伴随着师生共同进行的探究、交流所衍生的积极的情感体验。我们不但要传授知识,而且要善于以自身的智慧不断唤醒孩子 们的学习热情,点化孩子们的学习方法,丰富孩子们的学习经验,开启孩子们的学习智慧。让我们行动起来,做一位有心的“烹饪师”,让每一节数学课都成为孩子 们“既好吃又有营养”的“数学大餐”! 此外,我还认识到:一节好的数学课,新在理念、巧在设计、赢在实践、成在后续。一节好的数学课,要 做到两个关注:一是:关注学生,从学生的实际出发,关注学生的情感需求和认知需求,关注学生的已有的知识基础和生活经验……是一节成功课堂的必要基础。二 是:关注数学:抓住数学的本质进行教学,注重数学思维方法的渗透,让学生在观察、操作、推理、验证的过程中有机会经历数学化的学习过程,使学生真正体验到 数学,乐学、爱学数学。此外,我认识到:一节好的数学课,不要有“做秀”情结,提倡“简洁而深刻、清新而厚重”的教学风格,展现思维力度,关注数学方法,体现数学课的灵魂,使数学课上出“数学味”!而教师的“装糊涂、留空间”也是一种教学的智慧和方法。 我突然感到自己身上的压力变大了,要 想不被淘汰出局,要想最终成为一名合格的骨干教师,就要更努力地提高自身的业务素质、理论水平、教育科研能力、课堂教学能力等。我觉得我还是一个小学生,要学的东西还很多,和新老师一样,不能因为自己新而原谅自己教育教学上的不足,因为对学生来说小学教育也只有一次。而这就需要我付出更多的时间和精力,努 力学习各种教育理论,并勇于到课堂上去实践,及时对自己的教育教学进行反思、调控我相信通过自己的不断努力会有所收获,有所感悟的。 在以后的教学中,我要做的是: 第一,自我反思。从以往的实践中总结经验得失。 第二,不断学习。读万卷书,行万里路,读书是提高自我素养的良好基奠。一桶水早已不能满足学生的需求了,我要不断学习,成为长流水。 第三,交流。他人直言不讳的意见与建议可能是发现不足、认识“庐山真面目”的有效途径。要听真言,要想听真言,更要会听真言,久而久之对我大有裨益。 百年大计,教育为本。教育大计,教师为本。我们必须是着眼于未来,采取科学的方法应对随时出现的新问题,努力使自己适应新时代的教育。在今后的工作中还必须给自己定好位,必须走“学习——反思——研究——实践”相结合的专业发展之路。 这次培训让我受益匪浅,感谢吉林省教育学院为我们提供这么好的学习空间,感谢“国培”为我们提供这么难得的学习机会,促使我在教育生涯的轨道上大步前进!2016年国培学习心得体会二 20xx年8月11日——8月21日,我有幸参加“国培计划(2014)为期10天的培训。重新回到校园学习,是一种全新的生活和体验,与以往每天周而复始的繁琐的工作相比,突然有一种别样的感觉,每天有规律地学习、生活,洗去了我身上的浮躁,让我回归本真,静心学习,潜心研修。 学习期间,让我感受最深的是国家对学前教育的前所未有的重视,基于此,我才能有幸成为“国培计划”的直接受益者,通过学习,我深深地感受到学前教育面临的机遇与挑战。20xx年7月,国务院颁布了《国家中长期教育改革和发展规划纲要(20xx-20xx年)》,对新时期推动教育事业科学发展进行了战略部署,描绘了未来教育改革发展的蓝图,为未来10年教育改革发展指明了方向。《规划纲要》第一次专章部署了学前教育,突显了国家对发展学前教育的高度重视,我深深地感受到自己肩负的压力和使命,国家对我们的大力培养,是让我们通过专家引领和自主研修,达到自我成长,并学以致用,成为农村学前教育改革和发展的开拓者、成为幼儿教师发展的引领者、成为教学和科研的示范者。面对这样的使命,我不敢有丝毫的懈怠,抓紧每一分钟的时间,努力地学习和思考,学习快要结束了,十天的培训学习,让我重新接受了一次系统的理论学习和专业提升的机会,我觉得自己的收获是沉甸甸的。 培训期间,师范学校的领导精心设计了丰富的学习内容:我首先聆听了贺红山老师对《3——6岁儿童学习与发展指南》的详细解读,使《指南》中的那些平凡的文字都鲜活起来,让我感到《指南》中的每一个字都值得认真去推敲和琢磨,也深刻感受到《指南》对幼教工作者重要的指导意义。特别是使我对幼儿园一日活动皆课程的含义有了更深的理解,让我对自己原有的幼儿园课程的理解重新定位,幼儿园的课程不光包含集体、分组的教学活动、区域活动和游戏活动,幼儿在园的一日生活也是幼儿园课程的重要组成部分。贺红山老师的《让幼儿在与环境的对话中成长》讲座,让我对由环境生成课程、由课程创设环境、透过环境,看到孩子的学习过程有了更深的理解。雷晓芳老师的《一日生活活动与幼儿发展》讲座,指导我在对观摩幼儿园的一日生活活动时,有了理论的支撑,培训学习更有的放矢。周利文和龙晓玲、杨卡佳三位一线园长的讲座,更是获益匪浅,周利文园长重点以科学领域为例讲述了《集体教学活动设计与幼儿发展》,虽说说的都是大学学过的,但在面对老师提出的种种刁难的疑问,她的回答充分体现出她理论与实践扎实的功底及个人深厚的内涵、气度,让人心悦诚服。龙晓玲园长的《传统游戏的现场教学》让我在欢乐而轻松的音乐游戏中掌握了幼儿园音乐教育活动的设计与实施,音乐活动组织要点,明白了老师要充分激起幼儿的兴趣,让他们在活动中体验到不断攀升带来的巨大愉悦。杨卡佳园长的《模范教师师德报告》讲座使我对幼师的神圣的使命有了更深一步的认识,让我对模范教师们肃然起劲,同时对于社会的认可感到深深的欣慰。唐烈琼老师的讲座,为我的幼儿园游戏教学问题与对策提供了理论的支撑和指导,进一步夯实了自己的幼教理论基础,有效提升自己对幼儿园教学活动、区域活动的组织能力。而由长师送的两个现场观摩课《勺子哈哈镜》、《圈圈魔术师》更是让我对老师的激情和课堂把控能力深深震撼,她们表情之丰富,语言语气之多变,动作夸张,无不彰显着她们的智慧。还有许许多多让我受益良多的东西,专家们精湛的理论知识,先进的理念和独特的设计给我留下了深刻的印象,在情感的熏陶和思想的洗礼中努力实现着培训学习与工作实践的有效对接,将专家经验和自身所学有机结合,丰富了自己的专业知识,提高自身的综合素质。 作为一名幼儿教师,我将会把这次培训的所想、所得、所思融入今后的工作中,这既是学用结合的要求,也是自己肩负的责任。自己唯有进一步修心—修行—修能,才能真正做一名学以致用的实践者、先进幼教理论的传播者、教师专业成长的引领者。感谢这难得的培训,感谢培训专家的付出,使自己受益匪浅,启迪良多,这是自己在幼教知识储备上的又一次空中加油!2016年国培学习心得体会三 通过这次“国培计划”远程项目的培训,使我提高了认识,理清了思路,学到了新的教学理念,找到了自身的差距和不足。我从中学习到了很多知识,而且在国培计划中有幸倾听了众多专家和学者的精彩讲解,使我对教学有了更多新的认识。 经过这次的培训令我感触很大,下面将谈谈我的一些感受: 本次培训给我许多思考,深刻的体会到自己有很多东西要去学习。怎样成为一个受欢迎的数学老师呢?怎样才能在教学过程中给学生营造一个良好的氛围,建立平等、民主、信任的新型师生关系?怎样才能……?我认为要解决的问题还很多,还需要自己不断的积累,不断的去学习。 首先,教育学生,从爱出发。平等的爱,理解的爱,尊重的爱,信任的爱,这些都是老师爱的真谛。不论在生活上,还是在学习上,都要给予学生必要的关心和帮助。只要有了问题时及时处理,处理的方法得当,注意和学生沟通,学生就会信任你,喜欢你。爱学生,还表现在老师对学生的尊重和信任,以及对学生的严格要求,又要注意对学生的个体差异,区别对待。对成绩比较差的学生,我们老师要采用不同的教育方法,因材施教。师爱要全面、公平。 其次,如何使我们的数学课堂愈发显得真实、自然、厚重而又充满着人情味,作为数学老师的我更要关注的是蕴藏在数学课堂中那些只可意会、不可言传,只有身临其境的教师和孩子们才能分享的东西,要关注那些伴随着师生共同进行的探究、交流所衍生的积极的情感体验。我们不但要传授知识,而且要善于以自身的智慧不断唤醒孩子们的学习热情,点化孩子们的学习方法,丰富孩子们的学习经验,开启孩子们的学习智慧。让我们行动起来,做一位有心的“烹饪师”,让每一节数学课都成为孩子们“既好吃又有营养”的“数学大餐”! 最后,我还认识到:一节好的数学课,新在理念、巧在设计、赢在实践、成在后续。一节好的数学课,要做到两个关注:一是:关注学生,从学生的实际出发,关注学生的情感需求和认知需求,关注学生的已有的知识基础和生活经验……是一节成功课堂的必要基础。二是:关注数学:抓住数学的本质进行教学,注重数学思维方法的渗透,让学生在观察、操作、推理、验证的过程中有机会经历数学化的学习过程,使学生真正体验到数学,乐学、爱学数学。此外,我认识到:一节好的数学课,不要有“做秀”情结,提倡“简洁而深刻、清新而厚重”的教学风格,展现思维力度,关注数学方法,体现数学课的灵魂,使数学课上出“数学味”!而教师的 “装糊涂、留空间”也是一种教学的智慧和方法。 通过这些天的学习,我从中学到了很多,不仅拓宽了我的视野,还丰富了我的实践经验,更让我的思想得到了升华,使我对数学教学有了更新的认识,更加热衷于教育事业。今后,我会更加努力学习,为教育事业贡献自己的一份力量。 2016年国培学习心得体会四 通过这次的国培学习,不论是教育教学理论或业务水平都有一定的提高。回顾十几年的教学工作,不管别人怎么看,我只觉得自己做的问心无愧。 在 教育工作中,我深深体会到教师的工作是神圣的,也是艰苦的,需要付出大量的精力和情感。热爱学生,致力于培养学生健全的人格和健康的心理,树立他们的自尊 心和自信心,以“爱”为核心,无论是优秀学生,还是后进生,我都细心关爱,倍加呵护,从欣赏开始,从称赞入手,欣赏、称赞学生的每一个细微处,激发他们高 尚的动机,而且自身对知识充满热忱,不断求新成长。当今的教师应该具备以下素养: 一、能科学地施教知识,深入学习教育学、心理学、教育方法等方面的知识,把教育理论的最新研究成果引入教学过程,使教育教学的科学性和艺术性高度完整地统一起来。 二、熟练掌握了现代教育技术的操作和应用。积极参加现代教育信息技术的培训,能够利用现代教育技术,恰当有效地选择教学方法和方式,直观形象地展示教学内容,使教学知识传授与创新思维结合起来,培养学生的创新精神和创新能力。我积极参加镇级的现代教育信息技术操作大赛及课件制作比赛均获一等奖。 三、有创新的精神。积极开展教育和科学研究,探索新的科学的教育模式,在耕耘中拓宽视野,在执教中提炼师艺,升华师技。形成自己独特的教学风格:我以通过抽象 思维和逻辑推理的训练,培养学生的数学思想为目的,善于启发,分析细腻层次分明,注重解题思路的传授和解题技巧的总结。 四、有爱心。我始 终认为:教师就必须用教师的职业的爱去对待每一个孩子,在孩子有困难时,在孩子做错事时,在孩子得到进步时,作为教师才能一视同仁的对待,教师的爱就是渗 透在平时的点滴中,贯穿在孩子成长的每一个阶段。教师不仅要有这种做人的威望,人格的力量,令学生所敬佩,还要以最佳的思想境界,精神状态和行为表现,积 极地影响和教育学生,使他们健康成长。正如奥地利教育哲学家马丁.布贝尔所说:“教师只能以他的整个人,以他的全部自发性才足以对学生的整个人起真实的影 响”。教师应把言传和身教完美结合起来,以身作则,行为示范;热爱学生,关心学生,建立平等的师生关系;仪表端庄、举止文雅,以自己的言行和人格魅力来影 响学生。 很长一段时间内“没有教不好的学生,只有不会教的教师”这个极端的教育口号像枷锁一样天天束缚着我,使我常常生活在自责和愧疚之 中,使我天天怀疑自己的教育教学能力,我真的就认为我就是那个不会教的教师,否则为什么会有部分学生不会学习呢。后来通过学习相关理论及多方面的实践探索 请教我才知道,它只是一种浪漫主义的宣传鼓励口号,而绝不是评价教师工作的客观标准。 教育是一项繁琐的工作,在日复一日的教学生活中,面 对一些顽劣的学生,恨铁不成钢的心理会左右自己的情绪,另外过于看重学生成绩,偏离了素质教育的轨道,有时候会茫然不知所从,不能坦然面对学生的错误,影 响了与学生感情上的沟通和交流,也是存在的问题。因此怎样克服工作中的急躁情绪,尊重每一个孩子,真正做到蹲下来给学生说话,还需要在以后的工作中进行调 整。 总之,在今后的教育教学工作中,我会认真遵循“教书育人”的工作准则,把书教好, 整数简便运算工程车人体的人特大号 教学目的 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 《乘法和加、减法混合运算》 姓名:苗秋艳职称:中教二级单位:东街小学电话: 邮编: 教 *** 041600 案 苏教版三年级数学:乘法和加、减法的混合运算教学设计 教学内容: 苏教版教科书 三年级(上册)第34~35页。教学目标: 1.让学生结合解决问题的过程认识综合算式,体会可以列综合算式解决两步计算的实际问题,并初步认识综合算式;初步掌握含有乘法和加、减法的两步式题的运算顺序,并能按顺序正确地计算。 2.使学生初步学会表达混合运算两步式题计算过程的书写格式,养成良好的学习习惯。 3.使学生在合作交流中,增强对数学学习的兴趣和信心。教学重点: 会列综合算式解决两步计算的实际问题,掌握含有乘法和加、减法的两步式题的运算顺序。教学难点: 掌握含有乘法和加、减法的两步式题的运算顺序。教学过程: 一、创设问题情境,提出数学问题 1.创设情境,激趣导入。 谈话:同学们,你们到文具店买过学习用品吗?现在,老师就带大家一起来逛逛这家文具店。课件呈现文具店场景。文具店里的商品可真不少,谁来说一说你都看到了哪些商品,每种商品的价格是多少元。2.提出问题。 谈话:同学们看,来了一位小顾客,他要买什么呢? 课件:我要买3本笔记本和1个数包,你们能帮我算一算一共要用去多少钱吗? 二、师生互动,解决第一个问题 1.运用已有经验,学生独立解答。 谈话:大家愿意帮忙吗?好,赶快在练习本上算一算吧。请一名学生板演。(可能绝大多数学生用分步解答。)5×3=15(元)15+20=35(元) 谈话:大家看这位同学做得对吗?谁来说说你是怎样想的,把你的思路讲给大家听一听。(先算3本笔记本多少元,再加上1个书包的价钱,就是一共用去多少元)2.学生尝试列综合算式。 谈话:同学们都是列两个一步计算的算是做的,在数学上,这叫分步解答。现在老师提一个新要求,大家能不能把这两个算式合在一起列成一个综合算式,有信心完成吗?快再练习纸上试一试吧!指名板演,其余学生在练习本上列式。5×3+20 教师指出:这个算式就是一个综合算式。会读综合算式吗?(学生一般会读5乘3加20) 3.观察比较,体会区别和联系。 谈话:现在,请同学们把分步算式和综合算式进行比较,找出相同和不同的地方。 学生以小组为单位,合作研究,然后在班内汇报各自的发现。 小结:不论是分步算式,还是综合算式,要解决这个问题,我们都要先求3本笔记本的价钱再加上1个书包的价钱。与刚才的两个分步算式相比,综合算式只是不过书写的形式变了。由于综合算式不只是乘法,也不单纯是加法,它进行的是混合运算,这就是这节课我们要一起研究的新问题。(板书课题:混合运算)4.规范综合算式的书写格式。 谈话:首先,混合运算有自己的书写格式,大家想了解吗? 讲解:对齐算式的左端画“=”,需要算几步就画几个“=”。同时板书: 5×3+20 = = 5.学生尝试计算并交流。 谈话:对于混合运算,你能进行计算吗?请大家试着做一下,算完后,在小组里互相说一说自己计算的顺序,先算什么,再算什么。学生汇报,教师同时板演,完成板书: 5×3+20 = 15 +20 = 35 提问:为什么先算5×3?(因为要解决这个问题,现要求出3本笔记本一共多少元,就要先算5×3) 谈话:解决问题别忘了在得数后面写单位名称,并写出答语。(教师作相应板书)第一个问题,在同学们的努力下,顺利解决了。 三、自主探索,解决第二个问题 谈话:看,文具店理由来了一位小顾客,她要买什么呢? 课件:我要买2盒水彩笔,付给售货员50元,应找回多少元呢? 谈话:这个问题,请同学们先独立列出综合算式并计算。做完后,把你的解题思路以及计算的顺序在小组里交流一下。 学生选组内写得最好的一份,用实物投影进行展示汇报。解题思路:用50元减去2盒水彩笔的价钱,就是应找回的钱数。计算顺序:先算18×2=36,再算50-36 =14 教师征询其他小组的意见,板书算式:50-18×2 谈话:同学们真肯动脑筋,看来,综合算式也能帮我们解决实际问题。现在,我们一起计算。教师边与学生交流,边板书。 列出的算式下边写几个等号? 先算什么?为什么先算18×2 在第一个等号后边能只写36吗?怎样写? 谁能接着算下去? 板书: 50-18×2 =50-36 =14(元) 答:应找回14元。 四、尝试归纳,建立模型 谈话:(指着板书)请同学们看黑板上的这两道算式,你能发现有什么共同点吗? 学生观察后自由发言。(算式中都有两种运算,其中一种是乘法,另一种是加法或减法,都是先算乘法) 讲述:这就是我们这节课所学习的含有乘法和加、减法的混合运算。(把课题补充完整)谁来说一说含有乘法和加、减法的混合运算的运算顺序是怎样的?让学生看书第34页,读教科书上的结论。 五、应用巩固,提高能力 1.做“想想做做”第1题。 课件逐题出示:16×6-9 38+4×15 80-23×3 先让学生说说每道题的运算顺序,再独立在练习纸上写出计算过程。提醒学生注意每一步的书写格式。2.做“想想做做”第2题。先让学生阅读题目,找出题中的错误之处,再改正。然后指名说出题目的错误之处,并说出正确的运算过程和结果。3.做“想想做做”第3题。 六、课堂作业 “想想做做”第3题和第5题。 七、全课总结 提问:今天我们学习的是什么内容?你有哪些收获? 板书设计: 乘法和加、减法的混合运算 5×3=15(元)5×3+20 15+20=35(元).=15+20 答:一共要用去35元。.=35(元) 50-18×2 =50-36 =14(元) 答:应找回14元。第二篇:长整数四则运算实验报告
第三篇:加减混合运算
第四篇:整数简便运算教案
第五篇:加减混合运算教案