课件版小茶c语言基础第4章_第1页
课件版小茶c语言基础第4章_第2页
课件版小茶c语言基础第4章_第3页
课件版小茶c语言基础第4章_第4页
课件版小茶c语言基础第4章_第5页
已阅读5页,还剩99页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第4章选择结构程序设计

4.1关系运算符及关系运算表达式4.2逻辑运算符及逻辑表达式4.3选择语句4.4选择结构程序设计4.5条件运算符 选择结构的特点是,根据某种条件程序有选择地执行程序中的某一部分语句(不执行某另一部分语句)。在这种选择结构下,程序中形成了若干个分支,因此,选择结构也称为分支结构。构成选择结构中的条件,在C语言中主要是用关系运算表达式或逻辑运算表达式实现的,而选择程序结构是用分支语句实现的。为此,本章首先介绍关系运算符及其关系表达式,逻辑运算符及其逻辑表达式。然后,介绍实现选择结构的分支语句及选择结构程序的设计。

关系运算符是用来确定一个量与另一个量之间的关系,

C语言提供六种关系运算符。4.1

关系运算符及关系运算表达式

关系运算的结果是一个逻辑值。逻辑值是一种只有两个值的量:真和假。关系运算的结果成立,或者说为真(true),则运算结果为1,也就是用1表示真。比较的结果不成立,或者说为假(false),则运算结果为0,也就是用0表示假。例如,关系运算:10>100 显然是不成立的,表达式的值为假,实际存储的数字为0。例4.1.1设有变量定义:

inta=90,b=80;计算下面关系运算表达式的值:

a>b>=1<=0==1!=0

按照关系运算符的优先级和结合性,上面表达式的运算顺序相当于

((((a>b>)=1)<=0)==1)!=0表达式的值为0。上式的运算过程可以用图4.1来说明。 例4.1.2下面的程序应用关系运算符判断用户输入的两个整型变量数是否相等,并将比较的结果输出。程序如下:

/*Thisprogramillustratestherelationaloperators.*/#include"stdio.h"main(){

intnum1,num2; /*定义变量*/printf("Entertwonumbers:"); /*提示用户输入数据*/

scanf("%d%d",&num1,&num2); /*用户输入数据*/printf("num1=%dnum2=%d\n",num1,num2); /*输出用户数据*/printf("result=%d\n",num1==num2); /*输出比较结果*/}程序输出举例:Entertwonumbers:22(用户从键盘输入22)

num1=2num2=2result=1 逻辑运算符用于支持基本逻辑运算。三种逻辑运算符及其意义,如表4.2.1所示。4.2逻辑运算符及逻辑表达式

什么是逻辑运算??--逻辑运算用来判断一件事情是“对”的还是“错”的,或者说是“成立”还是“不成立”,判断的结果是二值的,即没有“可能是”或者“可能不是”,这个“可能”的用法是一个模糊概念,在计算机里面进行的是二进制运算,逻辑判断的结果只有二个值,称这二个值为“逻辑值”,用数的符号表示就是“1”和“0”。其中“1”表示该逻辑运算的结果是“成立”的,如果一个逻辑运算式的结果为“0”,那么这个逻辑运算式表达的内容“不成立“。表4.2.1逻辑运算符名称优先级结合性!逻辑非2<-(自右向左)&&逻辑与11->(自左向右)||逻辑或12逻辑运算是对逻辑量或表达式进行运算的。逻辑运算的对象可以是数值型的、字符型的,也可以是逻辑量。C语言规定,逻辑运算的运算对象为0时,代表逻辑量假;运算对象为非0时,代表逻辑量真。逻辑运算的结果仍是逻辑量:真或假。

例4.2.1分析下面表达式的值是什么?

25>5&&!(8>7)||2<=10

根据上述的关系运算和逻辑运算的意义以及运算符的优先级,不难知道该表达式的值为真。这可以从图4.3清楚地看出。

例4.2.2设有如下变量定义:

charch='A';/*ch的值是65*/

intk1=65,k2=97;计算下面表达式的值:

k1+32==k1&&k2==ch

上式的计算过程相当于:

((k1+32)==k2)&&(k1==ch)第一步运算k1+32=97;第二步运算97==k2结果为真;第三步运算k1==ch结果为真;第四步运算1&&1结果为真;所以,整个表达式的值为1(真)。例4.2.3编写程序,求25&&10,25||10的逻辑值。程序如下:

