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;        
    }

 错误信息1:
 错误原因:第13行最后少了个括半个号。数学函数sqrt要用括号括起整个变量来,缺少了后半个括号。
 改正方法:在分号前加上括号。
 错误信息2:
 错误原因:if和else都没有加大括号,else找不到与之对应的if。
 改正方法:在if和else后加大括号。
 错误信息3:编译无误后,运行发现第一组数据无误,第二组数据错误。


 错误原因:if的条件语句中,应用“&&”连接。
 改正方法:将“||”改为“&&”。
改正后,编译运行,无误:


改正后,正确的源程序为:

#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(x>y)
printf("%d",x);

(2)if(表达式)语句1 else 语句2
例如:

if(x>y)printf("%d",x);
else printf("%d",y);

在每个语句中,可以有多个语句,但需要加上大括号
例:

if(x>y)
{
    printf("%d",x);break;
}

(3)switch语句
例如:

switch(n)
{
    case 10:
    case 9:printf("A\n");
           break;
    case 8:printf("B\n");
    	   break;
    case 7:printf("C\n");
    	   break;
    case 6:printf("D\n");
           break;
    default:printf("E\n");
}

答:在只需要判断一个条件的时候,自然是使用if语句方便有效;但是当判断条件很多的时候,我们可以使用多个if语句或者if...else if语句或者switch case语句。
if-else语句更适合于对区间(范围)的判断,而switch语句更适合于对离散值的判断。
当条件的分支很多时(通常超过六个)使用switch...case的效率将高于多重if_else语句(在汇编层switch...case是查找表,if语句是跳转:)  。
链接:https://baike.baidu.com/item/if语句/10252180?fr=aladdin#2_1
https://baike.baidu.com/item/switch循环/5413605?fr=aladdin
2.对其他你认为需要进行总结的内容进行总结。
(1)case后面一定要是常量(就是一个不可变的量)! 
(2)如果case后没有break,则程序会一直运行下去,直到deault语句。
(3)if......else语句中else后不能加表达式。
(三)实验总结
1.比较大小deault
(1)题目
本题要求将输入的任意3个整数从小到大输出。
(2)流程图

(3)源代码

#include <stdio.h>
int main (void)
{
    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)实验分析
问题:a与b的值无法调换。
原因:无一个中间值来调换a与b的值。
解决办法:用一个中间值t来调换a和b的值,将a的值赋给t,再将b的值赋给a,最后将t的值赋给b。
(5)本题PTA提交列表如图:

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

(3)源代码

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

(4)实验分析
问题:无法输出“%”。
原因:“%f”只能表示一个数字,若要表示一个百分数,则需在后面加上“%%”。
解决办法:在输出语句中“%.0f”后加“%%”。
(5)本题PTA提交列表如图:
3.计算油费
(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;
    double y;
    char c;
    scanf("%d %d %c",&a,&b,&c);
    if(b==90)
    {
	    if(c=='m')
	    {
		    y=a*6.95*(1-0.05);
	    }
	    else if(c=='e')
	    {
		    y=a*6.95*(1-0.03);
	    }
    }
        else if(b==93)
    {
	    if(c=='m')
	    {
		    y=a*7.44*(1-0.05);
	    }
	    else if(c=='e')
	    {
		    y=a*7.44*(1-0.03);
	    }
    }
    else if(b==97)
    {
	    if(c=='m')
	    {
		    y=a*7.93*(1-0.05);
	    }
	    else if(c=='e')
	    {
		    y=a*7.93*(1-0.03);
	    }
    }
    printf("%.2f",y);
    
    return 0;
}

(4)实验分析
问题:编译时字符方面出现问题。
原因:字符没用单引号引起来。
解决办法:将字符用单引号引起来。
(5)本题PTA提交列表如图:
4.12-24小时制
(1)题目
编写一个程序,要求用户输入24小时制的时间,然后显示12小时制的时间。
(2)流程图

(3)源代码

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

(4)实验分析
问题:运行结果出现了12:00 AM。
原因:h的范围不明确,忘记加上最后一个else语句。
解决办法:不表示h=12,在最后加上一个else语句,将h=12包含在里面。
(5)本题PTA提交列表如图:
(四)博客互评
(1)http://www.cnblogs.com/wangqi1998/p/7777066.html
(2)http://www.cnblogs.com/windsky-1999/p/7765579.html
(3)http://www.cnblogs.com/english123-/p/7774238.html

posted @ 2017-11-05 01:53  楠有乔木  阅读(518)  评论(0编辑  收藏  举报