C语言程序设计第四次作业-选择结构

(一)改错题

输出三角形的面积和周长,输入三角形的三条边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;        
}

错误信息1:

错误原因:少加了一个右括号
改正方法:在( s - c )后再加一个右括号
错误信息2:

错误原因:if后面的语句和else后面的语句没加大括号
改正方法:把if和else后面的语句分别用大括号括起来
错误信息3:
输出内容错误
错误原因:if里面的判断之间应该用&&连接,||代表或者
改正方法:将||改为&&

(二)学习总结

1.在编程解决问题的过程中,我们会用到多个if语句,if...else if... 语句以及switch语句,查阅资料,总结一下这三种情况的区别何在,并分别举例加以说明。禁止大段复制,要自己对资料进行归纳总结,并给出你参考的资料链接。
2.对其他你认为需要进行总结的内容进行总结。
答:if类型的语句的判断条件可以用来表示一个范围,而switch则是一个具体的数值。出现多个if语句的时候会对每一个条件都进行判断。最后的else会和最近的if配对。而if和else if的语句,一旦满足了其中的一个条件就会终止判断。
判断条件较多时可以使用if else if语句和switch语句,而两者的区别则是switch...case会生成一个跳转表来指示实际的case分支的地址,而这个跳转表的
索引号与switch变量的值是相等的。从而,switch...case不用像if...else if那样遍历条件分支直到命中条件,而只需访问对应 索引号的表项从而到达定位分支的目的。
所以从效率上来说由于if...else if的遍历性,代码执行效率是不高的。
举例:例如选择结构二的第三道编程题,计算天数,需要进行多次判断。而因为知道具体的月份,所以用switch会更加简单。

而在选择结构一的第九题计算阶梯电价中,因为用户的用电量是随机的,所以用能够表示范围的if语句会更好一点

资料链接一  资料链接二
(三)实验总结
1.比较大小
(1)题目
本题要求将输入的任意3个整数从小到大输出。
(2)流程图

(3)源代码

#include<stdio.h>
int main()
{
int a,b,c,x,y,z;
scanf("%d%d%d",&a,&b,&c);
if(a>b && a>c)
{
	x = a;
	if(b>c)
	{
		y = b,z = c;
	}
	else
	{
		y = c;
		z = b;
	}
}
else if(b>a && b>c)
{
	x = b;
	if(a>c)
	{
		y = a;
		z = c;
	}
	else
	{
		y = c;
		z = a;
	}
}
else
{
	x = c;
	if(a>b)
	{
		y = a;
		z = b;
	}
	else
	{
		y = b;
		z = a;
	}
}
printf("%d->%d->%d",z,y,x);
return 0;


}

(4)实验分析
问题一:if语句错误
原因:&应该是两个而不是一个
解决办法:再加上一个&
问题二:答案输出错误
原因:有一个if后面的语句没加括号
解决办法:将在if后面的语句括起来
(5)本题PTA提交列表

  1. 高速公路超速处罚
    (1)题目
    按照规定,在高速公路上行使的机动车,超出本车道限速的10%则处200元罚款;若超出50%,就要吊销驾驶证。请编写程序根据车速和限速自动判别对该机动车的处理。
    (2)流程图

    (3)源代码

     #include<stdio.h>
     int main()
     {
     int a,b;
     double c;
     scanf("%d%d",&a,&b);
     c = (a-b)*1.0/b;
     if(c<0.1)
     printf("OK");
     else if(c>=0.1 && c<0.5)
     printf("Exceed %0.0f%%. Ticket 200",c*100);
     else
     printf("Exceed %0.0f%%. License Revoked",c*100);
     return 0;
     }
    

(4)实验分析
问题一:不能正确输出百分数
原因:%lf后面应该加上两个百分号
解决办法:在%lf后面加两个百分号
(5)本题PTA提交列表

3.计算油费
(1)题目
现在90号汽油6.95元/升、93号汽油7.44元/升、97号汽油7.93元/升。为吸引顾客,某自动加油站推出了“自助服务”和“协助服务”两个服务等级,分别可得到5%和3%的折扣。
(2)流程图

(3)源代码

    #include<stdio.h>
    int main()
    {
int p;
double l,y;
char f;
scanf("%lf%d %c",&l,&p,&f);
switch(p)
{
		case 90:
	if(f == 'm')
	{
		y = l*6.95*0.95;
	}
	else
	{
		y = l*6.95*0.97;
	}

		break;
case 93:
	if(f == 'm')
	{
		y = l*7.44*0.95;
	}
	else
	{
		y = l*7.44*0.97;
	}
	break;
case 97:
	if(f == 'm')
	{
		y = l*7.93*0.95;
	}
	else
	{
		y =l*7.93*0.97;
	}
}
printf("%0.2f",y);
return 0;
    }

(4)实验分析
switch和if后面的语句要记得用括号括起来,并且后面不能加分号。其他语句后面都要分号。表示等于是两个等号,一个代表赋值
(5)本题PTA提交列表

4.12-24小时制
(1)题目
编写一个程序,要求用户输入24小时制的时间,然后显示12小时制的时间。
(2)流程图

(3)源代码

    #include<stdio.h>
    int main()
    {
    int h,m,h1,m1;
    scanf("%d:%d",&h,&m);
    if(h<12)
    {
    	h1 = h;
    	m1 = m;
	printf("%d:%d AM",h1,m1);
	}
  	    else if(h == 12)
    {
    	h1 = h = 12;
	m1 = m;
	printf("%d:%d PM",h1,m1);
}
else if(h>12 && h <24)
{
	h1 = h-12;
	m1 = m;
	printf("%d:%d PM",h1,m1);
}
else
{
	h1 = 0;
	m1 = m;
	printf("%d:%d AM",h1,m1);
}

return 0;

}

(4)实验分析
要注意各个时间点的区分,if,else if后面的语句要用括号括起来,判断条件后面不加分号。输出要符合题目格式要求。注意区分中英文符号
5)本题PTA提交列表

(四)博客互评
刘长森
李仁正
潘久朋

posted @ 2017-11-04 18:26  WH吴晗  阅读(2652)  评论(4编辑  收藏  举报