C语言程序设计第四次作业——选择结构(2)
(一)改错题
(1)输出三角形的面积和周长,输入三角形的三条边a、b、c,如果能构成一个三角形,输出面积area和周长perimeter(保留2位小数);否则,输出“These sides do not correspond to a valid triangle”。
- 源程序:
- 错误信息1:
- 错误原因:在对area的计算中最后丢了与第一个括号并列的另一个括号。
- 改正方法:在分号之前加入一个")".
- 错误信息2:
- 错误原因:if的执行语句超过一条时,必须要加上{}。
- 改正方法:在if的执行语句前后加入{}。
- 错误信息3:在进行运行时,输入任意不能组成三角形的三条边的值,发现出现如下结果;
- 错误原因:经研究发现,if语句的附加内容中未将条件关系设置为“且”,即为程序语言中的"&&",而是使用了“或”关系,使得程序无法输出不为三角形的情况。
(二)学习总结
1.在编程解决问题的过程中,我们会用到多个if语句,if...else if... 语句以及switch语句,查阅资料,总结一下这三种情况的区别何在,并分别举例加以说明。
- 经查阅资料和自己总结,我认为这三种语句的区别有以下几点。
- 1.当只需要判断一个条件时,用if语句更加简便。
- 2.但在条件非常多时,if... else if的编程效率更高一些,因为if...else if在任何一个环节满足条件的时候就将会终止判断,只处理一个满足条件的情况;而对于多个if语句,
将会对每一个判断条件进行判断,自然而然会导致程序的执行效率降低.
- 3.对于switch...case语句,也可以用于复杂条件的编写,但在效率方面要高于if...else if语句,因为if...else if语句在你输入值时,会遍历所有条件,而switch...case语句会自动检索到所符合的条件,然后自动结束相比来说用switch...更便捷。
- 引用的资料:[博客园](http://www.cnblogs.com/bluesky365/p/5631517.html)
- 三种情况的格式样例。
- 1.if
if(比较表达式1) {
语句体1;
}
else {
语句体n+1;
}
if(比较表达式1) {
语句体1;
}else if(比较表达式2) {
语句体2;
}else if(比较表达式3) {
语句体3;
}
...
else {
语句体n+1;
}
switch(表达式) {
case 值1:
语句体1;
break;
case 值2:
语句体2;
break;
...
default:
语句体n+1;
break;
}
2.对其他你认为需要进行总结的内容进行总结。
- 1.在这一阶段的学习中,我们学习了if...else if;swtich...case语句,并进行了多种编程的尝试,得出了许多有意义的结果,如在进行大小比较的问题研究中,引入了中间变量t,使得程序变得更加简洁明了。
- 2.强制double:在有些变量最初未设置整形实型时,可在语句前加(double)进行强制定义,这样可以保持编程的流畅度,并且输出正确结果。
- 3.if后括号内语句的相关问题:在赋值时用一个等号,在判断是否为此值时,应用两个等号,否则程序会认为是赋值。
- 4.关于数学函数:这一阶段主要学习了绝对值函数(fabs(x));平方根函数(sqrt(x));幂函数(pow(x,n);指数函数(exp(x))。
- 5.运算符的优先级:!>算术运算符>关系运算符>&&和||>赋值运算符。
(三)实验总结
1.题目:本题要求将输入的任意3个整数从小到大输出。
2.流程图
3.源程序
#include <stdio.h>
int main()
{
int a,b,c,t;
scanf("%d %d %d",&a,&b,&c);
if(a>b)
{t = a;
a = b;
b = t;
}
if(a>c)
{t = a;
a = c;
c = t;
}
if(b>c)
{t = b;
b = c;
c = t;
}
printf("%d->%d->%d",a,b,c);
return 0;
}
4.实验分析
- 错误信息:第一次做时未使用“t”这一中间值,导致变成无法编程。
- 错误原因:自己知识储备不足,没有深刻理解到中间量这一非常实用的量。
- 改正方法:在if语句中输入中间量“t”这一中间量,将三个部分中的最小值输出,最终得出正确结果
提交列表:
1.按照规定,在高速公路上行使的机动车,超出本车道限速的10%则处200元罚款;若超出50%,就要吊销驾驶证。请编写程序根据车速和限速自动判别对该机动车的处理。
2.流程图
3.源程序
#include <stdio.h>
int main()
{
int a,b;
double x;
scanf("%d %d",&a,&b);
x=(double)(a-b)/b*100.00;
if(x >= 10 && x < 50)
{
printf("Exceed %.0f%%. Ticket 200",x);
}
if(x >= 50)
{
printf("Exceed %.0f%%. License Revoked",x);
}
if(x < 10)
{
printf("OK");
}
return 0;
}
4.实验分析
- 错误信息:在输入999999,333两数时出现以下结果
- 错误原因:if语句后的限制条件中,使用的是“||”,而不是“&&”,前者表示或,而后者表示的是且的关系,按题意的说法应是用且的关系。
- 改正方法:将if后的的语句中的||改为&&,再次输入以上信息,得到以下结果
- 结果正确。
提交列表:
1.题目:现在90号汽油6.95元/升、93号汽油7.44元/升、97号汽油7.93元/升。为吸引顾客,某自动加油站推出了“自助服务”和“协助服务”两个服务等级,分别可得到5%和3%的折扣。
2 流程图。
3 源程序。
/#include <stdio.h>
int main()
{
int a,b;
scanf("%d:%d",&a,&b);
if(a>=12)
{
if(a==12)
{
printf("%d:%d PM",a,b);
}
else
{
a=a-12;
printf("%d:%d PM",a,b);
}
}
else
{
printf("%d:%d AM",a,b);
}
return 0;
}
4.实验分析。
- 错误信息1:输入预设数字,结果如下。
- 错误原因:经检查,发现括号内内容并不是判断,而是直接赋值,这样的话限制条件就发生了变化,并不能得出正确结果
- 改正方法:将原括号内的“=”语句换为“==”,这样就表示判断而不是赋值。
- 改正后输出:
- 符合期望。
提交列表:
1.题目:编写一个程序,要求用户输入24小时制的时间,然后显示12小时制的时间。
2.流程图
3源程序
#include <stdio.h>
int main()
{
int a,b;
scanf("%d:%d",&a,&b);
if(a>=12)
{
if(a==12)
{
printf("%d:%d PM",a,b);
}
else
{
a=a-12;
printf("%d:%d PM",a,b);
}
}
else
{
printf("%d:%d AM",a,b);
}
return 0;
}
```
### 4.实验分析
* 错误信息1:在输入十二点时未能输出正确结果。
* 错误原因:忽略了十二点的存在,将其并入了上午时间。
* 改正方法:在程序中附加一条判断中午十二点的语句。
#### 提交列表:![](http://images2017.cnblogs.com/blog/1242130/201711/1242130-20171103152724154-507665086.png)
## (四)博客互评。
* 1.许天笑:整体内容良好,总结的比较到位;只是在实验分析中建议插入一些运行后的输出结果之类的,现在这样略显简略。希望能共同进步。
* 地址:(http://www.cnblogs.com/snxtx/p/7763856.html)
* 2.姚庆虎:总结的很是详尽,只是在源程序处是不是出了点问题?include字体似乎有点过大,建议使用前面后边加入“```”的方法来输入程序。希望共同进步。
* 地址:(http://www.cnblogs.com/yaole10086/p/7778593.html)
* 3.王映丹:内容简洁,只是实验分析有些简单,希望你能更详尽的描述出现的错误及解决办法,这样能帮助你更好的了解这道题的来龙去脉。希望共同进步。
* 地址:(http://www.cnblogs.com/windsky-1999/p/7765579.html)