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:

错误原因:第13行分号前少加一个后括号。
改正方法:在第13行分号前加一个后括号。
错误信息2:

错误原因:if-else语句中没有加大括号。
改正方法:在if-else语句中加上大括号。

输入样例1:

样例1没有问题。

输入样例2:

样例2与结果不同。

错误信息3:

错误原因:第11行中把 && 写成了 || 。
改正方法:把第11行的 && 改为 || 。

再次输入样例1和2:

(二)学习总结
1.在编程解决问题的过程中,我们会用到多个if语句,if...else if... 语句以及switch语句,查阅资料,总结一下这三种情况的区别何在,并分别举例加以说明。
区别:if语句,if else if语句和switch case语句都属于流程控制语句。在只需要判断一个条件的时候,自然是使用if语句方便有效;但是当判断条件很多的时候,我们可以使用多个if语句或者if...else if语句或者switch case语句。
在多个判断条件的情况下,使用if...else if语句相对于使用多个if语句而言,可以减少程序的判断次数,提高效率。
一般情况下,当判断条件较多的情况下,使用switch case语句的效率会高于使用if...else if语句。
举例:判断65分到85分之间的学生有哪些适合用if-else语句,因为[65,85]是区间而判断一个学生的班级是一班、二班还是三班适合用switch语句,因为一班、二班、三班是离散值。

2.总结
(1)我认为应该熟练掌握并运用三种不同的控制语句,尽量简化程序。
(2)还应熟练掌握并熟练运用字符型数据,例如putchar函数(字符输出函数)和 getcher函数(字符输入函数)等。

(三)实验总结
1 成绩转换
(1)题目
本题要求编写程序将一个百分制成绩转换为五分制成绩。转换规则:
大于等于90分为A;
小于90且大于等于80为B;
小于80且大于等于70为C;
小于70且大于等于60为D;
小于60为E。
(2)流程图

(3)源代码

# include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
switch(n/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");
	break;
}

return 0;
}

(4)实验分析
问题:

原因:没有在每个case语句后面加上break。
解决办法:在每个case语句后面加上break。

(5)本题PTA提交列表

5 三角形判断
(1)题目
给定平面上任意三个点的坐标(x1,y1)、(x2,y2)、(x3,y3),检验它们能否构成三角形。
(2)流程图


(3)源代码

#include<stdio.h>
#include<math.h>
int main(void)
{
double x1 = 0.0,y1 = 0.0,x2 = 0.0,y2 = 0.0,x3 = 0.0,y3 = 0.0,a = 0.0,b = 0.0,c = 0.0,L = 0.0,A = 0.0,M = 0.0;
scanf("%lf%lf%lf%lf%lf%lf",&x1,&y1,&x2,&y2,&x3,&y3);
a = pow((pow(x1 - x2,2)+pow(y1 - y2,2)),0.5);
b = pow((pow(x1 - x3,2)+pow(y1 - y3,2)),0.5); 
c = pow((pow(x3 - x2,2)+pow(y3 - y2,2)),0.5);
if(a + b > c && a + c > b && b + c > a)
{
	L = a + b + c;
	M = L / 2.0;
	A = pow(M * (M - a) * (M - b) * (M - c),0.5);
	printf("L = %.2f, A = %.2f",L,A);
}
else
{
	printf("Impossible");
}
return 0;
} 

(4)实验分析
问题:结果可能为负数。
原因:用错误的方法有可能会使面积为负数。
解决办法:加入一个判断语句,使得输出的面积均为正数。

(5)本题PTA提交列表

7.两个数的简单计算器
(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);
switch(op)
{
	case '+':c = a+b;printf("%d",c);break;
	case '-':c = a-b;printf("%d",c);break;
	case '*':c = a*b;printf("%d",c);break;
	case '/':c = a/b;printf("%d",c);break;
	case '%':c = a%b;printf("%d",c);break;
	default :printf("ERROR");
}

return 0;			

}

(5)本题PTA提交列表

9.求一元二次方程的根
(1)题目
本题目要求一元二次方程的根,结果保留2位小数。
(2)流程图


(3)源代码

#include<stdio.h>
#include<math.h>
int main(void)
{
double a = 0.0,b = 0.0,c = 0.0,t = 0.0, x1 = 0.0,x2 = 0.0,m = 0.0;
scanf("%lf%lf%lf",&a,&b,&c);
t = 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(t > 0 && a != 0)
{
x1 = (sqrt(t) - b) / (2 * a);
x2 = (-b - sqrt(t)) / (2 * a);
printf("%.2f\n%.2f",x1,x2);
}
else if(t == 0 && a !=0)
{
	x1 = -b / (2 * a);
	printf("%.2f",x1);
}
else if(t < 0 && a != 0 && b != 0)
{
	b = -b / ( a * 2);
	t = fabs(t);
	x1 = sqrt(t) / (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(t < 0 && b == 0 && a !=0)
{
	t = fabs(t);
	x1 = sqrt(t) / 2;
	printf("0.00+%.2fi\n",x1);
	printf("0.00-%.2fi",x1);
}

return 0;



}

(4)实验分析
问题:各种错误。
原因:思路不对。
解决办法:改变思路,改变方法。

(5)本题PTA提交列表

(四)博客互评
1.http://www.cnblogs.com/abc15369938639/p/7773975.html
2.http://www.cnblogs.com/he111923/p/7772093.html
3.http://www.cnblogs.com/8426224ll/p/7769227.html

posted @ 2017-11-04 22:00  Religious  阅读(354)  评论(1编辑  收藏  举报