《选择结构语句.docx》由会员分享,可在线阅读,更多相关《选择结构语句.docx(16页珍藏版)》请在优知文库上搜索。
1、选择结构语句前面所有的程序都是从上到下,每条语句执行一次,直到程序结束,这种W页序结构的程序能解决的问题极其有限。在现实生活中,需要进行判断和选择的情况是很多的,例如上一章的金币复制机,如果限制用户投入的金币数必须少于20,才能复制金币,那就要判断用户投入的金币数是否小于20。如果问题中出现需要进行判断和选择的情况,那就要引入选择语句才能解决。选择语句C语言最常用的选择语句是if选择语句,if选择语句分为ifelse语句和if语句。ifelse语句ifelse语句的格式如下所示:if()else是判断条件,是一个条件表达式或逻辑表达式。(关于条件表达式或逻辑表达式稍后介绍)是当条件为真值(满足
2、条件)时执行的语句。是当条件为假值(不满足条件)时执行的语句。条件表达式选择结构语句中的条件是一个条件表达式或逻辑表达式。条件表达式是件表达式的运算结果是逻辑值:真值(满足条件)或假值(不满足条件)。条件表达式分为关系表达式和逻辑表达式。关系表达式关系表达式是指用关系运算符将两个表达式(关系运算对象)连接起来的式子,如果条件满足,结果为真值,否则为假值。关系表达式中的关系运算符用于对运算对象进行比较运算,判定是否符合给定的关系。C语言中关系运算符有6种:(小于)、=(小于或等于)、(大于)、=(大于或等于)、=(连续2个等于号,等于)、!=(不等于)。关系运算符都是双目运算符,即有2个运算对象
3、,它们的运算很简单。关系表达式举例:45假值4!=5真值逻辑表达式逻辑表达式是指用逻辑运算符将运算对象连接起来的表达式逻辑表达式中的逻辑运算符是对逻辑值(真值或假值)或者运算结果是一个逻辑值的表达式进行运算,C语言中有3种逻辑运算符:&:与运算符,只有当它连接的2个表达式都为真时,其运算结果为真,其他情况都为假。与运算符用于连接2个要同时满足的条件。Il:或运算符,只有当它连接的2个表达式都为假时,其运算结果为假,其他情况都为真。或运算符用于连接2个只要满足1个的条件。!:非运算符,或者叫做取反。后面的表达式为真值时,结果为假,否则为真。逻辑表达式举例:a=0&a=100/a是一个已有值的变量
4、if语句if语句的格式如下所示:if()是判断条件,是一个条件表达式或逻辑表达式。是当条件为真值(满足条件)时执行的语句。单分支问题单分支问题是指根据情况进行判断后,可供选择的结果只有1个。例子新版金币复制机的另一个版本:现在金币复制机的功能更新,只有当用户投入的金币数小于20时,金币复制机才会正常吐出金币,反之,金币复制机没有任何反馈信息。用户投入金币后,金币复制机只有1种选择:一是如果用户的金币数小于20,金币复制机复制出一半的金币。显然,这是一个单分支问题。显而易见,单分支问题用if语句解决,本题的完整程序如下:SCanf(%d,&x);if(x20)y=365*x2+x;Print(y
5、);程序11双分支问题双分支问题是指根据情况进行判断后,可供选择的结果有2个。例子新版金币复制机:现在金币复制机的功能更新,只有当用户投入的金币数小于20时,金币复制机才会正常吐出金币,反之,金币复制机会输出金币数太多的反馈信息。用户投入金币后,金币复制机有2种选择:一是如果用户的金币数小于20,金币复制机复制出一半的金币,二是如果用户的金币数大于或等于20,金币复制机给出金币数太多的反馈信息。显然,这是一个双分支问题。首先,分析金币复制机的算法,如下所示: 用户输入金币数 如果用户输入的金币数小于20,计算并输出总的金币数,输出运算结果,反之,输出ToOmanygoldcoins”。这里要根
6、据条件(用户输入的金币数小于20)的真或假来决定接下来运行的语句,这就要用到选择语句了。设保存用户输入的金币数的变量为X,由选择结构的条件是:x20根据这个条件将用户的金币数分为2个区域(双分支):20以上和20或20以下,不同的区域有不同的处理。如果条件为真(20以上的区域)则计算并输出总的金币数,语句如下:y=365*x2+xPrintf(w%d”,y);如果条件为假(20或20以下)则输出t。manygoldcoins,语句如下:printfftoomanygoldcoins);将以上结果填入ifelse语句,再加上前后的语句,程序如下:SCanf(%d,&x);if(x20)y=365
7、*x2+x;print(y);elseprintfftoomanygoldcoinszz);程序1编程技巧双分支问题也可以用if语句解决。不管是几个分支,归根结底,每一个结果都对应一个条件,它们是一对应的,例如上面介绍的金币复制机。if语句就是当一个条件满足时执行对应的一个结果,反过来,一个条件对应一个结果可以用一条if语句解决,所以双分支问题就可以用2个if语句来解决。因为ifelse语句中else部分的条件是取反得到的,所以只要将ifelse语句中的条件取反就可以得到另一个if语句中的条件。所以前面的程序可以改写为:SCanfC%d,&x);if(x=20)printf(toomanygo
8、ldcoins7);程序2程序2中的2条的if语句可以交换顺序,如下所示:SCanf(%d,8x);if(x=20)printf(toomanygoldcoinszz);if(x20)y=365*x2+x;Pnt(y);程序3习题threefigures”输入一个整数,如果是一个3位数,将它逆序并输出,否则给出not的反馈信息。下面举一个例子。例题输入一个整数,如果它是奇数则输出yes,否则输出no首先,算法分析。本题的运算过程是:用户输入一个二位数X如果X是奇数,则输出yes,f,否则输出no本题需要用户输入一个二位数,包含一条输入语句:SCanf(%d,&X);本题要根据条件来判断,由于是
9、双分支问题,可以使用ifelse语句。要判断X是否奇数,判断条件是:x%2=l所以完整程序如下:intx;scanf(%d,z8x);if(%2=l)Printf(yes)花括号内的语句只有一条时,可以省略花括号elseprintf(nozz);程序4同样,程序4也可以改写成使用if语句的程序,如下所示:intx;scanf(%d,z8x);if(%2=l)Printf(yes)if(%2!=l)printf(no,z);程序5将题目稍微更改一下,如下所示:输出一个整数是否奇数(结果为1或0,1表示是奇数,0表示不是奇数)。本题与上题的不同在于输出结果的数据类型,上题是一个字符串同,本题是一个
10、整数,所以对于本题来说,如下的程序是错误的:intx;SCanf(%d,a);jf(%2=l)printfCi;if(x%2!=l)printfC0z,);程序6正确的程序如下所示:intx;SCanfr%d”,a);jf(%2=l)if(x%2!=l)printfC%d,zO);程序7或者是:it,y;SCanf(%d,a);if(%2=l)(y=i;PrintfC%d,y);if(x%2!=l)(y=;Printfc%d”,y);)程序8从程序8的执行过程可以看出,if语句中的printf(%d,y)/可以移到后面,所以程序8可以简化为:it,y;SCanf(%d,a);if(%2=l)y
11、=i;if(x%2!=l)y=;Printf(%d,y);程序9编程技巧有很多问题是根据一个条件判断真假,例如如判断一个数是否奇数、判断一个数是否水仙花数、判断一个数是否素数等,都可以用以下思路解决:先认定结果是真或假(大多数情况下,先认定为真或假都可以,有时候要根据具体问题来确定),然后再根据条件确定结果是否为假或真,如果是,则更正先前的认定。根据以上思路,判断一个数是否奇数的问题就可以先认定它是奇数,再判断它是否偶数,如果是,则认定它是偶数。所以程序9可以简化为:it,y;SCanf(%d,a);y=l;if(x%2!=l)y=;Printf(%d,y);程序10当然,也可先认定该数是偶数
12、,具体程序请读者自行完成。作业1、输出153是否水仙花数(水仙花数是该数各位数字的立方和等于该数本身,例如153;结果为1或0,1表示是奇数,0表示不是奇数)2、输出102是否这样的三位数:个位数不大于2,若将个位数移动到百位之前,新三位数大于原三位数的两倍(结果为1或0,1表示是奇数,0表示不是奇数)是不是所有的双分支结构都可以像这样替换成2个单分支结构呢?不是。请看下面的代码:if(maxla)maxl=a;elsemax2=a;能否替换成如下的代码呢?if(maxl=maxl)ma2=a;不能。因为2条单分支语句是先后执行的,由于前一条语句改变了变量maxi和ma2的值,而它们又被后一条
13、语句的条件使用,这样就很可能改变了后一条语句的条件,从而得到错误的结果。多分支的处理为了鼓励用户多户多投金币,金币复制机的功能再次改进,如下所示:如果小于10,则吐出的金币数和投入金币数相同;当用户投入的金币数在大于等于10并且小于20时,吐出的金币数为投入金币数的2倍;如果大于20,则输出toomanygoldcoins。现在要将金币数分为3个区域(3个分支),每一种区域都对应不同的处理方式。一个条件只有真或假2种结果,也就是说只能将金币数分为2个区域,分成3个区域的情况怎么处理呢?首先来看看使用ifelse语句如何解决。用if语句的嵌套解决多分支问题为了处理多个分支的情况,可以在ifels
14、e语句的结果语句中包含if语句或ifelse语句,也就是if语句的嵌套。现在将金币数X分为3个区域(3个分支):X小于10 X大于等于10并且X20首先用第一个if语句(判断条件是X小于10),将X分为小于10和X大于等于10的2个区域。X大于等于10的区域还要再分为2个区域,这又要用到第二个if语句(判断条件是X20),第二个if语句要嵌套到第Tif语句中去。第一个if语句将金币数X分成2个区域,所以要用到双分支结构。为了便于说明,将双分支结构的格式复制过来:if()(else)是条件,这里是X是否小于10是当条件真时所要执行的语句,当X小于10时,计算金币数并输出。是当条件为假时要执行的语句。当X大于等于10时,还要再分为2个区域,所以要再次使用双分支结构。这个双分支结构的判断条件是X是否大于20,如果为真则输出金币数太多的提示,反之计算金币数并输出。将以上分析结果填入双分支结构,如下所示:if(x10)(