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