大数运算的C 语言实现

大数运算的C 语言实现
大数运算的C 语言实现

大数运算的C语言实现

作者:方玉阁,07秋软件工程;学号:v07254643119;指导教师:贾磊

毕业实践是学校根据专业教学的要求,对学员已学部分理论知识进行综合运用的培训,其目的在于让学生接触社会,加强学生对社会的了解,培养和训练学生认识、观察社会以及分析、解决问题的能力,提高学生的专业技能,使之很快地融入到实际工作中去。2009年5月份大数运算方面的实践。

在不到一个月的时间内,要想整个完全实现所有功能的算法过程是不易的。我主要采用了“多搜、多问、多学、多悟”四多的方式,基本了理清了整个流程的操作实现。现将此次实践活动的有关情况报告如下:

一、实践的内容与过程

实践内容是关于大数开n次方的以及过程中所用到的大数的四则运算和一些辅助函数如大数合法性的验证、大数的逻辑运算等等数学运算。考虑到这是一个非常有用的方法,目前C及C++语言最大支持的数据类型为八字节长度的长整型long,所以当我们要在程序里运算一个较大的数时,就无从着手,在C语言提供的函数库里没有此功能的函数,可见实现一个此类功能的方法对实现大数运算的功能可见是很有用的,可为众多软件开发者提供方便、捷径,用较短的时间做更多的事,然而每件事情并不是那么简单的,要考虑的严禁,不出逻辑问题,又要考虑执行效率,安全健壮性,未免不是一件难事,对于实现其功能很有挑战性,技术性的提高。虽说现在很多地方都实现了这个功能,但算法都有所不同,也许他们用的算法有好有坏,但我还是要有必要写一个,或许不同的这个算法,别人还没有实现,也算得是开源吧,因为这个中国古代的一个笔算算法,要用程序来实现它,不仅精度可以控制主要是运算精度,效率很高。

首先,要了解该类功能实现的整个流程,先什么,后什么,主次要分清楚,还有功能的合理划分,及可扩充性,程序的健壮性。通过资料查询和逻辑够思,大至总结出此类需要什么函数及各个函数方法之间的联系,细节性的在实现中逐步添加,主要功能还是大数开n次方的运算,而其它加减乘阶乘除则是为其服务的,在此类基础上可以推导出许多运算的实现,就相当于基类中的一个部件,还有通常的数学运算,比如模运算和一些稍微复杂运算方法,如开方,乘方等等这些,各种方法的具体实现用简单的做不出来效果,就换复杂的来做,一种方法不通,就尝试用其它方法来达到所需效果,即有简则不复杂,提高编程效率,前提

注重质量下。另外就是可扩充性,目前凭个人已有经验要做的完美无缺是不现实的,只能尽量减少失误,方便添加新功能,修改已有功能,如命名规则,接口,公有、保护、私有方法或属性和多态性的使用等。

整个实践过程分四个阶段进行,第一阶段资料和算法搜集,可行性判断,第二阶段类的方法、属性,数据存储结构的设计,第三个阶段方法的实现,即算法的代码实现,第四阶段收尾工作,程序的测试,保证写出来的程序可以运行,有问题返回继续。

(一)资料搜集

首先,资料准备阶段,搜集实践过程中要用到的算法,技术文章和参考文献,做好准备式作,第一算法收集,经过资料查询,我决定用我们中国古代笔算算法,因为它可以控制精度,不仅精度高而且效率还高,虽说复杂繁锁一点,但实现它很有价值性,说起来是我们中国人自己的算法,第二,技术文章准备,因为在实践过程中可能会遇到很多问题,不是知识没学过,是学过不过有些细节性的东西可能没记得那么细,书上要更详细点,边实践边学习,可以事倍功半学到更多东西,甚至书上都没提到过的知识点,有些好的方法都是工作中总结出来的。若在书上找不到,就需从网上搜了,实在是找不到了,就得请教资历高深、经验非富的老师,把所需知识点给理清楚,记录下来,用什么方法能直接或间接实现,边学边用活学活用融会贯通,第三就是参考文献了,别人或许可以否认你设计的程序逻辑,但都会相信肯有权威性的参考文献中的标准文章,因为那是官方最原始的未经任何人修改过的,更具有高的可信的价值性。

其次,将收集来的资料归类,要不等需要用到时,再去找会很麻烦的,或许有可能都找不到,忘了放在哪里了,也许一不小心就把它删掉了,这会做又得重新搜寻,白花费时间精力。下面最主要的核心算法。

开方笔算算法:其实开方的笔算法中国古代就已经被发现了,方法也不难,就是计算特别烦琐。旧的初中教材里有笔算开平方的方法,我觉得笔算开n次方的方法也不难,就介绍我知道的笔算开n次方的方法:

①把被开方的整数部分从个位起向左每隔n位为一段,把开方的小数部分从小数点第一位起向由每隔n位为一段,用撇号分开;②根据左边第一段里的数,求得开n次算术根最高位的数,假设这个数为a;③从第一段的数减去求得的最高位上数的n次方,在它们的差的右边写上第二段数作为第一个余数;④把n(10a)^(n-1)去除第一个余数,所得的整数部分试商(如果这个最大整数大于或等于10,就用9做试商);⑤设试商为b。如果(10a+b)^n-(10a)^n小于或等于余数,这个试商就是n次算术根的第二位;如果(10a+b)^n-(10a)^n大于余数,就把试商逐次减1再试,直到(10a+b)^n-(10a)^n小于或等于余数为止;⑥用同样

的方法,继续求n次算术跟的其它各位上的数(如果已经算了k位数数字,则a 要取为全部k位数字)。

例如计算987654321987654321的五次算术根,就算到小数点后四位。

397 1.1929

5√987'65432'19876'54321.00000'00000'00000'00000

243

________________________________________________

74465432......................................74465432/(5×30^4)整数部分是18,用9作试商

65924199......................................39^5-30^5

_____________________________________________

854123319876................................854123319876/(5×390^4)的整数部分是7,用7作试商

839297061757................................397^5-390^5

____________________________________________

1482625811954321..........................1482625811954321/(5×3970^4)的整数部分是1,用1作试商

1242655709408851..........................3971^5-3970^5

___________________________________________

239970102545470 00000....................23997010254547000000/(5×39710^4)的整数部分是1,用1作试商

12433443520609199551....................39711^5-39710^5

_________________________________________

11563566733937800449

00000..............1156356673393780044900000/(5×397110^4)的整数部分是9,用9作试商

1119117001570432051621599..............397119^5-397110^5

_________________________________________

37239671823347993278401

00000........3723967182334799327840100000/(5×3971190^4)的整数部分是2,用2作试商

2487041901386565548357443232........3971192^5-3971190^5

_______________________________________

1236925280948233779482656768

00000..123692528094823377948265676800000/(5×39711920^4)的整数部分是9,用9作试商

111917049019214028715187411930649..39711929^5-39711920^5

_______________________________________

11775479075609349233078264869351