#include<stdio.h>main(){intx=25,y=10;printf("x=%dy=%dx&&y=%d\n",x,y,x&&y);printf("25||10=%d\n",25||10);}程序的输出有如下的形式:

x=25y=10x&&y=125||10=1

关于逻辑运算,有一点要特别说注意:当对两个表达式进行逻辑与运算时,若前一个表达式的值为假,则不再进行后一个表达式的计算,整个表达式的值肯定为假。同样,当对两个表达式进行逻辑或运算时,若前一个表达式的值为真,整个表达式的值肯定为真,也不再进行后一个表达式的计算。例如,表达式10>12&&(a=a+1)中前一个表达式的值为0(假),整个表达式的值为0,不进行后面表达式“a=a+1”的计算,a的值保持不变。又如,表达10<121||(a=a+1)中前一个表达式的值为1(真),整个表达式的值为0,不进行后面表达式“a=a+1”的计算,a的值保持不变。4.3选择语句

选择语句是用于构造选择程序结构的语句。4.3.1单分支if选择语句单分支if选择语句是形式最简单的if条件转移语句,它的格式如下:

if(表达式)语句;本语句的功能是,首先计算“表达式”的值,如果表达式的值为真,则执行“语句”,否则不执行,而是转去执行本语句后面的语句。单分支if语句的流程图如图4.4所示。图4.4单分支if语句的流程if语句中表达式可以任何类型的C表达式。其中语句也可以是任何语句,包括另一个if语句(称嵌套if语句);也可以是由若干语句组成的一个组语句。在这种情况下,这组语句需要用花括号“{}”括起来。

例4.3.1编写程序,求输入的整数的绝对值并将其输出。整个程序的思路可归结为以下三步:(1)输入整数a;(2)求a的绝对值并存入a;(3)输出a。求a的绝对值的简单方法就是:如果a是负数,再对它取一次负就变为正数了。按照这个思路,不难写出如下的程序:

#include"stdio.h"main(){inta,a1;scanf("%d",&a);a1=a;

if(a<0)a=-a;printf("|%d|=%d\n",a1,a);}

如果输入整数−5,则程序输出|−5|=5。4.3.2双分支if_else选择语句if_else语句的格式为:

if(表达式)语句1;

else语句2;

语句的功能是,首先计算表达式的值,如果为真,则执行语句(块)1,否则执行else后面的语句(块)2。上述功能如图4.5所示。图4.5双分支if_else选择语句流程例4.3.2比较用户输入的两个整数的大小。若输入的第一个数大于第二个数,则显示:

first>second

否则,显示:

first<=second最后,显示:

Alldone!显然,这是一个有两个分支的程序。用图4.6的流程图说明编程的思想。

图4.6例4.3.2程序的流程图根据流程图可写出程序如下:#include<stdio.h>main(){intfirst,second;

printf("Entertwonumbers:");scanf("%d%d",&first,&second);

if(first>second)printf("first>second");elseprintf("first<=second");

printf("Alldone!");}例4.3.3用双分支if语句重新编写例4.3.1的程序。可以利用一个分支处理变量a为正数的情况,如令x=a。用另一个分支初处理变量a为负数的情况,如令x=−a。最后输出结果。下面给出程序:

#include"stdio.h"main(){inta,x;scanf("%d",&a);if(a>0)x=a;elsex=-a;printf("|%d|=%d\n",a,x);}4.3.3多分支结构如果在if选择语句的一个或两个分支语句中,还包含有if语句,则称这种结构为“if语句的嵌套”。利用if语句的嵌套,可以构成多个分支的选择结构程序。例4.3.4编写一程序,进行十进制数、八进制数和十六进制数之间的转换。程序首先给出一个菜单,供用户选择所要求的数制转换。

菜单的形式如下:Convert:1:decimaltohexadecimal(十进制数转换为十六进制数)2:hexadecimaltodecimal(十六进制数转换为十进制数)3:decimaltooctal(十进制数转换为八进制数)4:octaltodecimal(八进制数转换为十进制数)5:octaltohexadecimal(八进制数转换为十六进制数)6:hexadecimaltooctal(十六进制数转换为八进制数)并提示用户输入数制转换类型:

