C语言课程设计报告_第1页
C语言课程设计报告_第2页
C语言课程设计报告_第3页
C语言课程设计报告_第4页
C语言课程设计报告_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、课程设计报告课程名称:计算机高级语言课程设计(C)学生姓名: 学号: 班号: 2015年春季学期大数相乘问题一、 题目描述两个大数相乘问题【要求】本问题中,要求输入两个相对较大的正整数,能够通过程序计算出其结果。【提示】两个相对较大的数肯定是不能够用LONG INT类型存储的,因为LONG型数据的数据范围也并不是很大,于是就需要采用其他的存储结构。这里推荐用数组存储一个大数,数组的初始空间可以定义到如200或300个单元,每个单元存储一位数据,形如下图:255 96207.。这样理论上,比如数组定义为200,就可以存储200个数字的整数,应该是满足足够大的条件了。而结果的存储也需要考虑空间的问

2、题,所以需要一个更大的数组。在解决了存储问题后,我们需要来实现乘法运送的过程,也就是说你必须要把这个数组中的每一位数字单独来进行乘法运算,比如我们可以用一个数字和另外一个数组中的每一位去相乘,从而得到乘法运算中一行的数字,再将每一行数字错位相加。这就是乘法运算的过程。二、 算法描述1.简介本程序用到多个int型变量与字符型数组a、b以及整形数组num1、num2、e,结合for循环与dowhile、while循环,使用if语句判断各个环节的运行结果,最终达到目的,做到了计算出两个大数相乘的结果并将其输出。未用到子函数,靠主函数与复杂的算法完成计算。2.算法分析1)、两个大数的输入:(自己设计完

3、成)考虑到两个大数长度非常长,采用单个变量显然会使程序臃肿混乱,故采用数组来储存这两个大数;又考虑到人们在键盘上的输入一串数字时是希望一次将其输完,因此在输入这两个数字时要避免其他繁杂的操作。字符型数组可一次性存入一个字符串,但字符无法进行数学运算;整型数组可以进行运算,但一次只能存入一个数字。所以本程序使用字符型数组读入两个大数,再将其转为整型数组进行相乘、相加运算。2)、读取两个字符数组存入字符的长度:(自己设计完成)两字符数组初始长度都比较大,本程序将它们长度均定义为200,(还可以更大);但人们在键盘输入的数字是随机的,因此每次执行两大数的长度都不会是一个定值,且一般会小于200。这就

4、需要有一个算法来读取两字符串的长度。字符串的末尾会有结束符0跟随,可使用循环语句与计数器m、n,在计数的同时判断是否读到结束符位置,若检测到0,说明用户输入的字符串已经结束,这时跳出循环,并取计数器最终值,即为大数长度。为达到修改程序时及时纠错目的,可将这两个字符长度用printf语句输出。这段算法采用do-while循环。这里也可以运用函数库中更为简便的strlen函数。3)、字符串转化为数字:(自己设计完成)字符串与数字的转化可以应用常用字符与ASCII码之间的关系来完成。数组a、b接收到的是0-9之间的字符,虽然其显示的是数字,但与数字有别。ASCII值048-057段代表了1-9这些字

5、符,0与048相对应,因此,用a中存放的字符减去0即可得到各字符所代表的数字。由于这些字符无法一次性转为数字,故会用到for循环结构。并在循环的同时将读取的数字存入数组num1、num2中。4)、两大数相乘算法:(参考其他程序)首先根据两数相乘的运算规则定义会用到的各个变量,他们有:计数器i、k、j、p;临时变量tmp;进位变量up;存放最终结果的数组e。计算的过程用实例来说明,随机选择两个较大数字,如:65936×36794,可先将其笔算过程写出: 6 5 9 3 6 ×3 6 7 9 40 0 2 6 3 7 4 40 5 9 3 4 2 44 7 1 5 5 2.本算

6、法就是按照笔算的思想来进行的。num2中的数字由末位到第一位依次与num1中的最后一位数字相乘,并将结果正序存在数组e中。然后num2中所有数字再与nu1中倒数第二位相乘,同时用相乘的结果与前一次计算的结果错位做加法运算,并以此类推。详细过程:如65936先与4做乘法运算,tmp=6*4=24,进2余4,用取余符%得到余数4并存在e1中,用int型变量的除法运算特点得到进位量2存放在up中;至此最内层循环进行一次,数组num2中的因数前移一位变为3,tmp=3*4=12按乘法计算法则知,12取余应与上次运算的进位量2相加,而这一次的进位量1应继续存放在up中等待与下一次的余数相加,以后继续进行

