C语言程序设计第四次作业——选择结构(2)
(一)改错题
输出三角形的面积和周长,输入三角形的三条边a、b、c,如果能构成一个三角形,输出面积area和周长perimeter(保留2位小数);否则,输出“These sides do not correspond to a valid triangle”。
错误信息1:

错误原因:面积公式少与开方对应的半个括号
改正方法:在分号前加上半个括号
错误信息2:

错误原因:if语句与else语句后都没有大括号
改正方法:在if和else语句后分别加上大括号
错误信息3:编译无错运行出问题
错误原因:if语句括号里的条件之间的关系不对,应是且的关系而不是或的关系
改正方法:将或的符号改为且的符号



二)学习总结
1.在编程解决问题的过程中,我们会用到多个if语句,if...else if... 语句以及switch语句,查阅资料,总结一下这三种情况的区别何在,并分别举例加以说明
if语句,if else if语句和switch 语句都属于流程控制语句。在只需要判断一个条件的时候,使用if语句方便有效;但是当判断条件很多的时候,我们可以使用多个if语句或者if...else if语句或者switch case语句。对于这三者的选择,下面将做一些具体分析;对于后两者的选择,又将涉及到程序执行效率的问题。if...else if语句和多个if语句的区别还是很大的,if...else if在任何一个环节满足条件的时候就将会终止判断,只处理一个满足条件的情况;而对于多个if语句,将会对每一个判断条件进行判断,自然而然会导致程序的执行效率降低。在多个判断条件的情况下,使用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那样遍历条件分支直到命中条件,而只需访问对应 索引号的表项从而到达定位分支的目的。所以从效率上来说由于if...else if的遍历性,代码执行效率是不高的。
#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);
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;
}
#include<stdio.h>
#include<math.h>
int main (void)
{
double x1,x2,x3,y1,y2,y3,a,b,c,L,A,d;
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 ;
}
# include<stdio.h>
# include<math.h>
int main(void)
{
int y,m,d;
scanf("%d/%d/%d",&y,&m,&d);
switch(m-1)
{
case 11:d=30+d;
case 10:d=31+d;
case 9:d=30+d;
case 8:d=31+d;
case 7:d=31+d;
case 6:d=30+d;
case 5:d=31+d;
case 4:d=30+d;
case 3:d=31+d;
case 2:if(y%4==0&&y%100!=0||y%400==0)
{
d=29+d;
}
else
{
d=28+d;
}
case 1:d=31+d;
case 0:d=d;
printf("%d",d);
}
return 0;
}
2.对其他你认为需要进行总结的内容进行总结。
(1)需掌握的:①字符常量②字符串常量和字符变量③switch语句④字符型数据的输入输出⑤复合语句
(2)需注意的:①在if和else后面总要用到{ }②当使用switch语句时,用break语句跳出。③“%c”输入时,空格字符和“转义字符”作为有效字符输入。在“%c”前加一个空格,忽略缓冲区内的空白字符(空格、回车、tab键)。
(三)实验总结
1.比较大小
(1)题目
本题要求将输入的任意3个整数从小到大输出。
(2)流程图


(3)源代码
# include<stdio.h>
int main(void)
{
int a,b,c,t;
scanf("%d %d %d",&a,&b,&c);
if(a>b)
{ t = a; a = b; b = t;}
if(a>c)
{t = a; a = c; c = t;}
if(b>c)
{t = b; b = c; c = t;}
printf("%d->%d->%d",a,b,c);
return 0;
}
(4)实验分析
比较简单,没有问题
(5)本题PTA提交列表

2.高速公路超速处罚
(1)题目
按照规定,在高速公路上行使的机动车,超出本车道限速的10%则处200元罚款;若超出50%,就要吊销驾驶证。请编写程序根据车速和限速自动判别对该机动车的处理。
(2)流程图


(3)源代码
#include<stdio.h>
#include<math.h>
int main (void)
{
double v,a,b;
scanf("%lf%lf",&v,&a);
if((v-a)/a*100<10)
{
printf("OK");
}
if((v-a)/a*100>=10&&(v-a)/a*100<50)
{
b=(double)(v-a)/a*100;
printf("Exceed %.0f%%. Ticket 200",b);
}
if((v-a)/a*100>=50)
{
b=(double)(v-a)/a*100.00;
printf("Exceed %.0f%%. License Revoked",b);
}
return 0;
}
(4)实验分析
问题1:流程图运行错误
原因:框图不对
解决办法:重新修改框图
(5)本题PTA提交列表

3.计算油费
(1)题目
现在90号汽油6.95元/升、93号汽油7.44元/升、97号汽油7.93元/升。为吸引顾客,某自动加油站推出了“自助服务”和“协助服务”两个服务等级,分别可得到5%和3%的折扣。
本题要求编写程序,根据输入顾客的加油量a,汽油品种b(90、93或97)和服务类型c(m - 自助,e - 协助),计算并输出应付款。
(2)流程图


(3)源代码
#include<stdio.h>
#include<math.h>
int main(void)
{
int a,b;
char c;
double yuan;
scanf("%d%d %c",&a,&b,&c);
if(c == 'm')
{
if(b == 90)
{
yuan = a*6.95*0.95;
printf("%.2f",yuan);
}
if(b == 93)
{
yuan = a*7.44*0.95;
printf("%.2f",yuan);
}
if(b == 97)
{
yuan = a*7.93*0.95;
printf("%.2f",yuan);
}
}
if(c == 'e')
{
if(b == 90)
{
yuan = a*6.95*0.97;
printf("%.2f",yuan);
}
if(b == 93)
{
yuan = a*7.44*0.97;
printf("%.2f",yuan);
}
if(b == 97)
{
yuan = a*7.93*0.97;
printf("%.2f",yuan);
}
}
return 0 ;
}
(4)实验分析
问题1:pta部分正确
原因:中间步骤拼写错误
解决办法:把错的拼写改正
(5)本题PTA提交列表

4.12-24小时制
(1)题目
编写一个程序,要求用户输入24小时制的时间,然后显示12小时制的时间。
(2)流程图


(3)源代码
#include <stdio.h>
int main (void)
{
int hour,minute,a;
char op;
scanf("%d%c%d",&hour,&op,&minute);
if(hour<12)
{
printf("%d%c%d AM",hour,op,minute);
}
else if (hour==12)
{
printf("%d%c%d PM",hour,op,minute);
}
else if (hour>12)
{
a=hour%12;
printf("%d%c%d PM",a,op,minute);
}
return 0 ;
}
(4)实验分析
没有问题
(5)本题PTA提交列表

(四)博客互评
http://www.cnblogs.com/luyu0322-/p/7765830.html
http://www.cnblogs.com/karry-5201314/p/7779360.html
http://www.cnblogs.com/wangqi1998/p/7777066.html
浙公网安备 33010602011771号