c语言 第4章 选择结构程序设计.docx

上传人:b****6 文档编号:8487668 上传时间:2023-01-31 格式:DOCX 页数:21 大小:59.54KB
下载 相关 举报
c语言 第4章 选择结构程序设计.docx_第1页
第1页 / 共21页
c语言 第4章 选择结构程序设计.docx_第2页
第2页 / 共21页
c语言 第4章 选择结构程序设计.docx_第3页
第3页 / 共21页
c语言 第4章 选择结构程序设计.docx_第4页
第4页 / 共21页
c语言 第4章 选择结构程序设计.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

c语言 第4章 选择结构程序设计.docx

《c语言 第4章 选择结构程序设计.docx》由会员分享,可在线阅读,更多相关《c语言 第4章 选择结构程序设计.docx(21页珍藏版)》请在冰豆网上搜索。

c语言 第4章 选择结构程序设计.docx

c语言第4章选择结构程序设计

第4章选择结构程序设计

4.1关系运算符和关系表达式

在程序中经常需要比较两个量的大小关系,以决定程序下一步的工作。

比较两个量的运算符称为关系运算符。

4.1.1关系运算符

在C语言中有以下关系运算符:

1)  <小于

2)  <=小于或等于

3)  >大于

4)  >=大于或等于

5)  ==等于

6)  !

=不等于

4.1.2关系表达式

关系表达式的一般形式为:

表达式关系运算符表达式

例如:

a+b>c-d

x>3/2

‘a’+1

-i-5*j==k+1

都是合法的关系表达式。

由于表达式也可以又是关系表达式。

因此也允许出现嵌套的情况。

例如:

a>(b>c)

a!

=(c==d)

◇关系表达式的值是真”和“假”,用“1”和“0”表示。

如:

5>0的值为“真”,即为1。

(a=3)>(b=5)由于3>5不成立,故其值为假,即为0。

关系运算符都是双目运算符,其结合性均为左结合。

◇关系运算符的优先级低于算术运算符,高于赋值运算符。

<,<=,>,>=的优先级相同,高于==和!

=;

==和!

=的优先级相同。

c>a+b→c>(a+b)

a>b==c→(a>b)==c

a==b

a=b>c→a=(b>c)

例:

#include

voidmain()

