第四次作业——选择结构(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;        
}
对程序进行编译

1242734-20171102154855810-2094862584.png

错误信息 1:

1242734-20171102155549076-421507948.png

错误原因:area公式不对
改正方法:area = sqrt( s * ( s - a ) * ( s - b ) * ( s - c )后加)
错误信息 2:

1242734-20171102155832716-7728225.png

错误原因:if和else没有对应起来
改正方法:在if后的语句加{}和else后的加{}

发现编译正确

错误信息3:1242734-20171102160852248-2055779897.png
错误原因:题目的意思是要成立a+b>c和b+c>a和a+c>b同时成立。而if后的 || 是或而不是和 和的表示符号是&&
改正方法: || 改为 &&

1242734-20171102161708998-729470441.png

答案正确

(二)学习总结

题目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)流程图

1242734-20171102180850232-1332184779.png

(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提交列表

1242734-20171103144336560-517104627.png

2.(1)题目

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

1242734-20171102210719638-2029308865.png

(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提交列表

1242734-20171103144415795-2003022170.png

### 3.(1)题目

#### 本题要求编写一个简单计算器程序,可根据输入的运算符,对2个整数进行加、减、乘、除或求余运算。题目保证输入和输出均不超过整型范围。

(2)流程图

1242734-20171102213452326-24094058.png

#### (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提交列表

1242734-20171103144538107-1464074337.png

4.(1)题目

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

1242734-20171103141531060-2084373982.png

(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提交列表

1242734-20171103144104123-626862831.png
1242734-20171103144109904-1455406344.jpg
(四).博客评论
郭玉霖 http://www.cnblogs.com/HBQ521/
范马桶 http://www.cnblogs.com/he111923/p/7772093.html
程晓磊 http://www.cnblogs.com/8426224ll/p/7769227.html

转载于:https://www.cnblogs.com/lipan123/p/7778208.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值