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

下载本文档

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

文档简介

1、 选择结构是根据运行时的情况自动选择要执行的 语句。在c语言中,用if语句或switch语句实现选择结 构。if语句称作条件语句,switch语句称作分情况语句。 如何表示条件,如何使用选择结构制程序流程,是学 习本章要掌握的主要内容。 先来看这样一个问题,计算分段函数: y= 3-x x0 2/x x0 求解问题的流程如下: (1)输入x; (2)如果x=0则y=3-x;否则y=2/x; (3)输出y的值。 显然程序的流程必须由x的值确定。这类程序 结构又称为分支结构,分支的依据是根据某 个变量或表达式的值做出判定,以决定执行 哪些语句和跳过哪些语句。分支流程控制可 以用if语句实现。 c语

2、言的if语句有3种形式: 单分支选择if语句 双分支选择if语句 多分支选择if语句。 单分支if语句 单分支选择语句if的形式为: if(表达式)语句 执行单分支选择语句时,首先判断表达 式的值,若表达式值为非0,则执行表达式后 面的语句;若表达式值为0,则不执行表达式 后面的语句。 控制流程如图4.1所示。 图4.1 单分支选择结构 例4.1 输入一个数,如果该数大于等于0, 则输出它的平方根,当它小于0,则不做 任何处理。 分析: (1)输入的数存入变量x; (2)使用选择if(x=0)。 程序: #include #include main() double x; scanf (%f,

3、 /* sqrt(x)开平方库函数调用*/ 例4.2 输入两个整数,求出大的数并输出。 #include main() int a,b,max; scanf (%d,%d, max=b; /*首先假设b为大的一个数*/ if ( ab) max=a; /* 如果b不为大的一个数,则a是大的一个数*/ printf(%d, max); 双分支if语句 双分支选择语句为if-else,语句的结 构形式为: if(表达式)语句1 else 语句2 当表达式值为非0,则执行语句1; 当表达式值为0,则执行语句2。 控制流程如图4.2所示。 图4.2 双分支选择结构 在例4.1中,若输入的数据大于等于0

4、,输出它的平 方根;否则,就输出数据出错信息,用if-else结构 形式的选择语句可以实现两种处理的分支。 编程如下: #include #include main() double x; scanf(%f, if(x=0) printf(%10.6f,sqrt(x); /*sqrt(x)开平方库函数 调用*/ else printf(enter data error! ); /*输出数据错误信息*/ 例4.3 输入两个数,比较其大小,将较大的数输出。 在例4.2中,我们用单分支实现过这个程序。现在我们用双分支 实现。流程分析: (1)输入两个数据a,b; (2)如果ab则输出a;否则,输出b

5、。 使用if-else选择结构进行双分支,程序设计如下: #include main() float a,b; scanf(%f,%f, if(ab) printf(%f,a); else printf(%f,b); 注意:else之前有一分号。如无此分号,则会出现语法错误。 多分支选择结构 多分支选择结构的if语句形式如下: if(表达式1)语句1; else if(表达式2)语句2; else if(表达式3)语句3; else if(表达式n)语句n; else语句n+1; 执行多分支选择if语句时,如果表达式i的值为 非0,则执行语句i,后面的语句再不执行;否 则执行else后面的语句