这样就得到987654321987654321的五次算术根精确到小数点前四位为3971.1929。

(二)结构设计

首先,大数类结构的设计,方法属性的命名,扩充功能的接口预留,一个合理的结构设计不仅写起程序实现简单,使程序的可读性也更简洁明了,后期修改也方便,另外就是大数的存储结构,由于大数的长度不确定,用数组存储有长度数组长度限制的,所以需采用链式存储结构。完了之后就需逐步实现各个函数的功能,考虑其运行效率的同时还要顾及到代码的逻辑,精简,安全性,接下来第一步做的是大数类的建立,方法属性的命名,扩充功能的接口预留,数据结点、链表的创建及如何回收,有效利用内存,合理地使用内存,若没有合理释放链表所使用的内存空间就会造成内存碎片,内存泄漏,会影响程序的运行(内存不足),为回收碎片结点就需建立一条碎片链,来记录所有已开辟的空间结点,这样就有效利用了已用过的链结点,在创建结点的时候访问碎片链一次,看是否有现成空间可用,有则利用,无则新创建,这样就有效节约了创建结点所需的时间,另一个就是数据存储结构,一个好的存储结构不仅可以节约内存的使用,更能提高程序的运行效率,经过几种结构的比较和程序测试,才确定下来一种较为合理的存储结构,既有指向前驱结点的指针域prior,又有指向后继结点的指针域next,和储存数据的数据结点域,和另外一些辅助变量,如静态结点,使不同对象之间通信。本来大数的运算不复杂的,但要想做的完美,比如实数的运算,考虑的越多,程序就越复杂,实现起来就越困难。

接下来就是每个模块的功能的代码实现,以及为其以后派生,继承某些功能所需要的一些接口,还要考虑程序的安全性,健壮性,正是一个面向对象程序所提到的其本思想,每二步,链表的运算,大数的运算,并不是每个大数都是合格的能转换成像一个实数那样的,因此在转换字符串到大数链的还要检测一下字符串的合法性,是否能转换成一个合格的大数,即类似于实数的大字符串,仿似数学上的运算,比如减数不足向前借位,不了则进位等性质,在实现各函数的同时,各函数之间关系都要明确,借用一些辅助函数,这些函数对外是不可访问的,其

目的就是为了代码的安全,可读性,方便修改,假如该功能的某处代码有所改动,就要改动多处,有一处错就影响整个程序的运行。为了减少不必要的麻烦,能简单则不复杂,代码越精简起好,可读性高;另外就是一个命名规则,好的命名规则会让整个程序清晰可见,简而易懂,方便维护的修改,总之最主要还是各个函数的链接,相当于程序运行必不可少的枢纽中心。

(三)方法实现

实现方法分以下几步进行

1.将字符串转换成一个大数进行验证,检查它是否是一个合格的大数,能否将它转换成一个大数链(可以像整数或小数一样参加运算,只不过位数不同),转换成大数链以便进行操作,检查一个大数是否为正确的要从以下几步去看,一、有正负号没,有了只能在第一位,二、有小数点没,有了只能有一个,三、以上两点判断完后就判断是除了+-.0123456789外是否还有其它字符,三个条件都通过后则说明此字符串是一个合格的大数。这三个条件是检查一个大数的必要条件。

2.建立数据结点,并前后挂链,使从前驱结点可以找到后继结点,从后继结点也可以找到前驱结点,最后一个结点的指向后继结点的next(指向大数结点的指针)域为空,标志大数链的结束,头结点的next域指向大数链的第一个结点,指向前驱结点的prior域指向大数链的最后一个结点,因为数的运算都是从后向前运算,大数也不例外,这样做可以方便从头结点找到最后的结点,并从后向前检索访问,就不必再头结点向后搜索到最后结点从而再向前进行操作而节约时间。

3.碎片链,或许会小看这东西,刚开始我也不晓得什么叫内存碎片,随着了解的越多就明白了为什么会要这东西,谈起链表的创建及回收就会想到内存的动态申请开辟及释放,有借有换,若借来的内存都没有还回给系统,少则没多大影响,无关紧要,多则就不行了,系统没有足够的内存空间给分配给其它处于等待申请的程序或线程,或许会造成为争夺资源而资源枯竭而陷入死机状态,或者会影响程序的运行(内存不足),好的程序一定要注意这问题,有效利用内存,为回收碎片结点就需建立一条碎片链,来记录所有已开辟空间结点,在创建结点的时候访问碎片链一次,看是否有现成空间可用,有则利用,无则新创建,因而我在这里使用碎片链来解决内存使用问题。当要释放回收结点时,我们可以不真接释放,而是用碎片链表来存起,每添加一个新的结点就在碎片链头部,从而使其变成碎片链的头,当我们需要开辟新结点时,就先访问碎片链上看有没有可用结点空间,有了真接取出,并使碎片链的头为其链上的下一个结点,这样不仅有效合理利用了内存,更为程序申请释放空间节约了时间,提高程序运行效率。

4.辅助函数的实现,在字符串验证并转后成大数链后就要开始对其进行操作了,目的是为了给实现主要功能做辅助功能,我称它为辅助函数,辅助函数有以下几个,大数加法,大数减法,乘法及除法这四个,其中加法是最好实现的,两个数从个位起开始运算,相加大于10、100,1000、10000(要看程序设置的标志量)了,就向前进位,留个标志,待指针运行到要进位的位置上时就使其加1而达到进位目的,一条链到头而另一条链没有到头就把另一条链剩下的依次复制出来到结果链上就完成了,减法要稍以复杂一点,那个做减数那个做被减数,虽说结果的绝对值是一样的,但当两个数相减后有可能会出现前后的多位为零的情况(例:000123.1000),这就得做另一个函数来清理结果上不需要的零了,额外还需加上逻辑运算的几个函数,判断两个大数之间的关系,是大于、等于还是小于关系。乘法运算要复杂程序在这四个中占第三位吧,小数点在运算中只起到间隔作用,不参加运算,如果说真接参加运算,程序写起来比较困难,因为每次运算都得把小数点考虑进去,还不如先把小数点处理出来,记录小数点的位置,待两个数运算完毕后计算小数点位置然后添加进去就成了。第四除法运算,算是这四个中最复杂的一个,难度也是相当高,就说内存使用情况就相当于其它的几倍,需要一条链来保存运算得到的结果,一条试商链来保存被除结果与除数的乘积用于得到试商结果,一条试商结果链来保存试商结果用于重新生成被除数继续除法运算,直到精度达到要求运行停止。