7、循环,直到num2中的第一位与4做完乘法。但当进行完这些工作后,程序并不会马上回到外层循环,而是先判断此时up是否大于0,若是,e中存入的数字前面会再存入一个数据即为up的当前值。当num2所有数与4相乘后程序跳出内层循环,num1前移一位,然后继续执行循环。可注意到程序中的tmp变量并不仅是是num1与num2之积,还加上了上次所得up与ek+p,这是因为,程序在进行计算乘积的同时,还要与上一项存入数据进行错位相加,这样做的目的是,可以使程序更为简练,避免了后续繁杂工作, 但此技法较难理解。5)、结果输出(自己设计)首先要算出结果的最大长度,由数学知识可知,其最大长度为n*m。但程序可能会比

8、这短,可由一个while语句来找到结果的初始位置,并标记。接下来由于存放数据的循序是由e1到en*m,所以输出顺序不能按常理由正方向开始,而应倒序输出。结合for循环,输出最终计算结果。并结束程序。三、 流程图四、 运行效果截图五、 心得体会C语言设计的目的不仅是让程序按照自己的意愿去执行,还要求程序的精简、高效。要做到调用最少的东西去完成最多的工作。如本程序中用到的数组与计算方法,但是,要做到这一点就要求我们对C语言有足够的了解,并可以将所学知识合理运用。合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下。平时的练习与积累十分重要,要有钻研的精神,多去研究别人写出的优秀的程序,从中吸

9、取经验,得到启发,并灵活运用,那么,学好C语言,一定不在话下。对于刚刚开始进入实践过程的人来说,程序的调试工作既枯燥又艰难,但万事开头难,只要多想、多问,问题一定可以解决。而且,只有这样一个过程,我们才能学会如何将书中学到的知识加以运用。总之,熟练运用C语言是一个难得的本领,看到自己的程序在调试之后完美运行会收获巨大的成就感。方程求解(自己设计)一、题目描述编写程序,用二分法求方程2x3-4x2+3x-6=0在(-10,10)之间的根。提示: 用do-while语句实现。 二分法的计算步骤:(1) 准备 计算f(x)在有根区间a,b端点处的值f(a),f(b)(2) 二分 计算f(x)在区间中

10、点(a+b)/2处的值f(a+b)/2(3) 判断若f(a+b)/2=0,则即是根,计算过程结束。否则,检测:A 若f(a+b)/2与f(a)异号,则根位于区间a,(a+b)/2内,这时以(a+b)/2代替b;B 若f(a+b)/2与f(a)同号,则根位于区间(a+b)/2,b内,这时以(a+b)/2代替a;反复执行步骤2和3,直到区间a,b长度缩小到允许的误差范围之内,此时中点(a+b)/2即为所求的根。二、算法描述1、简介本程序主要运用数学中的二分法求解一元三次方程的实根,在此思路引领下,使用do-while语句、if语句与各种运算构成算法,完成程序。本程序未使用子函数。什么是二分法?对于

11、区间a,b上连续不断且f(a)·f(b)<0的函数y=f(x),通过不断地把函数f(x)的零点所在的区间一分为二,使区间的两个端点逐步逼近零点,进而得到零点近似值的方法叫二分法。2、算法分析首先由scanf函数读入函数解所在区间,将它们存在变量a、b中;计算a、b中点数值,因a、b中点不一定为整数,故将其存入double型变量x中; 将x代入f(x)中,即计算2x3-4x2+3x-6的值,存入double型变量f中;判断f是大于0,小于0,还是等于0,已知f(-10)<0,f(10)>0,若f(x)<0 ,说明解位于(x,b)内,因此积分区间缩小一倍,将x值赋予a;若f(x)值大于0,同理,说明解位于(a,x)内,将x赋值给b;若f(x)值为零,说明当前x值即为方程的解,此时输出x,并结束程序;整个程序的循环由do-while语句来控制,改变while (i<100)中100处数值,就可改变方程的循环次数,得到不同精度的解。 三、 流程图四、运行效果截图 五、心得体会C语言可以结合多个科目的知识完成一些工作,这需要编程人员有融会贯通的能力,C语言与各领域结合,方能使它的价值得到最充分的体现。同时,我们学到的各种数学知识,都可以转化为最简单的加、减

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论