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:

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



错误原因:if后面的语句和else后面的语句没加大括号
改正方法:把if和else后面的语句分别用大括号括起来
错误信息3:样例2输出错误

错误原因:if里面的判断之间应该用&&连接,||代表或者。
改正方法:将||改为&&

(二)学习总结
1.在编程解决问题的过程中,我们会用到多个if语句,if...else if... 语句以及switch语句,查阅资料,总结一下这三种情况的区别何在,并分别举例加以说明。禁止大段复制,要自己对资料进行归纳总结,并给出你参考的资料链接。
2.对其他你认为需要进行总结的内容进行总结。
答:1.只需要判断一个条件的时候,使用if语句比较好,但是当判断条件很多的时候,使用多个if语句就不是最好的选择了。
if...else if在任何一个环节满足条件的时候就将会终止判断,只处理一个满足条件的情况。当判断条件较多的情况下,使用switch case语句。
switch判断固定值的时候用,而if建议判断区间或范围的时候用,一般用switch能做的,用if都能做,但是反过来则不行。
举例:

当条件较少时用if语句很容易,但是条件多就不是很简单了,过程就会很复杂。

使用if...else if... 语句其实跟if语句差不多,只是省略了些条件,是过程简化,不再看起来那么复杂。


这两个比较可看出switch语句能把if...else if... 语句比较复杂的简化,进一步是=使过程清楚易懂,运行起来也更加迅速。

(三)实验总结
1.成绩转换
(1)题目:
本题要求编写程序将一个百分制成绩转换为五分制成绩。转换规则:
大于等于90分为A;
小于90且大于等于80为B;
小于80且大于等于70为C;
小于70且大于等于60为D;
小于60为E。
(2)流程图:

(3)源程序:

# include <stdio.h>
int main()
{
    int score,a;
    scanf("%d",&score);
    a = score / 10;
	    switch(a)
    {	    case 10 : printf("A");break;
	    case 9 : printf("A");break;
	    case 8 : printf("B");break;
 	    case 7 : printf("C");break;
	    case 6 : printf("D");break; 
	    default : printf("E");break; }	 
    return 0;
 } 

(4)实验分析
想不到case后面应该用什么,没有老师提醒想不到case(score/10)。
要多练习,才能想的到简单的方法。
(5)本题PTA提交列表

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

(3)源程序:

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

(4)实验分析:
问题1:在定义某些量时,定义错了他们的类型把double型的定义成了int型,导致错误。
解决办法:判断准确量的类型。
问题2:if语句中的某些符号使用错误,跟之前的混淆。
解决办法:牢记&&和||的用法。
(5)本题PTA提交列表

7简单的计算器
(1)题目:本题要求编写一个简单计算器程序,可根据输入的运算符,对2个整数进行加、减、乘、除或求余运算。题目保证输入和输出均不超过整型范围。
输入格式:
输入在一行中依次输入操作数1、运算符、操作数2,其间以1个空格分隔。操作数的数据类型为整型,且保证除法和求余的分母非零。
输出格式:
当运算符为+、-、*、/、%时,在一行输出相应的运算结果。若输入是非法符号(即除了加、减、乘、除和求余五种运算符以外的其他符号)则输出ERROR。
(2)流程图:

(3)源程序:

#include<stdio.h>
#include<stdlib.h>
int main()
{
    int a,b,c;
    char d;
    scanf("%d %c%d",&a,&d,&b);
    switch(d)
    {
	    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)实验分析:
“%c”输入时,空格会对输入造成影响。
解决办法:在前面加上空格。

(5)本题PTA提交列表

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

(3)源程序:

#include<stdio.h>
#include<math.h>
int main()
{
    double a,b,c,x,y,q,w,e;
    scanf("%lf%lf%lf",&a,&b,&c);
    if(a==0&&b!=0)
    {
	    y=(0-c)/b;
	    printf("%.2f",y);
    }
    else
    {
	    x=((0-b)+sqrt(b*b-4*a*c))/(2*a);
	    y=((0-b)-sqrt(b*b-4*a*c))/(2*a);
	    if(a==0&&b==0&&c==0)
	    {
		    printf("Zero Equation");
	    }
	    else if(a==0&&b==0)
	    {
		    printf("Not An Equation");
	    }
	    else if(b*b-4*a*c==0)
	    {    
		    printf("%.2f",x);
	    }
	    else if(b*b-4*a*c<0)
	    {
		    q=(0-b)/(2*a);
		    w=sqrt(4*a*c-b*b)/(2*a);
	    printf("%.2f+%.2fi\n",q,w);
	    printf("%.2f-%.2fi\n",q,w);
	    }
	    else if(x!=y)
	    {
	      if(x<y)
	      {e=x;x=y;y=e;}
	      else
	      printf("%.2f\n%.2f",x,y);
	    }
	    return 0;
	
    }
}

(4)实验分析:
刚开始看这个题时,有点思路,但是写起程序来,真是麻烦,错误百出。
问题1:结果不完全正确。
原因:没有考虑纯虚根。
最后老师提醒:纯虚根的情况,即有虚根的时候,如果实部为0,则实部应该输出0.00.然后输出虚部,不能只输出虚部而没有实部的内容。
(5)本题PTA提交列表:

(四)博客互评:
C语言程序设计第四次作业——选择结构(2) - 李仁正 - 博客园
http://www.cnblogs.com/lrxlrz/p/7763680.html
C语言程序设计第四次作业 - 范马桶 - 博客园
http://www.cnblogs.com/he111923/p/7772093.html
C语言程序设计第四次作业-选择结构 - WH吴晗 - 博客园
http://www.cnblogs.com/moying456/p/7770919.html

posted @ 2017-11-05 17:12  计科1702冯亚杰  阅读(421)  评论(1编辑  收藏  举报