C语言程序设计第四次作业

C语言程序设计第四次作业

(一)改错题

源程序:

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

错误信息:

错误原因:sqrt后面的括号不完整,使这个开平方根函数无法正常运行
改正:在sqrt( s * ( s - a ) * ( s - b ) * ( s - c ),最后面再加一个“)”

错误信息:

错误原因:else没有找到与之对应的if,对此我又写了一个类似的错误

但是我把if后面的printf语句去掉程序就正确了

因为在if后面没花括号{}输出if后面的语句后程序停止不再继续向下进行

改正:在if后加上{}框住if后面的语句到else前面
编译正确
错误信息:

错误原因:这明显不符合实际情况,关键在于if语句中的判断条件“||”这是或的意思只要有一个条件成立就可以执行下面的语句,这里应该是“&&”与就是这些条件全部是真才能继续下面的语句
改正:把 if( a + b > c || b + c > a || a + c > b)中“||”改为“&&”
运行及测试结果:

(二)学习总结

1、 if语句,if...else if... 语句以及switch语句都属于流程控制语句,

if语句和if...else if语句有很大区别,多个if是所有的if都会进行判断 if ...else if是只要有满足条件的,就不再对之后的else if进行判断
if...else if语句和switch语句的区别是switch...case会生成一个跳转表来指示实际的case分支的地址,有种指哪打哪的感觉,快准恨。
所有的switch语句都可以用if...else if替换,而并不是所有的if-else语句都可以用switch语句来替换。
在判断条件较多时可以用switch case语句提高运行效率,有些情况下switch语句中的不加break的穿透现象会有不俗的效果。
参考资料地址:http://www.cnblogs.com/wankun/p/4989831.html

2 、在做改错题的时候发现一个问题s = ( a + b + c ) / 2;这里有没有必要做强制转型,我想单纯这样计算结果会损失很多数据,我就把2改成了2.0可是运算结束是一样的。后来我就把那一段单独写了一下

结果就不一样了
2.0的时候是

2的时候是

我很是纳闷,到底哪不一样最后发现前面声明的类型就不一样改错题中2或者2.0之所以对是在声明时 a,b,c;
就声明成了double类型所以s = ( a + b + c ) / 2;自然也就是double类的了,而我提出这段程序时用的int类型定义的a,b,c所以2和2.0就会有区别了。
switch语句中要有break;否则程序无法跳出。

(三)实验总结

1.成绩转换

(1)题目:本题要求编写程序将一个百分制成绩转换为五分制成绩。

转换规则:
大于等于90分为A;
小于90且大于等于80为B;
小于80且大于等于70为C;
小于70且大于等于60为D;
小于60为E;

(2)流程图

(3)源代码

#include<stdio.h>
int main()
{
int g;
scanf("%d",&g);
switch(g/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;
	default:
		printf("E\n");
}
}

(4)实验分析

问题:结果正确就是运算效率低

原因:没有理解switch语句的优势所在,不明确switch语句和if。。else。语句的区别

解决:把if...else if 语句换成switch语句

(5)本题PTA提交列表

5、三角形判断

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

(2)流程图

(3)源代码

#include<stdio.h>
#include<math.h>
int main()
{

double x,v,k,L,A,m,t,a,b,c,d,e,f,z;
scanf("%lf %lf %lf %lf %lf %lf",&a,&b,&c,&d,&e,&f,&z);


k=(a-c)*(a-c)+(b-d)*(b-d);
k=sqrt(k);
x=(a-e)*(a-e)+(b-f)*(b-f);
x=sqrt(x);
v=(c-e)*(c-e)+(d-f)*(d-f);
v=sqrt(v);

if(k+x>v&&k+v>x&&v+x>k)
{
	L=x+v+k;
	m=L/2;
	t=m*(m-k)*(m-x)*(m-v);
	A=sqrt(t);
	printf("L = %.2f, A = %.2f",L,A);
}
else
{
	printf("Impossible");
}

}

(4)实验分析

问题1:

原因:

%f 代表输入float, 是实数;
%d 代表输入int, 是整数;
根据题目要求应该输入的是一个实数

改正:把所有变量改为double或者float类型

(5)本题PTA提交列表

7、两个数的简单计算器

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

(2)流程图

(3)源代码

#include<stdio.h>
#include<stdlib.h>
int main()
{
int a,b,c;
char op;
scanf("%d %c %d",&a,&op,&b);
if(op=='+')
{
	c=a+b;
  printf("%d",c);
}
else if(op=='-')
{
	c=a-b;
  printf("%d",c);
}
else if(op=='*')
{
	c=a*b;
  printf("%d",c);
}
else if(op=='/')
{
	if(b==0)
{
	printf("除数不能为零\n");
           exit(0);	
}
else
{
	c=a/b;
	printf("%d",c);
}
}
else if(op=='%')
{
	c=a%b;
printf("%d",c);
}

else
{
	printf("ERROR");
}
    }

(4)实验分析

问题:

这样7-5输入程序没有问题,但是加上空格后7 - 5就不一样了

这样程序就不对了。

原因:

人们在输入时会有时会加上空格而空格也算是一个字符,使得op变量无法正确被赋值

改正:

在%d %c %d中间插入空格留作缓冲使用

(5)本题PTA提交列表

9、求一元二次方程的根

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

(2)流程图

(3)源代码

#include<stdio.h>
#include<math.h>
int main()
{
float a,b,c,x1,x2,s,m;
scanf("%f %f %f",&a,&b,&c);
	s=b*b-4*a*c;
if(a==0&&b==0&&c==0)
{
	printf("Zero Equation");
}
else if(a==0&&b==0&&c!=0)
{
	printf("Not An Equation");
}
else if(a==0&&b!=0&&c!=0)
{
	x1=-c/b;
 printf("%.2f\n",-c/b);raptor_OUTPUT
}
else if(a!=0&&b==0&&c==0)
{
	printf("0.00");
 } 

else
{
	 if(s>0)
  {
  	m=sqrt(s);
  	x1=(-b+m)/(2*a);
  	x2=(-b-m)/(2*a);
  	if(x1>x2)
  	{
  		printf("%.2lf\n",x1);
  		printf("%.2lf\n",x2);
  	}
  			 if(x1<x2)
  			{
  				printf("%.2lf\n",x2);
  				printf("%.2lf\n",x1);
			 }
	
  }
   if(s<0)
  {
  	
  	if(a!=0&&b==0&&c!=0)
  	{
	  m=sqrt(-s);
  		x2=m/(a*2);
  	printf("0.00+%.2lfi\n",x2);
  	printf("0.00-%.2lfi\n",x2);	
	  }
	else
	{
	m=sqrt(-s);
	x1=-b/(2*a);
  	x2=m/(2*a);
  	printf("%.2lf+%.2lfi\n",x1,x2);
  	printf("%.2lf-%.2lfi\n",x1,x2);
	}

  }
   if(s==0)
  {
  	m=-b/(2*a);
  	printf("%.2lf\n",m);
  }
}

}

(4)实验分析

问题:

原因:忽略了一种情况没有考虑方程是纯虚根

解决:

问题:编译错误

原因:在调试时忘记删除原来的一些内容

解决:删掉else if

(5)本题PTA提交列表

(四)博客互评

人满为患 http://www.cnblogs.com/liukaixuan/

怪人、http://www.cnblogs.com/LLIU/

T磊? http://www.cnblogs.com/8426224ll/

posted @ 2017-11-04 16:01  任佳鹏  阅读(943)  评论(6编辑  收藏  举报