C语言程序设计第四次作业——选择结构(2)
(一)改错题
输出三角形的面积和周长,输入三角形的三条边a、b、c,如果能构成一个三角形,输出面积area和周长perimeter(保留2位小数);否则,输出“These sides do not correspond to a valid triangle”。
输入输出样例1:
Enter 3 sides of the triangle: 5 5 3
area = 7.15; perimeter = 13.00
输入输出样例2:
Enter 3 sides of the triangle: 1 4 1
These sides do not correspond to a valid triangle
源程序(有错误的程序)
#include <stdio.h>
#include <math.h>
int main(void)
{
double a,b,c;
double area,perimeter,s;
printf("Enter 3 sides of the triangle: ");
scanf( "%lf%lf%lf",&a,&b,&c );
if( a + b > c || b + c > a || a + c > b)
s = ( a + b + c ) / 2;
area = sqrt( s * ( s - a ) * ( s - b ) * ( s - c );
perimeter = a + b + c;
printf("area = %.2f; perimeter = %.2f\n",area,perimeter);
else
printf("These sides do not correspond to a valid triangle\n");
return 0;
}
对源程序进行编译,采用每次修改第一个错误并重新编译的方法,记录每个错误的错误信息、分析错误原因并给出正确的语句。
错误信息:
错误原因:area = sqrt( s * ( s - a ) * ( s - b ) * ( s - c ); 最后面丢掉了半个括号
改正方法:area = sqrt( s * ( s - a ) * ( s - b ) * ( s - c ));
错误信息:
错误原因:if与else中的语句没有加括号
改正方法:在每一个条件前后加括号
if( a + b > c && b + c > a && a + c > b)
{
s = ( a + b + c ) / 2;
area = sqrt( s * ( s - a ) * ( s - b ) * ( s - c ));
perimeter = a + b + c;
printf("area = %.2f; perimeter = %.2f\n",area,perimeter);
}
else
{
printf("These sides do not correspond to a valid triangle\n");
}
错误信息:
错误原因:三角形判定两边之和大于第三边判定关系有误
改正方法:三角形两边之和大于第三边应该是并且的关系用&&连接而不是||, if( a + b > c && b + c > a && a + c > b)
以下是我改正后的程序:
#include <stdio.h>
#include <math.h>
int main(void)
{
double a,b,c;
double area,perimeter,s;
printf("Enter 3 sides of the triangle: ");
scanf( "%lf%lf%lf",&a,&b,&c );
if( a + b > c && b + c > a && a + c > b)
{
s = ( a + b + c ) / 2;
area = sqrt( s * ( s - a ) * ( s - b ) * ( s - c ));
perimeter = a + b + c;
printf("area = %.2f; perimeter = %.2f\n",area,perimeter);
}
else
{
printf("These sides do not correspond to a valid triangle\n");
}
return 0;
}
(二)学习总结
1.在编程解决问题的过程中,我们会用到多个if语句,if...else if... 语句以及switch语句,查阅资料,总结一下这三种情况的区别何在,并分别举例加以说明。禁止大段复制,要自己对资料进行归纳总结,并给出你参考的资料链接。
答:1.if与if else
①if是条件判断语句,只有if的条件成立(表达式的值为真)后,才会执行if部分的代码,否则将会执行else的代码。
如果是if...else if,则满足第一个if执行第一个if里的代码,如果不满足第一个if,而满足第二个if,则执行第二个if(即else if)的代码,如果都不满足,就不执行,如果后面有else(不带if的else),则只要前面的if和else if都没执行,就执行最后一个else。
②if,else if都需要接判断表达式。else不需要判断表达式。
使用else if和else,必须紧跟在if之后,形参if-esle if组或if-else对。 没有对应的if语句,else if和else语句都会在编译时报错。
if(condition1) /*如果满足条件1*/
{
}
else if(condition2)/*否则,如果满足条件2*/
{
}
else/*否则*/
{
}
2.if与switch
if语句每执行一次都要先判断条件表达式是true还是false,为true时执行相应语句,若为false则继续判断下一个表达式,直到最后一个else结束。线性执行。
switch语句只需在入口时计算表达式的值,然后查找跳转表,执行对应语句,否则default。
区别一:
switch…case…只能用于case值为常量的分支结构,而if…else…更加灵活。
区别二:
if判断条件为逻辑表达式,可以是布尔类型的合法表达式、可以是常量、枚举等。而switch 通常处理算术表达式,或字符。。
区别三:
switch 进行一次条件判断后直接执行到程序的条件语句。而if…else 有几种条件,就得判断多少次。
区别四:
相比if语句,switch语句是以空间换时间的分支结构。因为它要生成跳转表,所以占用较多的代码空间。当case常量分布范围很大但实际有效值又比较少的情况, switch…case的空间利用率将变得很低。
区别五:
分支较多时,使用switch的效率高于if,除非第一个if条件就为真。。
其次,当分支较多时,使用if…else…代码可读性不如switch…case…高。
if…else…
if (表达式1)
{
语句1;
}
else if (表达式2)
{
语句2;
}
else if (表达式3)
{
语句3;
}
else if (表达式4)
{
语句4;
}
...
else
{
语句n+1;
}
switch…case…
switch (表达式)
{
case 值1:语句1;break;
case 值2:语句2;break;
case 值3:语句3;break;
case 值4:语句4;break;
case 值5:语句5;break;
...
default:语句n+1;break;
}
参考链接:http://bbs.itheima.com/thread-3126-1-1.html
2.对其他你认为需要进行总结的内容进行总结。
答:在switch中,有些情况不需要每个case后边都加break,比如计算一年至今有多少天。 有一些截图在此无法上传成功,仍是一串字符,目前还无法解决,只能寻找替代品。
(三)实验总结
本次实验总结,学号末位数是单数的同学完成选择结构(2)中的1、5、7、9题,学号末位数是双数的同学完成选择结构(2)中的2、4、6、8题。
- 比较大小
(1)题目
本题要求将输入的任意3个整数从小到大输出。
(2)流程图
(3)源代码
#include<stdio.h>
int main()
{
int a,b,c,n,max,min;
scanf("%d %d %d",&a,&b,&c);
if(a>=b&&b>=c)
{
max = a;
n = b;
min = c;
}
else if(a>b&&b<c&&a>c)
{
max = a;
n = c;
min = b;
}
else if(b>a&&a>c)
{
max = b;
n = a;
min = c;
}
else if(b>a&&c>a&&b>c)
{
max = b;
n = c;
min = a;
}
else if(a>b&&b<c&&a<c)
{
max = c;
n = a;
min = b;
}
else if(b>a&&c>a&&b<c)
{
max = c;
n = b;
min = a;
}
else if(c>a&&a>b)
{
max = c;
n = a;
min = b;
}
else if(c>a&&a<b&&c>b)
{
max = c;
n = b;
min = a;
}
else if(c>a&&a<b&&c<b)
{
max = b;
n = c;
min = a;
}
printf("%d->%d->%d",min,n,max);
return 0;
}
(4)实验分析
问题1:此实验一开始输入格式没有读懂。
原因:来才发现格式单纯的只是“->”
解决办法:只需按题目输出即可。
问题2:编程忘记了a=b=c的情况。
解决办法:在if中加入a=b=c条件即可。
问题:在流程图里边我无法在输出用数字以及->输出。
解决办法:只能用字母加->表示。
(5)本题PTA提交列表
4.高速公路超速处罚
(1)题目
按照规定,在高速公路上行使的机动车,超出本车道限速的10%则处200元罚款;若超出50%,就要吊销驾驶证。请编写程序根据车速和限速自动判别对该机动车的处理。
(2)流程图
(3)源代码
# include <stdio.h>
int main(void)
{
int a,b;
double c;
scanf("%d %d",&a,&b);
if(b*110<=100*a&&a*100<b*150)
{
c=(a-b)*100.0/b;
printf("Exceed %.f%%. Ticket 200",c);
}
else if(b*150<=a*100)
{
c=(a-b)*100.0/b;
printf("Exceed %.f%%. License Revoked",c);
}
else
{
printf("OK");
}
return 0;
}
(4)实验分析
问题1:当b=150时,输出的是Exceed %.f%%. Ticket 200",c,
原因:b的范围没有弄清楚。
解决办法:b=150应该放在下边那个判断条件里。
(5)本题PTA提交列表
6.计算油费
(1)题目
现在90号汽油6.95元/升、93号汽油7.44元/升、97号汽油7.93元/升。为吸引顾客,某自动加油站推出了“自助服务”和“协助服务”两个服务等级,分别可得到5%和3%的折扣。
本题要求编写程序,根据输入顾客的加油量a,汽油品种b(90、93或97)和服务类型c(m - 自助,e - 协助),计算并输出应付款。
(2)流程图
(3)源代码
# include <stdio.h>
int main(void)
{
int a,b;
char op;
double money;
scanf("%d %d %c",&a,&b,&op);
switch(b)
{
case 90:
money=6.95*a;
break;
case 93:
money=7.44*a;
break;
case 97:
money=7.93*a;
break;
}
if(op=='m')
{
money=money*0.95;
}
else
{
money=money*0.97;
}
printf("%.2f",money);
return 0;
}
(3)实验分析
问题1:
原因:在一开始编程序的时候忘记了字符变量是什么。
解决方法:现在知道了字符型变量if里边应该用单引号,应该切忌;
问题2:在流程图里边服务类型的选择我有一些搞不懂。
原因:服务类型如果用选择的话,选择条件不知道如何写。
解决方法:把选择去掉,直接对服务类型赋值。
(5)本题PTA提交列表
8.12-24小时制
(1)题目
编写一个程序,要求用户输入24小时制的时间,然后显示12小时制的时间。
(2)流程图
(3)源代码
# include <stdio.h>
int main(void)
{
int a,b;
scanf("%d:%d",&a,&b);
if(a>12)
{
if(a==24)
{
printf("0:%d AM",b);
}
else
{
a=a-12;
printf("%d:%d PM",a,b);
}
}
else
{
if(a==12)
{
printf("%d:%d PM",a,b);
}
else
printf("%d:%d AM",a,b);
}
return 0;
}
(4)实验分析
问题1:流程图里边输出是还是无法表示数字,比如我令m=分钟,输出的时候还是m这个字母。
原因:可能这个软件就无法输出数字。
解决方法:就只能看左边的红色的字符表示。
(5)本题PTA提交列表
(四)博客互评
每个同学至少评论三篇其他同学的博客作业,依次列出你所评论的博客地址。对于同学对你的博客作业提出的问题,应积极进行回答,存在的错误应及时改正。希望大家能够在互评的过程中取长补短,共同进步。
http://www.cnblogs.com/yiqiekaoziji/p/7772484.html 我们不一样(徐振刚)
http://www.cnblogs.com/zhaochenyu/p/7769166.html 永恒破碎(赵晨宇)
http://www.cnblogs.com/yjy751522356/p/7773477.htm l 幕曦