文章目录
- 第4章 选择结构程序设计
- 一、用 if 语句实现选择结构
- 二、用 switch 语句实现多分支选择结构
- 三、条件运算符和条件表达式
第4章 选择结构程序设计
一、用 if 语句实现选择结构
-
一般形式:
if (表达式) 语句1
[ else 语句2 ] -
其他形式,常用的有以下三个:
-
(1)if (表达式) 语句1
-
(2)if (表达式)
语句1
else
语句2 -
(3)if (表达式1) 语句1
else if (表达式2) 语句2
else if (表达式3) 语句3
…
else if (表达式m) 语句m
else 语句m+1
-
- 【说明】
-
整个 if 语句可以写在多行上,也可以写在一行上
//写法1 if (number>500) cost=0.15; else if (number>300) cost=0.10; else if (number>100) cost=0.075; else if (number>50) cost=0.05; else cost=0; //写法2(推荐这种写法) if(number>500) cost=0.15; else if(number>300) cost=0.10; else if(number>100) cost=0.075; else if(number>50) cost=0.05; else cost=0;
-
常用形式(3)中的
语句1
~语句m+1
都是 if 语句的内嵌语句
,它们是 if 语句中的一部分。每个内嵌语句结尾都要有分号(它是语句组成的成分),否则出现语法错误。if(x>0) y=1; //结尾必须有分号 else y=-1; //结尾必须有分号
-
if 语句无论写在几行上,都是一个整体,属于同一个语句。不要认为 if 部分是一个语句,else 部分是一个语句。注意:else 子句不能作为语句单独使用,它必须是 if 语句的一部分,与 if 配对使用。
-
语句1
~语句m
可以是一个简单的语句,也可以是一个包括多个语句的复合语句(用花括号括起来)。if(x>0) {y=1;z=2; } else {y=-1; z=9; }
-
内嵌语句也可以是一个if语句。
如用 if 语句表示阶跃函数:
y = { 1 ( x > 0 ) 0 ( x = 0 ) − 1 ( x < 0 ) y=\left\{ \begin{aligned} 1 \ \ \ (x>0)\\ 0 \ \ \ (x=0)\\ -1 \ \ \ (x<0)\\ \end{aligned} \right. y=⎩ ⎨ ⎧1 (x>0)0 (x=0)−1 (x<0)if(x<0) y=-1; else //内嵌语句是一个 if 语句,它也是else的一部分 {if(x==0)y=0;elsey=1; }
-
在 if 语句中要对给定的条件进行检查,判定所给定的条件是否成立。判断的结果是一个逻辑值“是”(“真”)或“否”(“假”)。
- 示例:实现输入x的值,输出y相应值
y = { x ( x < 1 ) 2 x − 1 ( 1 ≤ x < 10 ) 3 x − 11 ( x ≥ 10 ) y=\left\{ \begin{aligned} &x \ \ \ &(x<1)\\ &2x-1 \ \ \ &(1\leq x<10)\\ &3x-11 \ \ \ &(x\geq 10)\\ \end{aligned} \right. y=⎩ ⎨ ⎧x 2x−1 3x−11 (x<1)(1≤x<10)(x≥10)
#include <stdio.h>
int main(void)
{int x,y;printf("输入x:");scanf("%d",&x);if(x<1){y=x;printf("x=%d,y=x=%d\n",x,y);}else if(x>=1 && x<10){y=2*x-1;printf("x=%d,y=2*x-1=%d\n",x,y);}else{y=3*x-11;printf("x=%d,y=3*x-11=%d\n",x,y);} 2
}
运行结果1:
运行结果2:
运行结果3:
二、用 switch 语句实现多分支选择结构
- 一般形式:
- switch (表达式)
{
case 常量1 : 语句1
case 常量2 : 语句2
…
case 常量n : 语句n
default : 语句n+1
}
- 【说明】
-
上面 switch 一般形式中括号内的
表达式
,其值的类型应为整数类型(包括字符型)。switch(a+b)//a+b的值是整数 {case 2: break;case 33: break;case 'a': break;default: break; }
-
switch 下面的花括号内是一个复合语句。
- 这个复合语句包括若干语句,它是switch语句的语句体。
- 语句体内包含多个以关键字 case 开头的语句行和最多一个以 default 开头的行。
- case 后面跟一个常量(或常量表达式),如case ‘A’,它们和 default 都是起标号的作用,用来标志一个位置。
- 执行 switch 语句时,先执行 switch 后面表达式的值,然后将它与 case 标号比较,如果与某一个 case 标号中的常量相同,流程就转到此 case 标号后面的语句。如果没有与 switch 表达式相匹配的 case 常量,流程转去执行 default 标号后面的语句。
-
可以没有 default 标号,此时如果没有与 switch 表达式相匹配的 case 常量,则不执行任何语句,流转到 switch 语句的下一个语句。
-
各个 case 标号出现次序不影响执行结果。
-
每一个 case 常量必须互不相同;否则就会出现互相矛盾的现象。但是如果语句后面加上 break 则执行到 break 后跳出 switch 语句。
-
case 标号只起到标记的作用,不作条件检查。
-
在 case 子句中虽然包含了一个以上执行语句,但可以不必用花括号括起来,会自动执行 case 后面所有的语句。当然加上大括号也可以。
-
多个 case 标号可以共用一组执行语句。
case 'A': case 'B': case 'C':printf(">60\n");break; ...
- 示例:功能要求:输入学生分数,百分制,输出学生的等级。
(1)90分以上为等级A
(2)80-89分为等级B
(3)70-79分为等级C
(4)60-69分为等级D
(5)60分以下为等级E
#include <stdio.h>
int main(void)
{float score;char grade;printf("请输入学生的成绩:");scanf("%f",&score);while(score>100 || score<0){printf("\n输入错误,请重新输入:");scanf("%f",&score);}switch((int)(score/10)){case 10:case 9:grade='A';break;case 8:grade='B';break;case 7:grade='C';break;case 6:grade='D';break;default:grade='E';break;}printf("学生成绩等级为 %c\n",grade); return 0;
}
运行测试结果1:
运行测试结果2:
三、条件运算符和条件表达式
-
条件运算符:由两个符号(?和:)组成,必须一起使用。
要求3个操作对象,称为三目(元)运算符,它是C语言中唯一的一个三目运算符。
-
条件表达式的一般形式为:
-
表达式1 ? 表达式2 : 表达式3
-
执行顺序:
-
【说明】
- 条件运算符的执行顺序:先求解表达式1,若为非0(真)则求解表达式2,此时表示2的值就作为整个条件表达式的值。若表达式1的值为0(假),则求解表达式3,表达式3的值就是整个条件表达式的值。
//赋值表达式 max=(a>b)?a:b;//功能:将a和b二者中的大者赋给max
- 条件运算符优先级高于赋值运算符,所以以上示例赋值表达式中,先求解条件表达式,再将它的值赋给max。
- 条件表达式后面加一个分号就是一个独立的语句。
//赋值表达式形式 max=(a>b)?a:b; //条件表达式语句形式 (a>b)?(max=a):(max=b); //相当于 if(a>b) max=a; else max=b; //还可以写成以下形式 (a>b)?printf("%d",a):printf("%d",b); //相当于 if(a>b) printf("%d",a); else printf("%d",b);
- 示例:输入一个字符,判断它是否是大写字母,如果是,将它转换成小写字母并输出。
#include <stdio.h>
int main(void)
{char ch;
scanf("%c",&ch);
ch=(ch>='A' && ch<='Z')?(ch+32):ch;printf("%c\n",ch);return 0;
}
运行结果:
本节完