(3)实验实例

更新于 2026年10月10日 版权声明
(3)实验实例

1)设计一个简单的计算器,能够进行基本的算术运算加“+”、减“-”、乘“*”、除“/”,注意除法中的除数不能为0,当出现0 时,提示“error”。

【程序分析】该程序比较简单,主要设计到了用if 对除数不为0 的判断,然后就是如何识别出运算符,并进行对应的运算,这里可以用switch。

【参考程序】

图示

图示

当按照这种方式去执行的时候,会发现当输入了2 个数并按下回车键后,程序直接运行出了结果,当然这是个错误的结果,如图3-1所示,因为我们还没输入运算符。不过此时程序的结果告诉我们,它其实已经获取到了我们需要的运算符之外的符号,这是什么情况呢?

图示

图3-1 错误结果

回想教材在标准输入输出知识中,曾提到键盘输入进去的数据,是暂时先存放在键盘缓冲区中的,然后再由输入函数去获取。那这里就会发现第二次是要获取字符数据的,而在第一组数据输入时,确认输入时按下了回车键,它也被存到了键盘缓冲区,scanf、getchar 就直接拿到了该字符,这样程序就自己运行完了。

我们来验证一下这个问题,在该行代码“op =getchar();∥scanf("%c",&op);”的下一行先把字符输出来,代码如下“putchar(op);”。左右两种结果是不是多了一空行,如图3-2所示。

图示

图3-2 对比结果

解决这个问题:

图示

【运行结果】如图3-3 和图3-4所示。

图示

图3-3 方法一的运行结果

图示

图3-4 方法二的运行结果

这种实现方式还是有一定的问题,小数点后面的位数太多了,而且很多时候都是0,读者可以思考如何优化这个程序。

2)编程实现输入三角形的3 条边长,判断三边长是否能构成一个三角形,若能构成三角形,则计算出三角形的面积并输出,并且输出它是直角三角形、等腰三角形、等边三角形还是一般三角形。若不能构成三角形,则输出信息“输入的3 条边长不能构成三角形”。

【程序分析】前面有一道练习题,输入三边求出该三角形的面积,当时受知识的限制,可直接利用公式计算,但是发现会出现一些错误的结果,导致这个原因是:我们并不知道输入的这三边能否组成三角形。这道题目也是先解决这个问题,在成立的前提下,就可以根据三角形的类型的特点再分开去判断。

【参考程序】

图示

程序的测试结果如图3-5所示。

图示

图3-5 测试结果

这里有个情况,就是当输入3.33 4.44 5.55 时,出现如图3-6所示的结果。(https://www.daowen.com)

图示

图3-6 错误结果

但是手动计算会发现:3.33*3.33 +4.44*4.44 =30.8025;5.55*5.55 =30.8025;这两个值是相等的,为什么输出的不是直角三角形呢?

这里跟浮点数在系统中的显示有一定的关系,换句话说,程序在运行时很有可能让输入的这3 个数发生了变化,为了验证这一点,我们借助编译环境的调试功能来查看一下。

首先在程序中设置一个断点,然后去运行查看变量窗口,发现确实出现了问题,输入的3个数据都在小数点后面出现了变化,按照程序中的方式去计算,也就不会得到想要的结果,调试过程如图3-7所示。

图示

图3-7 调试结果

这与浮点数的特性有关,所以当借助运算后的结果进行对比时,只能采用在误差允许的范围内进行处理,比如判断a==b,修改为a-b< =1e-5,这就让误差在0.00001 内都认为是相等,但是我们发现a-b 差得很多时,且a 小,也会成立,所以需要对a -b 取绝对值,可以借助fabs()函数-求浮点数的绝对值。上述程序就可以改成如下形式:

图示

图示

为了不麻烦,初学者可以把边长定义成整型,不考虑边长为实数的情况,但这是不科学的。

【运行结果】如图3-8所示。

图示

图3-8 运行结果

3)输入年份和月份,判断输出该年是否是闰年,并根据月份判断输出是什么季节和该月有多少天,平年(Common year)。

闰年(Leap year)的条件是符合下面两条件之一:

①年份能被4 整除,但不能被100 整除。

②年份能被400 整除。

季节规定为:

3—5月为春季(Spring),6—8月为夏季(Summer),9—11月为秋季(Fall),12—2月为冬季(Winter)。

【程序分析】本程序要解决3 个问题,第一个是年份是否为闰年?这个需要把题目中的两个条件转化成程序的表达①year%4 ==0&&year%100! =0,②year%400 ==0,两个条件为或的关系,①是一个复合表达式,里面有逻辑与,跟①和②的逻辑或是属于同一类,根据优先级关系,逻辑与大于逻辑或,所以当组合在一起时①是不需要加括号的。第二个问题是季节,可以看作范围问题,比如if(month> =3&&month< =5),但是这种写法当读者出现误操作输入3.5的时候,也会有结果输出。既然只是需要几个独立的数字做条件,那我们可以借助switch 语句来实现,但是注意break 的使用。第三个问题就是月份的天数,我们读小学时就知道:1,3,5,7,8,10,12月份为31 天,4,6,9,11月份为30 天,2月闰年29 天,平年28 天。

这里还有一些逻辑问题,就是关于遇到2月份时,要考虑是否为闰年,要想办法把两者组合在一起。

【参考程序】

图示

图示

【运行结果】如图3-9所示。

图示

图3-9 运行结果

↑上一章 ↓下一章
关注公众号获取验证码
复制内容需要验证码(7.99元/天)