C语言程序设计第四次作业
1
1.三角形的面积和周长
源程序如下:
源程序(有错误的程序)
#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:
错误原因:括号添加的不完整使运行出现错误。
改正:在"( s - c )后加上")"即可。
错误信息2:
"if"包括的条件没有用大括号括起来,使else没有配对的if。
改正:把if后else前的内容用"{}"括起来。
错误信息3:
错误原因:三角形任意两边之和大于第三边,逻辑运算符使用错误。
改正:if条件句后的"||"都改成"&&"。
错误信息4:
错误原因:根据题意知a,b,c为整形变量。a,b,c定义类型有误。
改正:把a,b,c定义为int 型,格式控制串改为"%d",改正后紧接着有了如下问题。
错误信息4:
错误原因:因为a,b,c定义为整形,所以结果输出也是整形,导致结果出错。
改正:把" s = ( a + b + c ) / 2;"改为" s = ( a + b + c ) / 2.0"即可。
2学习总结
1.在编程解决问题的过程中,我们会用到多个if语句,if...else if... 语句以及switch语句,查阅资料,总结一下这三种情况的区别何在,并分别举例加以说明。
if语句在没有else语句和else if 语句前提下,一个或者多个if语句使用,系统会一致判定if语句直到结束,如果有else if 语句,系统判定如果else if 后条件符合要求就会终止判断,直接输出结果,若不符合判定下一个else if符合后再次终止判断,以此类推。switch选择语句在"switch"后也需要跟判别式,但是在case后只能跟单一数字或变量,若之后有break; 条件如果符合则终止判断,不符合继续执行,以此类推。若无break语句,则根据switch语句的穿透性,会一直判断,若结果都不符合,最后用default语句作结。如果是对区间范围的判断,用if语句和else if 语句更合适,因为case语句对区间范围判断只能逐一写出情况,十分复杂,并且当区间里值为无限个的时候,而switch语句又只能为整形,就无法达到要求,正如之前有做过的题目对学生成绩区间分类评优的题目,用if语句就能很好的区分区间,而switch语句则需要罗列所有情况。较为复杂。但如果是离散型变量,数据的话,适合使用switch语句,例如对学生班级的判断。同时if语句还可以和switch语句相互替换,前提是在区间时值的个数有限。 之后又经过上网查询得到进一步的区分如下:" 在多个判断条件的情况下,不仅可以使用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的遍历性,代码执行效率是不高的。" 由此段解释本人明白了switch语句会生成实际的case分支地址通过索引到达分支处的目的,效率更高的道理,进一步区分了他们之间的区别和他们的执行效率以及使用两种语句的不同情况。具体的链接如下:http://www.cnblogs.com/wankun/p/4989831.html
2.选择结构(2)其他总结:char型变量:它定义字符型变量,用"%c"表示,但同时也可以表示一些整形变量,但要注意范围限制在0——255 之间。注意字符变量和字符串变量的差别,字符常量是表示用单引号括起来的单个普通字符或者转义字符。而字符串常量是表示用双引号引起来的字符序列。同时也要注意不可以把字符串赋给字符变量。除此之外若无字符串变量,用字符数组存放较好。
不同类型数据运算先转换成同一类型。首先,精度由高到低为int——unsigned——unsigned long——double ,其次自动转换类型的:fioat——double,long——long unsigned ,unsigned short——unsigned ,char,short——int 。条件运算符:形式: "表达式1?表达式2:表达式3 " ,常用语赋值语句中,例如:
if(a>b)
{
max=a
}
else
{
max=b
}
就可以用如下代码段表示:
max=(a>b)?a:b
3实验总结
- 比较大小
流程图:
源程序如下图
#include <stdio.h>
int main()
{
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;
}
由于是较为简单的选择结构,所以在过程中并未出现问题。
提交列表:
2.高速公路超速处罚
流程图:
源程序:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int m,n;
double a;
scanf("%d %d",&m,&n);
a=(double)(m-n)*100/(double)n;
if(a<10||m<n)
printf("OK");
else if(a<50)
printf("Exceed %.0f%%. Ticket 200",a);
else
printf("Exceed %.0f%%. License Revoked",a);
return 0;
}
问题1.本人最初的程序如下:
由于最初没有定义a为double型,导致出现下图结果:
与要求输出结果不同。
改正:对a进行强制类型转换即可,如图:
即可出现正确结果。
其他方面并未出现问题。
提交列表:
3.计算油费
流程图:
源程序:
#include <stdio.h>
int main()
{
int a,b;
double money;
char c;
scanf("%d%d %c",&a,&b,&c);
switch(b)
{
case 90:money = a * 6.95;break;
case 93:money = a * 7.44;break;
case 97:money = a * 7.93;break;
}
switch(c)
{
case 'm':money = 0.95 * money;break;
case 'e':money = 0.97 * money;break;
}
printf("%.2f",money);
return 0;
}
问题:没有在“%c”前加空格导致空格会被缓存进输入的数据中,初次输入结果如图:
改正:在%c后加一个空格除去空格等的干扰即可。
由于对switch语句运用较为熟练,在c++上改正后提交正确,之后的运行中并未再出现其他问题。
提交列表:
4.12-24小时制
流程图:
源程序:
#include <stdio.h>
int main()
{
int a,b;
scanf("%d:%d",&a,&b);
if((a != 0 && a < 12) || a == 0)
{
printf("%d:%d AM",a,b);
}
else if(a > 12)
{
a = a - 12;
printf("%d:%d PM",a,b);
}
else
{
printf("%d:%d PM",a,b);
}
return 0;
}
问题1:未表明a=0的情况时会出现如下问题:
因为0也被认为是上午时间。
改正:在if条件句后加上条件a=0的情况即可。
提交列表:
4博客互评
任佳鹏:http://www.cnblogs.com/rjp123/p/7778689.html
许天笑:http://www.cnblogs.com/snxtx/p/7763856.html
李晓晓: