C语言程序设计 |
您所在的位置:网站首页 › 双向循环链表输出 › C语言程序设计 |
课程设计题目及要求:长整数加法运算 【问题描述】 设计一个实现任意长的整数进行加法运算的演示程序。 【基本要求】 利用双向循环链表实现长整数的存储,每个结点含一个整型变量。任何整型变量的范围是-(215-l)~(215-1) 。输入和输出形式:按中国对于长整数的表示习惯,每四位一组,组间用逗号隔开。 【测试数据】 (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) 每个结点中可以存放的最大整数为 215-1=32767, 才能保证两数相加不会溢出。但若这样存放,即相当于按32768进制数存放,在十进制数与32768进制数之间的转换十分不方便。故可以在每个结点中仅存十进制数的4位,即不超过9999的非负整数,整个链表表示为万进制数。 (2) 可以利用头结点数据域的符号代表长整数的符号。相加过程中不要破坏两个操作数链表。不能给长整数位数规定上限。 (3)实现长整数的四则运算; 【选作内容】 (1)实现长整数的乘方和阶乘运算; (2)整型量范围是- (2n-1) ~ (2n-1), 其中,n是由程序读人的参量。输入数据的分 组方法可以另行规定 系统功能和原始数据 1.原始数据 (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 " 。 2.系统功能 用链表来实现任意长度的长整数的加法 程序总体设计 (1)数据结构 采用双向链表 (2)模块划分和层次结构 十一个函数,main函数在开头; 调用每个函数; (3)函数原型清单 1.int Compare(dnode *a, dnode *b) ; 功能:用来比较链表中存入的两个数的大小 2.void InitNode(dnode **head); 功能: 初始化链表 3.int InitNumber(dnode *head, char *data) ; 功能:将字符转化为数字后,插入数字 4.void InsertNode(dnode *head, int x); 功能: 创建插入节点 5.void InsertNodePre(dnode **head, int x); 功能: 相加后,将结果插入已有节点的前面 6.void Addition(dnode *a, dnode *b) ; 功能: 相加 7.dnode* add(dnode *a, dnode *b) ; 功能: 进行相加,结果存入链表中,返回头指针 8.dnode* sub(dnode *a, dnode *b) ; 功能: 进行相减,结果存入链表中,返回头指针 9 void des( dnode *head); 功能:销毁链表,释放内存; 9.void PrintNode(dnode *head); 功能: 输出链表 (4)程序总体框架 功能模块函数设计和调试 主要模块: 加法:dnode* add(dnode *a, dnode *b) 功能:实现两个同号的长整数相加;每个相加后的节点存入创建的新链表; 要考虑到进位,满10000进一,每次计算时要注意加上进位的数值; num = x + y + jin;//两个相加,在加上进位的; jin = num /10000;//因为是万进制,所以满万进一; num = num%10000;; if(jin > 0)//如果从后往前最后一位相加后,有进位的话, InsertNodePre(&head, jin); 减法:dnode* sub(dnode *a, dnode *b) 功能: 这个函数用来 实现两个异号的长整数相减;每个相加后的节点存入创建的新链表中; 要考虑到借位,每次相减要减去借位的数值 num = x - y - borrow;//减去借位的 borrow = 0;//初始化变量 if(num < 0){ borrow = 1; num =num + 10000 ; } 程序清单: 源代码: 运行结果: 错误提示:非法字符: 课程设计总结 通过课设,对链表的理解更深一些,对于链表的添加,删除和插入都更熟悉; 在检查程序的时候,调试的时候发现在循环一遍后,有些变量忘记重新初始化; 在查错的时候,输入非法字符程序会崩溃,进行控制判断后,可以输出错误信息提示; 参考资料: 李戈视频. 钱能教材 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |