C++第8周项目2多分段函数求值
2013-10-21 06:29
357 查看
课程首页在:/article/1353314.html
【项目2:分段函数求值】从键盘输入x的值(要求为实型),根据公式1计算并输出x和y的值。
请自行列出需要的测试用输入数据及对应的输出,以便于在运行时进行对照。
参考解答:
同学们的解法中,还有:
这个解法不能算错,但是不好,它会让计算机多“做”一些事情。例如,当输入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)永远为假。
将表示判断的表达式写好,事关正确性与效率。
有同学写出了下面的解法:
这个写法中,终于在第15行用了一个else。看似用上了双分支是好事,这个程序却是完全错误的。输入0或4运行一下,就会发现错误了。而分析程序,确实只要(x>=6 && x<10)为假,即使x<6已经在前面给y赋过值,else分支仍然要执行,y将被重新赋值,由此产生错误!
项目2扩展一(选做):按公式2进行计算,注意此处x<0是非法的输入,程序中应该做出处理。
参考解答见:/article/1353493.html(2012级第9周项目1)
==================== 迂者 贺利坚 CSDN博客专栏=================|== IT学子成长指导专栏 专栏文章分类目录(不定期更新) ==||== C++ 课堂在线专栏 贺利坚课程教学链接(分课程年级) ==|======== 为IT菜鸟起飞铺跑道,和学生一起享受快乐和激情的大学 =======
【项目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。看似用上了双分支是好事,这个程序却是完全错误的。输入0或4运行一下,就会发现错误了。而分析程序,确实只要(x>=6 && x<10)为假,即使x<6已经在前面给y赋过值,else分支仍然要执行,y将被重新赋值,由此产生错误!
项目2扩展一(选做):按公式2进行计算,注意此处x<0是非法的输入,程序中应该做出处理。
参考解答见:/article/1353493.html(2012级第9周项目1)
==================== 迂者 贺利坚 CSDN博客专栏=================|== IT学子成长指导专栏 专栏文章分类目录(不定期更新) ==||== C++ 课堂在线专栏 贺利坚课程教学链接(分课程年级) ==|======== 为IT菜鸟起飞铺跑道,和学生一起享受快乐和激情的大学 =======
相关文章推荐
- C++第8周项目2-5参考解答
- C++第8周项目4要不要加油
- C++第8周(春)项目3 分数类中的运算符重载
- C++第8周项目2-5参考解答
- 第8周-项目0-简单C++学生信息管理系统
- C++第8周(春)项目4 扩充String类
- 2013C++-第8周项目——用if语句实现分支结构程序设计
- C++第8周项目2-5参考解答
- C++第8周项目1 - 实现复数类中的运算符重载
- C++第8周项目 数组和指针 【项目1 - 数组作数据成员】(复习新版)
- C++第8周项目2 -Time类中的运算符重载
- 2013级C++第8周(春)项目——运算符重载 【项目1】实现复数类中的运算符重载
- 第8周项目3-多分段函数求值
- C++第8周(春)项目1 实现复数类中的运算符重载 .(一)
- C++第8周项目3 - 分数类中的运算符重载
- 2014秋C++第8周项目1参考-分段函数求值
- C++实验2:项目二:分段函数求值
- C++第8周项目 数组和指针 【项目2-用对象数组操作长方柱类】(复习新版)
- 2014秋C++ 第8周项目 分支程序设计
- 2014秋C++第8周项目2参考-加班费