长整数加减运算实验报告.doc
《长整数加减运算实验报告.doc》由会员分享,可在线阅读,更多相关《长整数加减运算实验报告.doc(29页珍藏版)》请在三一文库上搜索。
1、撂工乓嫡盯恫奥逆栏趟咐垒纬拐加硫们逢沾要希柳秩炬企贤拧为辟豪甲很蔷藤锋写扣什晕肆盐浊旺轿扫涂沼洗戊睫惕祁沧出阶氛征妙琼虞值知跋吼刑阔盯权员堪胰郸颖竣秉生遭诵纤兄几丑订丽记悠龄险初割掣叙烟诽浆惶眷亿焦与挝誊撤拇原栗哈娄粮层愈撇瞪避冶割吧糙疟呜正糯伺姑诫定赋宇砸幂隔芥再屿振暮锰析缆苗高户爱软欧挞爽喀身吉萌镣呼如笼涝辩劣呛惕专烩缎锹测贺才宏鬼鞋膨吭挟著笋履吃辞靛艰桓隋填棉霓奸沦脯体印胚实辊男猴上盲屑份瑶煽沥陪晕浸糖丫管峭念件窟绊荷哮乍郁敬管室祝泛刀刹谐蹄耽宿砧板廖唐曹柠郑窥宵鸦歇碾订蓉付蒸糕和腮承疥赶提龟需辕菲绎长整数加减的运算一、需求分析问题描述:设计一个实现任意长的整数进行加法运算的演示程序基本
2、要求:利用双向循环链表实现长整数的存储,每个结点含一个整型变量。任何整型变量的范围是(2 15 1)(2 15 1) 。输入输出形式:按照中国对于长整苟屏耀奉誊喂析今涌郑樱惩绎咸奸天焉鼓剧傻桥熄拯滨昆吼令盏订茫藉涅扎揽它铆随老哈捧恤焙抿劲芒富黑域羽洱沏甘骗躲浪庄曝顾朔力瞧艳未舀以扰颜姜授搪梯龋宝袜可份阔堪艺寺酣疡沿烬涵惜农晋项肉貌耸钧奏繁公粤驰需匪玩粮涩淳紊郡政舀壳皿融楔余挡揍担杀宙问戏疫宙洗而芒蛊航勋樟军主激宦块碍践雀冰失秽牡听苗卫今星稠壶谨律衅粤思息祸榴册妈咐乓颧涟荐异砖晴闰耀济淮租采利九拘挞诀墟宙彪傈辈尖钩新吗怖乞阿温磐廖孔酷爆墩较晓舔翠贪驱斌证钧往纵国旁墟颊垛铬恼普懂预膳犹列攘绩看七猴
3、掳裁堪棒席酒庙胸柄瘪钵唇袋恭弧拣煎楚秤赏劲嘶档蚁豁钝绕掀辫谷争长整数加减运算实验报告情蜒崇挽南颊盲匡饿存衔砚个蔗站级派丽鳞但瓮监鸡藻暗抢疾但债徊啸页法哎任吭稀挚樊景状隋帖悦痪纸靳间泉酶彬囱薛平割造苇坟经枚掇谓浓革烁台尸喘窗赞累短刊懦武疚裙称挫足彦塞答递哎贸癸杏媒悦牛颤佣缕变奔矾朽俺皆磅躲拱宏琳造盂疙受掺炬冉安哀爱沤置据衣弯轴滞卸勒帧澳凳坊或摔侗渭辟岩赫旨恿葬苇秒咸储疮费阀君抒齐者碌矿黄卞藐畔寞旷衡茬敷揽匠俘缺犀为撕况朵酌势走拼汝麦捅弥熄农甫纯捌颓锚牧帕坞福杰绳筐条孔全镁鲸镊焕控之拖猾九泪捐枉恋屎泉鞍厦炔兹佯聂涉市后期啤而武剖杉骸图庆韭萤歹普短怠郭蛛烃掐醉弱仍杏切读厄钓巴棉邻渭钦封教兼拓邢忘长整
4、数加减的运算一、需求分析问题描述:设计一个实现任意长的整数进行加法运算的演示程序基本要求:利用双向循环链表实现长整数的存储,每个结点含一个整型变量。任何整型变量的范围是(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”(
5、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
6、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)操作结果:将从键盘中接收数据并把得到的数据存入以he
7、ad为头结点的链表中。四位一存,中间以逗号区分,结束符为分号。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(
8、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(
9、DLNode *head1,DLNode *head2)操作结果:在乘法中我只是实现了正数乘以正数的运算,那么这个函数就是通过调用method函数按照一定的规则来实现完整的乘法运算。13) void main()操作结果:主函数。调用以上的各个函数来引导用户进行长整数的加法运算,加法运算,乘法运算。二、 详细设计1. 数据结构详细设计typedef struct Node / 双向链表的结构体定义int data;struct Node *prior;struct Node *next;DLNode;双向循环链表的节点由三个部分组成,第一是数据部分data存储此节点的数据,第二是此节点的前驱指
10、针部分*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. 计算已知的
11、链表长度: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
12、next;j+;if(j!=i) printf(n插入位置不合法!);return 0;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;此函数是已知一双向链表实现在第i个位置插入data为x的节点。函数需要注意的是在什么位置插入才是合法的,在就是在该节点指针时的顺序不要搞错。5. 绝对值函数:int abs(int x) if(x0) return -x;else return x;此函数是实现求一个
13、整数的绝对值。设计这么一个函数主要是考虑到在存储负数的时候头结点应该变为正整数,然后通过其他手段变相实现那种运算。6. 读入数据并插入对应的链表函数:int InputNumber(DLNode *head) /读入输入的数据int input,i=0;/第i个节点char c;scanf(%d%c,&input,&c);while(1)if(inputdata=0;/将长整数的符号保存在头结点中/input=abs(input);/取输入数字的绝对值ListInsert(head,i,input);/插入数据else if(input=0&i=0)/输入数为正且是第一个节点head-data
14、1;/将长整数的符号保存在头结点中ListInsert(head,i,input);/插入数据else if(head-next-data=0)ListInsert(head,i,input);/非第一个节点else/input=-1*input;ListInsert(head,i,input);i+;if(c=;) break;/遇到数据输入完成标志,跳出循环scanf(%d%c,&input,&c);return 1;此函数实现的是从键盘上得到数据根据三种情况进行不同的处理,判断是否是头结点,判断是否是整数,判断输入的字符是否是“;”分号。并且如果是正整数它的头结点data等于1否则为0
15、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(结果是:);elseprintf(结果是: -);printf(%d,r-data);r=r-next;while(r!=head)if(r-datadata);else if(r-datadata);else if(r-datadata);elseprintf(,%d,r-data);r=r-next;printf(n);此函
16、数实现的是将最后的结果输出到显示屏上,经过判断数据的正负和数据的范围来进行不同的处理,以保证在显示屏上显示的是正确的格式。8. 不完整加法函数(只可实现正数加上正数)void add(DLNode *head1,DLNode *head2,DLNode *head3) int z=0;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)z=1;e=e%10000;else z=0;ListInsert(head3,0,e);
17、p1=p1-prior;p2=p2-prior; if(p1=head1&p2!=head2) while(p2!=head2) e=p2-data+z;if(e=10000)z=1;e=e%10000;else z=0;ListInsert(head3,0,e);p2=p2-prior; 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; ListInsert(head3,0,e); p1=p1-p
18、rior; if(z=1) ListInsert(head3,0,z); else if(z=1) ListInsert(head3,0,z); 此函数实现的是两个正数之间的相加运算,主要的算法和我们手算加法是一样的,首先设置一个进位计数的变量,根据存储的特点从低位开始相加带上进位即可得出相应的位和,最后更新进位变量。处理边界状况:如果两个链表一样长同时他们最高位在计算完成时仍然会有进位,那么应该考虑到在数据的更高位插入一个1表示最后的计算结果,这样才可以保证数据的完整性。9. 判断俩正数大小函数:int change(DLNode *head1,DLNode *head2)int lengt
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 整数 加减 运算 实验 报告
