天天看点

2014秋C++第8周项目3参考-多分段函数求值

<a target="_blank" href="http://blog.csdn.net/sxhelijian/article/details/40155025"></a>

从键盘输入x的值(要求为实型),根据下面的公式计算并输出y的值。 

2014秋C++第8周项目3参考-多分段函数求值

(1)请用if~else~语句的嵌套,实现这个多分支的程序;

参考解答:

  这个解法不能算错,但是不好,它会让计算机多“做”一些事情。例如,当输入x的值为1时,解法1只需要进行一次判断,直接求值即可,而当输入x的值为8时,解法1也只需要进行3次判断。但对于解法2,无论输入是多少,4次判断都少不了。

  这是涉及“效率”的问题,可能在此处无关大碍,但专业人员对程序评价是,正确是底线,接下来就要关注效率。

  充分用好else分支,显然程序更易懂一些,要习惯于用这种写法。

  再一个需要强调并于条件的写法。以(x&gt;=2 &amp;&amp; x&lt;6)为例,有人会写成(2=&lt;x&lt;6),这时,编译器会提示错误,由此改正尚不至于造成严重后果。而将同样的条件,有人写成(6&gt;x&gt;=2)时,不会有编译错误,但更大的风险却隐藏其中。例如x=4时,

(x&gt;=2 &amp;&amp; x&lt;6)的值为真(1):(x&gt;=2)和(x&lt;6)同时为真,故为真;

(6&gt;x&gt;=2)的值为假(0):为假为原因是,6&gt;4为真(1),故表达式相当于(1&gt;=2);

事实上,由于(6&gt;x)的取值只能是0或1,无论x取值多少,(6&gt;x&gt;=2)永远为假。

  将表示判断的表达式写好,事关正确性与效率。

//解法3

  这个写法中,终于在第15行用了一个else。看似用上了双分支是好事,这个程序却是完全错误的。输入0或4运行一下,就会发现错误了。而分析程序,确实只要(x&gt;=6 &amp;&amp; x&lt;10)为假,即使x&lt;6已经在前面给y赋过值,else分支仍然要执行,y将被重新赋值,由此产生错误!

(2)请用switch语句构造多分支结构,完成求解。

解法1:各分段的标准都为2的倍数,所以,构造表达式 t= x/2,根据t的取值决定switch分支;

解法2:构造表达式 t=(x&lt;2) + (x&lt;6) + (x&lt;10)。由于关系表达式(x&lt;a)的值为0或1(真为1,假为0),所以t能表示x究竟满足了几个条件。t值为3时,相加的三个关系表达式全为真,对应x&lt;2;而t值为0时,相加的三个关系表达式全为假,对应x≥10,其他类似。根据t的取值,可以决定switch分支。

继续阅读