第3章选择结构程序设计_第1页
第3章选择结构程序设计_第2页
第3章选择结构程序设计_第3页
第3章选择结构程序设计_第4页
第3章选择结构程序设计_第5页
已阅读5页,还剩53页未读 继续免费阅读

下载本文档

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

文档简介

选择结构(分支结构)的处理过程为:先判断一个条件,然后根据条件是否成立,执行不同的代码。第3章

选择结构程序设计C语言提供了作为判断条件的关系表达式和逻辑表达式,还有实现分支结构的if语句和switch语句。3.1关系运算符和关系表达式3.2逻辑运算符和逻辑表达式3.3if语句3.4switch语句3.5条件运算符和条件表达式第3章选择结构程序设计3.6程序举例3.1关系运算符和关系表达式关系运算符:比较两个量的运算符关系表达式:用关系运算符将运算对象 连接起来的式子在C语言中,关系运算符有六种3.1.1关系运算符优先级相同

(高)①<

(小于)②<=(小于或等于)③>

(大于)④>=(大于或等于)⑤==(等于)⑥!=(不等于)优先级相同

(低)运算符优先级的高低次序3.1.1关系运算符结合性为自左至右关系表达式是用关系运算符将运算对象连接起来的式子。

运算对象可以是常量、变量或表达式。3.1.2关系表达式例如:

3>7a<=ba%2==0a+b>=c-d关系表达式求解的结果:成立或不成立,即“真(true)”或“假(flase)”。

在C语言中,用“1”代表“真”,用“0”代表“假”。3.1.2关系表达式例如:

inta=7,b=4,c=1,d;a%2==0a%2==0的值为0a%b<a/ba%b<a/b的值为03.1.2关系表达式例如:

inta=7,b=4,c=1,d;d=a>bd=a>b的值为1(d=a)>b(d=a)>b的值为1d=a>b>cd=a>b>c的值为0注意:在C语言中要判断a大于b且b大于c时,写成逻辑表达式a>b&&b>c,其中&&是逻辑与运算符。3.2.1逻辑运算符

在C语言中,逻辑运算符有三种

3.2逻辑运算符和逻辑表达式运算符优先级的高低次序3.1.1逻辑运算符结合性为自右至左结合性为自左至右逻辑表达式:用逻辑运算符将关系表达式或逻辑量连接起来的式子。

逻辑表达式的值是一个逻辑值,即“真”或“假”。

C语言中,以1表示“真”,以0表示“假”。3.2.2逻辑表达式逻辑运算的真值表3.2.2逻辑表达式

运算对象,可以是任意类型的数据,以非0表示真,以0表示假

运算结果,以1表示“真”,以0表示“假”逻辑量的真假判定──0和非0C语言用整数“1”表示“逻辑真”、用“0”表示“逻辑假”。但在判断一个数据的“真”或“假”时,却以0和非0为根据:如果为0,则判定为“逻辑假”;如果为非0,则判定为“逻辑真”。例如,假设num=12,则:!num的值,num>=1&&num<=31的值,num||num>31的值。011

注意!3.2.2逻辑表达式对于&&,如果其左侧表达式的值为假,则右侧表达式不进行求解(即不执行)。

对于||,如果其左侧表达式的值为真,则右侧表达式不进行求解。例如,假设n1、n2、n3、n4、x、y的值分别为1、2、3、4、1、1,则求解表达式“(x=n1>n2)&&(y=n3>n4)”后,x的值变为,而y的值等于!01C99所增加的一种数据类型类型标识符:_Boolstdbool.h头文件中,把bool定义为该类型的别名

#definebool

_Bool同时定义:#definetrue

1

#definefalse

0

【注】在不支持c99标准的编译器上(如VC++6.0)不能使用。#include<stdio.h>intmain(){

_Boolb; b=2000; printf("%d\n",b); return0;}1#include<stdio.h>#include<stdbool.h>intmain(){

boolb; b=2000; if(b==true)printf("%d\n",b); return0;}3.3.1if语句的形式3.3if语句C语言中的if语句有三种基本形式。1.单分支if语句一般形式: if(表达式)

语句例如: if(x>y) printf("%d",x);表达式语句假真【例3-1】求x的绝对值。3.3.1if语句的形式思路:先求解表达式x<0的值,判断x是否为负数,如果结果为真,则执行内嵌的语句x=-x;,否则不执行该语句。掌握if语句的一般形式与求解过程。3.3.1if语句的形式【例3-1】求x的绝对值。#include<stdio.h>

intmain()

