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:

错误原因:
area=语句最后缺一个括号。
改正方法:
在area=语句最后加上括号。
错误信息2:

错误原因:
没有else与if相对。
改正方法:
在if语句和else语句后加上大括号。
程序修改完成

运行结果:

发现得不到想要的结果,继续修改。
错误信息3:

错误原因:
源代码把a,b,c定义为double类型的了。
改正方法:
把a,b,c定义为int类型的,并且把scanf里的%lf改为%d。
运行结果:


发现在不满足是一个三角形的时候,输出结果不对,继续修改。
错误信息4:

错误原因:
if语句后的a+b>c,a+c>b,b+c>a,是用||连接的。
改正方法:
将||改为&&。
运行结果:


最后运行结果正确。
(二)学习总结
1.在编程解决问题的过程中,我们会用到多个if语句,if...else if... 语句以及switch语句,查阅资料,总结一下这三种情况的区别何在,并分别举例加以说明。禁止大段复制,要自己对资料进行归纳总结,并给出你参考的资料链接。
在只判断一个条件的时候,用if case语句很方便,但当判断多个条件是用if...else if...语句和switch语句比较方便。if...else if在任何一个环节满足条件的时候就将会终止判断,只处理一个满足条件的情况;而对于多个if语句,将会对每一个判断条件进行判断,显得比较繁琐。一般情况下,当判断条件较多的情况下,使用switch case语句的效率会高于使用if...else if语句。
举例:
1:在只判断一个条件时,用if case语句很方便,例子:

#include<stdio.h>
#include<math.h>
int main (void)
{
    double x1,x2,x3,y1,y2,y3,a,b,c,L,A,d;
    scanf("%lf%lf%lf%lf%lf%lf",&x1,&y1,&x2,&y2,&x3,&y3);
    a=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
    b=sqrt((x2-x3)*(x2-x3)+(y2-y3)*(y2-y3));
    c=sqrt((x3-x1)*(x3-x1)+(y3-y1)*(y3-y1));
    if(a+b>c&&a+c>b&&b+c>a)
     {
 	    L = a+b+c;
 	    d = L/2;
	    A = sqrt(d*(d-a)*(d-b)*(d-c));
	    printf("L = %.2f, A = %.2f",L,A);
	     }	
   else
    {
	    printf("Impossible");
    }
    return 0 ;
}

2:对于多个if语句,在进行判断时会比较繁琐,例子:1

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

}

3:if..else if...语句和switch语句在对多个判断处理时,比较方便,例子:
switch语句例子:

# include <stdio.h>
int main(void)
{
    int m;
    scanf("%d",&m);
    switch(m/10)
    {
    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;
    case 5: case 4: case 3: case 2: case 1: case 0:
    printf("E\n");
    break;
    }

    return 0;	
	
}

if...case if...语句例子:

#include<stdio.h>
#include<math.h>
int main(void)
{
    double a,b,c,d,x1,x2,m;
    scanf("%lf%lf%lf",&a,&b,&c);
    d = pow(b,2) - 4 * a * c;
    if(a == 0 && b == 0 && c == 0)
    {
	    printf("Zero Equation");
    }
    if(a == 0 && b == 0 && c != 0)
    {
	    printf("Not An Equation");
    }
    if(d > 0 && a != 0)
    {
    x1 = (-b+sqrt(d)) / (2 * a);
    x2 = (-b - sqrt(d)) / (2 * a);
    printf("%.2f\n%.2f",x1,x2);
    }
    else if(d == 0 && a !=0)
    {
	    x1 = -b / (2 * a);
	    printf("%.2f",x1);
    }
    else if(d < 0 && a != 0 && b != 0)
    {
	    b = -b / ( a * 2);
	    d = fabs(d);
	    x1 = sqrt(d) / (a * 2);
	    printf("%.2f+%.2fi\n",b,x1);
	    printf("%.2f-%.2fi",b,x1);
    }
    else if(a == 0 && b != 0)
    {
	    x1 = -c / b;
	    printf("%.2f",x1);
    }
    else if(d < 0 && b == 0 && a !=0)
    {
	    d = fabs(d);
	    x1 = sqrt(d) / 2;
	    printf("0.00+%.2fi\n",x1);
	    printf("0.00-%.2fi",x1);
    }

    return 0;

}

从举的例子中可以看出,虽然在对多个语句做判断时if...case if...和switch case都可以用,但是switch case语句显得更加清楚明了。
查询链接:
http://www.cnblogs.com/wankun/p/4989831.html
2.对其他你认为需要进行总结的内容进行总结。
该章节学习了switch...case语句和char语句,在用switch语句时,总是忘记加break,还有就是总是想像if语句一样在括号里边做出判断,还有就是在应用char语句是总是把%c写成%d,导致输出结果总是不对。
(三)实验总结
本次实验总结,学号末位数是单数的同学完成选择结构(2)中的1、5、7、9题,学号末位数是双数的同学完成选择结构(2)中的2、4、6、8题。
格式如下:
1.成绩转换
(1)题目
本题要求编写程序将一个百分制成绩转换为五分制成绩。转换规则:
大于等于90分为A;
小于90且大于等于80为B;
小于80且大于等于70为C;
小于70且大于等于60为D;
小于60为E。
(2)流程图

