C语言程序设计第四次作业
(一)改错题
输出三角形的面积和周长,输入三角形的三条边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:
错误原因:少了一个括号,使式子表达混乱。
改正如图:
错误信息3:
错误原因:if语句后需要加大括号。
改正如图;
修改后的正确程序为;
数据测试及运行结果:
运行符合条件,则修改正确。
(二)学习总结
1.在编程解决问题的过程中,我们会用到多个if语句,if...else if... 语句以及switch语句,查阅资料,总结一下这三种情况的区别何在,并分别举例加以说明。禁止大段复制,要自己对资料进行归纳总结,并给出你参考的资料链接。
switch 进行一次条件判断后直接执行到程序的条件语句.
if...else 有几种条件,就得判断多少次. //可能这就是所说的,效率不同的根源所在吧
if...else可以进行条件范围的判断,switch只能进行具体数值的的判断
例:
if(a>10&a<20)
{
//程序代码
}elseif(a<=20&a>30){
//程序代码
}
完成上面的代码对于switch来说,就是很麻烦的事情了
switch(number){
case 1:
//程序代码
break;
case 2:
//程序代码
break;
}
实现上面的功能用switch效率就会更高些
在if语句中当判断结果为true也就时,就会进入到相应的if(或eleseif)中执行程序代码。然后跳出if...else 语句块执行if后面的程序代码,而switch则是当找到某一个case与判断条件一致时,进入到相应的case中执行代码,并查看是否该case中是否有break语句,如果有break则跳出switch,转到后面的程序代码执行,如果没有则会继续执行下面的case语句中的程序代码,直到遇到break或者switch完成,才转入到switch下面的代码进行执行
链接:http://bbs.itheima.com/thread-3126-1-1.html
自己总结:两者本质的区别是 if-else语句更适合于对区间(范围)的判断,而switch语句更适合于对离散值的判断
判断65分到85分之间的学生有哪些适合用if-else语句,因为[65,85]是区间,而判断一个学生的班级是一班、二班还是三班适合用switch语句,因为一班、二班、三班是离散值。
(1)在确切知道条件结果,并且结果有限下的条件下可以使用switch,在不能确切表示结果的情况下最好用if...else,在使用switch时候一定要注意break的使用。
(2)default后并不需要break。
2.总结:感觉自己对选择结构没那么熟练,switch语句后要注意必要的时候用break跳出运算,在改错题时发现一个问题,也是自己常犯的错误,见下图:
公式注意用括号隔开,必须得仔细,不能因为括号多就丢落一个甚至两个,否则只会编译错误,这种低级错误应该避免。
(三)实验总结
1.成绩转换
本题要求编写程序将一个百分制成绩转换为五分制成绩。
大于等于90分为A;
小于90且大于等于80为B;
小于80且大于等于70为C;
小于70且大于等于60为D;
小于60为E。
(1)源程序:
#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");
}
}
(2)流程图
(3)实验总结:忘记换行符号导致部分正确,要注意全面思考。
用switch和case比用if else形式方便了许多,应该学会对其熟练地应用。
(4)本题PTA提交列表
5、三角形判断
(1)题目:给定平面上任意三个点的坐标(x1,y1)、(x2,y2)、(x3,y3),检验它们能否构成三角形。
(2)源代码:
include<stdio.h>
include<math.h>
int main (void)
{
double a,b,c,L,A,d,x1,x2,x3,y1,y2,y3;;
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 ;
}
(3)流程图:
(4)实验总结:
由于丢落括号导致编译错误,上文也提到了类似问题,总是在这里出错还是有点心痛的,一定得注意公式,不要一直犯这些低级错误。
(5)本题PTA 提交列表
7、两个数的简单计算器
(1)题目:本题要求编写一个简单计算器程序,可根据输入的运算符,对2个整数进行加、减、乘、除或求余运算。题目保证输入和输出均不超过整型范围。
(2)源代码:
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 = ab;
break;
case '/':if(b == 0)
{
printf("除数不能为零\n");
exit(0);
}
c = a/b;
break;
case'%':c = a%b;
break;
default:printf("ERROR\n");
exit(0);
}
printf("%d\n",c);
return 0;
}
(3)流程图:
(4)实验总结:本题基本没啥问题。希望自己再接再厉!
(5)PTA提交结果
9、求一元二次方程的根
(1)题目:本题目要求一元二次方程的根,结果保留2位小数
(2)源代码:
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);http://www.so.com/s?src=lm&ls=s12d445d99e&q=c语言编程教程&lmsid=a90ba148bf3c2905&lm_extend=ctype:7
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;
}
(3)流程图
(4)实验分析:我觉得本题真是硬伤,刚开始真的是一头雾水,真的不明白思路,后来只好在网上查并通过询问同学终于搞懂,但还是有些小问题
在给x1赋值时分号没用英文半角导致程序编译错误,这种错误很不容易发现害我一顿好找,在打一些字符是经常会用到shift键有时就会忘记切换回去导致打出一些中文符号。改正:在x1=-c/b后面加上英文“;”
(5)本题PTA提交列表
(四)博客互评
(1)人满为患 http://www.cnblogs.com/liukaixuan/
(2)王映丹http://www.cnblogs.com/windsky-1999/p/7765579.html
(3)任佳鹏http://www.cnblogs.com/rjp123/p/7778689.html