第四次作业——选择结构(2)
(一)改错题
源程序(有错误的程序)
#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 = sqrt( s * ( s - a ) * ( s - b ) * ( s - c )后加)
错误信息 2:
错误原因:if和else没有对应起来
改正方法:在if后的语句加{}和else后的加{}
发现编译正确
错误信息3:
错误原因:题目的意思是要成立a+b>c和b+c>a和a+c>b同时成立。而if后的 || 是或而不是和 和的表示符号是&&
改正方法: || 改为 &&
答案正确
(二)学习总结
题目1
1.在编程解决问题的过程中,我们会用到多个if语句,if...else if... 语句以及switch语句,查阅资料,总结一下这三种情况的区别何在,并分别举例加以说明。禁止大段复制,要自己对资料进行归纳总结,并给出你参考的资料链接。
switch语句, 其一般形式为:
switch(表达式){
case 常量表达式1: 语句1
case 常量表达式2: 语句2
case 常量表达式n: 语句
default: 语句n+1
switch用整数
在case后的各常量表达式的值不能相同,否则会出现错误。
在case后,允许有多个语句,可以不用{}括起来。
各case和default子句的先后顺序可以变动,而不会影响程序执行结果。
default子句可以省略不用。
if(表达式1)
语句1;
else if(表达式2)
语句2;
else if(表达式3)
语句3;
…
else if(表达式m)
语句m;
else
语句n;
1 两者本质的区别是 if-else语句更适合于对区间(范围)的判断,而switch语句更适合于对离散值的判断
2 示例
判断65分到85分之间的学生有哪些适合用if-else语句,因为[65,85]是区间
而判断一个学生的班级是一班、二班还是三班适合用switch语句,因为一班、二班、三班是离散值
3 扩展
所有的switch语句都可以用if-else语句来替换(因为if-else语句只需对每个离散值分别做判断即可),而并不是所有的if-else语句都可以用switch语句来替换(因为区间里值的个数是无限的并且switch所接受的值只能是整型或枚举型,所以不能用case来一一列举)。
if else 与 switch 可以相互转化,不过有时switch看起来比较好理解。有时有用if else比较好,但变量一定是用switch比较好,当变量不确定时用if else就比较好,但有些条件只能用if,能用switch一定能用if。
2.对其他你认为需要进行总结的内容进行总结。
1.switch语句中缺省break语句,顺序执行下一个case。 2.每个case后面“常量表达式”的值,必须各不相同
(三)实验总结
1.(1)题目
7-1 7-1 成绩转换(10 分)
本题要求编写程序将一个百分制成绩转换为五分制成绩。转换规则:
大于等于90分为A;
小于90且大于等于80为B;
小于80且大于等于70为C;
小于70且大于等于60为D;
小于60为E。
(2)流程图
(3)源代码
#include <stdio.h>
int main()
{
int g,a;
scanf("%d",&g);
a=g/10;
switch(a)
{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)实验分析
本题没有错误,只是格式错误
(5)本题PTA提交列表
2.(1)题目
三角形判断
给定平面上任意三个点的坐标(x1,y1)、(x2,y2)、(x3,y3),检验它们能否构成三角形。
(2)流程图
(3)源代码
#include<stdio.h>
#include<math.h>
int main()
{ double a,b,c,d,e,f;
scanf("%lf %lf %lf %lf %lf %lf",&a,&b,&c,&d,&e,&f );
double AB,BC,AC,ab,bc,ac;
ab=(a-c)(a-c)+(b-d)(b-d);
bc=(c-e)(c-e)+(d-f)(d-f);
ac=(a-e)(a-e)+(b-f)(b-f);
AB=sqrt(ab);
BC=sqrt(bc);
AC=sqrt(ac);
if((AB<BC+AC)&&(BC<AB+AC)&&(AC<AB+BC))
{
double l=AB+BC+AC;
double P = l / 2;
double s = sqrt(P(P-AB)(P-BC)*(P-AC));
printf("L = %.2f, A = %.2f",l,s);
}
else
{
printf ("Impossible");
}
return 0;
}
(4)实验分析
问题1:输出的答案一直是整数,得数不对
原因:定义时一直将边长当做整数定义
解决办法:将边长定义成double型
(5)本题PTA提交列表
### 3.(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;
}
else if(op == '-')
{
c=a-b;
}
else if(op == '*')
{
c=a*b;
}
else if(op == '%')
{
c=a%b;
}
else if(op == '/')
{
if(b == 0)
{
printf("除数不能为零\n");
}
else
{
c=a/b;
}
}
else
{
printf("ERROR");
exit(0) ;
}
printf("%d",c) ;
}
(4)实验分析
问题1:可能会出现0的情况或者是一直是ERROR
原因:定义字符方式错误
解决办法:char op
(5)本题PTA提交列表
4.(1)题目
本题目要求一元二次方程的根,结果保留2位小数。
(2)流程图:
(3)源代码
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main()
{
double a, b, c;
scanf("%lf%lf%lf", &a, &b, &c);
double d, del, ans1, ans2;
d = b * b - 4.0 * a * c;
if(a == b && a == c && a == 0)
printf("Zero Equation\n");
else if(a == b && a == 0 && c != 0)
printf("Not An Equation\n");
else if(d == 0)
{
ans1 = (-b) / (2.0*a);
printf("%.2f\n", ans1);
}
else if(a == 0)
printf("%.2f\n", (-c) / b);
else if(d > 0)
{
del = sqrt(d);
ans1 = (-b+del) / (2.0*a);
ans2 = (-b-del) / (2.0*a);
printf("%.2f\n%.2f\n", ans1, ans2);
}
else if(d < 0)
{
del = sqrt(-d);
if(b != 0)
ans1 = (-b) / (2.0*a);
else
ans1 = 0;
ans2 = del / (2.0*a);
printf("%.2f+%.2fi\n%.2f-%.2fi\n", ans1, ans2, ans1, ans2);
}
return 0;
}
(4)实验分析
问题:多次出现格式错误和部分正确
问题原因:此题的步骤太过繁琐导致出错,实根与虚根。以及方程的解法老是出错
改正:与同学一起改正了错误,这些错误自己实在无法改正。
(5)本题PTA提交列表
(四).博客评论
郭玉霖 http://www.cnblogs.com/HBQ521/
范马桶 http://www.cnblogs.com/he111923/p/7772093.html
程晓磊 http://www.cnblogs.com/8426224ll/p/7769227.html