C++第3次实验(基础班)—选择结构程序设计(参考答案)-项目4:多分数段函数求值

本文通过示例解析C++中if~else~语句的嵌套使用,探讨了不同解法的效率与正确性问题。重点强调了合理利用else分支以提高程序可读性和效率,并提醒注意条件表达式的正确书写,避免潜在错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

参考解答:

 

 

[cpp] view plain copy print?在CODE上查看代码片派生到我的代码片

  1. //解法1  
  2. #include<iostream>  
  3. #include<cmath>  
  4. using namespace std;  
  5. int main( )  
  6. {  
  7.     double x, y;  
  8.     cin>>x;  
  9.     if (x<2)  
  10.         y=x;  
  11.     else if(x<6)  //此处已经自然满足x>=2的条件  
  12.         y=x*x+1;  
  13.     else if(x<10)  
  14.         y=sqrt(x+1);  
  15.     else //自然是x>=10的时候执行下一语句  
  16.         y=1/(x+1);  
  17.     cout<<y<<endl;  
  18.     return 0;  
  19. }  

 

[cpp] view plain copy print?在CODE上查看代码片派生到我的代码片

  1. //解法2  
  2. #include<iostream>  
  3. #include<cmath>  
  4. using namespace std;  
  5. int main( )  
  6. {  
  7.     double x, y;  
  8.     cin>>x;  
  9.     if (x<2)  
  10.         y=x;  
  11.     if(x>=2 && x<6)  
  12.         y=x*x+1;  
  13.     if(x>=6 && x<10)  
  14.         y=sqrt(x+1);  
  15.     if(x>=10)  
  16.         y=1/(x+1);  
  17.     cout<<y<<endl;  
  18.     return 0;  
  19. }  

 

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

 

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

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

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

 

  • (x>=2 && x<6)的值为真(1):(x>=2)和(x<6)同时为真,故为真;
  • (6>x>=2)的值为假(0):为假为原因是,6>4为真(1),故表达式相当于(1>=2);
  • 事实上,由于(6>x)的取值只能是0或1,无论x取值多少,(6>x>=2)永远为假

 

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


//解法3

[cpp] view plain copy print?在CODE上查看代码片派生到我的代码片

  1. #include<iostream>  
  2. #include<cmath>  
  3. using namespace std;  
  4. int main( )  
  5. {  
  6.     double x, y;  
  7.     cin>>x;  
  8.     if (x<2)  
  9.         y=x;  
  10.     if(x>=2 && x<6)  
  11.         y=x*x+1;  
  12.     if(x>=6 && x<10)  
  13.         y=sqrt(x+1);  
  14.     else  
  15.         y=1/(x+1);  
  16.     cout<<y<<endl;  
  17.     return 0;  
  18. }  

 

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值