5.主要功能大数开n次方的方法的实现,根据上述笔算算法加上述辅助功能及技术的处理就很容易得到结果,布骤如下,1、把被开方的整数部分从个位起向左每隔n位为一段,把开方的小数部分从小数点第一位起向由每隔n位为一段,用撇号分开;2、根据左边第一段里的数,求得开n次算术根的最高位上的数,假设这个数为a;3、从第一段的数减去求得的最高位上数的n次方,在它们的差的右边写上第二段数作为第一个余数;4、把n(10a)^(n-1)去除第一个余数,所得的整数部分试商(如果这个最大整数大于或等于10,就用9做试商);5、设试商为b。如果(10a+b)^n-(10a)^n小于或等于余数,这个试商就是n次算术根的第二位;如果(10a+b)^n-(10a)^n大于余数,就把试商逐次减1再试,直到(10a+b)^n-(10a)^n小于或等于余数为止。6、用同样的方法,继续求n次算术跟的其它各位上的数(如果已经算了k位数数字,则a要取为全部k位数字)。也许会为得到结果上的位数而发愁,因为都涉及到开方运算,而现在开方运算还没有实现咋个做,不愁有办法是想出来的,因为每个结果最高位是9,这就好办了,就不用开方或除法去计算该位上的数,用乘法从0试到9就行了或者从9试到0,这样方便程序实现,至此整个方法实现完了,告一段落,接下来就是测试了。

6.程序测试

直接检验测试,清晰可见简而易懂就可以看到结果,如下:

二、实践成功获得的主要经验

两学期来,虽说编程上学到了很多理论东西,但很少有在实践中运用,与实际还有些距离,经过这次的实践,明白有那些不足之处和那些程序设计中的优点可取之处。

(一)类结构、方法属性命规则、接口等合理的设计

好的结构使程序看起来更简洁明了,读起来简而易懂,有助于提高程序的可读性,并为功能扩充留下接口,方便功能添加和修改。

(二)链表的挂链、插入、删除

挂链是一个抽象的概念,对很多初学C语言的都很难理解,经过这次的实践,掌握了一些独特的方法,对以后设计其它的程序方便有利,如双向链表完成结点交换不需要临时指针就行了,可以通过逻辑与运算符的功能来达到目的。

(三)多个函数协同工作,其功能的划分及其管理

每个函数有不同的功能,不同功能在程序中起着不同作用,各个函数之间的协同工作,通信交互,共同来达到所需功能,合理的功能划分使程序条理清晰有序,提高程序的可读性,把多处用到的相同功能的代码放在某一函数里,减少代码的冗余,方便程序修改,若哪处功能有所改动,一改全改,就不用一处一处改动,减少不必要的修改错误,为编程提高效率。

(四)程序的健壮性

防止程序出现意外而异常终止,好的话只是程序终止,坏的情况下则导致系

统崩溃带来严重后果,这是程序开发者一定要注意的问题,这也并不是一两个函数所能完成的任务,要在每个有可能出现异常的函数里加入异常处理功能,至于怎么处理,要视情况而定,所实现的功能就是保持程序的健壮。

三、实践过程中存在的主要问题

虽然这次社会实践时间很短,但从中学到了很多东西,这是平常都没注意到的,尤其在链表的操作上的程序设计思路比较不错,由于现在高手如运,大数运算类更是多的是,要使开发人员使用这个的类,就得有吸引力的地方,比如速度,精度等,目前速度,精度不是问题,我认为这套算法主要存在的问题:

①算法的执行效率是一重要问题,算法好并不一定实现方法是最好的,有待优化;②键壮性,可能哪里存在着漏洞不过尚未发现,有待众人检测。

四、实践的收获和体会

经过此次实践,发现自己与实际工作还有一定的距离,还有许些不足,该怎么弥补不足,还要拟定个计划,学习那些内容,我们平常在学校学的东西,在实践中都能用到,但还有所不足,这次实践它使我们走出课堂,走向社会,走上了与实践相结合的道路,让我们在实践中施展才华,增长才干,磨练意志,在实践中检验自己,通过实践,一方面,我们锻炼了自己的能力,在实践中成长,另一方面,我们找到了与社会的接触之路,但在实践过程中,我们也表现经验不足,处理问题不够成熟,书本知识与实际结合不够紧密等问题,所以我们一定要珍惜在校学习时光,努力学习文化、技术知识,为把我们的祖国变得更繁荣昌盛而努力奋斗!

c语言程序设计课程计算器设计报告

课程设计说明书 题目计算器程序设计 起讫日期 2006 年 7月 3日至 2006 年 8月 6日 所在院系软件学院 专业机械+软件班级 04-2 学生姓名偶偶哦学号 指导教师 2006年 8 月日

摘要 当今社会是信息社会,科技经济高速发展的社会!为了更方便人们的工作生活和加速人们处理信息的速度,计算器应运而生。由于它体积小巧,携带方便,价格便宜,构造简单等诸多的优点成为人们生活中的必备品! 随着科技的发展计算器的种类变得更多,功能变得更强大,体积变得更小!电脑的出现改变人们的生活习惯,很多事情都可以电脑来完成!电脑的更大一个优点就是可以通过软件的应用无限的延伸电脑功能的外延!下面我们将用我们学习的c语言编写一个简易的计算器程序!实现简单的初步的计算功能! 本程序的编写基础是Tubro 汉化版,它在tubro c的原有基础上实现了多汉字的支持方便了我们的使用。生成的程序可移植性强兼容性好稳定!现在只实现了加、减、乘、除、求幂、求模,求平方根,求Sin,求Cos,求Log10,以及一个时钟原代码。这个系统是基于软件发展的生命周期来研制的,它可以直接输入数学表达式,不需要任何转换,就可以直接输出数学四则运算的结果。但是,每次只能运算一个表达式。不能运算多个表达式。在程序里面在添加一组选择函数即可。本论文主要介绍了本课题的开发背景,开发的过程和所要完成的功能。重点的说明了系统设计思想,设计的步骤、难点技术和解决方案。 关键词:C语言 Tubro c 汉化版计算器时钟

目录 第一章综述 (1) 1.1 课题的现实意义 (1) 1.2 软件环境 (1) 1.3 硬件环境 (1) 第二章系统设计流程图 (2) 2.1 系统流程图 (2) 2.2 主要功能表 (2) 第三章系统分析和设计 (3) 3.1 图形的绘制和输出 (3) 3.2 文本的输出显示 (3) 3.3 计算函数的调用 (4) 3.4 程序的运行和退出 (5) 第四章系统测试 (6) 4.1 系统测试 (6) 4.2 调试 (6) 4.3 错误原因分析一 (6) 4.4 错误原因分析二 (6) 第五章用户使用说明书 (8)

C语言课程设计 简单计算器程序

课程设计名称:C语言课程设计课程设计题目:简单计算器程序

目录 第1章需求分析 (1) 1.1设计要求 (1) 1.2任务 (1) 第2章总体设计 (2) 2.1设计简介及设计方案论述 (2) 2.2功能模块层次图 (2) 第3章详细设计 (3) 3.3由(后缀)逆波兰表达式计算中缀表达式原理 (8) 3.3.1算法描述 (8) 第4章调试分析 (10) 4.1程序设计中所遇到的错误及犯错的原因 (10) 4.2错误的解决方法 (10) 第5章用户手册 (11) 总结 (15) 参考文献 (16) 附录(程序清单) (17)

