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/