第四次作业--选择结构(2)
一:改错
先将源程序(有错误的程序)复制到devc++中如图
进行第一次编译寻找错误
发现错误信息(1)如图
错误原因:第13行关于面积的计算式的sqrt数学函数缺少“)”,导致编译错误
改正方法:补齐缺少的“)”
进行第二次编译寻找错误
发现另有错误(2)如图
错误原因:“if”和“else”语句后缺少对应的“{}”大括号,导致没有与“else”配对的“if”,逻辑关系出现了问题导致编译错误
改正方法:将“if”和“else”后缺少的“{}”补齐
现进行第三次编译寻找错误
编译成功
进行运行指令,按输入样例1进行输入,发现结果与输出样例1相同
关闭,进行第二次运行,按输入样例2进行输入,发现与输出样例2不同,显然不符合题意存在错误信息(3)
返回源程序寻找错误发现
错误原因:选择语句中,三边的判断语句,且“&&”错写成了,或"||"导致当输入三边构不成三角形时发生错误
改正方法:将第11行“||”改为“&&”
进行第三次运行,按输入样例2进行输入,发现结果与输出样例2相同
所有错误改正,改正后符合题目要求的正确程序如下
二:学习总结
1.在编程解决问题的过程中,我们会用到多个if语句,if...else if... 语句以及switch语句,查阅资料,总结一下这三种情况的区别何在,并分别举例加以说明。
总结(1):通过比较得出,在选择条件是嵌套类型的我们使用if--else 语句比较方便;当条件单一是使用switch--case 比较简单。
例如输出结果 i=2,分别用两种语句进行
include<stdio.h>
int main(void)
{
int i = 2;
if (i == 2)
{
printf(" i 等于 2");
}
else
{
printf(" i 不等于 2");
}
return 0;
}
include<stdio.h>
int main(void)
{
int i = 2;
switch (i)
{
case 1: printf(" i 等于 1"); break;
case 2: printf(" i 等于 2"); break;
case 3: printf(" i 等于 3"); break;
case 4: printf(" i 等于 4"); break;
case 5: printf(" i 等于 5"); break;
default: printf(" i 不等于1,2,3,4,5, "); break;
}
return 0;
}
总结(2):if语句更灵活,switch语句显得结构更清晰
总结(3):多个if是所有的if都会进行判断,if else if是只要有满足条件的,就不再对之后的else if进行判断
总结(3):如果所有if的条件不存在包含于被包含的关系,那么就用if就可以,如果存在或者不清楚包含与被包含的关系最好用if else
参考资料连接1:http://blog.csdn.net/u014536527/article/details/48878649
参考资料连接2:http://www.jb51.net/article/83096.htm
参考资料连接3https://zhidao.baidu.com/question/166896032.html:
2.对其他你认为需要进行总结的内容进行总结。
本人对本章其他需要总结的内容如下几点:
(1):“switch case ”语句中,“switch”后面()跟的是一个值,不能忘记添加“break”
(1):“if”,“else if ”后一定要记得加条件语句,而“else”后不能加条件语句
(3):弄清楚字符与字符串的关系,仔细区分字符与字符串,不可混淆使用
三:实验总结
1.
(1)题目:
本题要求编写程序将一个百分制成绩转换为五分制成绩。转换规则:
•大于等于90分为A;
•小于90且大于等于80为B;
•小于80且大于等于70为C;
•小于70且大于等于60为D;
•小于60为E。
(2)流程图
(3)源代码
#include<stdio.h>
int main()
{
int a;
scanf("%d",&a);
if(a>=90)
{
printf("A");
}
else if(a<=90 && a>=80)
{
printf("B");
}
else if(a<=80 && a>=70)
{
printf("C");
}
else if(a<=70 && a>=60)
{
printf("D");
}
else
{
printf("E");
}
return 0;
}
(4)实验分析
问题:最后的“else”后加了条件语句
原因:刚开始学没有搞清楚
解决办法:实验课上询问同学已解决
(5)本题PTA提交列表
(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
return 0;
}
(4)实验分析
问题:编译发生错误
原因:忘记加头文件#include<math.h>
解决办法:因为用了“sqrt”和“pow”函数所以不填加头文件不能进行编译,仔细查找错误发现原因并改正
(5)本题PTA提交列表
(1)题目:本题要求编写一个简单计算器程序,可根据输入的运算符,对2个整数进行加、减、乘、除或求余运算。题目保证输入和输出均不超过整型范围
(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”输入时误将空格字符和转义字符作为有效字符输入
解决方法:在“%c”前再加一个“ ”以保证正常运行
(5)本题PTA提交列表:
9.
(1)题目:本题目要求一元二次方程的根,结果保留2位小数。
(2)流程图
(3)源代码:
include<stdio.h>
include<math.h>
int main(void)
{
double a,b,c,d,e,f;
scanf("%lf %lf %lf",&a,&b,&c);
if(a0&&b0)
{
if(c0)
{
printf("Zero Equation");
}
else
{
printf("Not An Equation");
}
}
else
{
d=bb-4ac;
if(d>0)
{
if(a!=0)
{
e=(-b+sqrt(d))/(2a);
f=(-b-sqrt(d))/(2*a);
printf("%.2f\n%.2f",e,f);
}
else
{
e=-c/b;
printf("%.2f",e);
}
}
else if(d0)
{
e=-b/(2a);
printf("%.2f",e);
}
else
{
e=-b/(2a);
f=sqrt(-d)/(2*a);
if(b==0)
{
printf("%.2fi\n-%.2fi",f,f);
}
else
{
printf("%.2f+%.2fi\n%.2f-%.2fi",e,f,e,f);
}
}
}
return 0;
}
(4)实验分析:
问题:没有考虑纯虚根的情况
原因:考虑到不周全,想的不够全面
解决:交完作业之前一直没有想到,交作业后与同学进行交流,得到解决
(5)本题PTA提交列表:
四:博客互评
李仁正:http://www.cnblogs.com/lrxlrz/p/7763680.html
范凯华:http://www.cnblogs.com/fkh1/p/7774050.html
何强:http://www.cnblogs.com/jjjj1234/p/7772739.html
本次作业如上