{ intx; scanf("%d",&x); if(x<0) x=-x;//if的内嵌语句 printf("|x|=%d\n",x); return0;}

运行一次,输入:-10运行结果:|x|=10再运行一次,输入:-10运行结果:|x|=10【例3-2】输入两个整数,按由小到大的顺序输出这两个数。3.3.1if语句的形式本题要点: 1.交换变量内容的方法 2.复合语句使用3.3.1if语句的形式【例3-2】输入两个整数,按由小到大的顺序输出这两个数。#include<stdio.h>

intmain()

{ intx,y,t; scanf("%d,%d",&x,&y); if(x>y) {t=x;x=y;y=t;}//复合语句 printf("%d,%d\n",x,y); return0;}

运行一次,输入:10,5运行结果:5,10思考:

去掉{},程序结果?xyt87878voidmain(){inta,b,c,temp;printf("Pleaseinputthreenumbers:");scanf("%d,%d,%d",&a,&b,&c);if(a>b){temp=a;a=b;b=temp;}if(b>c){temp=b;b=c;c=temp;}if(a>b){temp=a;a=b;b=temp;}printf("%d,%d,%d\n",a,b,c);} 输入任意三个数a、b、c,按从小到大的顺序排序输出。2.双分支if语句3.3.1if语句的形式一般形式: if(表达式)

语句1 else

语句2例如: if(x>0) printf("%d",x); else printf("%d",-x);表达式语句1语句2真假【例3-3】求两个数中较大者。3.3.1if语句的形式

使用双分支if语句实现。3.3.1if语句的形式【例3-3】求两个数中较大者。#include<stdio.h>

intmain()

{ intx,y,max; scanf("%d,%d",&x,&y); if(x>y) max=x;//if的内嵌语句 else max=y;//else的内嵌语句 printf("max=%d\n",max); return0;}

运行一次,输入:5,10运行结果:Max=10

注意!3.2.2逻辑表达式

else不能作为语句单独使用,它必须是if语句的一部分,与if配对使用。例如: if(x>y) {x=y;y++;} else {y=x;x--;}如果写成: if(x>y) x=y;y++; else {y=x;x--;}语法错误3.多分支if语句3.3.1if语句的形式多分支if语句可以看成双分支if语句的扩展形式,即在双分支if语句中,else的内嵌语句是另一个双分支的if语句。一般形式: if(表达式1)语句1 elseif(表达式2)语句2 elseif(表达式3)语句3 …… else语句n多分支if语句的执行过程:3.3.1if语句的形式如果表达式1的值为真,则执行语句1,否则判断表达式2。如果表达式2的值为真,则执行语句2,否则判断表达式3,依次类推。如果所有表达式的值都为假,则执行语句n。【例3-4】输入一个百分制的分数,输出相应的等级。3.3.1if语句的形式要求如下:

成绩>=90,输出A 89>=成绩>=80,输出B 79>=成绩>=70,输出C 69>=成绩>=60,输出D

成绩<60,输出E本题要求使用多分枝if语句实现。3.3.1if语句的形式【例3-4】输入一个百分制的分数,输出相应的等级。#include<stdio.h>

intmain()

{ intscore; scanf("%d",&score); if(score>=90)printf("scoregradeisA\n");elseif(score>=80)printf("scoregradeisB\n");elseif(score>=70)printf("scoregradeisC\n");elseif(score>=60)printf("scoregradeisD\n");elseprintf("scoregradeisE\n");return0;}

运行一次,输入:85运行结果:scoregradeisB再运行一次,输入:55运行结果:scoregradeisE在if语句中,if和else的内嵌语句可以是任何语句,如果又是if语句,则称为if语句的嵌套。3.3.2if语句的嵌套3.3.2if语句的嵌套例如:if(a>b) if(b>c) printf("%disbiggest\n",a);elseprintf("%disnotbiggest\n",a);以上代码中else与哪个if配对?3.3.2if语句的嵌套C语言规定:else总是与它上面最近的未曾配对的if配对。即:if(a>b) if(b>c) printf("%disbiggest\n",a); else printf("%disnotbiggest\n",a);else与这个if配对if(a>b){ if(b>c) printf("%disbiggest\n",a);} else printf("%disnotbiggest\n",a);else与这个if配对3.3.2if语句的嵌套【例3-5】求三个数中最大者。本题使用嵌套if语句实现。3.3.1if语句的嵌套【例3-5】求三个数中最大者。#include<stdio.h>

intmain()

{ intx=4,y=5,z=2,max; max=x; if(z>y) {if(z>x) max=z; } else if(y>x) max=y; printf("max=%d",max); return0;}运行结果:max=5或者写为:……if(num1>num2)

max=num1;

else

max=num2;if(num3>max)

max=num3;……或者max=num1;if(num2>max)max=num2;3.4switch语句switch语句是专门用于处理多分支结构的条件选择语句,又称开关语句。一般形式为: switch(表达式) { case常量表达式1:语句1;[break;] case常量表达式2:语句2;[break;] ……. case常量表达式n:语句n;[break;] [default:语句n+1;[break;]] }3.4switch语句switch语句的执行过程:1)求解switch后面括号中表达式的值。2)用此值依次与各个case后面的常量表达式的值进行比较。3)匹配,则执行此case后面的语句。4)若括号中表达式的值与所有case后面的常量表达式都不相等,则执行default后面的语句。5)语句执行后若遇到break语句或switch的结束符“}”就终止switch语句。6)否则就继续执行下一个case后面的语句,依次类推。3.4switch语句例如:执行以下程序代码intno;scanf("%d",&no);switch(no){case1:printf("first\n");break;case2:printf("second\n");case3:printf("third\n");}运行一次:输入:1运行结果:first再运行一次:输入:2运行结果:secondthird3.4switch语句说明:(1)case和常量表达式之间要有空格,常量表达式只起语句标号作用,跳出switch必须用break语句。如果每个case和default后面都有break语句,则它们出现的次序不影响执行结果。例如:switch(no){ default:printf("last\n");break; case2:printf("second\n");break; case1:printf("first\n");break; case3:printf("third\n");break;}3.4switch语句说明:(2)case后面常量表达式的值必须互不相同。(3)多个case可共用一组执行语句,case后可包含多个可执行语句,且不必加“{}”,进入某个case后,会顺序执行本case后面的所有语句。(4)default部分可以省略。如果省略,当switch后面括号中表达式的值与所有case后面的常量表达式的值都不相等时,则不执行任何一个分支直接退出switch语句。(5)switch语句可以嵌套。3.4switch语句【例3-6】将例3-4进行修改,用switch语句实现。输入一个百分制的分数,输出相应的等级。