第1章需求分析 1.1 设计要求 (1)用 C 语言数据结构实现程序设计; (2)利用结构体、栈、进行相关信息处理; (2)系统的各个功能模块要求用函数的形式实现; (4)界面简单,可操作性高。 1.2任务 (1)定义一个结构体类型数组,输入0~9 及+、--、*等符号的信息,将其信息存储起来; (2)输入简单的加减乘除算术计算式,并在屏幕上显示逆波兰(后缀式)表达式和计算结果; (3)编写代码; (4)程序分析与调试。 说明: 本课程设计将实现一个简单计算器。在功能上尽量模仿windows 的计算器。系统界面不做牵制要求。该程序能实现标准型中+、-、*、/、(、)、.、的混合运算表达式(一般意义上的中缀表达式),将其转换成逆序波兰表达式(后缀表达式)并计算输出结果。在进行运算后可以选择继续运算或者结束当前运算。即时准确地获得需要的计算的结果,充分降低了数字计算的难度和节约了时间,对人们的生活有一定的帮助。

第2章 总体设计 2.1设计简介及设计方案论述 逆波兰表达式又叫做后缀表达式。在通常的表达式中,二元运算符总是置于与之相 关的两个运算对象之间,所以,这种表示法也称为中缀表达式。波兰逻辑学家 J.Lukasiewicz 于 1929 年提出了另一种表示表达式的方法。按此方法,每一运算符都置 于其运算对象之后,故称为后缀表达式。 后缀表达式的优点是显而易见的, 编译器在处理时候按照从左至右的顺序读取逆波 兰表达式,遇到运算对象直接压入堆栈,遇到运算符就从堆栈提取后进的两个对象进行计算,这个过程正好符合了计算机计算的原理。后缀表达式比前缀表达式更加易于转换,并且它的最左面一定为数字,这一点在实 际编程的时候就会体会到它的好处了。 逆波兰表达式有一个更大的优点,就是拆括号,根据运算符的级别将中缀表达式转 换成逆波兰表达式后,运算顺序就已经替代了运算符的级别,这样也避免了括号提高运 算级别的特殊处理。 2.2功能模块层次图 将算术表达式转化为逆波兰表达式 计算逆波兰表达式的值 简单计算器 表 达 式 格 式 转 换 系统 求 值 计 算 系 统

二级C语言-运算符与表达式

二级C语言-运算符与表达式 (总分:60.00,做题时间:90分钟) 一、{{B}}选择题{{/B}}(总题数:38,分数:38.00) 1.设变量已正确定义并赋值,以下合法的C语言赋值语句是______。 ? A.x=y==5 ? B.x=n%2.5 ? C.x+n=i ? D.x=5=4+1 (分数:1.00) A. √ B. C. D. 解析:[解析] 赋值运算符左侧的操作数必须是一个变量,而不能是表达式或者常量,选项C和D错误。“%”运算符两侧都应当是整型数据,选项B错误。 2.在x值处于-2~2、4~8时值为“真”,否则为“假”的表达式是______。 ? A.(2>x>-2)||(4>x>8) ? B.!(((x<-2)||(x>2))&&((x<=4)||(x>8))) ? C.(x<2)&&(x>=-2)&&(x>4)&&(x<8) ? D.(x>-2)&&(x>4)||(x<8)&&(x<2) (分数:1.00) A. B. √ C. D. 解析:[解析] 本题是考查关系运算和逻辑运算的混合运算。要给出此题的正确答案,首先需要了解数学上的区间在C语言中的表示方法,如x在[a, b]区间,其含义是x既大于等于a又小于等于b,相应的C语言表达式是x>=a&&x<=b。本例中给出了两个区间,一个数只要属于其中一个区间即可,这是“逻辑或”的关系。在选项A中,区间的描述不正确。选项B把“!”去掉,剩下的表达式描述的是原题中给定的两个区间之外的部分,加上“!”否定正好是题中的两个区间的部分,是正确的。选项C是恒假的,因为它的含义是x同时处于两个不同的区间内。选项D所表达的也不是题中的区间。 3.sizeof(double)是______。 ? A.一种函数调用 ? B.一个整型表达式 ? C.一个双精度表达式 ? D.一个不合法的表达式 (分数:1.00)

C语言四则运算测试程序设计报告

昆明理工大学 《计算机程序设计基础》课程 综合实践型教学课题报告 课题名称:100以内的整数四则运算测试程序设计 组长:学号 040401067 姓名周绍平 组员:学号 040401070 姓名邓磊 学号 040401106 姓名刘云路 学号姓名 学号姓名 学号姓名 学号姓名 学院:信自学院专业班级:自动化0421 指导教师:耿植林 昆明理工大学计算中心 2005 年 6月18日

昆明理工大学计算中心 《计算机程序设计基础》课程综合实践型教学课题报告课程名称:100以内的整数四则运算测试程序设计

正文内容: 一、问题描述 这是一个进行数学计算的程序,且要求拥有多种功能,包括(1)选项菜单集成各功能函数模块(2)出题(每次出10道题目)(3)答题并评分(4)答错的题给出正确答案(5)显示答卷。总体看来,大多数功能要求调用错题,所以面临的两个难题便是出题和保存答题者做错的题以便其它函数调用。另外,由于除法的特殊性——其除数不能为0。又因为这是一个用于100以内整数的四则运算的程序,又对除法这个特殊成员提出了新的要求——要使得到的结果为整数。所以有必要把除法单独拿出来作为一个函数处理。 二、问题分析 这是一个任务很明确的程序设计—用于100以内的整数的四则运算。这个程序要求拥有选项菜单、出题、答题评分、显示答卷、错题再解、重复练习的功能。既然是一个用于计算的程序那它的主要作用就是给练习者答题,并验证答题的正确与否。当然,还要有一些附加功能,比如:把答卷显示出来,错题给出正解,错题再抽出来再做。 这个程序只要求100以内的四则运算,所以随机出现的数字只能是100以内的,并且要求其为整数。不论是数据的输入与输出,都要求其为整数。 鉴于这个程序所要求达到的功能,我们小组决定把它分为计算、菜单、答卷、重做、正解、评价、除法七个函数模块。 对各成员的分工如下: 计算、正解和菜单(周绍平) 评价和除法(邓磊) 答卷和重做(刘云路) 主函数及各函数的连接则由小组成员共同完成。 三、程序设计思路功能模块说明 各函数流程图: 1、除法(chufa) 2、计算(jisuan)

C语言简易计算器的实现

目录 一.课程设计目的 (1) 二.设计环境 (1) 三.设计内容 (1) 四.设计说明 (2) 五.设计程序流程图 (2) 六.调试 (4) (1)错误原因分析一 (4) (2)语法错误 (5) (3)逻辑错误 (5) 七. 调试结果图 (6) 八. 结论与心得体会 (7) 九.附录 (8) 具体代码实现 (8) 十.参考文献 (18)

