第三章 选择结构程序设计
第一节 if语句
-
3.1 if语句的一般形式
-
if 语句包含3中形式:
-
if (表达式) 语句
-
if (表达式) 语句1
else 语句2
-
if(表达式1) 语句1
else if (表达式2) 语句2
else if (表达式3) 语句3
··· ···
else if (表达式m) 语句m
else 语句m+1
-
-
表达式:可以是关系表达式、逻辑表达式,甚至是数值表达式。
- 关系表达式:两个数值进行比较的式子。
- else - if 多分支语句:从前往后计算各个表达式的值,如果某个表达式的值为真,则执行对应的语句,并终止整个多分支结构的执行。如果上述所有表达式均不成立,即均为逻辑假时,则执行对应的 else 部分。else 部分可以省略,但一般情况下不省略。
-
流程图示例:
-
代码示例:
-
#include <stdio.h> int main() { int num_age; scanf("%d", &num_age); if (num_age < 12) printf("是儿童"); printf("判断结束"); return 0; }
-
//判断是否是儿童-2 #include <stdio.h> int main() { int num_age; scanf("%d", &num_age); if (num_age < 12) printf("是儿童"); else printf("不是儿童"); printf("判断结束"); return 0; }
-
-
练习1:有两个变量(a和b)通过scanf获取数据,通过比较,将最大的数存储到a变量中,将小的数存储到b变量中,并打印输出其内容。
-
#include <stdio.h> int main() { int a, b, t; printf("请输入两个数字:\n"); scanf("%d %d", &a, &b); if (a < b) { t = a; a = b; b = t; } printf("a = %d\nb = %d", a, b); return 0; }
-
-
练习2:人的年龄段可以划分为:0~12 儿童,12~18 青少年,18~30 青年,30~60 中年,60以上 老年
#include <stdio.h> int main() { int age; printf("请输入年龄:\n"); scanf("%d", &age); if (age > 0 && age <= 12) printf("儿童"); else if (age >12 && age <= 18) printf("青少年"); else if (age > 18 && age <= 30) printf("青年"); else if (age > 30 && age <= 60) printf("中年"); else if (age > 60) printf("老年"); else printf("年龄输入不符合规范,请重新输入正整数"); return 0; }
-
第二节 关系运算符和关系表达式
-
用来对两个数值进行比较,即比较符,也称为关系运算符。在c语言中,满足条件,则结果称为“真”,不满足条件则称为“假”。
-
关系运算符及其优先次序
-
- 前4种关系运算符(<, <=, >, >=)的优先级别相同,后2种也相同。前4种高于后2种。例如,“>”优先于“==”,而“>”与“<”优先级相同。
- 关系运算符的优先级低于算术运算符。
- 关系运算符的优先级高于赋值运算符。
-
例如:
-
表达式 含义 解释 c>a+b 等效于c>(a+b) 关系运算符的优先级低于算术运算符 a>b ==c 等效于(a>b) ==c 大于运算符>的优先级高于相等运算符== a==b<c 等效于a==(b<c) 小于运算符<的优先级高于相等运算符== a=b>c 等效于a=(b>c) 关系运算符的优先级高于赋值运算符
-
-
练习:定义a,b,c三个变量,比较a和b的大小,将最小的数保存到c中,如果a和b相等的时候,c存储a和b任何一个数据,如果a和b相等的时候,提示a和b相等,如果a和b不相等的时候,提示a和b不相等。
-
#include <stdio.h> int main() { int a, b, c; printf("请输入两个数字:\n"); scanf("%d %d", &a, &b); if (a >= b) c = b; else c = a; if (a == b) { c = a; printf("a == b\n"); } else printf("a != b\n"); printf("c = %d\n", c); return 0; }
-
-
关系表达式: 用关系运算符将两个数值或数值表达式连接起来的式子 。
- 关系表达式的值是一个逻辑值,即“真”或“假”。在c的逻辑运算中,1代表真,0代表假;例如:5==3 假 5>=0 真
第三节 逻辑运算符和逻辑表达式
-
3种逻辑运算符:与(AND),或(OR),非(NOT)。
-
逻辑运算符及其含义
-
运算符 含义 举例 说明 && 逻辑与 a&&b 如果a和b都是真,则结果为真,否则为假 || 逻辑或 a||b 如果a和b有一个以上为真,则结果为真,二者都为假时,结果为假 ! 逻辑非 !a 如果a为假,则!a为真,如果a为真,则!a为假
-
-
逻辑运算符的真值表
-
a b !a !b a&&b a||b 真 真 假 假 真 真 真 假 假 真 假 真 假 真 真 假 假 真 假 假 真 真 假 假
-
-
代码示例
-
#include <stdio.h> int main() { int a, b; scanf("%d %d", &a, &b); if (a < 100 && b < 100) { printf("a和b的值都小于100\n"); } if (a < 100 || b < 100) { printf("a和b的值有一个小于100\n"); } if (!(a > 100)) { printf("a的值不大于100\n"); } return 0; }
-
-
!a && b || x > y && c ==> ((!a) && b) || ((x > y) && c)
-
逻辑表达式
-
用逻辑运算符将关系表达式或其他逻辑量连接起来的式子。
-
逻辑表达式的值是一个逻辑量“真”或“假”。C语言编译系统在表示逻辑运算结果时,用数值1代表“真”,用0代表“假”,但在判断一个量是否为“真”时,以0代表“假”,以非0代表“真”。
-
代码示例
-
#include <stdio.h> int main() { int a = 4, b = 5; if (a) { printf("量为真\n"); return 0; } }
-
-
逻辑运算的真值表进化版
-
a b !a !b a&&b a||b 非0 非0 0 0 1 1 非0 0 0 1 0 1 0 非0 1 0 0 1 0 0 1 1 0 0
-
-
注意:
- 在逻辑表达式的求解中,不是所有的逻辑运算符都会被执行,只有在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该运算符。
-
举例:
-
(1)a && b && c 如果a为假,就不会判别b和c,因为只有a为真(非0)时,才需要判别b的值。只有当a和b都为真的情况下才需要判别c的值。如果a为真,b为假,不判别c。
-
(2)a || b || c 只要a为真(非0),就不会判别b和c。只有a为假,才判别b。a和b都为假才判别c。
-
-
代码示例
-
#include <stdio.h> int main() { int a = 1, b = 2, c = 3, d = 4; if (a > b && c > d) { printf("该语句模块被执行\n"); } return 0; }
-
-
练习:判断年份是否为闰年
-
/* 闰年:能被400整除 || 能被4整除但是不能被100整除 */ #include <stdio.h> int main() { int year; printf("请输入一个年份:\n"); scanf("%d", &year); if (year % 400 == 0 || year % 4 == 0 && year % 100 != 0) { printf("%d年是闰年\n", year); } else printf("%d年不是闰年\n", year); return 0; }
-
-
关系表达式和逻辑表达式的值是0和1,而且在判断一个量是否为真时,以0代表假,以非0代表真,那么就可以理解为什么在if语句中表达式可以是任何数值表达式。
-
第四节 条件运算符和条件表达式
-
条件表达式的一般形式:
表达式1 ? 表达式2 : 表达式3
- 表达式的结果是否为真?如果为真,则执行表达式2,否则执行表达式3。
-
条件运算符:由两个符号( ? 和 : )组成,必须一起使用,要求有3个操作对象,称为三目运算符,它是C语言中唯一的三目运算符。
-
c = (a > b) ? a : b
-
根据表达式1的结果,将表达式2或3的结果赋值给变量c。
-
代码示例:
-
#include <stdio.h> int main() { int a; scanf("%d", &a); a < 10 ? printf("a小于10") : printf("a不小于10"); return 0; }
-
-
练习:输入一个字符,判断是否为大写字母,如果是,将它转换为小写字母,否则不转换,输出最后得到的字符
-
#include <stdio.h> int main() { char c; scanf("%c", &c); c = (c >= 'A' && c <= 'Z') ? c + 32 : c; printf("%c", c); return 0; }
-
-
第五节 选择结构的嵌套
-
在if语句中又包含一个或多个if语句称为if语句的嵌套。
-
多分支结构就属于if语句的嵌套。if语句的嵌套一般形式如下:
-
应当注意if与else的配对关系。else总是与它上面的最近的未配对的if配对。
第六节 用switch语句实现多分支选择结构
-
if语句只有两个分支可以选择,如果要实现多个分支,使用起来比较复杂,嵌套的层数比较多,大大降低了代码的可读性。C语言提供了switch语句直接处理多分支选择。
-
switch语句的一般形式:
-
说明:
-
(1)switch括号中的表达式,值类型应为整数类型(包括字符型)。
-
(2)switch下面的花括号是一个复合语句,这个复合语句包含若干语句,它是switch语句的语句体。语句体内包含多个以关键字case开头的语句行和最多一个以default开头的行。case后面跟一个常量(或常量表达式),如:case ‘A’,它们和default都是起
标号
(label,或称标签、标记)的作用,用来标志一个位置。执行switch语句时,先计算switch后面的”表达式“的值,然后将它与各case标号比较,如果与某一个case标号中的常量相同,流程就转到此case标号后面的语句。如果没有与switch表达式相匹配的case常量,流程转去执行default标号后面的语句。 -
(3)可以没有default标号,此时如果没有与switch表达式相匹配的case常量,则不执行任何语句,流程转到switch语句的下一个语句。
-
(4)各个case标号出现次序不影响执行结果。例如,可以先出现default标号,再出现” case ‘D’ : ··· “,然后是” case ‘B’ : ··· “。
-
(5)每个case常量必须互不相同;否则就会出现互相矛盾的现象(对switch表达式的同一个值,有两种或多种执行方案)。
-
(6)case标号只起标记的作用。在执行switch语句时,根据switch表达式的值找到匹配的入口标号,并不在此进行条件检查,在执行完一个case标号后面的语句后,就从此标号开始执行下去,不再进行判断(一般情况下,在执行一个case子句后,应当用break语句终止该条switch子句的执行。最后一个case子句(今为default子句)中可不必加break语句)。
-
(7)在case子句中虽然包含了一个以上执行语句,但可以不必用
{ }
括起来,会自动顺序执行本case标号后面的所有语句。加上{}
也可以。 -
(8)多个case标号可以共用一组执行语句,如:
-
case 'A': case 'B': case 'C': printf(">60\n");break; ···
-
-
-
代码示例:
-
#include <stdio.h> int main() { char c; printf("请输入等级:\n"); scanf("%c", &c); swit ch (c) { case 'A':printf("85分以上\n"); break; case 'B':printf("70`84分\n"); break; case 'C':printf("60`69分\n"); break; case 'D':printf("60分以下\n"); break; default:printf("输入错误,请重新输入"); } return 0; }
-
-
练习:买鞋,12双不打折,34双9折,56双8折,78双7.5折,9双以上7折
-
#include <stdio.h> int main() { int num, price; printf("请输入要买的鞋的数量和单价:\n"); scanf("%d %d", &num, &price); switch ((num + 1) / 2) { case 1:printf("不打折,总价为:%f\n", num * price); break; case 2:printf("9折,总价为:%f\n", num * price * 0.9); break; case 3:printf("8折,总价为:%f\n", num * price * 0.8); break; case 4:printf("7.5折,总价为:%f\n", num * price * 0.75); break; default:printf("7折,总价为:%f\n", num * price * 0.7); } return 0; }
-
上一篇: C语言程序设计第三章
下一篇: Access 使用总结一篇