(3)源代码

# include <stdio.h>
int main(void)
{
    int m;
    scanf("%d",&m);
    switch(m/10)
    {
    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;
    case 5: case 4: case 3: case 2: case 1: case 0:
    printf("E\n");
    break;
    }

    return 0;	
	
}

(4)实验分析
问题1:
输出得不到想要的结果,因为switch语句不像if语句一样可以做判断。
原因:
对switch...case语句应用不熟练。
解决办法:
向同学询问,修改程序。
(5)本题PTA提交列表

5. 三角形判断
(1)题目
给定平面上任意三个点的坐标(x1,y1),(x2,y2),(x3,y3),检验它们能否构成三角形。
(2)流程图


(3)源代码

#include<stdio.h>
#include<math.h>
int main (void)
{
    double x1,x2,x3,y1,y2,y3,a,b,c,L,A,d;
    scanf("%lf%lf%lf%lf%lf%lf",&x1,&y1,&x2,&y2,&x3,&y3);
    a=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
    b=sqrt((x2-x3)*(x2-x3)+(y2-y3)*(y2-y3));
    c=sqrt((x3-x1)*(x3-x1)+(y3-y1)*(y3-y1));
    if(a+b>c&&a+c>b&&b+c>a)
     {
 	    L = a+b+c;
 	    d = L/2;
	    A = sqrt(d*(d-a)*(d-b)*(d-c));
	    printf("L = %.2f, A = %.2f",L,A);
	     }	
    else
    {
	    printf("Impossible");
    }
    return 0 ;
}

(4)实验分析
问题1:
编译不正确。
原因:
没有数学类型的函数。
解决办法:
在# include <stdio.h>下边加上# include <math.h>
(5)本题PTA提交列表





7.两个数的简单计算器
(1)题目
本题要求编写一个简单计算器程序,可根据输入的运算符,对2个整数进行加、减、乘、除或求余运算。题目保证输入和输出均不超过整型范围。
(2)流程图


(3)源代码

# include <stdio.h>
#include <stdlib.h>
int main(void)
{
    int a,b,c;
    char op;
    scanf("%d %c%d",&a,&op,&b);
    switch(op)
    {
    case '+':c = a+b;
    break;
    case '-':c = a-b;
    break;
    case '/':c = a/b;
    break;
    case '*':c = a*b;
    break;
    case '%':c = a%b;
    break;
    default:
    printf("ERROR");
    exit(0);
    }
    printf("%d",c);
    return 0; 
}

(4)实验分析
问题1:

原因:
运算符没有用‘’括起来。对char语句应用不熟练。
解决办法:
把运算符用‘’括起来。
(5)本题PTA提交列表

9.求一元二次方程的根
(1)题目
本题目要求一元二次方程的根,结果保留2位小数。
(2)流程图


(3)源代码

#include<stdio.h>
#include<math.h>
int main(void)
{
    double a,b,c,d,x1,x2,m;
    scanf("%lf%lf%lf",&a,&b,&c);
    d = pow(b,2) - 4 * a * c;
    if(a == 0 && b == 0 && c == 0)
    {
	    printf("Zero Equation");
    }
    if(a == 0 && b == 0 && c != 0)
    {
	    printf("Not An Equation");
    }
    if(d > 0 && a != 0)
    {
    x1 = (-b+sqrt(d)) / (2 * a);
    x2 = (-b - sqrt(d)) / (2 * a);
    printf("%.2f\n%.2f",x1,x2);
    }
    else if(d == 0 && a !=0)
    {
	    x1 = -b / (2 * a);
	    printf("%.2f",x1);
    }
    else if(d < 0 && a != 0 && b != 0)
    {
	    b = -b / ( a * 2);
	    d = fabs(d);
	    x1 = sqrt(d) / (a * 2);
	    printf("%.2f+%.2fi\n",b,x1);
	    printf("%.2f-%.2fi",b,x1);
    }
    else if(a == 0 && b != 0)
    {
	    x1 = -c / b;
	    printf("%.2f",x1);
    }
    else if(d < 0 && b == 0 && a !=0)
    {
	    d = fabs(d);
	    x1 = sqrt(d) / 2;
	    printf("0.00+%.2fi\n",x1);
	    printf("0.00-%.2fi",x1);
    }

    return 0;

}

(4)实验分析
问题1:
总是输不出正确答案。
原因:
对数学应用不熟练,复数根不会求,导致该题在c++中总是出错,而且一直改不对。
解决办法:
向同学询问,修改程序,但在c++上还是得不出想要的结果,最后看了看别的同学的解题思路并在同学的耐心讲解下才明白在pta上提交正确。
(5)本题PTA提交列表

(四)博客互评
每个同学至少评论三篇其他同学的博客作业,依次列出你所评论的博客地址。对于同学对你的博客作业提出的问题,应积极进行回答,存在的错误应及时改正。希望大家能够在互评的过程中取长补短,共同进步。
(一)
http://www.cnblogs.com/tengwenqing/p/7762729.html
(二)
http://www.cnblogs.com/windsky-1999/p/7765579.html
(三)
http://www.cnblogs.com/yjy751522356/p/7773477.html

posted @ 2017-11-04 14:27  vahalla  阅读(811)  评论(4编辑  收藏  举报