一.课程设计目的 1.通过一个学期的学习,我认为要学号C语言程序这门课程,不仅要认真阅读课本知识,更重要的是要通过上机实践来巩固我 们的知识,特别是学计算机专业的,我们更应该注重这一环节, 只有这样我们才能成为一个合格的计算机人才。通过这一个课程 设计,进一步来巩固所学的语句,如:循环,和分支结构的运用。还要熟悉四则运算和函数的算法。 2.通过这次课程设计扩展自己的知识面,课本上的东西是远 远不够的,可以通过上网或去图书馆查资料等方式得到一些新的 知识, 3.通过课程设计,加深对课程化设计思想的理解,能进行一 个系统功能分析,并设计一个合理的模块化结构,提高程序开发 能力。 二.设计环境 1.硬件:一台完整的电脑,包括键盘、鼠标,最小硬盘空间1GHz 2.软件:安装有Microsoft visual c++6.0 三.设计内容 以简易计算器为例,通过对简单应用软件计算器的设计,编制、调试,实现

简单的加,减,乘,除等运算,以学习应用MFC库类编写对话框的原理,加深对C++类的学习及应用。 (1)定义一个结构体类型数组,输入0~9及+、--、*等符号的信息,将其信息存入文件中; (2)输入简单的加减乘除算术计算式,并在屏幕上显示计算结果; (3)画出部分模块的流程图; (4)编写代码; (5)程序分析与调试。 四.设计说明 1)包含的功能有:加、减、乘、除运算,开方、平方等功能。 (2)计算器上数字0—9为一个控件数组,加、减、乘、除为一个控件数组,其余为单一的控件。 (3)输入的原始数据、运算中间数据和结果都显示在窗口顶部的同一个标签中。 (4)计算功能基本上是用系统内部函数。 (5)程序可以能自动判断输入数据的正确性,保证不出现多于一个小数点、以0开头等不正常现象。 (6)“CE”按钮可以清除所有已输入的数据从头计算 五.设计程序流程图

C语言中条件运算符的语法为

条件运算符的语法为: (条件表达式)?(条件为真时的表达式):(条件为假时的表达式) 例如: x=ay?"greater than":x==y?"equal to":"less than" 它等价于: (x>y)?"greater than":((x==y)?"equal to":"less than") 当x>y时,值为"greater than",x==y时,值为"equal to",否则,值为"less than"。条件运算符的嵌套可读性不够好。 在一个条件运算符的表达式中,如果后面两个表达式的值类型相同,均为左值,则该条件运算符表达式的值为左值表达式。例如: int x=5; long a,b; (x?a:b)=1;//ok:因为a和b都是左值 (x?x:a)=2;//error:x和a不同类型。编译器将其解释为(1ong)x和a (x==271:a)=3;//error:1非左值 "(x?a:b)=1"表示当x为0时,b=1,否则a=1。这里的括号是必须的,否则将被看作x?a:(b=1)。"(x?x:a)=2”中,尽管x是左值,a也是左值,但x与a不同类型,条件运算符要对其进行操作数的隐式转换,使之成为相同的类型。任何被转换的变量都不是左值。 ->在C中,条件运算符是不能作左值的,所以"(x?a:b)=1;"将通不过编译。 getchar 函数名: getchar 功能: 从stdio流中读字符 用法: int getchar(void); 注解:

C语言-四则运算

四则运算 姓名: 学号: 班级: 1.功能结构图 2.程序功能 进行整数的加减乘除和求模运算。程序采用随机产生1~100的两个数进行运算每种运算有10个题目用户输入对应的答案程序提示答案的对错最后统计正确率。每次给出两次答题机会。 3.程序流程图

4.函数列表及功能

5.源程序代码 #include #include #include #define N 10 int f(int a,int b) { //自定义函数int result; result=a+b; return result; } int f1(int a,int b) { int result; result=a-b; return result; } int f2(int a,int b) { int result; result=a*b; return result; } int f3(int a,int b) { int result; result=a*b/b; return result; } int mod(int a,int b) { int result; result=a%b; return result; } int main() { int a,b,res,ans; int i,count; int op,c; srand((unsigned)time(NULL)); while(1) {

printf("\n---加减乘除运算练习系统---\n"); printf("1.加法运算\n"); printf("2.减法运算\n"); printf("3.乘法运算\n"); printf("4.除法运算\n"); printf("5.求模运算\n"); printf("6.混合运算\n"); printf("0.退出练习\n"); printf(" 请输入数字0~6:"); scanf("%d",&op); //输入相应数字进行练习switch(op) { case 1:printf("--请进行加法运算--\n"); count=0; for(i=1;i<=N;i++) { a=rand()%100+1; b=rand()%100+1; res=f(a,b); //调用加法函数 printf("%d+%d=",a,b); scanf("%d",&ans); //输入数值 if(ans==res) { printf("Very Good!\n"); count++; } else { printf("wrong! 请重新输入\n"); scanf("%d",&ans); if(ans==res) printf("Very Good!\n"); else printf("Wrong Answer!\n"); } } printf("***正确率为%.0f%%***\n",100.0*count/N); break; case 2:printf("--请进行减法运算--\n"); count=0; for(i=1;i<=N;i++) { a=rand()%100+1; b=rand()%100+1;

C语言实现计算器功能

实验一多功能计算器 一、问题描述 设计一个多功能计算器,可以完成基本的计算。 设计要求: 1、具备整型数据、浮点型数据的算术(加、减、乘、除)运算功能。依次输入第一个运算数、运算符(+,-,*,/)、第二个运算数,然后输出结果。结果可以作为下一个运算的第一运算数。按‘C’清屏,按‘R’返回菜单。 例如:输入:2 + 5 输出:7 2、实现单运算符表达式计算的功能。输入的操作数可以包含整数或浮点数。输入表达式如下: 例如:输入:2+5 输出:7 二、算法说明 1.数据结构说明(可以图示说明,也可以文字说明) 本程序主要根据选择菜单编写了六个自定义函数,用于在main()函数中调用,在main()中,用一个字符变量num1来记录下菜单选项的标号,根据num1的值来决定调用哪个函数。 程序要完成的功能及所要用到的函数如下:

下面就是整个程序的流程图:

2.算法说明(即函数说明) void suanshuyunsuan() //做算术运算时调用的函数 void suanshuyunsuan2() //选择继续做算术运算调用的函数,将上次运算的结果做为下次算术运算的第一个操作数//判断算术运算就是否继续 void panduan() //判断算术运算就是否继续 void biaodashiyunsuan() //单运算符表达式实现函数 void qingping() //清除屏幕 void fanhuicaidan() //显示菜单 三、测试结果(这部分需文字与图示结合) 1.第一组测试用例 (1)测试输入: 测试目的:测试算术运算的功能 结果输出:

(2)再一次输入:1测试目的:测试算术运算就是否能继续 结果输出: (3)这时输入:0 测试目的:退出算术运算 结果输出:

(完整word版)C语言运算符与表达式的练习题答案

