(一)改错题
输出三角形的面积和周长,输入三角形的三条边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:
错误原因:后面没有加括号。
改正方法:在后面加括号。
错误信息2:
错误原因:else没有对应的if
改正方法:在if和else后面加一对大括号。
错误信息 3:
错误原因 :括号中用了“||”,应该是“&&”的关系。
改正方法:把“||”改成“&&”。
输出正确。
(二)学习总结
if-else语句的一般格式为:
#include<stdio.h>
if(表达式)
{
语句1;
}
else
{
语句2;
}
else-if语句是实现多分支的方法,其一般形式为:
#include<stdio.h>
if(表达式1)
{
语句1;
}
else if(表达式2)
{
语句2;
}
...
else if(表达式n-1)
{
语句n-1;
}
else
{
语句n;
}
switch语句的一般形式为:
#include<stdio.h>
switch(表达式)
{
case 常亮表达式1:语句段1;break;
case 常亮表达式2:语句段2;break;
...
case 常亮表达式n:语句段n;break;
default:语句段n+1;break;
}
if语句,if else if语句和switch case语句都属于流程控制语句。
在只需要判断一个条件的时候,自然是使用if语句方便有效;但是当判断条件很多的时候,我们可以使用多个if语句或者if...else if语句或者switch case语句。
在多个判断条件的情况下,使用if...else if语句相对于使用多个if语句而言,可以减少程序在多个判断条件的情况下,不仅可以使用if...else if语句,还可以使用switch case语句。一般情况下,当判断条件较多的情况下,使用switch case语句的效率会高于使用if...else if语句。switch...case与if...else if的根本区别在于,switch...case会生成一个跳转表来指示实际的case分支的地址,而这个跳 转表的索引号与switch变量的值是相等的。从而,switch...case不用像if...else if那样遍历条件分支直到命中条件,而只需访问对应 索引号的表项从而到达定位分支的目的。
参考资料 - http://wenda.so.com/q/1383256793069725?src=140
(三)实验总结
第一题
(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);
switch(a/10)
{
case 10:
case 9:
printf("A");
break;
case 8:
printf("B");
break;
case 7:
printf("C");
break;
case 6:
printf("D");
break;
default:printf("E");
}
return 0;
}
(4)实验分析
问题:在进行这种类似的多点判断时,用switch语句运算比较好。
原因:switch语句直接找到对应的条件进行,而if else则需要一个一个运行
解决办法:将if语句改成switch语句即可。
(5)本题PTA提交列表
第二题
(1)题目:三角形判断
给定平面上任意三个点的坐标(x1,y1)、(x2,y2)、(x3,y3),检验它们能否构成三角形。
(2)流程图:
(3)源程序:
#include <stdio.h>
#include <math.h>
int main ()
{
double a1,a2,b1,b2,c1,c2;
double a,b,c,L,S,s;
scanf("%lf%lf%lf%lf%lf%lf",&a1,&a2,&b1,&b2,&c1,&c2);
c=sqrt((b1-a1)*(b1-a1)+(b2-a2)*(b2-a2));
b=sqrt((c1-a1)*(c1-a1)+(c2-a2)*(c2-a2));
a=sqrt((b1-c1)*(b1-c1)+(b2-c2)*(b2-c2));
if(a<b+c&&b<a+c&&c<a+b)
{
L=a+b+c;
s=L/2;
S=sqrt(s*(s-a)*(s-b)*(s-c));
printf("L = %.2f, A = %.2f",L,S);
}
else
{
printf("Impossible");
}
}
(4)实验分析
问题1:在PTA中提交总是部分正确
原因:格式不同输出保留几位的时候必须.2f格式,输出的格式和题目中的不一样。
解决办法:应该把(L=%lf, A=%lf)改成(L = %.2f, A = %.2f)。
(5)本题PTA提交列表
第三题
(1)题目:
两个数的简单计算器
本题要求编写一个简单计算器程序,可根据输入的运算符,对2个整数进行加、减、乘、除或求余运算。题目保证输入和输出均不超过整型范围。
(2)流程图
(3)源代码
#include <stdio.h>
int main()
{
int a, b,result;
char c;
scanf("%d %c%d", &a,&c,&b);
if(c=='+')
{
result= a + b;
printf("%d",result);
}
else if(c=='-')
{
result= a - b;
printf("%d",result);
}
else if(c=='*')
{
result= a * b;
printf("%d",result);
}
else if(c=='/')
{
result= a / b;
printf("%d",result);
}
else if(c=='%')
{
result= a % b;
printf("%d",result);
}
else
{
printf("ERROR");
}
}
(4)实验分析
问题:在这个题中,总是出现&符号。
原因:在输出中后面的字符中加了&。
解决办法:删去后面的&
(5)本题PTA提交列表
第四题
(1)题目:求一元二次方程的根
本题目要求一元二次方程的根,结果保留2位小数。
输入格式:
输入在一行中给出3个浮点系数a、b、c,中间用空格分开。
输出格式:
根据系数情况,输出不同结果:
1) 如果方程有两个不相等的实数根,则每行输出一个根,先大后小;
2) 如果方程有两个不相等复数根,则每行按照格式“实部+虚部i”输出一个根,先输出虚部为正的,后输出虚部为负的;
3) 如果方程只有一个根,则直接输出此根;
4) 如果系数都为0,则输出"Zero Equation";
5) 如果a和b为0,c不为0,则输出"Not An Equation"。
(2)流程图
(3)源代码
#include<stdio.h>
#include<math.h>
int main()
{
double a,b,c,k1,k2,m,n;
scanf("%lf %lf %lf",&a,&b,&c);
m=b*b-4*a*c;
if(a==0&&b==0&&c!=0)
{
printf("Not An Equation");
}
else if(a==0&&b==0&&c==0)
{
printf("Zero Equation\n");
}
else if(a==0&&b!=0&&c!=0)
{
k1=k2=-c/(double)b;
printf("%.2lf\n",k1);
}
else if(m>=0)
{
k1=(-b-sqrt(m))/(2*a);
k2=(-b+sqrt(m))/(2*a);
if(k1>k2)
{
printf("%.2lf\n",k1);
printf("%.2lf\n",k2);
}
else if(k1==k2)
{
printf("%.2lf\n",k1);
}
else
{
printf("%.2lf\n",k2);
printf("%.2lf\n",k1);
}
}
else if(m<0)
{
k1=-b/(2*a);
n=sqrt(fabs(m))/(2*a);
if(k1!=0)
{
printf("%.2lf+%.2lfi\n",k1,n);
printf("%.2lf-%.2lfi\n",k1,n);
}
else if(k1==0&&n!=0)
{
printf("+%.2lfi\n",n);
printf("-%.2lfi\n",n);
}
}
return 0;
}
(4)实验分析
问题:一直都是部分正确,最一开始是两个复数和虚根那里错了,后来改的只剩一个虚根仍然错误,我找了原来的小班,她也没看出来那里错了。。。所以一直没改过来
原因:到最后也没有解决。额没有坚持下去,,
解决办法:未知。。。。
(5)本题PTA提交列表
(四)博客互评
看了很多的博文,我首先说目前最好的就是李晓晓的,确实是不得不服,差不多每次都是第一个,而且各方面都很详细,看起来有老师的解答的意思。确实不错,也许是因为李晓晓同学的博文实在太好,看别人的博文也就没什么太大的惊喜之类的。以后要向晓晓同学学习。
其次是任佳鹏同学的博文,
任佳鹏之前的博文就被推荐过,我仔细看了看发现确实不同,有好多地方我们忽略的地方佳鹏都会做出比较详细的解答