第4章 简单的C程序设计——选择结构程序设计
在顺序结构中,各语句是按自上而下的顺序执行的,执行完上一个语句就自动执行下一个语句,是无条件的,不必作任何判断。实际上,很多情况下,需要根据某个条件是否满足来决定是否执行指定的操作任务,或者从给定的两种或多种操作选择其一。
4.1选择结构和条件判断
例:定义一个函数,如果饿了吃饭。如果不饿不吃饭。
#include <stdio.h>
int main()
{
int a;
printf("请输入一个数 0或1 ,0代表不饿,1代表饿了\n");
scanf("%d",%a);
if(a!=||a!=)
printf("输入错误\n");
if(a==)
printf("饿了,吃饭。。。\n");
else
printf("不饿,不吃饭。。。\n");
return ;
}
若输入0则,输出“不饿,不吃饭。。。”
若输入1则,输出“饿了,吃饭。。。”
若输出其他值,输出”输入错误“
code result
C语言有两种选择语句:(1)if语句,用来实现两个分支的选择结构;(2)switch语句,用来实现多分支的选择结构。
4.2 用if语句实现选择结构
4.2.1 用if语句处理选择结构举例
例:实现两个变量的交换
#include <stdio.h>
int main()
{
int a,b,temp;
printf("请输入两个数a b\n");
scanf("%d%d",a,b);
printf("你输入的值a=%d,b=%d\n",a,b);
printf("正在交换两个数的位置\n");
temp = a;
a = b;
b = temp;
printf("交换后的值a=%d,b=%d\n",a,b);
return ;
}
若输入1,;则输出:
{
请输入两个数a b
你输入的值a=,b=
正在交换两个数的位置
交换后的值a=,b=
}
Code Result
4.2.2 if语句的一般形式
if语句的一般形式如下:
if(表达式) 语句1
[else 语句2]
if语句中的“表达式”可以使关系表达式、逻辑表达式,甚至是数值表达式。
关系表达式就是两个数值进行比较的式子。
根据if语句的一般形式,if语句可以写成不同的形式,最常用的优以下3中形式:
(1)if(表达式)
语句1[复合语句] (没有else子句部分)
(2)if(表达式) (有else子句部分)
语句1[复合语句]
else
语句2[复合语句]
(3)if(表达式1) 语句1[复合语句] (在else部分又嵌套了多层的if语句)
else if(表达式2) 语句2[复合语句]
else if(表达式3) 语句3[复合语句]
… …
else if(表达式m) 语句m[复合语句]
else 语句m+1[复合语句]
注意:复合语句应当用花括号括起来。{} 花括号括起来的多条语句称为复合语句。
4.3 关系运算符和关系表达式
在C语言中,比较符(或称比较运算符)称为关系运算符。所谓“关系运算”就是“比较运算”,将两个数值进行比较,判断其比较的结果是否符合给定的条件。
4.3.1 关系运算符机器优先次序
C语言提供6中关系运算符:
①< (小于)
②<= (小于或等于)
③> (大于)
④>= (大于或等于)
⑤== (等于)
⑥!= (不等于)
①②③④优先级相同(高),⑤⑥优先级相同(低)
关于优先次序:
(1)前四种关系运算符(< <= > >=)的优先级相同,后2种也相同。前4种高于后2种。
(2)关系运算符的优先级低于算术运算符
(3)关系运算符的优先级高于赋值运算符
4.3.2 关系表达式
用关系运算符将两个数值或数值表达式连接起来的式子,称关系表达式。关系表达式的值是一个逻辑值,即“真”或“假”。
在C的逻辑运算中,以“1”代表“真”,以“0”代表“假”。更准确来说,是“!0”代表真,“0”代表假。
4.4 逻辑运算符和逻辑表达式
4.4.1 逻辑运算符及其优先次序
有3中逻辑运算符:与(AND) 或(OR) 非(NOT)。注意:在C语言中不能在程序中直接用AND、OR、NOT作为逻辑运算符,而是用其他符号代替。C逻辑运算符及其含义如下:
“&&”和“||”是双目(元)运算符,它要求有两个运算对象(操作数);“!”是一目(元)运算符,只要求有一个运算对象。逻辑运算真值表:
按以下的优先次序:
(1)!(非)->&&(与)->||(或),即“!”为三者中最高的
(2)逻辑运算符中的“&&”和“||”低于关系运算符,“!”高于算术运算符。
4.4.2 逻辑表达式
逻辑表达式的值应该是一个逻辑量“真”或“假”。
实际上,逻辑运算符两侧的运算对象不但可以是0和1,或者是0和非0的整数,也可以是字符型、浮点型、枚举型或指针型的纯量型数据。(关于纯量型的讲解,在本人博客里C Language的第2章里有讲解)系统最终以0和非0来判定他们属于“真”或“假”。逻辑运算的真值表(用0和非0表示的另一种格式):
在逻辑表达式的求解中,并不是所有的逻辑运算符都被执行,只是在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该运算符;如
(1)a&&b&&c。只有a为真(非0)时,才需要判别b的值。只有当a和b都为真的情况下才需要判别c的值。如果a为假,就不必判断b和c的值(此时整个表达式已确定为假)。换个说法,就是a若为假,则b和c被短路了,不会被执行。
(2)a||b||c。只要a为真(非0)是,就不必判断b和c。只有a为假,才判别b。a和b都为假才判别c。
4.4.3 逻辑型变量
这是C99有所增加的一种数据类型。可将关系运算和逻辑运算的结果存到一个逻辑变量中,以便于分析和运算。定义逻辑变量用类型符_Bool.
float score;
scanf(“%f”,&score);
_Bool a ,b; //a和b被定义为逻辑型变量
a = score>=60; //将关系表达式score>=60的值赋给逻辑变量a
b = score<=69; //将关系表达式score<=60的值赋给逻辑变量b
if(a&&b) //如果a和b均为真,输出分数等级为C
printf(“The grade is C\n”);
如果在源文件中用#include指令包含了头文件stdbool.h,那么上面的程序段可以写成:
float score;
scanf(“%f”,&score);
bool a ,b; //a和b被定义为逻辑型变量
a = score>=60; //将关系表达式score>=60的值赋给逻辑变量a
b = score<=69; //将关系表达式score<=60的值赋给逻辑变量b
if(a&&b) //如果a和b均为真,输出分数等级为C
printf(“The grade is C\n”);
注意:在使用bool类型时,要先了解自己所用的编译系统能否允许使用逻辑型变量bool和true和false.
4.5 条件运算符和条件表达式
有一种if语句,当被判别的表达式的值为“真”或“假”时,都执行一个赋值语句且向同一个变量赋值,如:
if(a>b)
max = a;
else
max = b;
以上的if语句可以改写为:
max = (a>b)?a:b;
条件运算符有两个符号(?和:)组成,必须一起使用,要求有3个操作对象,称为三目(元)云三幅,它是C语言中唯一的一个三目运算符。
条件表达式的一般形式为:
表达式1?表达式2:表达式3
执行过程:先计算出表达式1的值,若为非零(真),则执行表达式2;否则,执行表达式3.
说明:
(1)条件运算符的执行顺序:先求解表达式1,若为非0(真)则求解表达式2,表达式2的值就作为整个条件表达式的值。若表达式1的值为0(假)则求解表达式3,表达式3的值就作为整个条件表达式的值。
(2)条件运算符优先于赋值运算符,因此复制表达式的求解过程是先求解条件表达式再将它的值赋给max
条件运算符的优先级别比关系运算符和算术运算符都低。
例:输入一个字符,判别它是否为大写字母,若是,则转换为小写字母。
#include <stdio.h>
int main()
{
char ch;
scanf(“%c”,&ch);
ch = (ch>=’A’&&ch<=’Z’)?(ch+32):ch;
printf(“%c\n”,ch);
return 0;
}
运行结果 A 回车 a
4.7选择结构的嵌套
在if语句中又包含一个或多个if语句称为if语句的嵌套(nest)。其一般形式如下:
if()
if() 语句1
else() 语句2
else
if() 语句3
else() 语句4
应当注意,if与else的配对关系。else总是与它上面的最近的未配对的if配对。如:
if()
if() 语句1
else
if() 语句2
else 语句3
有些编程者会把else写在与第1个if(外层if)同一列上,意图是使else与第1个if对应,但实际上else是与第2个if配对,因为它们相距最近。
为了避免二义性的混淆,最好使内嵌if语句也包含else部分。如:
if()
{
if() 语句1
}
else 语句2
这时“{}”限定了内嵌if语句的范围,因此else与第一个if配对。
4.7用switch语句实现多分支选择结构
C语言提供switch语句直接处理多分支选择。
switch语句是多分支选择语句。
switch渔具店作用是根据表达式的值,是流程跳转到不同的语句。switch语句的一般形式如下:
switch(表达式)
{
case 常量1 : 语句1
case 常量1 : 语句1
… …
case 常量n : 语句n
default : 语句n+1
}
说明:
(1)switch后面的括号内的“表达式”,其值的类型应为整数类型(包括字符型)
(2)switch下面的花括号内是一个复合语句。这个复合语句包括若干语句,它是switch语句的语句体。语句体内包含多个以关键字case开头的语句行和最多一个以default开头的行。
case后面跟一个常量(或常量表达式),如:case ‘A’ ,它们和default都是标号(label或称标签、标记)的作用,用来标志一个位置。执行switch语句时,先计算switch后面的“表达式”的值,然后将它与各case标号比较,如果与某一个case标号中的常量相同,流程就转到此case标号后面的语句。如果没有与switch表达式相匹配的case常量,流程转去执行default标号后面的语句。换句话说,就是表达式和case后面的常量比较,有适配的就执行对应的语句;如果case没有匹配的常量,就执行default后面的语句。
(3)可以没有default标号,此时如果没有与switch表达式相匹配的case常量,则不执行任何语句,流程转到switch语句的下一个语句。
(4)各个case标号出现次序不影响执行结果。如,可以先出现default标号,然后再出现case标号。
(5)每一个case常量必须互不相同;否则就会出现相互矛盾的现象(对switch表达式的同一个值,有两种或多种执行方案)
(6)case标号只起标记的作用。如果在个case子句中没有break语句,则会连续输出剩下从case标号对应的语句,直至遇到break或者结束switch选择分支。
注意:一般情况下,在执行一个case子句后,应当用break语句使流程跳出switch结构,即终止switch语句的执行。最后一个case子句(或者default子句)中可不必加break语句,因为流程已到了switch结构的结束处。
(7)在case子句中虽然包括了一个以上执行执行语句,但可以不必用花括号括起来,会自动顺序执行本case标号后面所有的语句。当然也可以加上花括号。
(8)多个case标号可以共用一组执行语句。
例:case ‘A’
case ‘B’
case ‘C’ : printf(“>60\n”);break;
当值为’A’ ’B’ ’C’时,都会执行同一组语句,输出“>60”,然后换行。
例:
#include <stdio.h> int main() { char ch; ch = getchar(); switch(ch) { case 'a': case 'b': case 'c': { printf("a"); printf("b"); printf("c"); } }
return ; }
运行结果:输入a 输出结果为abc;
第4章 简单的C程序设计——选择结构程序设计的更多相关文章
- 【C语言】第4章 选择结构程序设计
第4章 选择结构程序设计 C语言有两种选择语句: if 语句,实现两个分支的选择结构 switch 语句,实现多分支的选择结构 输入3个数a,b,c,要求按由小到大的顺序输出. 可以先用伪代码写出算法 ...
- 第5章 简单的C程序设计——循环结构程序设计
5.1 为什么需要循环控制 前面介绍了程序中常用到的顺序结构和选择结构,但是只有这两种结构是不够的,还需要用到循环结构(或称重复结构).因为在程序所处理的问题中常常遇到需要重复处理的问题. 循环结构和 ...
- 160809209_李梦鑫_C语言程序设计实验2+选择结构程序设计_进阶
<C语言程序设计>实验报告 学 号 160809209 姓 名 李梦鑫 专业.班 计科16-2班 学 期 2016-2017 第1学期 指导教师 黄俊莲 吴喆 实验地点 C05 机 ...
- 160809212田京诚C语言程序设计实验2 选择结构程序设计_进阶
实验2-6 猜数字游戏 实验要求: 编写一个C程序实现一个[1-100]以内的猜数字游戏. (1) 系统随机产生一个[1-100]之间的随机数. (2) 输入任意一个数字.数字 ...
- c学习 - 第五章:选择结构程序设计
5.2 关系运算符与逻辑运算符 !(非) ^ 高 算术运算符 | 关系运算符 | &&和 || | 赋值运算符 | 低
- 160809209_李梦鑫_C语言程序设计实验2 选择结构程序设计
实验2-1 输入3个数,并按由大到小的顺序输出. 实验要求: 编写一个C程序,输入3个数,并按由大到小的顺序输出. 源码:#include <stdio.h> int main() { i ...
- 160809225_叶桦汀_C语言程序设计实验2 选择结构程序设计_进阶
#include<stdio.h> #include<math.h> int main() { int a,b,c,l,p,s; printf("请输入三个数:&qu ...
- 符瑞艺 160809228_C语言程序设计实验2 选择结构程序设计
实验2- 输入3个数,并按由大到小的顺序输出. 实验要求: 编写一个C程序,输入3个数,并按由大到小的顺序输出. 参考: 源码: #include <stdio.h> int main() ...
- 学号160809224姓名黄家帅c语言程序设计实验2 选择结构程序设计
实验2-1 输入3个数,并按由大到小的顺序输出. 实验要求: 编写一个C程序,输入3个数,并按由大到小的顺序输出. 源码: #include <stdio.h>void main(){ i ...
随机推荐
- Ajax 与服务器通信 验证编号重复
在最近的一个Web项目中,需要实现一个功能,就是用户在前端输入一个编号,后台需要验证这个编号是否在数据库中已经存在,如果存在就提示用户. 主要用到两个模块.第一:在jsp中添加一个脚本,利用ajax向 ...
- 玩转Spring MVC(二)----MVC框架
早期程序员在编写代码时是没有一个规范的,系统的业务逻辑和数据库的访问时混合在一起的,不仅增加了大量的重复工作,而且增加了后期维护的难度. 后来,人们逐渐发现某些通用的功能是可以单独的封装起来的,这样就 ...
- Windows10 使用docker toolbox安装docker
一.介绍 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互之间 ...
- Python Web 框架:Tornado
1.Tornado Tornado:python编写的web服务器兼web应用框架 1.1.Tornado的优势 轻量级web框架 异步非阻塞IO处理方式 出色的抗负载能力 优异的处理性能,不依赖多进 ...
- Python3 requests与http.cookiejar的使用(cookie的保存与加载)
在学习Python之余,发现Python2与Python3 有很大的变化,之前使用urllib和cookielib来保存cookie,发现很繁琐,于是改用requests.发现cookielib在3. ...
- NIO(一)——缓冲区Buffer
NIO(一)--Buffer NIO简介 NIO即New IO,是用来代替标准IO的,提供了与标准IO完全不同传输方式. 核心: ...
- BZOJ_2134_单选错位——期望DP
BZOJ_2134_单选错位——期望DP 题意: 分析:设A为Ai ∈ [1,ai+1] 的概率,B为Ai = A(imodn+1)的概率显然P(A|B) = 1,那么根据贝叶斯定理P(B) = P( ...
- cocoapods安装及使用其中 添加新源: gem sources -a https://ruby.taobao.org/
一.概要 iOS开发时,项目中会引用许多第三方库,CocoaPods(https://github.com/CocoaPods/CocoaPods)可以用来方便的统一管理这些第三方库. 二.安装 由于 ...
- 【STM32H7教程】第12章 STM32H7的HAL库框架设计学习
完整教程下载地址:http://forum.armfly.com/forum.php?mod=viewthread&tid=86980 第12章 STM32H7的HAL库框架设计学 ...
- 再谈腾讯云centos服务器不能登录的解决过程
上篇文章谈到腾讯云centos服务器不能登录,通过查看监控信息,cpu使用过高,再腾讯云页面使用VNC方式直接登录,然后根据提示信息,关闭导致内存溢出的进程,从而解决问题. 1 问题再现 昨天刚解决了 ...