C语言运算符与表达式的练习题 单项选择题 (1)以下选项中,正确的 C 语言整型常量是(D)。 A. 32L B. 510000 C. -1.00 D. 567 (2)以下选项中,(D)是不正确的 C 语言字符型常量。 A. 'a' B. '\x41' C. '\101' D. "a" (3)字符串的结束标志是(C)。 A. 0 B. '0' C. '\0' D. "0" (4)算术运算符、赋值运算符和关系运算符的运算优先级按从高到低依次为(B)。 A. 算术运算、赋值运算、关系运算 B. 算术运算、关系运算、赋值运算 C. 关系运算、赋值运算、算术运算 D. 关系运算、算术运算、赋值运算 (5)逻辑运算符中,运算优先级按从高到低依次为(D)。 A. && ! || B. || && ! C. && || ! D. ! && || (6)表达式!x||a==b 等效于(D)。 A. !((x||a)==b) B. !(x||y)==b C. !(x||(a==b)) D. (!x)||(a==b) (7)设整型变量 m,n,a,b,c,d 均为1,执行 (m=a>b)&&(n=c>d)后, m,n 的值是(A)。 A. 0,0 B. 0,1 C. 1,0 D. 1,1 *(8)设有语句 int a=3;,则执行了语句 a+=a-=a*=a; 后,变量 a 的值是(B)。 A. 3 B. 0 C. 9 D. -12 (9)在以下一组运算符中,优先级最低的运算符是(D)。 A. * B. != C. + D. = (10)设整型变量 i 值为2,表达式(++i)+(++i)+(++i)的结果是(B,上机13)。 A. 6 B. 12 C. 15 D. 表达式出错 (11)若已定义 x 和 y为double 类型,则表达式的值是(D)。

大学计算机c语言计算器源代码

C++语言编写。。 #include #include #include using namespace std; const double pi = 3.14159265; const double e = 2.718281828459; const int SIZE = 1000; typedef struct node//为了处理符号而建立的链表(如: 1+(-2)) { char data; node *next; }node; typedef struct stack_num//存储数的栈 { double *top; double *base; }stack_num; typedef struct stack_char//存储运算符号的栈 { char *top;

char *base; }stack_char; stack_num S_num;//定义 stack_char S_char;//定义 char fu[18] = {'\n', ')', '+', '-', '*', '/', '%', '^', 'Q', 'L', 'C', 'S', 'T', 'c', 's', 't', '('}; int compare[1000];//表现出各运算符号的优先级 double shu[1000];//存储"数"的数组 double dai_result;//运算的结果,是为了处理M运算(简介函数里有M的定义) int biao = 0;//和dia_result一样,为了处理M运算 char line[SIZE];//输入的所要计算的表达式 void init()//初始化 { compare[fu[0]] = -2;//用数字的大小表现出符号的优先级 compare[fu[1]] = -1; compare[fu[2]] = 2; compare[fu[3]] = 2; compare[fu[4]] = 4; compare[fu[5]] = 4; compare[fu[6]] = 4;

C语言实验报告四则运算

《C语言》课内实验报告 学生姓名: 及学号: 学院: 班级: 课程名称:C语言 实验题目:实验二选择结构程序设计 指导教师 姓名及职称: 年月日

一、实验目的 1.掌握逻辑表达式和if语句、嵌套的if语句、switch语句和break语句的格式、语义。 2.掌握选择结构程序设计方法。 二、实验内容 编写程序实现两个数的四则运算,要求从键盘输入进行运算的两个数字以及相应的运算符('+'、'-'、'*'、'/'),程序给出算数表达式及运算结果。(如下图所示,要求使用if语句和switch语句两种方法实现) 三、实验结果 1、流程图

2、源程序 (1)使用if语句 #include void main() { float a,b; char c; printf("please input two numbers:"); scanf("%f%f",&a,&b); getchar(); printf("\nplease input the operator:"); //fflush(stdin); scanf("%c",&c); printf("\n"); if(c=='+') printf("%10.2f+%10.2f=%10.2f\n",a,b,a+b); else if (c=='-') printf("%10.2f-%10.2f=%10.2f\n",a,b,a-b); else if (c=='*') printf("%10.2f*%10.2f=%10.2f\n",a,b,a*b); else if (c=='/') printf("%10.2f/%10.2f=%10.2f\n",a,b,a/b); else printf("Input error!\n"); } (2)使用switch语句 #include void main() { float a,b; char c; printf("please input two numbers:"); scanf("%f%f",&a,&b); //输入a,b的值 getchar(); printf("\nplease input the operator:"); //输入操作符 scanf("%c",&c); printf("\n"); switch(c) //判断输入操作符 { case '+': //若操作符为'+',输出a+b printf("%10.2f+%10.2f=%10.2f\n",a,b,a+b); break;

C语言运算符与表达式的练习题

C语言运算符与表达式的练习题 (作业写到纸质作业本上,在规定时间内交给助教批阅,不要 再网上提交) 一、单项选择题 (1) 以下选项中,正确的C 语言整型常量是。 A. 32L B. 510000 C. -1.00 D. 567 (2) 以下选项中,是不正确的C 语言字符型常量。 A. 'a' B. '\x41' C. '\101' D. "a" (3) 在C 语言中,字符型数据在计算机内存中,以字符 的形式存储。 A. 原码 B. 反码 C. ASCII 码 D. BCD码 (4) 字符串的结束标志是。 A. 0 B. '0' C. '\0' D. "0" (5) 算术运算符、赋值运算符和关系运算符的运算优先级按 从高到低依次为。 A. 算术运算、赋值运算、关系运算 B. 算术运算、关系运 算、赋值运算

C. 关系运算、赋值运算、算术运算 D. 关系运算、算术运算、赋值运算 (6) 逻辑运算符中,运算优先级按从高到低依次为。 A. &&,!,|| B. ||,&&,! C. &&,||,! D. !,&&,|| (7) 表达式!x||a==b 等效于。 A. !((x||a)==b) B. !(x||y)==b C. !(x||(a==b)) D. (!x)||(a==b) (8) 设整型变量m,n,a,b,c,d 均为1,执行(m=a>b)&&(n=c>d)后, m,n 的值是。 A. 0,0 B. 0,1 C. 1,0 D. 1,1 (9) int b=0,x=1;执行语句if(x++) b=x+1; 后,x,b 的值依次为。 A. 2,3 B. 2,0 C. 3,0 D. 3,2 (10) 设有语句int a=3;,则执行了语句a+=a-=a*=a; 后,变量 a 的值是。 A. 3 B. 0 C. 9 D. -12 (11) 在以下一组运算符中,优先级最低的运算符是。 A. * B. != C. + D. =

计算器C语言程序

