版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第3章之选择结构程序设计,学习的意义,在编制程序时,有时并不能保证程序一定执行某些指令,而是要根据一定的外部条件来判断哪些指令要执行。如菜谱中要加工西红柿,可能有这样的步骤:如果是用鲜西红柿,则去皮、切碎,开始放入,如果是用西红柿酱,就在最后放入。这里,我们并不知道具体操作时执行哪段指令,但菜谱给出了不同条件下的处理方式,计算机程序也是如此,可以根据不同的条件执行不同的代码,这就是选择结构。程序总是为解决某个实际问题而设计的,而问题往往包含多个方面,不同的情况需要有不同的处理,所以选择结构在我们的实际应用程序中可以说是无处不在,离开了选择结构很多情况将无法处理,因此,正确掌握选择结构程序设计方
2、法对于我们编写实际应用程序尤为重要。,C程序中语句的分类 关系运算符、逻辑运算符、条件运算符 选择结构的程序设计(if语句、switch语句) 选择结构程序设计举例 本章小结,学习目标,理解选择结构的含义; 掌握C语言语句的分类; 掌握关系运算符、逻辑运算符和条件运算符的用法; 记住关系运算符、逻辑运算符和条件运算符与其它运算符的优先级关系和结合性; 掌握if、switch语句的使用方法。,学习内容,C程序中语句的分类,语言程序的执行部分是由语句组成的。程序的功能也是由执行语句实现的。C语言中的语句可以分为以下5类:,表达式语句 由表达式加上分号“;”组成。其一般形式为:表达式;,函数调用语句
3、 由函数名、实际参数加上分号“;”组成。其一般形式为:函数名(实际参数表);,a = 10 赋值表达式 a = 10; 赋值语句 k+ 表达式 k+; 表达式语句,while (getchar( ) != n ) ; 本语句的功能是,只要从键盘输入的字符不是回车则重新输入。这里的循环体为空语句。,空语句 只有分号“;”组成的语句称为空语句。空语句是什么也不执行的语句。在程序中空语句可用来作空循环体。,printf (C Program) 函数调用; printf (“C Program”); 函数调用语句 其功能是输出字符串C Program。,说明: (1) “”后不加分号 (2) 语法上和
4、单一语句相同 (3) 复合语句可嵌套 (4) 复合语句内定义的变量只能在复合语句内使用。,复合语句 用 括起来的一组语句。, int a = 2, b = 3, c; c = a + b; printf (c = %dn, c); ,一般形式为: 数据说明部分; 执行语句部分; ,#include void main ( ) int x = 10, y = 20, z; z = x + y; int z; z = x * y; printf (z = %dn, z); /输出复合语句中z的值 printf (z = %dn, z); /输出复合语句外z的值 ,输出结果: z = 200 z =
5、 30,控制语句 用来实现一定的控制功能的语句称为控制语句 。C语言用控制语句来实现选择结构和循环结构。语言有九种控制语句。可分成以下三类:,3.4 选择结构的程序设计,1. if语句,简单if语句形式,if (表达式) 语句;,格式:,执行流程:,例如:下面的程序段是输入两个整数,输出其中的大数。 int a, b, max; printf (input two numbers: ); scanf (%d%d, ,if_else形式,if (表达式) 语句1; else 语句2;,格式:,执行流程:,例如:下面的程序段同样是输出两个整数中的最大数。 int a, b; printf (inp
6、ut two numbers: ); scanf (%d%d, ,1. if语句,if_else_if形式,if(表达式1) 语句1; else if (表达式2) 语句2; else if (表达式3) 语句3; else 语句n;,格式:,执行流程:,例如:下面的程序段是判断输入字符的种类。 char c; printf (Enter a character: ); c = getchar ( ); if (c = 0 ,if语句注意事项,(1) if语句后面的表达式必须用括号括起来 。 (2) 表达式通常是逻辑表达式或关系表达式,但也可以是其它任何表达式,如赋值表达式等,甚至也可以是一个
7、变量。只要表达式非零时,表达式的值就为真,否则就是假。 (3) 在if语句的三种形式中,所有的语句应为单个语句,如果要想在满足条件时执行一组(多个)语句,则必须把这一组语句用 括起来组成一个复合语句。但要注意的是在之后不能再加分号。 (4) 在if语句中,如果表达式是一个判断两个数是否相等的关系表达式,要当心不要将=写成了赋值运算符=。,if (a = 5) 语句; /表达式的值永远为非0, 所以其后的语句总是要执行的 if (b) 语句; /等价于if (b != 0) 语句;,运行结果:x = 0,运行结果:x != 0,if语句嵌套: 一般形式:,例 输入两数并判断其大小关系,#incl
8、ude void main ( ) int x, y; printf (Enter integer x, y: ); scanf (%d, %d, ,运行结果: Enter integer x, y: 12, 23 XY Enter integer x, y: 12, 12 X=Y,语言规定,在缺省 时,else总是和它上面离它最近的未配对的if配对,运行结果:a = 0,运行结果:a = 1,if_else 配对原则,例: if (a=b) if(b=c) printf(“a=b=c”); else printf(“a!=b”);,修改: if (a=b) if(b=c) printf(“a
9、=b=c”); else printf(“a!=b”);,实现if else 正确配对方法:加 ,例:考虑下面程序输出结果: void main( ) int x = 100, a = 10, b = 20; int v1 = 5, v2 = 0; if (a b) if (b != 15) if (!v1) x=1; else if (v2) x = 10; x = -1; printf (“%d”, x); ,结果:-1,2. switch语句(开关分支语句) 一般形式:,switch ( 表达式) case E1: 语句组 1; break; case E2: 语句组 2; break;
10、 . case En: 语句组 n; break; default: 语句组 ; break; ,执行过程:,使用switch语句注意事项,(1) switch后面的“表达式”,可以是int、char和枚举型中的一种,但不可为浮点型。,float a, b = 4.0; scanf (%f, ,int a, b = 4; scanf (%d, ,使用switch语句注意事项,(2) case后面语句(组)可加 也可以不加 ,但一般不加 。 (3) 每个case后面“常量表达式”的值,必须各不相同,否则会出现相互矛盾的现象。,switch ( i ) case 1: b = b + 1; bre
11、ak; / 可加可不加 case 2: b = b - 1; break; ,使用switch语句注意事项,(4) 每个case后面必须是“常量表达式”,表达式中不能包含变量。,例:按成绩分成A、B、C、D、E、F几个等级。 char score; printf (Enter Score: ); scanf (%d, ,使用switch语句注意事项,(5) case后面的“常量表达式”仅起语句标号作用,并不进行条件判断。系统一旦找到入口标号,就从此标号开始执行,不再进行标号判断,所以必须加上break语句,以便结束switch语句。,#include void main ( ) char ch
12、; ch = getch ( ); switch ( ch ) case Y : printf (Yesn); break; case N : printf (Non); break; case A : printf (Alln); break; default : printf (Yes,No or Alln); ,运行结果: No,/假设输入为:N,#include void main ( ) char ch; ch = getch ( ); switch ( ch ) case Y : printf (Yesn); break; case N : printf (Non); case A
13、 : printf (Alln); break; default : printf (Yes,No or Alln); ,/假设输入为:N,运行结果: No ALL,使用switch语句注意事项,(6)多个case子句,可共用同一语句(组)。,例:当a的值是1、2、3时,将b的值加2,当a的值是4、5、6时,将b的值减2。 int a, b = 4; scanf (%d, ,使用switch语句注意事项,(7) case子句和default子句如果都带有break子句,那么它们之间顺序的变化不会影响switch语句的功能。,#include void main ( ) char ch; ch
14、= getch ( ); switch ( ch ) case Y : printf (Yesn); break; case N : printf (Non); break; case A : printf (Alln); break; default : printf (Yes,No or Alln); break; ,#include void main ( ) char ch; ch = getch ( ); switch ( ch ) case Y : printf (Yesn); break; default : printf (Yes,No or Alln); break; cas
15、e N : printf (Non); break; case A : printf (Alln); break; ,使用switch语句注意事项,(8) case子句和default子句如果有的带有break子句,而有的没有带break子句,那么它们之间顺序的变化可能会影响输出的结果。,#include void main ( ) char ch; ch = getch ( ); switch ( ch ) case Y : printf (Yesn); break; case N : printf (Non); break; case A : printf (Alln); break; d
16、efault : printf (Yes,No or Alln); ,#include void main ( ) char ch; ch = getch ( ); switch ( ch ) case Y : printf (Yesn); break; default : printf (Yes,No or Alln); case N : printf (Non); break; case A : printf (Alln); break; ,/假设输入为:B,运行结果: Yes,No or All,运行结果: Yes,No or All No,/假设输入为:B,使用switch语句注意事项
17、,(9) switch语句可以嵌套。,void main ( ) int x = 1, y = 0, a = 0, b = 0; switch ( x ) case 1: switch ( y ) case 0: a+; break; case 1: b+; break; case 2: a+; b+; break; case 3: a+; b+; printf (na = %d, b = %d, a, b); ,运行结果: a = 2,b = 1,选择结构程序设计举例,【例1】已知某公司员工的保底薪水为500,某月所接工程的利润profit(整数)与利润提成的关系如下所示(计量单位:元)。计
18、算员工的当月薪水。,程序应该这样来设计: 首先要定义一个变量用来存放员工所接工程的利润; 其次提示用户输入员工所接工程的利润,并调用scanf函数接受用户输入员工所接工程的利润; 然后根据上表的规则,计算该员工当月的提成比率。 最后计算该员工当月的薪水(保底薪水+所接工程的利润*提成比率),并输出结果。,#include void main ( ) long profit; /所接工程的利润 float ratio; /提成比率 float salary = 500; /薪水,初始值为保底薪水500 printf (Input profit: ); /提示输入所接工程的利润 scanf (%l
19、d, /输出结果 ,运行结果: Input profit: 4000 salary = 1100.00,方法一:使用if_else if语句,#include void main ( ) long profit; /所接工程的利润 float ratio; /提成比率 float salary = 500; /薪水,初始值为保底薪水500 printf (Input profit: ); /提示输入所接工程的利润 scanf (%ld, /输出结果 ,运行结果: Input profit: 4000 salary = 1100.00,方法二:使用if语句,0.1默认为double型,不进行强制
20、类型转换将产生警告信息!,方法三:使用switch语句,算法设计要点: 为使用switch语句,必须将利润profit与提成的关系转换成某些整数与提成的关系。分析本题可知,提成的变化点都是1000的整数倍(1000、2000、5000、),如果将利润profit整除1000,则当: profit 1000 对应0、1 1000 profit 2000 对应1、2 2000 profit 5000 对应2、3、4、5 5000 profit 10000 对应5、6、7、8、9、10 10000 profit 对应10、11、12、 为解决相邻两个区间的重叠问题,最简单的方法就是:利润profit
21、先减1(最小增量),然后再整除1000即可: profit 1000 对应0 1000 profit 2000 对应1 2000 profit 5000 对应2、3、4 5000 profit 10000 对应5、6、7、8、9 10000 profit 对应10、11、12、,#include void main ( ) long profit; /所接工程的利润 int grade; float ratio; /提成比率 float salary = 500; /薪水,初始值为保底薪水500 printf (Input profit: ); /提示输入所接工程的利润 scanf (%ld,
22、 /输入所接工程的利润,方法三:使用switch语句,/将利润-1、再整除1000,转化成switch语句中的case标号 grade = (profit - 1) / 1000; switch ( grade ) /计算提成比率 case 0: ratio = 0; break; / profit1000 case 1: ratio = (float)0.10; break; / 1000profit2000 case 2: case 3: case 4: ratio = (float)0.15; break; / 2000profit5000 case 5: case 6: case 7:
23、 case 8: case 9: ratio = (float)0.20; break; / 5000profit10000 default: ratio = (float)0.25; / 10000profit salary += profit * ratio; /计算当月薪水 printf (salary = %.2fn, salary); /输出结果 ,运行结果: Input profit: 4000 salary = 1100.00,【例2】写一程序,从键盘上输入1年份year(4位十进制数),判断其是否闰年。闰年的条件是:能被4整除、但不能被100整除,或者能被400整除。,程序应该
24、这样来设计: 如果能被整除,则余数为,即如果的值等于,则表示能被整除! 首先将是否闰年的标志leap预置为0(非闰年),这样仅当year为闰年时,将leap置为1即可。这种处理两种状态值的方法,对优化算法和提高程序可读性非常有效,请读者仔细体会。,#include void main ( ) int year, leap = 0; / leap=0:预置为非闰年 printf (Please input the year: ); /提示输入年份 scanf (“%d”, ,运行结果: Please input the year: 2008 2008 is a leap year.,判断是否为闰
25、年,if ( ( year % 4 = 0 ,【例3】写一程序,从键盘上输入任意两个数和一运算符(+:加,-:减,*:乘,/:除),计算其运算的结果并输出 。,程序应该这样来设计: 首先输入两个数和一运算符号,然后根据运算符号来做相应的运算,但是在做除法运算时,应判别除数是否为0,如果为0,运算非法,给出提示信息。如果运算符号不是+、-、*、/则同样是非法的,也应给出提示信息。其它情况,输出运算的结果。,#include void main ( ) float a, b; /存放两个数的变量 int tag = 0; /运算合法的标志,0-合法,1-非法 char ch; /运算符变量 flo
26、at result; /运算结果变量 printf (input two number: ); /提示输入两个数 scanf (%f%f, /输入运算符,switch ( ch ) /根据运算符来进行相关的运算 case +: result = a + b; break; /加法运算 case -: result = a - b; break; /减法运算 case *: result = a * b; break; /乘法运算 case /: if (!b) /除法运算,判除数是否为0 printf (divisor is zero!n); /显示除数为0 tag = 1; /置运算非法标志
27、 else /除数非0 result = a / b; /计算商 break; default: printf (illegal arithmetic lablen); /非法的运算符 tag = 1; /置运算非法标志 if (!tag) /运算合法,显示运算结果 printf (%.2f %c %.2f = %.2fn, a, ch, b, result); ,运行结果: input two number: 20 30 input arithmetic lable(+ - * /): + 20.00 + 30.00 = 50.00,本讲小结:,语言程序的执行部分是由语句组成的。程序的功能也
28、是由执行语句实现的。C语言中的语句可以分为表达式语句、函数调用语句、复合语句、空语句及控制语句五类。 关系表达式和逻辑表达式是两种重要的表达式,主要用于条件执行的判断和循环执行的判断。 语言提供了多种形式的条件语句以构成选择结构。 if语句主要用于单向选择。 if-else语句主要用于双向选择。 if-else-if语和switch语句用于多向选择。 任何一种选择结构都可以用if语句来实现,但并非所有的if语句都有等价的switch语句。switch语句只能用来实现以相等关系作为选择条件的选择结构。,Goog Bye!,一、选择题: (1)在下面的选择语句中,只有一个在功能上与其它三个语句不等
29、价(其中s1,s2表示某个C语句),这个不等价的语句是_。 A)if (a) s1;else s2; B)if(!a) s2;else s1; C)if(a!=0) s1;else s2; D)if(a= =0)s1;else s2; (2)设有声明语句“int a=1,b=0;”,则执行以下后输出的结果为_。 switch(a) case 1: switch(b)case 0: printf(“*0*”); case 1: printf(“*1*”);break; case 2: printf(“*2*”);break; A) *0* B) *0*2* C) *0*1*2* D) *1*2*
30、,(3)在while(x)语句中的x与下面关系表达式是_。 A)x= =0 B) x= =1 C) x! =0 D) x=!=1 (4)若有语句int x=2;下面程序段的输出结果是_。 for(x=3;xb) if(ac) printf(“%dn”,a); else printf(“%dn”,b); printf(“ItOK!n”); ,(2)#include ”stdio.h” main( ) int a=2,b=3,c=1; if(ab) if(ac) printf(“%dn”,a); else printf(“%dn”,b); printf(“ItOK!n”); 三、编程题: 输入三角形的三条边a,b,c,判断它们能否构成三角形。如果能构成三角形,则输出何种三角形(直角三角形、等腰三角形、等边三角形、不等边三角形);不能构成三角形,则输出信息“不能构成三角形”。,1.设x,y,a
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 冗余工作制度
- 即办制工作制度
- 县档案工作制度
- 五长工作制度
- 健萌工作制度
- 动力部工作制度
- 健身房工作制度
- 九年制工作制度
- 养护员工作制度
- 保修期工作制度
- 2026年青海省海南藏族自治州单招职业适应性测试题库附参考答案详解(模拟题)
- 广告制作公司奖惩制度
- 2026年及未来5年市场数据辽宁省环保行业市场行情动态分析及发展前景趋势预测报告
- 基金会会计监督制度
- 幼儿园课件《认识我们的身体》课件
- 违反无菌技术操作
- 骨髓腔穿刺科普
- 长螺旋钻孔灌注桩基础施工组织设计方案
- 管道酸洗、钝化施工方案
- 苏州市2024年江苏苏州工业园区房地产交易管理中心辅助人员招聘4人笔试历年参考题库典型考点附带答案详解(3卷合一)
- 2025年安徽省合肥市单招职业适应性测试题库附答案
评论
0/150
提交评论