比较switch语句与嵌套if语句的差异。3.4switch语句【例3-6】将例3-4进行修改,用switch语句实现。#include<stdio.h>

intmain()

{ intscore; scanf("%d",&score); switch(score/10) {case10: case9:printf("scoregradeisA\n");break; case8:printf("scoregradeisB\n");break; case7:printf("scoregradeisC\n");break; case6:printf("scoregradeisD\n");break; default:printf("scoregradeisE\n");break;} return0;}case10和case9共用一组语句3.4switch语句【例3-7】嵌套的switch语句

阅读程序,分析结果。3.4switch语句【例3-7】嵌套的switch语句。#include<stdio.h>

intmain()

{intx=1,y=0,a=0,b=0;switch(x){case1: switch(y) {case0:a++;break; case1:b++;break;} case2:a++;b++;break; case3:a++;b++;} printf("\na=%d,b=%d",a,b); return0;}运行结果:a=2,b=1//break语句终止switch(y)//break语句终止switch(y)//break语句终止switch(x)3.5条件运算符和条件表达式条件运算符,是C语言中唯一的一个三元运算符。条件表达式,由条件运算符连接的式子。一般形式为:表达式1?表达式2:表达式3例如:x>y?x:y3.5条件运算符和条件表达式说明(1)条件表达式的值求解过程为:先求解表达式1,如果表达式1的值为真(非0),则将表达式2的值作为整个条件表达式的值,否则将表达式3的值作为整个条件表达式的值。例如:max=x>y?x:y;//将x和y中较大者赋给maxy=x>0?x:-x;//将x的绝对值赋给ya>b?(max=a):(max=b);a>b?printf(“%d”,a):printf(“%d”,b);3.5条件运算符和条件表达式说明(2)条件运算符的优先级高于赋值运算符和逗号运算符,低于其它运算符。例如:

a%3?a+2:a-2等价于(a%3)?(a+2):(a-2)a>5&&a<10?a++:a--等价于(a>5&&a<10)?(a++):(a--)b=a+3>7?10:20等价于b=((a+3)>7?10:20)3.5条件运算符和条件表达式说明(3)条件运算符的结合方向为自右至左。条件表达式可以嵌套,当一个条件表达式中出现多个条件运算符时,应该将位于最右边的问号与离它最近的冒号配对,并按这一原则正确区分各条件运算符的运算对象。例如:a>b?10:b>c?20:30等价于a>b?10:(b>c?20:30)3.6程序举例1.从键盘输入一个字符,判断该字符是否为大写字母,如果是转换为小写字母输出,如果不是,原样输出。

本题要点: 1.ASCII码应用 2.判断某个字符是否为大写字母的方法。3.6程序举例#include<stdio.h>

intmain()

{ charch; printf("Inputacharacter:"); scanf("%c",&ch); ch=(ch>='A'&&ch<='Z')?(ch+32):ch; printf("ch=%c\n",ch); return0;}运行一次,输入:A运行结果:a2.编写程序,用switch语句处理菜单命令。解题思路:在许多应用程序中,用菜单对流程进行控制,例如从键盘输入一个’A’或’a’字符,就会执行A操作,输入一个’B’或’b’字符,就会执行B操作,等等。#include<stdio.h>intmain(){voidaction1(int,int),action2(int,int);charch;inta=15,b=23;ch=getchar();switch(ch){case'a':case‘A’:action1(a,b);break;

case'b':case‘

温馨提示

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

评论

0/150

提交评论