选择结构程序设计
if 语句的一般形式
if 语句包含3种形式:
-
if(表达式) 语句
- 表达式:可以是关系表达式、逻辑表达式,甚至是数值表达式
- 关系表达式:两个数值进行比较的式子
示例:
#include "stdio.h" void main() { int num_age; scanf("%d", num_age); if (num_age < 12) printf("是儿童\n"); printf("判断结束"); }
结果:
10 是儿童 判断结束 Press any key to continue
15 判断结束 Press any key to continue
-
if(表达式) 语句1 else 语句2
复合语句:
if(表达式) { 语句1 语句2 ... } else 语句n
示例:
#include "stdio.h" void main() { int num_age; scanf("%d", num_age); if (num_age < 12) printf("是儿童\n"); else printf("不是儿童\n"); printf("判断结束"); }
结果:
10 是儿童 判断结束 Press any key to continue
15 不是儿童 判断结束 Press any key to continue
-
else-if多分支语句:
if(表达式1) 语句1 else if(表达式2) 语句2 else if(表达式3) 语句3 else if(表达式4) 语句4 ... else if(表达式n) 语句n else 语句n+1
- 从前往后计算各个表达式的值,如果某个表达式的值为真,则执行对应的语句,并终止整个多分支结构的执行。如果上述所有表达式均不成立,即均为逻辑假时,则执行对应的 else 部分。else 部分可以省略,但一般情况下不省略
示例:
#include "stdio.h" void main() { int num_age; scnaf("%d", &num_age); if (num_age <= 12) printf("是儿童\n"); else if (12 < num_age && num_age <= 18) printf("是青少年\n"); else if (18 < num_age && num_age <= 30) printf("是青年\n"); else if (30 < num_age && num_age <= 60) printf("是中年\n"); else printf("是老年人\n"); }
结果:
20 是青年 Press any key to continue
...
任务:
1、有两个变量(a和b)通过scanf获取数据
2、通过比较,将最大的数存储到a变量中,将小的数存储到b变量中
3、并打印输出其内容
示例:
#include "stdio.h"
void main()
{
int a, b, t;
scanf("%d,%d", &a, &b);
if (a < b)
{
t = a;
a = b;
b = t;
}
printf("最大的是:%d,最小的是:%d\n", a, b);
}
结果:
4,5
最大的是:5,最小的是:4
Press any key to continue
关系运算符和关系表达式
关系运算符及优先级
用来对两个数值进行比较,即比较符,也称为关系运算符
在c语言中,满足条件时则结果称为“真”,不满足条件时则称为“假”
C语言6中关系运算符:
-
优先级相同(高)
< 小于
<= 小于等于
> 大于
>= 大于等于
-
优先级相同(低)
== 等于
!= 不等于
由高到低排列:算术运算符、关系运算符、赋值运算符
例如:
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、a+b>b+c、(a=3)>(b=5)、‘a’<‘b’、(a>b)>(b>c)
关系表达式的值是一个逻辑值,即“真”或“假”
例如:5==3(假);5>=0(真)
在c的逻辑运算中,1代表真,0代表假
示例:
#include "stdio.h"
void main()
{
int a = 4, b = 5, c = 1, d, f;
printf("%d\n", 3 > 2);
printf("%d\n", a > b == c);
d = a > b;
f = a<b> c;
printf("%d,%d\n", d, f);
}
结果:
[Running] cd "d:\vscode(C语言)\" && gcc 选择结构程序设计.c -o 选择结构程序设计 && "d:\vscode(C语言)\"选择结构程序设计
1
0
0,0
[Done] exited with code=4 in 0.191 seconds
逻辑运算符和逻辑表达式
逻辑运算符
例如:如果a小于100,并且b也要小于100时,输出信息;包含两个条件如何处理?
示例:
#include "stdio.h"
void 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");
}
结果:
110,50
a和b的值有一个小于100
Press any key to continue
...
C逻辑运算符及其含义
运算符 | 含义 | 举例 | 说明 |
---|---|---|---|
&& | 逻辑与 | a&&b | 如果a和b都是真,则结果为真,否则为假 |
|| | 逻辑或 | a||b | 如果a和b有一个以上为真,则结果为真,二者都为假时,结果为假 |
! | 逻辑非 | !a | 如果a为假,则!a为真,如果a为真,则!a为假 |
逻辑运算的真值表
a | b | !a | !b | a&&b | a||b |
---|---|---|---|---|---|
真 | 真 | 假 | 假 | 真 | 真 |
真 | 假 | 假 | 真 | 假 | 真 |
假 | 真 | 真 | 假 | 假 | 真 |
假 | 假 | 真 | 真 | 假 | 假 |
例如:!a&&b||x>y&&c(先运算!a、再运算x>y、其次进行逻辑与运算、最后进行逻辑或运算)
由高到低排列:!(非)、算术运算符、关系运算符、&&和||、赋值运算符
逻辑表达式
什么是逻辑表达式?
用逻辑运算符将关系表达式或其他逻辑量连接起来的式子
逻辑表达式的值是一个逻辑量“真”或“假”
C语言编译系统在表示逻辑运算结果时,用数值1代表“真”,用0代表“假”,但在判断一个量是否为“真”时,以0代表“假”,以非0代表“真”
示例:
#include "stdio.h"
void main()
{
int a = 4, b = 5; //'a' 0 !a a&&b a||b !a||b 4&&0||2 b>3&&8<a-!0
if (a)
printf("if语句块被执行了\n");
}
结果:
[Running] cd "d:\vscode(C语言)\" && gcc 选择结构程序设计.c -o 选择结构程序设计 && "d:\vscode(C语言)\"选择结构程序设计
if语句块被执行了
[Done] exited with code=0 in 0.227 seconds
逻辑运算的真值表详细版
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 |
注:在逻辑表达式的求解中,不是所有的逻辑运算符都会被执行,只有在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该运算符
例如:
- a && b && c 如果a为假,就不会判别b和c,因为只有a为真(非0)时,才需要判别b的值。只有当a和b都为真的情况下才需要判别c的值。如果a为真,b为假,不判别c
- a || b || c 只要a为真(非0),就不会判别b和c。只有a为假,才判别b。a和b都为假才判别c
关系表达式和逻辑表达式的值是0和1,而且在判断一个量是否为真时,以0代表假,以非0代表真,那么就可以理解为什么在if语句中表达式可以是任何数值表达式
判断是否为闰年
注:能被4整除,但不能被100整除,如2008;或者能被400整除的都是闰年,如2000
示例:
#include "stdio.h"
void main()
{
int year;
scanf("%d", year);
if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0))
printf("%d是闰年\n", year);
else
printf("%d不是闰年\n", year);
}
结果:
2008
2008是闰年
Press any key to continue
条件运算符和条件表达式
条件表达式的一般形式:表达式1?表达式2 : 表达式3
表达式的的结果是否为真?如果为真,则执行表达式2,否则执行表达式3
例如:
if (a>b)
printf(“a”);
else
printf(“b”);
转化后:
(a>b)? printf(“a”): printf(“b”)
示例:
#include "stdio.h"
void main()
{
int a;
scanf("%d", &a);
if (a < 10)
printf("a的值小于10\n");
else
printf("a的值大于10\n");
}
转化后:
#include "stdio.h"
void main()
{
int a;
scanf("%d", &a);
(a < 10) ? printf("a的值小于10\n") : printf("a的值大于10\n");
}
结果:
5
a的值小于10
Press any key to continue
条件运算符:由两个符号( ? 和 : )组成,必须一起使用,要求有3个操作对象,称为三目运算符,它是C语言中唯一的三目运算符
例如:
c = (a>b)?a:b
根据表达式1的结果,将表达式2或3的结果赋值给变量c
示例:
/*使用条件表达式实现以下要求
输入一个字符,判断它是否为大写字母,如果是,将它转换为小写字母,否则不转换,最后输出得到的字符*/
#include "stdio.h"
void main()
{
char a;
scanf("%c", &a);
a = (a >= 'A' && a <= 'Z') ? a + 32 : a;
printf("%c\n", a);
}
结果:
H
h
Press any key to continue
选择结构的嵌套
在if语句中又包含一个或多个if语句称为if语句的嵌套
多分支结构就属于if语句的嵌套
if语句的嵌套一般形式如下:
if(表达式1)
if(表达式2) 语句1
else 语句2 //第二行与第三行为内嵌if
else
if(表达式3) 语句3
else 语句4 //第五行与第六行为内嵌if
示例:
#include "stdio.h"
void main()
{
int x;
scanf("%d", &x);
if (x < 0)
printf("请输入大于0的数\n");
if (x < 18)
{
if (x < 12)
printf("是儿童\n");
else
printf("是青少年\n");
}
else
{
if (x < 30)
printf("是青年\n");
else if (x < 50)
printf("是中年\n");
else
printf("是老年\n");
}
}
结果:
40
是老年
Press any key to continue
如何分辨if else的配对?
else总是与它上面最近的未配对的 if 配对
用switch语句实现多分支选择结构
if语句只有两个分支可以选择,如果要实现多个分支,使用起来比较复杂,嵌套的层数比较多,大大降低了代码的可读性。C语言提供了switch语句直接处理多分支选择
switch语句的一般形式:
switch(表达式)
{
case 常量1:语句1
case 常量2:语句2
...
case 常量n:语句n
default: 语句n+1
}
实例:学生成绩分类(85分以上为A等、7084分为B等、6069分为C等、60分以下为D等)
转化前示例:
#include "stdio.h"
void main()
{
char a;
scanf("%c", &a);
if (a < 'A' || a > 'D')
printf("输入错误\n");
else
{
if (a == 'A')
printf("100~85\n");
if (a == 'B')
printf("84~70\n");
if (a == 'C')
printf("69~60\n");
if (a == 'D')
printf("<60\n");
}
}
结果:
C
69~60
Press any key to continue
转化后示例:
#include "stdio.h"
void main()
{
char a;
scanf("%c", &a);
switch (a)
{
case 'A':
printf("100~85\n");
break;
case 'B':
printf("84~70\n");
break;
case 'C':
printf("69~60\n");
break;
case 'D':
printf("<60\n");
break;
default:
printf("输入错误\n");
}
}
结果:
B
84~70
Press any key to continue
switch 详解:
- switch括号中的表达式,值类型应为整数类型(包括字符型)
- switch下面的花括号是一个复合语句,都属于switch语句的语句体
- case和default是标号,用来标志一个位置
- 执行switch语句时,先计算表达式的值,然后将值与case后面的常量按顺序进行对比,如果相同则从该执行该语句。如果没有相同的常量,则执行default标号后面的语句
- 可以没有default标号,如果没有与switch表达式相匹配的case常量,则不执行任何语句,继续执行switch语句块后面的代码
- 各个case标号出现次序不影响执行结果
- 每个常量值不能重复,否则出现冲突
- 在case子句中虽然包含了一个以上执行语句,但可以不必用{ }括起来,会自动顺序执行case标号后面的所有语句。加上{}也可以
- 多个case标号可以公用一组执行语句
- break语句打断,防止执行完对应语句继续向下执行