参考资料
李铮、叶艳冰、汪德俊,C语言程序设计基础与应用,清华大学出版社,2005
[2]CSDN技术中心
二、概要设计
为了实现大整数相加这个程序,将程序划分为了三个模块:
输入数据。
运算。
输出结果。
首先定义了子函数Input()来存储用户输入的两个加数,为了满足任意位数的两个大整数相加,在子函数Input()中嵌套调用子函数Init()使sum数组里面存放的数初始化为”0”。
然后定义子函数Long_Add()使两个大整数作加法运算,从后面往前面相加,附带进位。定义子函数Output()实现输出结果。
最后如下图所示,在主函数main中调用Input(),Long_Add(),Output()三个子函数实现程序。
三、详细设计
程序的流程图:
四、调试过程
第一次 测试数据a=1234567893456767,b=111111
编译运行后不能输出结果,检查函数后编译正确。再次分析,发现如果直接把a,b,sum定义为unsigned int型的话,计算出来的和的范围只能在0~65535之间,否则就会出现错误。
尝试将a,b,sum存放到字符数组中,从个位开始,一位一位相加。
第二次 测试数据a=1234567893456767,b=111111
编译运行后仍不能输出结果。分析原因,在用于输出的子函数Output()中,输出数组字符数组sum[]前未确定和的最高非零位。
尝试加入for(i=0;i<Max;i++)语句来寻找和的最高非零位,再
if(sum[i] != '0')
break;
次进行调试。
第三次 测试数据a=99999919,b=99
编译运行后发现计算出来结果不正确。经过分析,函数中没有对最后
一个进位进行处理。
尝试加入while(carry > 0) 语句,再次进行调试。
{
tempsum = sum[i]-'0'+carry ;
sum[i] = tempsum%10+'0';
carry = tempsum/10;
i--;
}
第四次 测试数据a=99999919,b=99
编译运行后得到正确结果。
第五次 随意输入几组数据进行测试,结果都是正确的。程序得到实现。
五、结论与体会
通过不断的调试、修改,本课程设计最终实现了200位以内的两个大整数相加,但程序还可以进一步完善,程序中仍存在一些不足之处,比如缺少容错功能,不能准确计算负整数加正整数,等等问题
虽然C语言程序设计在上学期做为我们的必修课已经学习过了,但书到用时方恨少,这次课程设计的学习程序设计中暴露出的我自身的问题更是非常明显。
一开始看到题目认为非常简单,直接将两个数都定义为整型。编写程序并运行后发现并不能达到题目的要求,计算出来的和只能小于等于65535,否则就会出现错误。分析后,将数据作为字符串来处理,用for循环语句从存数的字符数组中一位一位的取数出来,按照数位对齐,从个位开始,按位相加,逢十进一的运算规则进行运算。最后用字符输出函数putchar()输出计算出来的结果。由于程序偏大且较复杂,将程序划分为了输入数据、运算、输出数据三个子程序。数次编译调试后,最终使程序得以实现。
经过三个星期的上机实践学习,使我对C语言有了更进一步的认识和了解,让我能够进一步的掌握和运用C语言来编写程序。要想学好C语言要重在实践,要通过不断的上机操作才能更好地学习它,通过实践,我也发现我的好多不足之处和薄弱环节。
首先,基础掌握不牢固,对于C语言中的许多基本语法尚没有熟练掌握,在设计过程中仍需请教其它同学,查阅课本,设计效率很低。
其次,经典算法掌握不牢。在完成作业的过程中还需查阅书籍和借鉴他人。
再次,程序量过大的时候,头绪理不清。杂乱无章,无系统性,不便调试和阅览,自己也易于出错。
并且对C语言中经常出现的错误也不了解,通过实践,使我在这几个方面的认识有所提高。
通过实践的学习,我认到学好计算机要重视实践操作,不仅仅是学习C语言,还是其它的语言,以及其它的计算机方面的知识都要重在实践,所以后在学习过程中,我会更加注视实践操作,使自己便好地学好计算机。
六、源程序清单
#include <stdio.h>
#include &l