6、。 多分支选择的流程图如图4.3所示。 图4.3 多分支选择的流程 例4.4 计算分段函数: 2*x x-10 y= 2+x-10 x0 x-20 x10 x/10 x10 分析: 此多分支结构可用图4.4所示的流程图表 示。 图4.4 例题4.3的流程图 分支选择结构语句如下: if(x-10*/ if(x0*/ if(x=10) /*看x是否小于等于10*/ yx-2; else /*x10*/ yx/10; 例4.5 输入3个数a,b,c,要求按由小到大的顺序输出。 编程如下: #include main() int a,b,c,t; scanf(%d,%d,%d, if (ab) t=

7、a; a=b; b=t; /*实现a和b的互换*/ if (ac) t=a; a=c; c=t; /*实现a和c的互换*/ if (bc) t=b; b=c; c=t; /*实现b和c的互换*/ printf(%d,%d,%dn,a,b,c); 运行情况如下: 3,7,1 1,3,7 在这个例子中,我们利用了一个中间变量t 来实现两个数的互换,这种方法将在许多地方用 到,读者可以自己好好地体会这种方法。 if语句中的“表达式”一般为逻辑表达式或 关系表达式,也可以是任意数值类型的表达式。 三种形式if语句中的执行语句可以是一条简单语 句,或一条空语句,或一条复合语句,也可以嵌 套其他流程控制语

8、句。 if语句的嵌套 在上述3种if语句结构中,当if(表达式)或else后面的 语句本身又是一个if语句结构时,就形成了if语句的嵌 套结构。 if语句的二层嵌套结构如下: if(表达式表达式1) if(表达式表达式1_1) 语句语句1_1; else 语句语句1_2; else if(表达式表达式2_1) 语句语句2_1; else 语句语句2_2; 对照前面的双分支结构,语句l的位置上嵌套了一个双 分支结构的if语句,语句2的位置上也嵌套了一个双分支结 构的if语句。 例题4.4的分段函数可以用两层嵌套来完成: if (x=10) if(x=-10)/*当x-10*/ y=2*x;/*当

9、-10 x0*/ else/*当-100时走这条分支*/ if(x=10)/*当0 xl 0*/ yx-2; else/*当10 x*/ yx/10; 上述流程可以用图4.5表示。 图4.5 例题4.3的两层嵌套流程图 在if语句的嵌套结构中并不需要对称, 只根据需要决定嵌套的形式。在写if语句 的嵌套结构时,要注意else与if配对的规 则,else与同一层最接近它而又没有其他 else语句与之相匹配的if语句配对。如果 忽略了else与if配对,就会发生逻辑错误。 如果读者采用较好的编程习惯,即缩进形 式,那么if与else的配对也许就更明了 。 为了使程序结构清晰,避免产生逻辑错误,可以

10、加花括 号来确定配对关系。 例如: if(x=0) if(x=-10)/*当x=-10*/ y=2*x; else/*当-10 x0时走这条分支*/ if(x=10)/*当0 x=l 0*/ y=x-2; else/*当10=150)printf(a); else printf(b); else if(tall=170)printf(a); else printf(b); switch语句是另一种分支控制语句, 其特点是可以根据一个表达式的多种值, 选择多个分支,因而也称为分情况语句 和开关语句。实际问题中常常需要用到 多分支结构,例如,学生成绩分档次(85 分以上为“a”等,7084分为“b

11、”等, 6069分为“c”等)。 switch语句一般形式如下: switch(表达式表达式) case常量常量1:语句:语句1; case常量常量2:语句:语句2; case常量常量3:语句:语句3; case常量常量n:语句:语句n; default: 语句语句n+1; 语句中的“表达式”可以是数值型或是字符型, 表达式的值称为开关值。语句结构中各个case后常 量表达式的值必须互不相同,否则执行时将出现矛 盾,即同一个开关值,将对应多种执行方案。 当表达式的值与某一个常量相等时,就执行常 量后面的语句。 case常量起的是语句标号的作用,程序并不在 此进行判断。当程序执行某个标号的语句,

12、就会按 顺序执行以后的语句,直到遇到break语句或switch 语句结束。 若表达式的值与所有常量表达式的值都不相 等,则执行default:后面的语句。default语句一般 放在最后,否则会出现逻辑错误。 注意: 虽说“表达式”可以是数值型,但由于浮点数 是用近似值表示的。“= =”用于两个浮点数的判断 时,由于存储误差,会得出错误的结果。 例如: 1.0/3.0 *3.0= =1.0 由于1.0/3.0得到的值用有限位保存,是近似 值,所以,1.0/3.0*3.01.0。也就是说,“表达式” 中不可以是浮点数。 例4.7 根据变量i的值,输出字符。 #include void main

13、() int i; printf(please input i:); scanf(%d, switch(i) case l: printf(an); case 2: printf(bn); case 3: printf(cn); case 4: printf(dn); default: printf(en); 若输入i的值为3,则与第3个常量相等,执行时会以 case3:为入口,执行此后的所有语句,其输出结果为: c d e 为了实现多分支,在执行了满足条件的语句后,就要使 流程跳出switch分支结构,而不执行其后续的case后面 的语句。因此,必须在常量表达式后面语句的最后,加 上“bre

14、ak语句。具体形式如下: switch(i) case l: printf(an); break; case 2: printf(bn); break; case 3: printf(cn); break; case 4: printf(dn); break; default: printf(en); 最后一个分支的default语句后面可以不加“break;”语句。 根据程序的需要在语句后面加或不加“break”,可以使 多分支处理变得非常灵活。如果多种情况需要共用一个 执行语句,可用case的常量表达式将多种情况列出,在 最后一种情况之后,才安排需执行的语句。例如: switch(i) c

15、ase l: case 2: case 3: printf(abcn); break; case 4: printf(dn); break; default: printf(en); 当表达式的值为l,2,3中任一个值,都会输出:abc。 case语句出现的次序并不影响执行结果。 case后面可以只有一条简单语句,也可以是用花括 号括起来的几条语句构成的复合语句,还可以是空 语句或流程控制语句。当有多条语句时,将会顺序 执行完所有语句。 例4.8 根据输入的学生的成绩判断等级。当成绩 score90时为a等;成绩70score90为b等;成绩 60score70为c等;成绩score60为d等

16、(score为整 数)。 分析:设score为整型数,在score90的范围内, score可能取100,99,90,如果把这些值都列 出来,太繁琐。利用两个整数相除,结果自动取整 的特性,当score在90到100之间变化时,score/10就 只可能取10和9两个值。 score和score/10的对应关系: scorescore/10 9010, 9 70897, 8 60696 60以下default 因此,可以用score/10的值来确定分支。 上述任务可以由以下的程序完成: #include void main() int score; scanf(%d, switch(score

17、/10) case 10: case 9: printf(%d:an,score); break; case 8: case 7: printf(%d:bn,score); break; case 6: printf(%d:cn,score); break; default: printf(%d:dn,score); 我们已经学习了顺序结构和两种选择 结构。这些结构都可以互相嵌套和组合, 设计出结构复杂的程序。在本节中,将 通过几个具体的例子介绍两种选择结构 和顺序结构的嵌套和组合。 例4.9 求方程ax2+bx+c0的实数解。 分析: 根据3个系数的不同情况,方程的根有如下 几种情况: (1

18、)a=0:不是二次方程 (2)b2-4ac0:有两个相等的实根,只要求 一个根 (3)b2-4ac0:有两个不等的实根,求x1和 x2 (4)b2-4ac0:没有实数解 程序: #include void main() float a, b ,c, xl, x2, disc; printf(input a b c: ); scanf(%f%f%f, if(fabs(a)le-6) /*a=0*/ printf(the equation is not a quadratic); else disc=b*b-4*a*c;/*求判别式*/ if(disc0)/*判别式小于0*/ printf(the

19、 equation has not real root); else if(fabs(disc) 1e6)/*判别式等于0*/ printf(the equation has two equal roots: %8.4f,-b/(2*a); else xl=(-b+sqrt(disc)/(2*a); x2(-b-sqrt(disc)/(2*a); printf(the equation has distinct real roots: %8.4f,%8.4f,xl,x2); /*3条顺序结构的语句组成一条复合语句*/ /*l条赋值语句和if(disc0)组成一条复合语句*/ 程序中用disc代

20、表b2-4ac,先计算disc的值,以减少 以后的重复计算。对于判断b2-4ac是否等于0时,要 注意一个问题:由于disc(即b2-4ac)是实数,而实数 在计算和存储时会有一些微小的误差,因此不能直 接进行如下判断: if (disc=0) 因为这样可能会出现本来是零的量,由于上 述误差而被判别为不等于零而导致结果错误。 所以采取的办法是判别disc 的绝对值 (fabs(disc)是否小于一个很小的数(例如1e6), 如果小于此数,就认为disc=0。图4.6 判断闰 年程序流程。 思考: 有多条语句嵌套在结构中时,必须用花括号 将多条语句组合成一条复合语句。如果去掉 花括号,会出现什么问题呢? 例4.10 输入年号,判断它是否为闰年。 分析: 如果此年号能被400整除,则它是闰年; 否则,如果能被4整除,而不能被100整 除则是闰年,否则不是闰年。 程序流程图如图4.6所示。 图4.6 判断闰年程序流程 程序: #include leap=0 void main() unsigned int year,leap; printf(enter year: );

温馨提示

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

评论

0/150

提交评论