第四次作业——选择结构(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

posted @ 2017-11-03 15:00  李攀¥  阅读(634)  评论(1编辑  收藏  举报