printf("TheMinmunis%d\n",min);
}
3. if...else…if语句——多分支结构
前二种形式的if语句一般都用于两个分支的情况。
当有多个分支选择时,可采用if-else-if语句,其一般形式为:
if(条件表达式1)
语句1;
elseif(条件表达式2)
语句2;
elseif(条件表达式3)
语句3;
…
elseif(条件表达式m)
语句m;
else
语句n;
其语义是:
依次判断条件表达式的值
当出现某个值为真时,则执行其对应的语句。
然后跳到整个if语句之外继续执行程序。
如果所有的表达式均为假,则执行语句n。
然后继续执行后续程序。
if-else-if语句的执行过程如下图所示。
例:
判别键盘输入字符的是控制符、数字字符、大写字母或小写字母类别。
#include
voidmain()
{
charc;
printf("inputacharacter:
");
c=getchar();
if(c<32)
printf("Thisisacontrolcharacter\n");
elseif(c>='0'&&c<='9')
printf("Thisisadigit\n");
elseif(c>='A'&&c<='Z')
printf("Thisisacapitalletter\n");
elseif(c>='a'&&c<='z')
printf("Thisisasmallletter\n");
else
printf("Thisisanothercharacter\n");
}
4. 在使用if语句中还应注意以下问题:
1) 在三种形式的if语句中,在if关键字之后均为条件表达式。
该表达式通常是逻辑表达式或关系表达式,但也可以是其它表达式,如赋值表达式等,甚至也可以是一个变量。
例如:
if(a=5)语句;
if(b)语句;
都是允许的。
只要表达式的值为非0,即为“真”。
如在:
if(a=5)…;
中赋值表达式的值永远为非0,所以其后的语句总是要执行的,当然这种情况在程序中不一定会出现,但在语法上是合法的。
又如,有程序段:
if(a=b)
printf(“a=%d”,a);
else
printf("a=0");
本语句的语义是,把b值赋予a,如为非0则输出该值,否则输出“a=0”字符串。
这种用法在程序中是经常出现的。
2)在if语句中,条件判断表达式必须用括号括起来,在语句之后必须加分号。
3)在if语句的三种形式中,所有的语句应为单个语句,如果要想在满足条件时执行一组(多个)语句,则必须把这一组语句用{}括起来组成一个复合语句。
但要注意的是在}之后不能再加分号。
例如:
if(a>b)
{
a++;
b++;
}
else
{
a=0;
b=10;
}
例:
求三角形的面积。
#include
#include//为了引用函数要sqrt()
main()
{
floata,b,c;
printf("pleaseentera,b,c:
");
scanf("%f%f%f",&a,&b,&c);
if(a+b>c&&b+c>a&&c+a>b)
{
doubles,area;
s=(a+b+c)/2;
area=sqrt(s*(s-a)*(s-b)*(s-c));
printf("area=%4.4f\n",area);
}
else
printf("itisnotatrilateral!
\n");
return0;
}
运行程序:
pleaseentera,b,c:
456
area=9.9216
5.if语句的嵌套
当if语句中的执行语句又是if语句时,则构成了if语句嵌套的情形。
其一般形式可表示如下:
if(条件表达式)
if(条件表达式)语句1;
else语句2;
else
if(条件表达式)语句3;
else语句4;
注意:
在嵌套内的if语句可能又是if-else型的,这将会出现多个if和多个else重叠的情况,这时要特别注意if和else的配对问题。
例如:
if(表达式1)
if(表达式2)
语句1;
else
语句2;
其中的else究竟是与哪一个if配对呢?
应该理解为:
if(表达式1)
if(表达式2)
语句1;
else
语句2;
还是应理解为:
if(表达式1)
if(表达式2)
语句1;
else
语句2;
为了避免这种二义性,C/C++语言规定,else总是与它前面最近的if配对,因此对上述例子应按前一种情况理解。
在实现编程中,可以借且缩格形式或{}来确定else与if的配对关系,以提高程序的可读性。
例:
用if语句嵌套实现比较两个数的大小关系。
#include
main()
{
inta,b;
printf("pleaseinputA,B:
");
scanf("%d%d",&a,&b);
if(a!
=b)
if(a>b)
printf("A>B\n");
else
printf("A
else
printf("A=B\n");
return0;
}
说明:
这种问题用if-else-if语句也可以完成。
而且程序更加清晰。
因此,在一般情况下较少使用if语句的嵌套结构。
以使程序更便于阅读理解。
例:
用if-else-if结构实现比较两个数的大小关系。
#include
main()
{
inta,b;
printf("pleaseinputA,B:
");
scanf("%d%d",&a,&b);
if(a==b)printf("A=B\n");
elseif(a>b)printf("A>B\n");
elseprintf("A
return0;
}
例:
写一个程序,从键盘输入年份year,判断其是否是闰年。
闰年条件:
能被4整除,但不能被100整除的年份是闰年,或者能被400整除的年份是闰年,即year是闰年要满足的条件是:
year%4==0&&year%100!
=0||year%400==0
从而可以写出如下的程序:
#include
main()
{
intyear;
printf("Pleaseinputtheyear:
");
scanf("%d",&year);
if(year%4==0&&year%100!
=0||year%400==0)
printf("%disaleapyear\n",year);
else
printf("%disnotaleapyear\n",year);
return0;
}
注意:
简单的分支结构可以用条件表达式替代。
例如条件语句:
if(a>b)max=a;
elsemax=b;
可用条件表达式写为
max=(a>b)?
a:
b;
例:
将输入的大写字母转换为小写字母输出。
#include
main()
{
charch;
printf("Inputacharacter:
");
scanf("%c",&ch);
ch=ch>='A'&&ch<='Z'?
ch+32:
ch;
printf("%c\n",ch);
return0;
}
4.4switch语句——开关语句
C语言还提供了另一种用于多分支选择的switch语句,其一般形式为:
switch(表达式)
{
case常量表达式1:
语句1;
case常量表达式2:
语句2;
…
case常量表达式n:
语句n;
default:
语句n+1;
}
语义:
计算表达式的值。
并逐个与其后的常量表达式值相比较,当表达式的值与某个常量表达式的值相等时,即执行其后的语句,然后不再进行判断,继续执行后面所有case后的语句。
如表达式的值与所有case后的常量表达式均不相同时,则执行default后的语句。
例:
#include
main()
{
inta;
printf("inputintegernumber:
");
scanf("%d",&a);
switch(a)
{
case1:
printf("Monday\n");
case2:
printf("Tuesday\n");
case3:
printf("Wednesday\n");
case4:
printf("Thursday\n");
case5:
printf("Friday\n");
case6:
printf("Saturday\n");
case7:
printf("Sunday\n");
default:
printf("error\n");
}
return0;
}
程序运行情况:
inputintegernumber:
3
Wednesday
Thursday
Friday
Saturday
Sunday
error
说明:
①本程序是要求输入一个数字,输出一个英文单词。
但是当输入3之后,却执行了case3以及以后的所有语句,输出了Wednesday及以后的所有单词。
②在switch语句中,“case常量表达式”只相当于一个语句标号,表达式的值和某标号相等则转向该标号执行,但不能在执行完该标号的语句后自动跳出整个switch语句,所以出现了继续执行所有后面case语句的情况。
这是与前面介绍的if语句完全不同的,应特别注意。
③C语言还提供了一种break语句,专用于跳出switch语句,break语句只有关键字break,没有参数。
例:
#include
main()
{
inta;
printf("inputintegernumber:
");
scanf("%d",&a);
switch(a)
{
case1:
printf("Monday\n");break;
case2:
printf("Tuesday\n");break;
case3:
printf("Wednesday\n");break;
case4:
printf("Thursday\n");break;
case5:
printf("Friday\n");break;
case6:
printf("Saturday\n");break;
case7:
printf("Sunday\n");break;
default:
printf("error\n");break;
}
return0;
}
程序运行情况:
inputintegernumber:
3
Wednesday
在使用switch语句时还应注意以下几点:
1)在case后的各常量表达式的值不能相同,否则会出现错误。
表达式和各case后面的常量表达式的类型为字符型、整型或枚举型——表示地址标号。
2)在case后,允许有多个语句,可以不用{}括起来。
3)若在每个case子句后都设置有break语句,则各case和default子句的先后顺序可以变动,而不会影响程序执行结果。
4)default子句可以省略不用。
5)switch语句允许嵌套使用。
4.5选择结构程序设计举例
例1:
任意顺序输入三个整数,按从大到小的顺序输出这三个数。
#include
main()
{
inta,b,c,temp;
printf("inputthreenumbers:
");
scanf("%d%d%d",&a,&b,&c);
if(a
if(aif(bprintf("%d%d%d\n",a,b,c);
return0;
}
例4.6根据学生成绩判断等级。
#include
voidmain()
{
intscore;
printf("Inputscore:
");
scanf("%d",&score);
switch(score/10)
{
case10:
case9:
printf("%d:
A\n",score);
break;
case8:
case7:
printf("%d:
B\n",score);
break;
case6:
printf("%d:
C\n",score);
break;
default:
printf("%d:
D\n",score);
}
}
例4.7:
求ax2+bx+c=0方程的根,a,b,c由键盘输入,设b2-4ac>0。
求根公式为:
令
,
则x1=p+q,x2=p-q
源程序如下:
#include
#include
voidmain()
{
floata,b,c;//输入带小数点的数,宜定义为float
doubledisc,x1,x2,p,q;
printf("Pleaseinputthreenumbers:
");
scanf("%f%f%f",&a,&b,&c);
disc=b*b-4*a*c;
p=-b/(2*a);
if(fabs(a)==0)
printf("Theequationisnotaquadratic.\n");
elseif(disc==0)
{
printf("Theequationhastwoequalroots:
");
printf("%8.4f\n",p);
}
elseif(disc>0)
{
printf("Theequationhasdistinctrealroots:
\n");
q=sqrt(disc)/(2*a);
x1=p+q;x2=p-q;
printf("%8.4f,%8.4f\n",x1,x2);
}
elseif(disc<0)
{
printf("Theequationhasdistincimageroots:
\n");
q=sqrt(-disc)/(2*a);