Enteryourchoice:

用户通过输入数字(1~6)选定所要转换类型,然后程序提示用户输入待转换的数,例如:

Enteradecimalvalue:

输入数据后,程序输出换算的结果。根据题意可知,本程序应该有六个分支语句块分别处理六种不同情况数制的转换。在每个分支中数制之间的转换,可通过函数printf()的格式控制字符实现。十进制数用格式字符“%d”输出。八进制数用格式字符“%o”输出,十六进制数用格式字符“%x”输出。

下面给出程序清单:

#include<stdio.h>main(){intvalue,choice;

printf("Convert:\n"); /*输出菜单*/

printf("1:decimaltohexadecimal\n");printf("2:hexadecimaltodecimal\n");printf("3:decimaltooctal\n");

printf("4:octaltodecimal\n");printf("5:octaltohexadecimal\n");printf("6:hexadecimaltooctal\n");

printf("Enteryourchoice:"); /*输入菜单选择*/

scanf("%d",&choice);if(choice==1){

printf("Enteradecimalvalue:");scanf("%d",&value);printf("%dinhexadecimalis%x\n",value,value);}elseif(choice==2){printf("Enterahexadecimalvalue:");scanf("%x",&value);printf("%xindecimalis%d\n",value,value);}elseif(choice==3){printf("Enteradecimalvalue:");scanf("%d",&value);printf("%dinoctalis%o\n",value,value);}elseif(choice==4){

printf("Enteraoctalvalue:");scanf("%o",&value);printf("%oindecimalis%d\n",value,value);}elseif(choice==5){printf("Enteraoctalvalue:");scanf("%o",&value);printf("%oinhexadecimalis%x\n",value,value);}

elseif(choice==6){printf("Enterahexadecimalvalue:");scanf("%x",&value);printf("%xinoctalis%o\n",value,value);}elseprintf("Invalidselection.\n");}我们看到,本程序通过六个if_else_if结构的语句,构成了七个分支的多分支程序。根据if语句的执行流程,当第一个if语句的条件(choice==1)为真时,执行它后面的语句块:进行十→十六的转换,输出结果后,程序运行结束。否则,表达式为假时,通过else分支进入第二个if语句。若表达式(choice==2)为真,执行它后面的语句块:进行十六→十的转换,输出结果后,程序运行结束。否则,表达式为假时,跳过它后面的语句块,执行下一个if语句,等等。以此类推,一直执行到第六个if语句。如果用户输入的数字不是在1~6中,则执行程序最后一行的else语句。下面是程序的一次运行输出实例(十进制数转换为十六进制数)。程序开始运行后显示采单:

Convert:1:decimaltohexadecimal;2:hexadecimaltodecimal;3:decimaltooctal;4:octaltodecimal;

5:octaltohexadecimal;6:hexadecimaltooctal;Enteryourchoice:1(输入1)

Enteradecimalvalue:255(输入255)

输出如下的计算结果:

255inhexadecimalisff

一般情况下,只要在一个if语句中包含有另一个if语句就是if语句的嵌套,组成的就是多分支的选择结构程序。例如,下面也是一种多分支的选择结构:

if(表达式)

if(表达式){语句}

else{语句}

elseif(表达式){语句}

else{语句}C语言对语句在程序中书写形式没有严格的要求。一行可以写多个语句,也可以把一个语句写在两行里。一个语句可以从一行的头开始写,也可以从一行的某个位置开始写。为了使嵌套结构清楚、醒目并避免产生错误的理解,建议各层嵌套的语句采用不同的缩进书写形式,如上面所写的那样。必要时,使用花括号也会使是程序的嵌套结构显示得更清晰。例4.3.5分析下面的多分支语句:

if(a>b)if(b>5)c=0;elsec=1;

在这个语句中含有两个if和一个else。从语句的书写形式上,分支结构不是很清楚。可能产生两种不同的理解。第一种理解是:如果(a>b)并(b>5),则执行c=0;否则,(a>b)不成立,则执行c=1。这种理解是把else与第一个if配为一对。用缩进格式表达上述理解时,可把语句写成如下的形式:

if(a>b)if(b>5)c=0;elsec=1;第二种理解是:如果(a>b)并(b>5),则执行c=0;否则,(a>b)成立,(b>5)不成立,则执行c=1。这种理解是把else与第二个if配对。用缩进格式表达上述理解时,可把语句写成如下的形式:

