代码改变世界

C语言程序设计第四次作业——选择结构(2)

2017-11-05 18:10  李志伟  阅读(1264)  评论(0编辑  收藏  举报

(一)改错题
输出三角形的面积和周长,输入三角形的三条边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:

错误原因:if后的语句缺少大括号。
改正方法:把if后的语句加上括号。
错误信息3:

错误原因:if后的判断语句错误。
改正方法:将if后的“||”改成“&&”。
(二)学习总结
1.在编程解决问题的过程中,我们会用到多个if语句,if...else if... 语句以及switch语句,查阅资料,总结一下这三种情况的区别何在,并分别举例加以说明。禁止大段复制,要自己对资料进行归纳总结,并给出你参考的资料链接。

1》if,else if需要接判断表达式,只有在满足条件的时候执行而else语句是在前面条件都不满足的时候才能执行
2》一个if...else if...else语句中可以有多个else if语句,但是最多只能有一个else语句
3》 if语句可以不需要else if或者else语句,可独立成分支逻辑,但是else if和else必须要有if引导,如果不能找到对应的if语句,也会报错。
4》 嵌套使用的时候else if和else遵循就近原则,和上面最靠近该语句的if语句匹配。
5》两个并排的if语句是可以同时发生的 if 和else if里面的语句是不能同时发生的.
6》if-else语句更适合于对区间(范围)的判断,而switch语句更适合于对离散值的判断.
7》switch用来根据一个整型值进行多路分支,并且编译器可以对多路分支进行优化,所以在多路分支时用switch比if..else if .. else结构要效率高。
⑵示例
判断65分到85分之间的学生有哪些适合用if-else语句,因为[65,85]是区间;
而判断一个学生的班级是一班、二班还是三班适合用switch语句,因为一班、二班、三班是离散值。
⑶资料链接
https://zhidao.baidu.com/question/303497983.html
https://zhidao.baidu.com/question/332651860.html
(三)实验总结
1.比较大小(10 分)
(1)题目
本题要求将输入的任意3个整数从小到大输出。
输入格式:
输入在一行中给出3个整数,其间以空格分隔。
输出格式:
在一行中将3个整数从小到大输出,其间以“->”相连。
输入样例:
4 2 8
输出样例:
2->4->8
(2)流程图

(3)源代码

#include <stdio.h>
int main(void)
{
int A,B,C,D;
scanf("%d %d %d",&A,&B,&C);
if(A<B)
{
	D=A;
	A=B;
	B=D; 
}
if(A<C)
{
	D=A;
	A=C;
	C=D;
}
if(B<C)
{
	D=B;
	B=C;
	C=D;
}
printf("%d->%d->%d",C,B,A);

return 0;

}

(4)实验分析
没问题
(5)本题PTA提交列表

2.高速公路超速处罚
(1)题目
按照规定,在高速公路上行使的机动车,超出本车道限速的10%则处200元罚款;若超出50%,就要吊销驾驶证。请编写程序根据车速和限速自动判别对该机动车的处理。
输入格式:
输入在一行中给出2个正整数,分别对应车速和限速,其间以空格分隔。
输出格式:
在一行中输出处理意见:若属于正常行驶,则输出“OK”;若应处罚款,则输出“Exceed x%. Ticket 200”;若应吊销驾驶证,则输出“Exceed x%. License Revoked”。其中x是超速的百分比,精确到整数。
输入样例1:
65 60
输出样例1:
OK
输入样例2:
110 100
输出样例2:
Exceed 10%. Ticket 200
输入样例3:
200 120
输出样例3:
Exceed 67%. License Revoked
(2)流程图

(3)源代码

#include <stdio.h>
int main(void)
{
int A,B;
double C;
scanf("%d %d",&A,&B);
C = (double)(A - B) * 100 / B;
if(C<10)
{
	printf("OK");
}
else if(C>=10 && C<50)
{
	printf("Exceed %.0f%%. Ticket 200",C);
}
else
{
	printf("Exceed %.0f%%. License Revoked",C);
}

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 - 协助),计算并输出应付款。
输入格式:
输入在一行中给出两个整数和一个字符,分别表示顾客的加油量a,汽油品种b(90、93或97)和服务类型c(m - 自助,e - 协助)。
输出格式:
在一行中输出应付款额,保留小数点后2位。
输入样例:
40 97 m
输出样例:
301.34
(2)流程图

(3)源代码

#include <stdio.h>
int main(void)
{
int a,b;
double d,h;
char c;
scanf("%d %d %c",&a,&b,&c);
switch(b)
{
	case 90: d = 6.95; break;
	case 93: d = 7.44; break;
	case 97: d = 7.93; break;
}
switch(c)
{
	case 'm': h = 0.95; break;
	case 'e': h = 0.97; break;
}
printf("%.2f",a*d*h);

return 0;
}

(4)实验分析
输入字母不要忘记定义char型。
(5)本题PTA提交列表

4.12-24小时制
(1)题目
编写一个程序,要求用户输入24小时制的时间,然后显示12小时制的时间。
输入格式:
输入在一行中给出带有中间的:符号(半角的冒号)的24小时制的时间,如12:34表示12点34分。当小时或分钟数小于10时,均没有前导的零,如5:6表示5点零6分。
提示:在scanf的格式字符串中加入:,让scanf来处理这个冒号。
输出格式:
在一行中输出这个时间对应的12小时制的时间,数字部分格式与输入的相同,然后跟上空格,再跟上表示上午的字符串AM或表示下午的字符串PM。如5:6 PM表示下午5点零6分。注意,在英文的习惯中,中午12点被认为是下午,所以24小时制的12:00就是12小时制的12:0 PM;而0点被认为是第二天的时间,所以是0:0 AM。
输入样例:
21:11
输出样例:
9:11 PM
(2)流程图

(3)源代码

#include <stdio.h>  
int main()  
{  
 int hour,c, minute;  
scanf("%d %c %d",&hour,&c,&minute);  
if(hour>=0 && hour<12)  
{
	printf("%d:%d AM\n",hour,minute);
}  
else if(hour==12)  
{
	printf("12:%d PM\n",minute );  
}
else  
{
    printf("%d:%d PM\n",hour-12,minute);  
}
return 0;  
}   

(4)实验分析
当输入十二点时输出格式错误,当输入12时应输出12,而不用12-12。
(5)本题PTA提交列表

(四)博客互评
⑴评论胡芳浩的作业:http://www.cnblogs.com/hfh0420/
内容很具体,格式正确。
⑵评论吴晗的作业:http://www.cnblogs.com/moying456/
第二题例子举出的很具体,值得学习。
⑶评论许天笑的作业:http://www.cnblogs.com/snxtx/
思路很好,内容具体,希望以后排版更好。