一个分支结构的程序关键在于条件的描述和实现分支结构的语句。
1.if 语句
C语言的if语句有三种形式,分别适应不同的分支结构。
1.1简单的 if 语句
一般形式:if(表达式){语句}
执行流程:计算表达式的值,若值为0(即“真”),则执行指定语句,否则直接执行if语句的下一条语句(在C语言中,“0”为假,“非0”为真)。
在简单的if语句中,当if子句在语法上是一个语句时,两边的花括号“{}”可以不写,但如果包含多个语句,必须要用花括号“{}”括起来组成复合语句。
如: if(a>0) {b++ ;} 也可以写成:if(a>0) b++ ;
例1:输入整数x,根据下面的分段函数计算y的值。
y=
编程思路:x为任意整数,有3种取值的可能,只有通过判断才能确定具体的取值情况,以便给y赋值。本次解答只采用3个简单的if语句来完成的取值判断。
#include<stdio.h>
int main()
{
int x,y;
printf("输入整数x:");
scanf("%d",&X);
if(x>0)
y=x+1;
if(x==0)
y=x;
if(x<0)
y+x-1;
printf("%d=y",y);
return o;
}
输入 60 ,得到的结果为:
1.2 双分支 if 语句(if-else 形式)
简单的if语句只在条件为“真”时执行指定操作。而双分支if语句,在条件为“真”或为“假”时都有要执行的操作。
1)一般形式
if(表达式)
{ 语句 1}
else
{ 语句 2}
2)执行流程
计算表达式的值,若表达式的值为非0(即“真”),则选择执行语句1,否则执行语句2。
举一个例子:判断整数i的奇偶性:
if(i%2==0)
printf("i是偶数");
else
printf("i是奇数");
注意事项:
(1)if-else语句中的else子句可以省略,不带else子句时就是简单的if语句。
(2)else子句不能作为单独的语句使用,它是if语句的一部分,必须与if搭配使用。
(3)如果if子句或else子句只有一条语句,“{}”可以省略,如上面的例子,但是包含多个语句时,必须要用“{}”括起来组成复合语句。
(4)C语言没有行的概念,因此if-else语句可以写在一行,也可以分多行书写。
(5)使用if语句时,不要随意加分号,否则会造成语法错误。(if或else后面没有分号)
(6)书写代码时,为了提高程序的可读性,if应与else对齐,而子句均向右推进(这样还起到整体书写的代码整齐的作用)。
例2:火车站托运行李,从甲地到乙地,按规定每张客票托运行李不超过50kg,按每千克1.35元计算运费,如超过50kg,超过的部分按每千克2.65元计算运费。编写程序计算托运费。
程序代码如下:
#include<stdio.h>
int main()
{
float a,b;
printf("请输入行李的重量");
scanf("%f",&b); //这里是浮点型,所以用%f而不是整型%d.
if(b<=50)
a=b*1.35;
else
a=50*1.35+(b-50)*2.65;
printf("您的行李托运费为:%.2f\n",a); //"%.2f":限定小数位数,希望小数点后面只保留两位。
return 0;
}
1.3条件表达式
双分支结构除了用if-else语句实现外,还可以使用条件表达式实现。
条件表达式的一般形式为:
表达式1?表达式2:表达式3
其中,表达式1、表达式2、表达式3可以是任何符合C语言规定的表达式,如:a>b?a:b(又叫三目操作符)。
条件表达式的运算过程为:先计算表达式1,如果表达式1的结果为真,则计算表达式2的值,并将其作为条件表达式的值;如果表达式1的结果为假,则计算表达式3的值,并将其作为条件表达式的值。
条件表达式通常应用于赋值语句之中。条件运算符的优先级高于赋值运算符,但低于关系运算符和算数运算符。例如:语句“if(a>b)max=a;else max=b;”可用条件表达式描述为"max=(a>b)?a:b;",如果a>b,max取a的值,否则max取b的值。
例3:任意提供2个整数,找出其中的大数。
用条件表达式解答如下:
#include<stdio.h>
int main()
{
int a,b,max;
printf("请输入两个数据:")
scanf("%d%d",&a,&b);
max=(a>b)?a:b;
printf("二者中的大数为:%d\n",max);
return 0;
}
用if-else语句解答如下:
#include<stdio.h>
int main()
{
int a,b,max;
printf("请输入两个数据:");
scanf("%d%d",&a,&b);
if(a>b)
max=a;
else
max=b;
printf("二者中的大数为:%d\n",max);
return 0;
}
1.4多分支if语句(if-else-if形式)
在实际应用中,存在大量的多分支问题。多分支if语句就是用来实现多分支结构的语句。
1)一般形式
if(表达式1)
语句1
else if(表达式2)
语句2
....
else if(表达式n)
语句n
else
语句n+1
2)执行流程
依次计算并判断表达式i(i为1~n),当表达式i的值为非0时,选择执行其后的语句;当表达式i的值都为0时,则执行语句n+1。
在多分支if语句中,表达式1的优先级最高,表达式2次之,无论执行完哪个分支语句,接下来都要转到多分支if语句的后续语句继续执行。
例4:对学生的考试成绩进行等级评价,90分以上为优秀,80~90分为良好,60~80分为及格,60分以下为不及格。请输入一个学生的成绩,判断其属于哪个等级。
程序代码如下:
#include<stdio.h>
int main()
{
int score;
printf("请输入分数:")
scanf("%d",score);
if(score>=90)
printf("%d----------优秀\n",score);
if(score>=80)
printf("%d----------良好\n",score);
if(score>=60)
printf("%d----------及格\n",score);
else
printf("%d----------不及格\n,score):
return 0;
}
2.switch语句
switch语句是又一个描述多分支结构的语句。switch语句是一种特殊形式的if...else结构,用于判断条件有多个结果的情况。它是把多重的else if 改成更易用,可读性更好的形式。
1)一般形式:
switch(测试表达式)
{ case 常量表达式1:语句1;
case 常量表达式2:语句2;
..........
case 常量表达式n;语句n;
default:语句n+1;
}
2)执行流程
(1)先计算测试表达式的值。
(2)用测试表达式的值顺次同case后常量表达式的值进行比较。
(3)若找到值相等的常量表达式,则执行该常量表达式冒号后的语句(这是入口)。注意,该语句执行后,程序会依次执行其后的所有冒号后面所有的语句。
(4)若找不到匹配的常量表达式的值,则执行default后面的语句。
(5)问题:在switch语句中的case子句和default子句有顺序要求吗?default只能放在最后吗?
解答: 其实,在switch语句中case语句和default语句是没有顺序要求的,只要你的顺序满足实际需求就可以。 不过,我们通常是把default子句放在最后处理。
3)switch语句说明
(1)switch后面测试表达式的值的类型只能是整型数据或字符型数据。
(2)常量表达式通常是整型常量或字符型常量。
(3)case与常量表达式之间必须用空格隔开。
(4)每个case后的常量应不相同。
(5)switch语句体必须用“{}”括起来。
(6)当case后包含多个语句时,可以不用花括号括起来,系统会自动识别并顺序执行所有语句。
(7)为了得到预期的输出结果,解决办法是在switch语句中使用break语句。
(switch也是分支效果的,只有在switch1语句中使用break才能跳出switch语句,如果某一个case语句的后边没有break语句,代码会继续往下执行,有可能执行其他case语句中的代码,直到遇到break语句,或者switch语句结束。所以在switch语句中的break语句是非常重要的,能实现真正的分支效果。)
接下来就用例4的例子具体分析一下吧。
用switch语句处理多分支问题时,首先要确定switch后的测试表达式。由于测试表达式的值只能是整型数据。再考虑到成绩的分布特点,测试表达式确定为score/10。
90<=score<=100时,score/10的取值分别为10、9;
80<=score<90时,score/10的取值分别为 8;
60<=score<80时,score/10的取值分别为7、6;
score<60时,score/10的取值均小于6.
根据测试表达式的各种取值情况,确定case后常量表达式的值。
程序代码如下:
#include<stdio.h>
int main()
{
int score,mark;
printf(" 请输入成绩:/n");
scanf("%d",&score);
mark=score/10;
switch(mark)
{
case 10:
case 9:printf("%d..........优秀\n",score);break;
case 8:printf("%d..........良好\n",score);break;
case 7:
case 6:printf("%d..........及格\n",score);break;
defauit:
printf("%d..........不及格\n",score);break;
}
return 0;
}
//本例中,标号10和9,7与6执行的操作是相同,在switch语句中,当相连接的case语句标号不同而
//执行的操作相同时,前面的case标号后的语句可省略,直接执行下面的语句。
输入95,得到的结果为:
值得注意的是:虽然switch语句需要break语句配合才能实现程序的分支结构功能,但是程序中也经常需要借助switch语句自身的执行特点解决问题。
3.总结:
了解了以上的知识,让我们来简单的总结一下吧:
(1)分支结构。分支结构分为双分支结构和多分支结构。一般情况下,双分支用简单的if语句或if-else语句实现,两个以上的多分支情况用if-else-if语句或switch语句实现。但是,有时候用多个简单的if语句实现多分支结构也是个不错的选择。
(2)描述条件。分支结构中的描述条件的表达式可以是C语言的任意一种表达式,但是通常会用关系表达式和逻辑表达式表示。关系表达式表示单一条件,逻辑表达式表示几个单一条件符合的复杂条件。
(3)if语句。复合形式:{语句1;语句2: ···},其在语法上被看成一个语句。其在循环结构中的复合语句中经常会用到。
(4)switch语句。switch语句有时候会不带break语句,利用switch语句自身的执行特点解决问题。
(5)语句嵌套。if 语句和switch 语句都可以嵌套,但是,嵌套会降低程序的可读性。