C语言程序设计第四次作业--选择结构(2)
(一)改错题
输出三角形的面积和周长,输入三角形的三条边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、错误信息:
错误原因:
sqrt后面的括号必须是成对出现的,不可单个出现。
改正方法:
在13行后面最后的分号前面加一个括号,和前面sqrt后面的一个括号配成对。
2、错误信息:
错误原因:
else没有与之配对的if。
改正方法:
前面的if下面的内容没有用大括号括起来并且最好把else下面的内容也加上一个大括号,看起来有整体感清晰明了。
3、错误信息:
错误原因:
编译没错后,开始输入进行运行的测验,发现再输入1 4 1这个组不成三角形的三个边长是输出的不是These sides do not correspond to a valid triangle,经检验发现在编译的语句中if后面的条件错了。
改正方法:
应该把if后面括号里面的“||”都改成“&&”。
最后输出正确结果。
改正后正确的代码
#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、if else和 if与switch的区别
if ...else和if ...else if的区别在于else后面不能再加条件的限制,但是else if后面可以继续加条件。switch用来根据一个整型值进行多路分支,并且编译器可以对多路分支进行优化,所以在多路分支时用switch比if..else、if结构要效率高。并且if else、 if是先判断switch是后判断的,如果判断的种类较少可以使用if语句如果比较复杂情况相对较多大多数使用switch语句。
switch针对单一变量或者语句,if可以包裹变量及其以外的,if范围大,但是写出来不如switch简明。switch()的所有case都是针对同一个表达式的,而if...else可以随意怎么设置条件。看你的需要去用。IF/ELSE可以处理复杂的逻辑关系,用switch/case处理的都可以用IF/ELSE处理,但是switch/case有局限性,说个例子给你听
关于个人所得税的征收
超过800低于1600部分 收1%
超过1600低于5000部分 收2%
超过5000低于20000部分 收3%
超过20000低于100000部分 收4%
乍一看这题好像是switch/case比较省事,但是再实际过程中会发现每个CASE之间数字的跨度不一样,到后面会越来越大,无法用简单办法处理。这样用IF/ELSE就十分方便了
当然能用switch/case的话可以减少不少代码的输入。
这三个分别来举例子说明一下。if else 大多会用于条件和条件之间有联系的。
#include <stdio.h>
int main(void){
int a, b;
printf("input two numbers: ");
scanf("%d%d",&a,&b);
if(a>b)
printf("max=%d\n",a);
else
printf("max=%d\n",b);
return 0;
}
if 语句大多运行在条件和条件之间并无太大关系的写完一条语句的限制接着写另一个限制。
#include <stdio.h>
int main(void){
int a,b,max;
printf("\n input two numbers: ");
scanf("%d%d",&a,&b);
max=a;
if (max<b) max=b;
printf("max=%d",max);
return 0;
}
switch语句限制性比较大,但是方便简单。
#include<stdio.h>
int main()
{
int n,x;
printf("What's the result?\n");
scanf("%d",&n);
x=n/10;
switch(x)
{
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");
break;
}
}
借鉴网址:http://wenwen.sogou.com/z/q659544857.htm
http://wenwen.sogou.com/z/q741234908.htm
http://wenwen.sogou.com/z/q658989739.htm
https://zhidao.baidu.com/question/151766890
2、对其他方面的总结
在本章中,我们主要学习的是选择结构,switch case和if else语句的使用和字符语句的常量变量以及语句的输入输出的各种形式,还有ASCII码的简单介绍。ASCII码和字母数字等等的简单转化。同时也讲到了char在电脑里的储存方式,在使用char语句是还引入了一个新的输入与输出的方式。getchar()和putchar的使用。随机函数rand()在C语言的使用。或者给出他一定的限制该人如何在1到100里面的随机产生数字的使用。但是在使用随机变量时一定要在开头加上一个#include<stdlib.h>才可以进行,在最后我们还提到了在产生随机数字时如果不改变它的种子是一样的产生的随机数字也都是一样的。所以又讲了一个新的变量那就是时间,在我们的身边不能随人们的意愿改变而改变的就是时间时间是无时无刻不再变化的所以引入了#include<time.h> srand(time(NULL));的使用,让随机变量一次次都不一样的出现。]
(三)实验总结
1、题目
7-2 比较大小
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、实验分析
问题:
使用raptor时输不出结果。
原因:
raptor中输入输出需要用引号括主,循环语句中不需要。
解决办法:
在输出语句是加上英文半角双引号。
问题:
提交到pta上不对。
原因:
最后输出格式不对,没有复制粘贴老师的格式。
解决办法:
改正自己的格式即可。
5、本题提交列表
1、题目
7-4 高速公路超速处罚
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、实验分析
问题:
原因:
在小于百分之十时应该输出OK,但是没有加引号,导致找不到结果没有办法输出,错误提醒。
解决办法:
在OK输出框内加上引号。
5、本体提交列表
1、题目
7-6 计算油费
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*67.44*0.97;
printf("%.2f",yuan);
}
if(b == 97)
{
yuan = a*7.93*0.97;
printf("%.2f",yuan);
}
}
return 0 ;
}
4、实验总结
问题:
找不到结果。
原因:
判断不出来m e。
解决办法:
把c=m 改成c="+m+"即可。
5、本题pta提交列表
1、题目
7-8 12-24小时制
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/he111923/p/7772093.html