第五章程序控制流程——选择结构。
5.1 关系运算符和逻辑运算符。
一、关系运算符和关系表达式。
1. 关系运算符。
1) 关系运算符的分类。
c语言为用户提供了6个关系运算符:<(小于)、<小于等于)、>大于)、>大于等于)、=关系相等)和!=(关系不等)。
2) 关系运算符的优先级。
关系运算符内部优先级是<、<的优先级相等,且优先级高于==和!=。
在c语言所有运算符中,关系运算符的优先级要低于算术运算符和位移运算符。
3) 关系运算符的结合性。
所有的关系运算符的结合性都是从左至右。
2. 关系表达式的基本形式。
有值表达式1 op 有值表达式2,其中op代表6个关系运算符。关系表达式的结果要么为0(操作数不满足关系运算),要么为1(操作数满足关系运算)。
假设有以下变量定义:int a=1,b=-3,c=2,i=13;
以下都是合法的关系表达式:a>b、i<=10、a+b(b=5)、a==5、a+b==2009、a!=b+2、b*b>=4*a*c等。
3. 关系运算符的使用。
1) 带有关系运算符的复杂表达式计算。
例5.1】 当a=3,b=2,c=1时,表达式f=a>b>c的值是。
例5.2】 下面关系表达式中结果为假的是。
a) 0!=1b) 2<=8
c) (a=2*2)==2d) y=(2+2)==4
说明:在c语言中用一切非0数(往往是1)表示逻辑真,0表示逻辑假。
课内思考题5.1】 当a=5,b=4,c=2时,表达式a>b!=c的值是。
2) 关系运算中的隐式类型转换。
例5.3】 分析下面程序的输出结果,并说明原因。
#include <>
main()
int i=-10;
unsigned int j=1;
printf("i}
3) 怎样比较两个浮点数是否相等。
有些浮点数在计算机内部是无法精确表示的,这主要是由于浮点数在计算机内部特殊的存储格式引起的,例如:
#include <>
main()
double a=123456789.9*9,b=1111111109.1;
double c=0.1+0.2;
printf("c==0.3 %d",c==0.3);
printf("a==b %d",a==b);
例5.4】 比较两个浮点数是否相等的正确方法。
#include <>
#include <>
#define yuzhi 1e-6
main()
double a=123456789.9*9,b=1111111109.1;
double c=0.1+0.2;
printf("a=%.9f,b=%.9f",a,b);
printf("a==b %d",a==b);
printf("a==b %d",fabs(a-b)<=yuzhi);
printf("c==0.3 %d",c==0.3);
printf("c==0.3 %d",fabs(c-0.3)<=yuzhi);
说明:应该避免直接比较两个浮点数是否相等,而是通过看两个浮点数差的绝对值是否小于。
某个很小的数来达到判断两个浮点数是否相等。
二、逻辑运算符和逻辑表达式。
1. 逻辑运算符。
1) 逻辑运算符的分类。
c语言为用户提供了3个逻辑运算符:!(逻辑非)、&逻辑与)和||(逻辑或)。
2) 逻辑运算符的优先级。
其中!(逻辑非)是单目运算符,在c语言所有运算符中优先级排第二(所有的单目运算符优先级都是第二)。&逻辑与)的优先级高于||(逻辑或),|的优先级高于?:(条件运算符)。
3) 逻辑运算符的结合性。
其中!(逻辑非)的结合性是从右至左(所有的单目运算符的结合性都是从右至左),&和||的结合性是从左至右。
2. 逻辑表达式的基本形式。
!有值表达式1,有值表达式1 &&有值表达式2,有值表达式1 ||有值表达式2。
逻辑表达式的结果见下表:
说明:实际编程时,总是用逻辑运算符去连接关系表达式。
3. 逻辑运算符的使用。
1) 带有逻辑运算符的复杂表达式计算。
例5.5】 以下程序的运行结果是。
#include <>
main()
int a,b,d=241;
a=d/100%9;
b=(-1)&&1);
printf("%d,%d",a,b);
a) 6,1b) 2,1c) 6,0d) 2,0
课内思考题5.2】 若a=2,b=4,则表达式!(x=a)||y=b)&&0的值是。
课内思考题5.3】 int a=3,b=4,c=5;,则以下表达式!(a+b)+c-1&&b+c/2的值为 。
2) 短路计算。
对于逻辑表达式“表达式1 &&表达式2 &&表达式n”而言,若在计算过程中发现表达式m的值为0,根据&&的特点,整个逻辑表达式的结果肯定为0,为提高计算效率,编译器不会计算从表达式m+1开始的后序表达式了,称为短路计算。
同样对于“表达式1 ||表达式2 ||表达式n”而言,只要发现某个表达式的值为1,肯定计算结果的同时也没有必要计算后面这些表达式的值。
短路计算在编程中有重要用途,能够为其他运算提供卫士:(number!=0) &1/number>0.
5),由于在做除法时,除数不能为0,所以在计算1/number是否大于0.5之前,先判断变量number的值是不是0。
例5.6】 设有说明语句:int a=1,b=2,c=3,d=4,m=2,n=2;,则执行(m=a>b) &n=c>d)后n的值为。
例5.7】 执行以下语句后a的值为b的值为。
int a=5,b=6,w=1,x=2,y=3,z=4;
a=w>x) &b=y>z);
四、用关系或逻辑表达式表示条件。
要按照语义并使用关系或逻辑表达式去描述条件,且当条件成立时,表达式值为1;当条件不成立时,表达式值为0。
例5.8】 设y为int变量,请写出描述“y是奇数”的表达式。
分析:首先,用来描述条件的表达式中必然包含变量y。其次,这个带有变量y的表达式的值只有两种结果:
假如y的值是奇数的话,该表达式的计算结果为1;假如y是偶数的话,该表达式的计算结果为0。最后,按照语义来构造表达式——奇数的特点是被2除余1(也可认为不能被2整除),不难得到:(y%2)==1(由%的优先级高于!
=,所以也可写成y%2==1)。请思考还有没有别的写法?
课内思考题5.4】 假设x是一个int变量,怎样用表达式表示条件“x被3整除,同时被5除余3”?
课内思考题5.5】 假设x是一个double变量,怎样描述条件”2【例5.9】 若x、y、z均为int变量,则描述“x或y中有一个小于z”的表达式是。
例5.10】 判别某年year是否闰年。闰年的条件是符合下面二者之一:能被4整除,但不能被100整除;能被400整除。可以用一个逻辑表达式来表示:
((year%4==0) &year%100!=0)) year%400==0),如果熟悉运算符的优先级,则表达式进一步简化为year%4==0 &&year%100!=0 ||year%400==0。
课内思考题5.6】 判断char型变量ch是否为大写字母的正确表达式是。
a) 'a'<=ch<='zb) (ch>='a') ch<='z')
c) (ch>='a') ch<='zd) (ch>='a') and (ch<='z')
5.2 用if语句和if-else语句实现选择控制流程。
一、if语句。
1. 基本语法格式。
if(表达式)
语句。说明:
1) if语句的执行过程是先计算表达式的值,如果非0就执行包含在if中的语句;如果为0就不执行该语句。如下图所示:
2) if语句中的表达式可以是任意的有值表达式,实际编程时往往使用关系表达式或将多个关系表达式用逻辑运算符连接起来的逻辑表达式。
3) if中的语句可以是除了声明语句以外的其他语句,例如各种流程控制语句(if、if-else、switch、while、do-while和for)、流程转移语句(break、continue、return和goto)、表达式语句(包括函数调用语句)、空语句和复合语句。
2. 应用示例。
例5.11】 分析以下程序的执行结果。
#include <>
main()
int i=-1;
if(i<=0) printf("%d",i++)
printf("%d",-i);
例5.13】 从键盘输入三个整数,计算其中的最大者并将其输出。
#include <>
main()
int a,b,c;
int max;
scanf("%d,%d,%d",&a,&b,&c);
max=a; /先假定变量a的值最大*/
if(max if(max 在深化高等教育改革 全面推进素质教育的新形势下,为进一步丰富在校学生程序设计竞赛的形式和内容,同时提高广大学生的学习积极性 创新意识和勇于实践的科学精神。经研究决定于举办我学院第四届c语言程序设计大赛。主办单位 河南城建学院计算机科学与工程学院。为保证此次赛事在公平 公正的环境下顺利进行,大赛特设立... 或 year 4 year 100 year 400 程序中可设置1个变量leap来代表是否闰年的信息,闰年 leap 1 不闰年 leap 0。include void main int year printf 请输入4位数年份 scanf d year if year 4 0 year 100 ... 一 考试性质。本考试大纲专为高职高专应届优秀毕业生进入本科学习考试而制定,目的主要是测试考生在程序设计及软件开发方面是否具有本科学习的能力。二 基本要求。1 熟练掌握c语言的基本知识,掌握常用的算法和结构化程序设计方法。2 具备基本的c语言程序设计能力,能熟练地阅读 理解和编制简短的c语言程序 3 ...C语言程序设计大赛通知
C语言程序设计入门经典例题
《C语言程序设计》专升本考试大纲2023年