数码管显示计算器C语言程序如下: #include #include #define uchar unsigned char #define uint unsigned int uchar i,j,temp,num; uchar a0,a1,a2,a3,a4,a5,b0,b1,b2,b3,b4,b5; uchar flag,flaga,flagb,fuhao; long a,b,c,flagz; void init() { a0=0xc0;b0=0xc0; a1=a2=a3=a4=a5=b1=b2=b3=b4=b5=0xff; flag=0,flaga=0,flagb=0;flagz=0; a=0,b=0,c=0; } void qn() { b0=b1=b2=b3=b4=b5=0xff; } uchar code table1[]={ 0xf8,0x80,0x90,0, 0x99,0x92,0x82,0, 0xf9,0xa4,0xb0,0, 0,0xc0,0,0}; uchar code table2[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; uint code table[]={ 7,8,9,0, 4,5,6,0, 1,2,3,0, 0,0,0,0 }; void delay(uint xms) { uint i,j; for(i=xms;i>0;i--) for(j=110;j>0;j--); } void display() { if(a5!=table2[0]) {P2=0x00; P0=a5; P2=0X01; delay(1);

C语言课程设计小学生四则运算

#include"stdio.h" #include"stdlib.h" void main() { int a,b,c,d,e,f,g,t; printf("****************************欢迎使用!************************\n"); printf("\n"); printf("1.加法运算\n"); printf("2.减法运算\n"); printf("3.乘法运算\n"); printf("4.除法运算\n"); printf("*****************************请选择运算类型:"); scanf("%d",&a); while(a<1||a>4) { printf("输入错误,请重新输入"); scanf("%d",&a); } if(a==1) { printf("5,一位数加一位数\n"); printf("6,一位数加两位数\n"); printf("7,两位数加两位数\n"); printf("*********************************请输入题型:"); scanf("%d",&a); while(a<5||a>7) { printf("输入错误,请重新输入"); scanf("%d",&a); } if(a==5) { loop:b=rand()%10; c=rand()%10; d=b+c; printf("%d+%d=?\n",b,c); printf("请输入答案:"); scanf("%d",&e); while(e!=d) { printf("回答错误,请重做"); printf("%d+%d=?\n",b,c); printf("请输入答案:"); scanf("%d",&e);

逻辑运算符和表达式(c语言)

南京高等职业技术学校 课堂教学设计 授课时间:2014年11月6日第11周星期四教学目标教学准备 授课教师课时课程通过本节课的学习,学生能够: 1.清晰地说出各种逻辑运算符; 2.正确运算出逻辑表达式的值,并 通过程序验证结果; 重点教案□√ 马丽娟 1 C语言多媒体课件□√班级授课地点课题教学讲义□ 512212 机房4.2逻辑运算符与逻辑表达 式 1.逻辑表达式的求值运算; 2.逻辑表达式的求值优化。 学生工作页□ 课堂特殊要求(指教师、学生的课前准备活动等) 教师:安装Win-TC程序难点 教具□√ 逻辑表达式的求值优化授课形式 理论讲授课 教学环节时间分配教师活动学生活动教学方法媒体手段导入新课 5 提出问题,并举例说明听讲、思考、回答讲授法PPT 新课讲授20 讲授、分析听讲、讨论并记录讲授法PPT 巩固练习15 布置任务、巡视、答疑思考、编程并回答问题练习法Win-TC 课堂小结 3 归纳、总结听讲、回答问题讲授法PPT 布置作业 2 布置作业记录讲授法PPT 板书设计 §4.2 逻辑运算符与逻辑表达式 ?逻辑运算符:&&、||、! ?逻辑表达式的值:非0即1 ?逻辑运算的求值优化工作任务/教学情境设置 无课后作业 书面作业:P52 随堂练习 课后反思

教案纸 教学内容 4.2 逻辑运算符与逻辑表达式 一、复习导入(5min) 1. 复习:请学生说出关系运算符有哪些? 请学生回答关系运算表达式的值? 教师进行补充。 2.导入新课: 1、学生参加技能大赛培训的条件? ?扎实的专业知识与较高的实践能力 教师强调与的关系 2、参加技能大赛集训而停课的条件? ?移动互联或智能家居 教师强调或的关系 3、学生回答引入禁烟区的条件? ?没有吸烟非 教师强调非的关系 二、新课讲授(20min) 逻辑运算符 1.教师根据逻辑关系给出三种逻辑运算符的表示形式: &&、||、! 2.教师利用具体的表达式关系分析各种逻辑运算符的作用: 逻辑与相当于英语中的and; 逻辑或相当于英语中的or; 逻辑非相当于英语中的no; 3.教师根据具体的逻辑关系引出逻辑表达式的概念及表示形式: 表达式1&&表达式2 a&&b 表达式1||表达式2 a || b !表达式!a

设计一个简单计算器的C语言课程设计报告

C语言课程设计报告题目:设计一个简单计算器 目录 1. 设计目的 2. 内容

3. 总体设计(有流程图) 4. 源程序编写(附上了运行图) 5. 执行结果 6. 心得体会 一、设计目的 设计一个简单计算器,在功能上功能尽量模拟windows 操作系统中的计算器,系统界面不做强制要求。 全面熟悉、掌握C语言基本知识,掌握C程序设计中的顺序、分支、循环三种结构及数组、函数、指针和文件的操作,把编程和实际结合起来,增强对不同的问题运用和灵活选择合适的数据结构以及算法描述的本领,熟悉编制和调试程序的技巧,掌握分析结果的若干有效方法,进一步提高上机动手能力,培养使用计算机解决实际问题的能力,规范编程思想,为以后在专业

课程中应用计算机系统解决计算、分析、实验和设计等学习环节打下较扎实的基础。 二、内容 1、程序设计的一般步骤 a、确定数据结构 b、确定算法 C、编程 d、调试 e、总结资料 2、基本要求 a .设计正确,方案合理,能实现相应功能。 b .界面友好,使用方便。 c .程序精炼,结构清晰。 d .设计报告含程序设计说明,用户使用说明,源程序清单及程序框图。 e .上机演示。

三、总体设计(程序设计组成框图、流程图)

四、源程序编与 #in clude #in clude #in clude double jisua n( char a[]) { int i=1,j,k,m,cnt=0,t1=0,t2=0,t3=0; char nibo[50],zha n2[50]; double x,n, l,z=0,zha n3[20]; typedef struct { double d1; int d2; }dd; typedef struct {

大整数的四则运算高质量c语言程序

设计题目:大整数的四则运算 1. 功能简介:编写出实现大整数之间相加,相减,相乘,相除的程序,并输出计算结构。 课程设计要求:采用模块化程序设计 源程序中应有足够的注释 必须上机调试通过 注重算法运用,优化存储效率与运算效率 需提交源程序(含有注释)及相关文件(数据或数据库文件); 提交设计报告书。 2.总体结构:

数据初判断运算符 加法 正整数非正整 转变为 减法 转变为 乘法除法 转变为 退出 流程图:

3 .概要设计:

