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
",area,perimeter);

    else
        printf("These sides do not correspond to a valid triangle
");

    return 0;        
    }

错误1:

原因1:
在第13行缺少右半括号
改正1:
将括号加上
错误2:

原因2:
else没有确切的if,因为在if语句下如果有多条语句,则需要加上大括号
改正2:将大括号加上
输出结果1正确:

输出结果2出现了错误:
错误3:

原因3:
构成三角形的条件应该是两边和大于第三边,并且是且的关系,而题目中写成了或的关系
改正3:将题目中的||改成&&
输出结果2正确:

(二)学习总结
1.在编程解决问题的过程中,我们会用到多个if语句,if...else if... 语句以及switch语句,查阅资料,总结一下这三种情况的区别何在,并分别举例加以说明。
1.首先他们都属于流程控制语句,在只需要判断一个条件的时候,自然是使用if语句方便有效;但是当判断条件很多的时候,我们可以使用多个if语句或者if...else if语句或者switch case语句。
2.if...else if语句和多个if语句的区别还是很大的,if...else if在任何一个环节满足条件的时候就将会终止判断,只处理一个满足条件的情况;而对于多个if语句,
将会对每一个判断条件进行判断,自然而然会导致程序的执行效率降低。在多个判断条件的情况下,使用if...else if语句相对于使用多个if语句而言,可以减少程序
的判断次数,提高效率。
3.在多个判断条件的情况下,不仅可以使用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的遍历性,代码执行效率是不高的。
4、例:用if语句
if(a>10)
//程序代码
if(a>20)
//程序代码
用if、、elseif语句
if(a>10&a<20){
//程序代码

}elseif(a<=20&a>30){

//程序代码

}

完成上面的代码对于switch来说,就是很麻烦的事情了

switch(number){
case 1:
        //程序代码
        break;
case 2:
        //程序代码
        break;
}
实现上面的功能用switch效率就会更高些
if语句在没有else语句和else if 语句前提下,一个或者多个if语句使用,系统会一致判定if语句直到结束,如果有else if 语句,系统判定如果else if 后条件符合要求就会终止判断,直接输出结果,若不符合判定下一个else if符合后再次终止判断,以此类推。在if语句中当判断结果为true也就时,就会进入到相应的if(或eleseif)中执行程序代码。然后跳出if...else 语句块执行if后面的程序代码,而switch则是当找到某一个case与判断条件一致时,进入到相应的case中执行代码,并查看是否该case中是否有break语句,如果有break则跳出switch,转到后面的程序代码执行,如果没有则会继续执行下面的case语句中的程序代码,直到遇到break或者switch完成,才转入到switch下面的代码进行执行
总结来说:在确切知道条件结果,并且结果有限下的条件下可以使用switch,在不能确切表示结果的情况下最好用if...else,在使用switch时候一定要注意break的使用。切记!切记!!
参考链接:http://www.cnblogs.com/wankun/p/4989831.html
2.对其他你认为需要进行总结的内容进行总结
(1)else 总是与它最近的if配对
(2)在switch,,,case 条件下,总是要加break来跳出循环,否则将都会执行,最后要加defaule.
(3)条件运算符的优先级,高于赋值运算符,但低于关系运算符和算术运算符。

(三)实验总结
一:(1)题目
本题要求将输入的任意3个整数从小到大输出。
输入格式:
输入在一行中给出3个整数,其间以空格分隔。
输出格式:
在一行中将3个整数从小到大输出,其间以“->”相连。
(2)流程图

(3)源程序

#include<stdio.h>
int main()
{   
   int x,y,z,temp;
   scanf("%d %d %d",&x,&y,&z);
   if(x>y)
   { temp=x;
     x=y;
     y=temp;

   }
   if(x>z)
   {
temp=z;
z=x;
x=temp;

   }
   if(y>z)
   {
temp=y;
y=z;
z=temp;


   }
   printf("%d->%d->%d",x,y,z);


   return 0;
}

(4)实验分析
没有太大问题,只是在开始的时候比较大小顺序弄反了
(5)本题提交列表

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

(3)源程序

 #include<stdio.h>
int main()
{   
   int x,y;
   double z;
 scanf("%d %d",&x,&y);
 z=(double)(x-y)/(double)y*100;
 if(z<10&&x>y)
 {
 printf("OK");
 }
 if(z>=10&&z<50)
 {  
 printf("Exceed %0.f%%. Ticket 200",z);
 }
 if(z>=50)
 {

 printf("Exceed %0.f%%. License Revoked",z);
 }
 return 0;

 }

(4)实验分析
(1)做题过程中没有注意整形与浮点型的转换,导致得出的结果是0,下次注意,少犯这种错误
(2)%在输出的时候要注意,两个%才可以输出一个,当时也没注意这个问题,导致结果不正确

(5)本题提交列表

三:(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位。
(2)流程图

(3)源代码

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

}

(4)实验分析
(1)if后边赋值需要写成==,而不是=,总是写错
(2)case后边需要加空格然后加数字,若直接加数字,也能运行,但结果错误,开始没注意这个问题,导致出现了错误
(5)提交列表

四:(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。
(2)流程图

(3)源程序

#include<stdio.h>
int main(void)
{
int t,m;
char c;
scanf("%d%c%d",&t,&c,&m);
if(a>12)
{
	t=t-12;
	printf("%d:%d PM",t,m);
}
else if(t==12)
{
	printf("%d:%d PM",t,m);
} 
else
{
	printf("%d:%d AM",t,m);
}
return 0;
}

(4)实验分析
这道题最开始没有读懂,不知道什么意思,后来写的时候没出现什么问题

(5)本题提交列表


四:博客互评
(1)折翼之舞http://www.cnblogs.com/longv587/p/7786770.html
(2)任佳鹏http://www.cnblogs.com/rjp123/p/7778689.html
(3)赵晓辉http://www.cnblogs.com/2205747462x/p/7784914.html

原文地址:https://www.cnblogs.com/xing--/p/7764421.html