if(a>b)if(b>5)c=0;elsec=1;

第一种理解是把else与第一个if配对;第二种理解是把else与第二个if配对。哪种理解是正确的呢?C语言的规定:在if嵌套语句中,一般从最内层开始,else与它前面最近的if配成一对。根据“else与它前面最近的if配对”的原则,这里的else应该是与第2个if配对,就是第二种理解是合乎C语法规则的。语句的功能应该这样理解:如果a>b成立,并且b>5,则把0赋给变量c;如果a>b成立,但b>5不成立,则把1赋给变量c。如果这不是我们所要表达的意思。我们要表达的是:如果a>b成立,并且b>5,则把0赋给变量c;如果a>b不成立,则把1赋给变量c。这时,else要与第一个if配对。我们应该这样写:

if(a>b){if(b>5)c=0;}elsec=1;

这里花括号是必须的。4.3.4多分支开关语句switch在许多情况下,switch语句非常适合构造多分支选择结构程序。switch语句的一般格式为:

switch(表达式){

case常量表达式1: 语句(块)1

break;case常量表达式2: 语句(块)2

break;……case常量表达式n: 语句(块)n break;default: 语句(块)n+1}

switch语句的执行过程如下:

首先,计算switch后圆括号内的表达式的值,然后,用这个值逐个与各case的常量表达式i的值进行比较。当找到与其相等(匹配)的case时,就执行该case中的语句(块)i,如果在语句(块)i中有break语句,便退出该switch语句。如果没有break语句,则在执行完某个语句(块)i后,连续执行其后的语句(块),直到遇上另一个break语句,结束switch的执行,或者一直执行到最后的语句(块),然后,结束switch语句的执行。switch语句的上述功能如图4.8所示。

图4.8switch语句的流程例4.3.6分析下面应用switch语句程序的输出。

#include"stdio.h"main(){intc;scanf("%d",&c);switch(c){

case1:printf("case1\n");break;case2:printf("case2\n");break;case3:printf("case3\n");case4:printf("case4\n");break;default:printf("default\n");}}输入1,则程序输出:case1(执行break语句,退出switch,程序结束)输入2,则程序输出:case2(执行break语句,退出switch,程序结束)输入3,则程序输出:case3(没有break语句,连续执行下后边的case)输入3,则程序输出:case4(执行break语句,退出switch,程序结束)

输入4,则程序输出:case4(执行break语句,退出switch,程序结束)输入1~4以外的数,如6,则程序输出:default(退出switch,程序结束)。

4.4选择结构程序设计

本节将通过一些例题,进一步练习选择结构程序的编程技术。例4.4.1用户从键盘输入三个整数,找出并输出其中数值最大的那一个。如果其中有一个以上的最大数(两数相等的情况),也要表示出来。因为程序要多次进行两个数的大小比较才能找出其中的最大值,所以这是一个多分支的选择结构的程序。我们要特别注意各语句中if和else的配对关系和相应的缩进书写形式。程序如下:

#include<stdio.h>main(){inta,b,c;printf("Enter3numbers:");scanf("%d%d%d",&a,&b,&c);if(a>b){

if(a>c)printf("max.a=%d\n",a);elseif(a==c)printf("max.a=c=%d\n",c);elseprintf("max.c=%d\n",c);}elseif(a==b){if(a>c)printf("max.a=b=%d\n",a);elseif(a==c)printf("a=b=c=%d\n",c);elseprintf("max.c=%d\n",c);}elseif(b>c)printf("max.b=%d\n",b);elseif(b==c)printf("max.b=c=%d\n",b);elseprintf("max.c=%d\n",c);}程序的输出有如下的形式:

Enter3numbers:132(132是用户的输入)

max.b=3(程序的输出)

需要强调指出的是,任何合法的C表达式都可以作为if语句的条件表达式。表达式中,关系操作符和逻辑操作符并不是绝对必要的。只要表达式的值是0,就认为条件为假,非0就认为是真。请看下面的例子。例4.4.2用户从键盘输入两个整数,进行除法运算。其中变量dividend是被除数,divider是除数,result是商。要求当除数(divider)为0时,输出信息“Can'tdividedbyzero.”,不进行计算。如果除数不为0,则进行除法运算并输出计算结果。程序中用