{

charc='k';

inti=1,j=2,k=3;

doublex=3e+5,y=0.85;

printf("%d%d\n",('a'+5=k+1));

printf("%d%d\n",(1

printf("%d%d\n",(i+j+k==2),(k-1==j==i));

}

程序运行后输出:

10

11

01

说明:

◇在本例中求出了各种关系运算符的值。

字符变量是以它对应的ASCII码参与运算的。

◇对于含多个关系运算符的表达式,如k-1==j==i,根据运算符的左结合性,先计算k-1==j,该式成立,其值为1,再计算1==i,也成立,故表达式值为1。

4.2逻辑运算和逻辑表达式

逻辑常和逻辑变量

逻辑量(布尔量)——用来描述两种对立状态的量称为逻辑量,如命题的成立与否、灯亮与灯灭、高与矮、肥与瘦、快与慢、长与短、阀门的开与关等,都可以有逻辑量来描述。

◇逻辑量的取值只有两个,即:

true(真)和false(假)。

注:

逻辑量在内存中占用一个字节,实际存储的是1和0,分别对应于true与false。

4.2.1逻辑运算

C语言中提供了三种逻辑运算符:

      &&与运算

      ||或运算

      !

非运算

与运算符&&和或运算符||均为双目运算符。

具有左结合性。

非运算符!

为单目运算符,具有右结合性。

逻辑运算符和其它运算符优先级的关系可表示如下:

!

(非)→&&(与)→||(或)

“&&”和“||”低于关系运算符,“!

”高于算术运算符。

按照运算符的优先顺序可以得出:

a>b&&c>d等价于(a>b)&&(c>d)

!

b==c||d

b)==c)||(d

a+b>c&&x+yc)&&((x+y)

⑵逻辑运算的值

逻辑运算的值也为“真”和“假”两种,用“1”和“0”来表示。

其求值规则如下:

①与运算&&:

参与运算的两个量都为真时,结果才为真,否则为假。

例如:

5>0&&4>2

由于5>0为真,4>2也为真,相与的结果也为真。

② 或运算||:

参与运算的两个量只要有一个为真,结果就为真。

两个量都为假时,结果为假。

例如:

5>0||5>8

由于5>0为真,相或的结果也就为真。

③非运算!

:

参与运算量为真时,结果为假;参与运算量为假时,结果为真。

例如:

!

(5>0)

的结果为假。

注意:

各种类型的数据量都可以参加逻辑运算,在判断一个量是为“真”还是为“假”时,以“0”代表“假”,以非“0”的数值作为“真”。

例如:

由于5和3均为非“0”因此5&&3的值为“真”,即为1。

又如:

5||0的值为“真”,即为1。

例:

#include

voidmain()

{

inti=0,j=5,z;

z=!

i*j;//!

的优先级高于算术运算

printf("%d\n",z);

}

4.2.2逻辑表达式

逻辑表达式的一般形式为:

表达式逻辑运算符表达式

表达式可以又是逻辑表达式,从而组成了嵌套的情形。

例如:

(a&&b)&&c

根据逻辑运算符的左结合性,上式也可写为:

a&&b&&c

逻辑表达式的值是式中各种逻辑运算的最后值,以“1”和“0”分别代表“真”和“假”。

例:

#include

voidmain()

{

charc='k';

inti=1,j=2,k=3;

doublex=3e+5,y=0.85;

printf("%d,%d\n",(!

x*!

y),(!

!

!

x));

printf("%d,%d\n",(x||i&&j-3),(i

printf("%d,%d\n",(i==5&&c&&(j=8)),(x+y||i+j+k));

}

程序运行后输出:

0,0

1,0

0,1

注意:

若f()是一个任意的表达式,返回一个确定的值,由于有:

0&&f()=0

1||f()=1

所以C++遇到这类情况不会对f()中的操作进行处理,而直接给出该逻辑运算的最终结果0或1。

例:

#include

voidmain()

{

inta=-1,b=4,k;

k=(++a<0)&&(!

(b--<=0));

printf("%d%d%d\n",k,a,b);

}

程序运行后输出:

004

因为当计算到(++a<0)为假后,可以确定整个表达式的值为0,所以没有对&&之后的表达式进行处理。

4.3if语句

if语句的三种形式

1. if(条件表达式)语句——单分支结构

if(条件表达式)语句

其语义是:

如果条件表达式的值为真,则执行其后的语句,否则不执行该语句。

其过程可表示为下图。

例:

输入两个数,输出较大者。

#include

voidmain()

{

inta,b,max;

printf("inputtwonumbers:

");

scanf("%d%d",&a,&b);

max=a;

if(a

printf("Max=%d\n",max);

}

2. if(条件表达式)语句1else语句2——双分支结构

if(条件表达式)语句1;else语句2;

其语义是:

如果条件表达式的值为真,则执行语句1,否则执行语句2。

其执行过程可表示为右图。

例4.2:

输入两个整数,输出其中的大数。

#include

voidmain()

{

inta,b;

printf("inputtwonumbers:

");

scanf("%d%d",&a,&b);

if(a>b)

printf("Max=%d\n",a);

else

printf("Max=%d\n",b);

}

改用if-else语句判别a,b的大小,若a大,则输出a,否则输出b。

例:

输入三个数,找出最小数。

可以只使用简单的if语句实现。

#include

voidmain()

{

inta,b,c,min;

printf("inputa,b,c\n");

scanf("%d%d%d",&a,&b,&c);

if(a

if(b

if(c

printf("TheMinmunis%d\n",min);

}

3. if...else…if语句——多分支结构

前二种形式的if语句一般都用于两个分支的情况。

当有多个分支选择时,可采用if-else-if语句,其一般形式为:

if(条件表达式1)

语句1;

elseif(条件表达式2)

语句2;

elseif(条件表达式3)

语句3;

elseif(条件表达式m)

语句m;

else

语句n;

其语义是:

依次判断条件表达式的值

当出现某个值为真时,则执行其对应的语句。

然后跳到整个if语句之外继续执行程序。

如果所有的表达式均为假,则执行语句n。

然后继续执行后续程序。

if-else-if语句的执行过程如下图所示。

例:

判别键盘输入字符的是控制符、数字字符、大写字母或小写字母类别。

#include

voidmain()

{

charc;

printf("inputacharacter:

");

c=getchar();

if(c<32)

printf("Thisisacontrolcharacter\n");

elseif(c>='0'&&c<='9')

printf("Thisisadigit\n");

elseif(c>='A'&&c<='Z')

printf("Thisisacapitalletter\n");

elseif(c>='a'&&c<='z')

printf("Thisisasmallletter\n");

else

printf("Thisisanothercharacter\n");

}

4. 在使用if语句中还应注意以下问题:

1) 在三种形式的if语句中,在if关键字之后均为条件表达式。

该表达式通常是逻辑表达式或关系表达式,但也可以是其它表达式,如赋值表达式等,甚至也可以是一个变量。

例如:

if(a=5)语句;

if(b)语句;

都是允许的。

只要表达式的值为非0,即为“真”。

如在:

if(a=5)…;

中赋值表达式的值永远为非0,所以其后的语句总是要执行的,当然这种情况在程序中不一定会出现,但在语法上是合法的。

又如,有程序段:

if(a=b)

printf(“a=%d”,a);

else

printf("a=0");

本语句的语义是,把b值赋予a,如为非0则输出该值,否则输出“a=0”字符串。

这种用法在程序中是经常出现的。

2)在if语句中,条件判断表达式必须用括号括起来,在语句之后必须加分号。

3)在if语句的三种形式中,所有的语句应为单个语句,如果要想在满足条件时执行一组(多个)语句,则必须把这一组语句用{}括起来组成一个复合语句。

但要注意的是在}之后不能再加分号。

例如:

if(a>b)

{

a++;

b++;

}

else

{

a=0;

b=10;

}

例:

求三角形的面积。

#include

#include//为了引用函数要sqrt()

main()

{

floata,b,c;

printf("pleaseentera,b,c:

");

scanf("%f%f%f",&a,&b,&c);

if(a+b>c&&b+c>a&&c+a>b)

{

doubles,area;

s=(a+b+c)/2;

area=sqrt(s*(s-a)*(s-b)*(s-c));

printf("area=%4.4f\n",area);

}

else

printf("itisnotatrilateral!

\n");

return0;

}

运行程序:

pleaseentera,b,c:

456

area=9.9216

5.if语句的嵌套

当if语句中的执行语句又是if语句时,则构成了if语句嵌套的情形。

其一般形式可表示如下:

if(条件表达式)

if(条件表达式)语句1;

else语句2;

else

if(条件表达式)语句3;

else语句4;

注意:

在嵌套内的if语句可能又是if-else型的,这将会出现多个if和多个else重叠的情况,这时要特别注意if和else的配对问题。

例如:

if(表达式1)

if(表达式2)

语句1;

else

语句2;

其中的else究竟是与哪一个if配对呢?

应该理解为:

if(表达式1)

if(表达式2)

语句1;

else

语句2;

还是应理解为:

if(表达式1)

if(表达式2)

语句1;

else

语句2;

为了避免这种二义性,C/C++语言规定,else总是与它前面最近的if配对,因此对上述例子应按前一种情况理解。

在实现编程中,可以借且缩格形式或{}来确定else与if的配对关系,以提高程序的可读性。

例:

用if语句嵌套实现比较两个数的大小关系。

#include

main()

{

inta,b;

printf("pleaseinputA,B:

");

scanf("%d%d",&a,&b);

if(a!

=b)

if(a>b)

printf("A>B\n");

else

printf("A

else

printf("A=B\n");

return0;

}

说明:

这种问题用if-else-if语句也可以完成。

而且程序更加清晰。

因此,在一般情况下较少使用if语句的嵌套结构。

以使程序更便于阅读理解。

例:

用if-else-if结构实现比较两个数的大小关系。

#include

main()

{

inta,b;

printf("pleaseinputA,B:

");

scanf("%d%d",&a,&b);

if(a==b)printf("A=B\n");

elseif(a>b)printf("A>B\n");

elseprintf("A

return0;

}

例:

写一个程序,从键盘输入年份year,判断其是否是闰年。

闰年条件:

能被4整除,但不能被100整除的年份是闰年,或者能被400整除的年份是闰年,即year是闰年要满足的条件是:

year%4==0&&year%100!

=0||year%400==0

从而可以写出如下的程序:

#include

main()

{

intyear;

printf("Pleaseinputtheyear:

");

scanf("%d",&year);

if(year%4==0&&year%100!

=0||year%400==0)

printf("%disaleapyear\n",year);

else

printf("%disnotaleapyear\n",year);

return0;

}

注意:

简单的分支结构可以用条件表达式替代。

例如条件语句:

if(a>b)max=a;

elsemax=b;

可用条件表达式写为

max=(a>b)?

a:

b;

例:

将输入的大写字母转换为小写字母输出。

#include

main()

{

charch;

printf("Inputacharacter:

");

scanf("%c",&ch);

ch=ch>='A'&&ch<='Z'?

ch+32:

ch;

printf("%c\n",ch);

return0;

}

4.4switch语句——开关语句

C语言还提供了另一种用于多分支选择的switch语句,其一般形式为:

switch(表达式)

{

case常量表达式1:

语句1;

case常量表达式2:

语句2;

case常量表达式n:

语句n;

default:

语句n+1;

}

语义:

计算表达式的值。

并逐个与其后的常量表达式值相比较,当表达式的值与某个常量表达式的值相等时,即执行其后的语句,然后不再进行判断,继续执行后面所有case后的语句。

如表达式的值与所有case后的常量表达式均不相同时,则执行default后的语句。

例:

#include

main()

{

inta;

printf("inputintegernumber:

");

scanf("%d",&a);

switch(a)

{

case1:

printf("Monday\n");

case2:

printf("Tuesday\n");

case3:

printf("Wednesday\n");

case4:

printf("Thursday\n");

case5:

printf("Friday\n");

case6:

printf("Saturday\n");

case7:

printf("Sunday\n");

default:

printf("error\n");

}

return0;

}

程序运行情况:

inputintegernumber:

3

Wednesday

Thursday

Friday

Saturday

Sunday

error

说明:

①本程序是要求输入一个数字,输出一个英文单词。

但是当输入3之后,却执行了case3以及以后的所有语句,输出了Wednesday及以后的所有单词。

②在switch语句中,“case常量表达式”只相当于一个语句标号,表达式的值和某标号相等则转向该标号执行,但不能在执行完该标号的语句后自动跳出整个switch语句,所以出现了继续执行所有后面case语句的情况。

这是与前面介绍的if语句完全不同的,应特别注意。

③C语言还提供了一种break语句,专用于跳出switch语句,break语句只有关键字break,没有参数。

例:

#include

main()

{

inta;

printf("inputintegernumber:

");

scanf("%d",&a);

switch(a)

{

case1:

printf("Monday\n");break;

case2:

printf("Tuesday\n");break;

case3:

printf("Wednesday\n");break;

case4:

printf("Thursday\n");break;

case5:

printf("Friday\n");break;

case6:

printf("Saturday\n");break;

case7:

printf("Sunday\n");break;

default:

printf("error\n");break;

}

return0;

}

程序运行情况:

inputintegernumber:

3

Wednesday

在使用switch语句时还应注意以下几点:

1)在case后的各常量表达式的值不能相同,否则会出现错误。

表达式和各case后面的常量表达式的类型为字符型、整型或枚举型——表示地址标号。

2)在case后,允许有多个语句,可以不用{}括起来。

3)若在每个case子句后都设置有break语句,则各case和default子句的先后顺序可以变动,而不会影响程序执行结果。

4)default子句可以省略不用。

5)switch语句允许嵌套使用。

4.5选择结构程序设计举例

例1:

任意顺序输入三个整数,按从大到小的顺序输出这三个数。

#include

main()

{

inta,b,c,temp;

printf("inputthreenumbers:

");

scanf("%d%d%d",&a,&b,&c);

if(a

if(a

if(b

printf("%d%d%d\n",a,b,c);

return0;

}

例4.6根据学生成绩判断等级。

#include

voidmain()

{

intscore;

printf("Inputscore:

");

scanf("%d",&score);

switch(score/10)

{

case10:

case9:

printf("%d:

A\n",score);

break;

case8:

case7:

printf("%d:

B\n",score);

break;

case6:

printf("%d:

C\n",score);

break;

default:

printf("%d:

D\n",score);

}

}

例4.7:

求ax2+bx+c=0方程的根,a,b,c由键盘输入,设b2-4ac>0。

求根公式为:

则x1=p+q,x2=p-q

源程序如下:

#include

#include

voidmain()

{

floata,b,c;//输入带小数点的数,宜定义为float

doubledisc,x1,x2,p,q;

printf("Pleaseinputthreenumbers:

");

scanf("%f%f%f",&a,&b,&c);

disc=b*b-4*a*c;

p=-b/(2*a);

if(fabs(a)==0)

printf("Theequationisnotaquadratic.\n");

elseif(disc==0)

{

printf("Theequationhastwoequalroots:

");

printf("%8.4f\n",p);

}

elseif(disc>0)

{

printf("Theequationhasdistinctrealroots:

\n");

q=sqrt(disc)/(2*a);

x1=p+q;x2=p-q;

printf("%8.4f,%8.4f\n",x1,x2);

}

elseif(disc<0)

{

printf("Theequationhasdistincimageroots:

\n");

q=sqrt(-disc)/(2*a);

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1