1)加法运算 利用两个整形数组分别存放两个数a和b的每一位的数值,最低位存放符号。如果a 和b同号,从最低为开始计算,如果有进位则保存在高一位,本为则减10,然后反序将计算后的各个位的数值保存在一个数组c并输出,如果a和b都是负数则在前面要输出负号,函数的返回值为c的位数。如果a和b异号,也即两个正整数相减,从最低位开始相减,如果要借位则本位加10再相减,高一位要减1,然后反序将计算后的各个位的数值保存在一个数组c并输出,在前面要输出相应的符号位。 2)减法运算 可将减法运算转化为加法运算,只要将被减数的符号改变即可。 3)乘法运算 符号存放在最低位,将其中一个数a的每一位分别乘以另一个数b的每一位,并将结果保存在数组c中,然后重复计算a的下一位跟b的每一位的乘积,把上一次计算保存在c 的值加上本次计算后的值,并保存在c自身中,直到a的最高位,最后输出符号和相应的计算结果。 4)除法运算 利用乘法和减法,将除数分别乘以1到9,直到其值大于等于被除数的对应的数,然后被除数对应的数减去其乘积,保存在一个数组中,下一次循环把它归到被除数中继续做除法运算,最后得到余数并输出。 4.函数功能: 1.void init(int a[],int b[],int *p1,int *p2) 2.功能说明:读入所要计算的数值,数据初始化 3.i nt plus(int a[],int b[],int c[],int m,int n) 4.功能说明:两个正整数相加 3. void change(int a[],int b[],int m,int n) 功能说明:当两异号数相加时,改变其符号以符合加法运算 5.i nt minus(int a[],int b[],int d[],int m,int n)

C语言制作简单计算器

C语言制作简单计算器 一、项目介绍 我们要用c语言做一个简单的计算器,进行加、减、乘、除操作。本程序涉及的所有数学知识都很简单,但输入过程会增加复杂性。我们需要检查输入,确保用户没有要求计算机完成不可能的任务。还必须允许用户一次输入一个计算式,例如:32.4+32 或者9*3.2 项目效果图 编写这个程序的步骤如下: ?获得用户要求计算机执行计算所需的输入。 ?检查输入,确保输入可以理解。 ?执行计算。 ?显示结果。 三、解决方案 1.步骤1

获得用户输入是很简单的,可以使用printf()和scanf()。下面是读取用户输入的程序代码: #includeint main(){ double number1=0.0; //定义第一个操作值 double number2=0.0; //定义第二个操作值 char operation=0; //operation必须是'+''-''*''/'或'%' printf("\nEnter the calculation\n"); scanf("%lf%c%lf",&number1,&operation,&number2); return0; } 2.步骤2 接着,检查输入是否正确。最明显的检查是要执行的操作是否有效。有效的操作有+、-、*、/和%,所以需要检查输入的操作是否是其中的一个。 还需要检查第二个数字,如果操作是/或者%,第二个数字就不能是0。如果右操作数是0,这些操作就是无效的。这些操作都可以用if语句来完成,switch语句则为此提供了一种更好的方式,因此它比一系列if语句更容易理解。 switch(operation) { case'+': printf("=%lf\n",number1+number2); break; case'-': printf("=%lf\n",number1-number2); break; case'*': printf("=%lf\n",number1*number2); break; case'/': if(number2==0) printf("\n\n\aDavision by zero error!\n"); else printf("=%lf\n",number1/number2); break;

c++ c语言 简单的四则运算

C++编写的简单计算器,能执行简单的四则运算 文档时copy过来的!只为方便大家 #include using namespace std; class calculator { public: char token; int exp( void ); int term( void ); int factor( void ); void match( char expectedToken ); void error( void ); }; int calculator::exp(void) { int temp = term(); /*计算比加减运算优先级别高的部分*/ while (( token == '+' ) || ( token == '-' )) switch ( token ) { case '+': match('+'); /*加法*/ temp += term(); break; case '-': match('-'); temp -= term(); /*减法*/ break; } return temp; } int calculator::term( void ) { int div; /*除数*/ int temp = factor(); /*计算比乘除运算优先级别高的部分*/ while (( token == '*' ) || ( token == '/' )) switch ( token ) { case '*': match('*'); /*乘法*/ temp *= factor(); break; case '/': match('/'); /*除法*/

C语言课程设计--计算器(图形界面)

扬州大 学 题目一个简易计算器的设计与实现 班级 学号 姓名 指导教师 成绩 老师评语: 扬州大学信息工程学院 2010 年6 月25

目录 一、程序设计目的: (1) 二、程序设计内容: (1) 三、课程设计所补充的内容:补充的函数或算法…………3,4 四、系统总体设计 (4) 五、系统详细设计………………………………………5,6,7,8 六、运行结果………………………………………………8,9,10 七、系统调试…………………………………………8,9,10,11 八、课程设计体会总结………………………………8,9,10,11

1 课程设计目的 (1).课程设计是一项综合性实践环节,是对平时实验的一个补充,课程设计内容包括课程的主要理论知识,但由于C语言对初学者较难掌握,因而对一个完整的C语言程序不适合平时实验。通过课程设计可以达到综合设计C语言程序的目的。 (2)通过本课程设计,可以培养独立思考,综合运用所学有关相应知识的能力,能更好地使用C语言的知识,更好地了解C语言的好处和其可用性!掌握基本的程序设计过程和技巧,掌握基本的分析问题和利用计算机求解问题的能力,具备初步的高级程序设计能力。为后续各门计算机课程的学习和毕业设计打下坚实基础! (3)通过本程序训练程序设计的基本技能,掌握字符串的表示方法和字符串函数的功能、自学掌握四则运算的算法及WIN-TC的图形操作的基本知识、键盘上特殊键的获取及图形方式下光标的显示。 2 课程设计内容 目的:本课程的课程设计要求学生模拟实现一个简单计算器,要求(1)能够实现四则运算,并能支持优先级运算。(2)三角与反三角运算:如sinx,cosx等。(3)指数对数运算:如log(x),lnx,e的x次方等。(4)其他运算:如X!,x 的累加等。(4)不允许调用库函数,使用自行开发的程序实现常用函数运算。(5)进一步考虑计算器外观设计,用可视化界面给出计算器外观、功能按键及输入界面。 使用说明:执行加法运算,'—'表示执行减法运算,表示执行乘法运算,'/'表示除法运算.‘Q’表示退出计算器‘C’表示清零,’=’表示得出结果'^'表示执行x的y次方,'e'表示执行e的x次方操作,'&'表示执行累加操作.,你可以可以用键盘上的上下左右键对光标进行移动,当光标移动到计算器按键上时,按ENTER即可执行该键的操作!最后按“=”则可得出结果。 3 课题设计的补充知识 本程序通过int specialkey(void)和#include来实现对屏幕的操作,通过调用int arrow()函数,int specialkey(void)和#include来实现对光标的操作。计算机图形采用Turbo C 2.0绘图程序制作。因此涉及C的图形程序设计知识。此外,由于不允许调用库函数,则要自行开发程序实现sinx,cosx,e的x次方函数运算,则可以根据幂级数的展开式来设计实现其运算的算法,而x的阶乘和x的累加则可用for语句来实现。 最后,不得不说说四则运算的算法,有两种方法可以实现:(1)利用堆栈实现四则运算(2)还可以用递归整数的四则运算。 sinx函数 #include

相关文档
最新文档