if(divider)判断除数是否是0。这里表达式divider不是什么关系表达式,也不是逻辑表达式,甚至也不是算术表达式。就是由一个变量组成的表达式。但是利用0代表假,非0代表真这一规则,因此,可以用作if语句的判断条件。程序如下:#include<stdio.h>{main()

floatdividend,divider,result;

printf("Entertwofloatnumbers:");scanf("%f%f",÷nd,÷r);

if(divider){result=dividend/divider;printf("result=%f",result);}

elseprintf("Can'tdividedbyzero.");}

当然,也可以把上面程序中的if(divider)写成下面的关系表达式的形式:

if(divider!=0)

但这种形式不如前一种形式更为简单。

在if语句的条件表达式中也可以出现赋值表达式,如if(x=y)。但不要与相等的比较运算(x==y)相混淆。前者是赋值表达式,后者是关系表达式。请看下面的例子。例4.4.3判断两整型数的和是否小于0的程序。程序中使用了如下的if语句:

if((z=x+y)<0)其中的z=x+y是赋值表达式。它与z==x+y的意义是不同的。程序如下:

#include<stdio.h>main(){intx,y,z;

printf("Entertwonumbers:");scanf("%d%d",&x,&y);

if((z=x+y)<0)printf("Thesumisnegative.\n");elseprintf("Thesumispositive.\n");}default是switch语句中的一个任选的分支,在语句中是可用可不用部分。但是,使用它可能产生很好的效果。在实践中,它一般用在处理不能与所有的case相匹配的情况。例如,键盘输入错误的数字,则在找不到匹配case后,便执行default情况下的语句,使其输出必要的信息,如“Inputerror.”等。

在switch语句中,并不要求每个case后面都要有相应的语句。如果case后面没有语句,则称它为空case。当与这种case匹配并进入该case后,什么也不做,接着进入下一个case。下面是一个这类应用的例子。例4.4.4程序要求用户输入任意一大于0并小于等于6的整数。如果用户输入的数是在1~6范围内的整数,程序输出:

yournumberisOK.number=(用户输入的数)如果输入是1~6范围以外的整数,程序则输出:

Iputerror!

程序如下:

#include<stdio.h>

main(){intc;

printf("Enteranumber:");scanf("%d",&c);switch(c){case1:case2:

case3:case4:case5:case6:printf("yournumberisOK.number=%d",c);break;default;printf("Iputerror!c=%d",c);}}这个程序的执行过程是,如果用户输入一个数字1~6的数,程序找到并执行匹配的case。程序中的case1到case5,都是空的。最后一定进入case6并输出相应信息。例如,用户输入2,则在屏幕上得到如下的结果:

yournumberisin1~6.number=2如果用户输入大于6的数(例如8),则执行default分支,输出:

Iputerror!c=8

例4.4.5输入学生的百分制成绩,然后,换算成为A,B,C,D四级输出。换算规则是:90~100分A级70~89分B级60~69分C级0~59分D级用switch语句编写程序。我们定义一个整型变量score用于存储100分制分数,定义一个字符变量level记录四级分的符号。解决本问题的算法的核心是:

scroe/10=9或10对应于Ascroe/10=7或8对应于Bscroe/10=6对应于Cscroe/10=其他对应于D于是应用switch语句可以写出如下的程序:

#include"stdio.h"main(){intscore;charlevel;

scanf("%d",&score);

switch(score/10){ case10:case9:level='A';break; case8: case7:level='B';break; case6:level='C';break;

default:level='D';}

printf("level=%c\n",level);}在这个程序中,使用了空case语句。请读者分析其中的道理并写出程序的输出。

例4.4.6编写计算下式的程序:程序的流程图示于图4.9。由图可以看出,按照x的值可以分出两个case,每个x的case嵌套一个y的switch。而每个y的switch又有两个case与相应的y值相对应。这样,一共相成四个分支。图4.9switch嵌套结构的例子程序如下:

#include<stdio.h>main(){intx,y;

printf("Entertwonumber(1or2):");scanf("%d%d",&x,&y);

switch(x){case1:switch(y){case1:printf("xx+yy=%d",x*x+y*y);break;

case2:

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论