2.
if(表达式)语句1
else语句2
如:
if(x>y)t=x;
elset=y;
例:
输入一个百分制的成绩,输出其等级。
main()
{intmark;
scanf(“%d”,&mark);
if(mark>=90&&mark<=100)printf(“优\n”);
elseif(mark>=80&&mark<90)printf(“良\n”);
elseif(mark>=70&&mark<80)printf(“中\n”);
elseif(mark>=60&&mark<70)printf(“及格\n”);
elseif(mark>=0&&mark<60)printf(“不及格\n”);
elseprintf(“输入错误\n”);
}
说明:
1.〈表达式〉一般为逻辑表达式或关系表达式,也可以是其它类型的表达式(如:
整型,实型,字符型,指针型),以非0为真,0为假。
2.else前面有一个分号,但不要认为是两个语句,if~else~是一个完整的语句。
3.在if和else后面只能是一个语句,若需要多个语句完成,则应使用复合语句(用大括号{}将几个语句括起来)。
如:
求三角形a,b,c的面积。
#include“math.h”
main()
{floata,b,c,s,area;
scanf(“%f%f%f”,&a,&b,&c);
if(a+b>c&&a+c>b&&b+c>a)
{s=(a+b+c)/2;
area=sqrt(s*(s-a)*(s-b)*(s-c));
printf(“area=%f\n”,area);
}
elseprintf(“\n这不是一个三角形。
\n”);
}
例1:
输入两个实数,按从小到大排序输出。
main()
{floata,b,t;
scanf(“%f%f”,&a,&b);
if(a>b)
{t=a;a=b;b=t;}
printf(“%f%f”,a,b);
}
例2:
输入三个实数,按从小到大排序输出。
main()
{floata,b,c,t;
scanf(“%f%f%f”,&a,&b,&c);
if(a>b)
{t=a;a=b;b=t;}
if(a>c)
{t=a;a=c;c=t;}/*先求出三个数中最小的数放在a中。
*/
if(b>c)
{t=b;b=c;c=t;}
printf(“%f%f”,a,b,c);
}
二.if语句的嵌套
在if语句中又包含一个或多个if语句称为if语句的嵌套。
一般形式:
if()
if()语句1
else语句2
else
if()语句3
else语句4
注意:
if与else的配对关系:
if()
if()语句1
else语句2此else应与内层if配对,若要与外层if配对,应用如下方式:
if()
{if()语句1}
else语句2
观察如下几个程序段:
求函数的值。
三.条件运算符
一般形式:
表达式1?
表达式2:
表达式3
流程图:
条件运算符是C语言中唯一的一个三目运算符。
如:
if(a>b)max=a;
elsemax=b;
说明:
1.优先级:
如:
a>b?
a:
b+1相当于(a>b)?
a:
(b+1)
2.结合方向:
从右到左
如:
a>b?
a:
c>d?
c:
d相当于a>b?
a:
(c>d?
c:
d)
3.表达式1的类型可与表达式2和表达式3的类型不同。
表达式2的类型也可与表达式3的类型不同,此时条件表达式的值的类型为二者中较高的类型。
如:
x>y?
1:
1.5若x<=y时取值1.5,若x>y则取值1.0。
例:
输入一个字符,判别它是否大写字母,若是,将它转换成小写字母;否则不转换。
最后输出得到的字符。
main()
{charch;
scanf(“%c”,&ch);
ch=(ch>=’A’&&ch<=’Z’)?
(ch+32):
ch;
printf(“%c\n”,ch);
}
§4.4switch语句
if语句是两个分支选择语句,switch语句是多分支选择语句。
一般形式:
switch(<表达式>)
{case常量表达式1:
语句1
case常量表达式2:
语句2
…
case常量表达式n:
语句n
default:
语句n+1
}
例:
输入一个百分制的成绩,输出其等级。
main()
{intmark,tag;
scanf(“%d”,&mark);
tag=mark/10;
switch(tag)
{case10:
case9:
printf(“\n优”);break;
case8:
printf(“\n良”);break;
case7:
printf(“\n中”);break;
case6:
printf(“\n及格”);break;
case5:
case4:
case3:
case2:
case1:
case0:
printf(“\n不及格”);break;
default:
printf(“\n输入错误”);
}
}
说明:
1.switch后面的表达式一般为整型、字符型或枚举型(C标准只能这三种类型),ANSI标准允许任何类型的表达式。
2.执行过程:
先计算switch后面〈表达式〉的值,再与case中的常量进行比较:
若与某个case中常量相等,则执行其后的语句,以及此后的所有语句;
若与所有case中常量都不相等,则执行default之后的所有语句。
break语句:
中止switch语句的执行。
3.每个case的常量表达式值必须互不相同。
4.各个case的顺序可以是任意的。
每个case后面可以有多个语句。
default语句也可放在前面。
5.多个case可以共用一组执行语句。
§4.5程序举例
例:
求ax2+bx+c=0方程的解。
有以下几种可能性:
1.a=0不是二次方程;
2.b2-4ac=0有两个相等的实根=-b/(2*a);
3.b2-4ac>0有两个不等的实根:
4.b2-4ac<0有两个共轭复根:
#include“math.h”
main()
{floata,b,c,disc,x1,x2,p,q;
scanf(“%f%f%f”,&a,&b,&c);
if(fabs(a)<=1e-6)
printf(“不是二次方程。
\n”);
else
{disc=b*b-4*a*c;
if(fabs(disc)<=1e-6)
printf(“有两个相等的实根:
%f\n”,-b/(2*a));
else
if(disc>1e-6)
{x1=(-b+sqrt(disc))/(2*a);
x2=(-b-sqrt(disc))/(2*a);
printf(“x1=%f,x2=%f\n”,x1,x2);
}
else
{p=-b/(2*a);
q=sqrt(-disc)/(2*a);
printf(“两个复根:
\n”);
printf(“%f+%fi\n”,p,q);
printf(“%f-%fi\n”,p,q);
}
}
}