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. 比较大小

(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 幕曦

posted on 2017-11-01 13:15  怪人、  阅读(842)  评论(12编辑  收藏  举报

导航