《C语言及程序设计》实践参考——分段函数求值

简介: 返回:贺老师课程教学链接  项目要求【项目1:分段函数求值】从键盘输入x的值(要求为实型),根据公式1计算并输出x和y的值。 [参考解答]解法1  #include <stdio.h>#include <math.h>int main ( ){ double x, y; scanf("%lf", &x); if (x<

返回:贺老师课程教学链接  项目要求


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

[参考解答]

解法1  

#include <stdio.h>
#include <math.h>
int main ( )
{
    double x, y;
    scanf("%lf", &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);
    printf("%lf\n", y);
    return 0;
}

同学们的解法中,还有:
解法2  
#include <stdio.h>
#include <math.h>
int main ( )
{
    double x, y;
    scanf("%lf", &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);
    printf("%lf\n", y);
    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 <stdio.h>
#include <math.h>
int main ( )
{
    double x, y;
    scanf("%lf", &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);
    printf("%lf\n", y);
    return 0;
}

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


目录
相关文章
|
8天前
|
程序员 C语言
C语言库函数 — 内存函数(含模拟实现内存函数)
C语言库函数 — 内存函数(含模拟实现内存函数)
16 0
|
19天前
|
编译器 C语言 C++
【C语言】memset()函数(内存块初始化函数)
【C语言】memset()函数(内存块初始化函数)
23 0
|
19天前
|
编译器 C语言 C++
【C语言】memcpy()函数(内存块拷贝函数)
【C语言】memcpy()函数(内存块拷贝函数)
38 0
|
20天前
|
C语言 C++
【C语言】rand()函数(如何生成指定范围随机数)
【C语言】rand()函数(如何生成指定范围随机数)
15 0
|
28天前
|
C语言
在C语言中数组作为函数参数的应用与示例
在C语言中数组作为函数参数的应用与示例
14 0
|
28天前
|
算法 C语言
在C语言中函数的递归调用及应用示例
在C语言中函数的递归调用及应用示例
15 1
|
28天前
|
C语言
在C语言中多维数组名作为函数参数的应用与示例
在C语言中多维数组名作为函数参数的应用与示例
12 0
|
8天前
|
程序员 C语言 开发者
C语言库函数 — 字符串函数(含模拟实现字符串函数)
C语言库函数 — 字符串函数(含模拟实现字符串函数)
33 0
|
15天前
|
存储 C语言
【我爱C语言】详解字符函数isdigit和字符串转换函数(atoi和snprintf实现互相转换字符串)&&三种strlen模拟实现1
【我爱C语言】详解字符函数isdigit和字符串转换函数(atoi和snprintf实现互相转换字符串)&&三种strlen模拟实现
|
15天前
|
机器学习/深度学习 C语言
【C语言】函数的系统化精讲(三)1
【C语言】函数的系统化精讲(三)