C++第8周项目2多分段函数求值

简介: 课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759【项目2:分段函数求值】从键盘输入x的值(要求为实型),根据公式1计算并输出x和y的值。 请自行列出需要的测试用输入数据及对应的输出,以便于在运行时进行对照。参考解答://解法1#include<iostream>#include&lt

课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759


【项目2:分段函数求值】从键盘输入x的值(要求为实型),根据公式1计算并输出x和y的值。 

请自行列出需要的测试用输入数据及对应的输出,以便于在运行时进行对照。

参考解答:

//解法1
#include<iostream>
#include<cmath>
using namespace std;
int main( )
{
    double x, y;
    cin>>x;
    if (x<2)
        y=x;
    else if(x<6)  //此处已经自然满足x>=2的条件
        y=x*x+1;
    else if(x<10)
        y=sqrt(x+1);
    else //自然是x>=10的时候执行下一语句
        y=1/(x+1);
    cout<<y<<endl;
    return 0;
}

同学们的解法中,还有:

//解法2
#include<iostream>
#include<cmath>
using namespace std;
int main( )
{
    double x, y;
    cin>>x;
    if (x<2)
        y=x;
    if(x>=2 && x<6)
        y=x*x+1;
    if(x>=6 && x<10)
        y=sqrt(x+1);
    if(x>=10)
        y=1/(x+1);
    cout<<y<<endl;
    return 0;
}

  这个解法不能算错,但是不好,它会让计算机多“做”一些事情。例如,当输入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
#include<iostream>
#include<cmath>
using namespace std;
int main( )
{
    double x, y;
    cin>>x;
    if (x<2)
        y=x;
    if(x>=2 && x<6)
        y=x*x+1;
    if(x>=6 && x<10)
        y=sqrt(x+1);
    else
        y=1/(x+1);
    cout<<y<<endl;
    return 0;
}

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


项目2扩展一(选做):按公式2进行计算,注意此处x<0是非法的输入,程序中应该做出处理。

参考解答见: http://blog.csdn.net/sxhelijian/article/details/8101488(2012级第9周项目1)


==================== 迂者 贺利坚 CSDN博客专栏=================

|==  IT学子成长指导专栏  专栏文章分类目录(不定期更新)    ==|

|== C++ 课堂在线专栏   贺利坚课程教学链接(分课程年级)   ==|

======== 为IT菜鸟起飞铺跑道,和学生一起享受快乐和激情的大学 =======


目录
相关文章
WK
|
10天前
|
机器学习/深度学习 人工智能 算法
那C++适合开发哪些项目
C++ 是一种功能强大、应用广泛的编程语言,适合开发多种类型的项目。它在游戏开发、操作系统、嵌入式系统、科学计算、金融、图形图像处理、数据库管理、网络通信、人工智能、虚拟现实、航空航天等领域都有广泛应用。C++ 以其高性能、内存管理和跨平台兼容性等优势,成为众多开发者的选择。
WK
32 1
|
21天前
|
程序员 C++ 容器
在 C++中,realloc 函数返回 NULL 时,需要手动释放原来的内存吗?
在 C++ 中,当 realloc 函数返回 NULL 时,表示内存重新分配失败,但原内存块仍然有效,因此需要手动释放原来的内存,以避免内存泄漏。
|
28天前
|
Ubuntu Linux 编译器
Linux/Ubuntu下使用VS Code配置C/C++项目环境调用OpenCV
通过以上步骤,您已经成功在Ubuntu系统下的VS Code中配置了C/C++项目环境,并能够调用OpenCV库进行开发。请确保每一步都按照您的系统实际情况进行适当调整。
234 3
|
1月前
|
存储 前端开发 C++
C++ 多线程之带返回值的线程处理函数
这篇文章介绍了在C++中使用`async`函数、`packaged_task`和`promise`三种方法来创建带返回值的线程处理函数。
44 6
|
1月前
|
C++
C++ 多线程之线程管理函数
这篇文章介绍了C++中多线程编程的几个关键函数,包括获取线程ID的`get_id()`,延时函数`sleep_for()`,线程让步函数`yield()`,以及阻塞线程直到指定时间的`sleep_until()`。
21 0
C++ 多线程之线程管理函数
|
1月前
|
编译器 C语言 C++
C++入门3——类与对象2-2(类的6个默认成员函数)
C++入门3——类与对象2-2(类的6个默认成员函数)
23 3
|
1月前
|
编译器 C语言 C++
详解C/C++动态内存函数(malloc、free、calloc、realloc)
详解C/C++动态内存函数(malloc、free、calloc、realloc)
134 1
|
1月前
|
存储 编译器 C++
C++入门3——类与对象2-1(类的6个默认成员函数)
C++入门3——类与对象2-1(类的6个默认成员函数)
26 1
|
1月前
|
编译器 C语言 C++
C++入门6——模板(泛型编程、函数模板、类模板)
C++入门6——模板(泛型编程、函数模板、类模板)
38 0
C++入门6——模板(泛型编程、函数模板、类模板)
|
2月前
|
编译器 C++
【C++核心】函数的应用和提高详解
这篇文章详细讲解了C++函数的定义、调用、值传递、常见样式、声明、分文件编写以及函数提高的内容,包括函数默认参数、占位参数、重载等高级用法。
22 3