C语言第4章选择结构程序设计

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

显然程序的流程必须由x的值确定。这类程序 结构又称为分支结构,分支的依据是根据某 个变量或表达式的值做出判定,以决定执行 哪些语句和跳过哪些语句。分支流程控制可 以用if语句实现。 C语言的if语句有3种形式: 单分支选择if语句 双分支选择if语句 多分支选择if语句。
单分支if语句
单分支选择语句if的形式为: if(表达式) 语句 执行单分支选择语句时,首先判断表达 式的值,若表达式值为非0,则执行表达式后 面的语句;若表达式值为0,则不执行表达式 后面的语句。 控制流程如图4.1所示。
例4.5 输入3个数a,b,c,要求按由小到大的顺序输出。 编程如下: #include <stdio.h> main() { int a,b,c,t; scanf(″%d,%d,%d″,&a,&b,&c); if (a>b) { t=a; a=b; b=t; } /*实现a和b的互换*/
if (a>c) { t=a; a=c; c=t; } /*实现a和c的互换*/ if (b>c) { t=b; b=c; c=t; } /*实现b和c的互换*/ printf(″%d,%d,%d\n″,a,b,c); }
程序: void main() { int tall; char sex; printf(″input sex and tall:″); scanf(″%c%d″,&sex,&tall); if(sex==′F′) { if(tall>=150)printf(″A″); else printf(″B″); }
例4.7 根据变量i的值,输出字符。 #include <stdio.h> void main() { int i; printf(″please input i:″); scanf(″%d″,&i); switch(i) { case l: printf(″A\n″); case 2: printf(″B\n″); case 3: printf(″C\n″); case 4: printf(″D\n″); default: printf(″E\n″); } }
例4.2 输入两个整数,求ຫໍສະໝຸດ Baidu大的数并输出。 #include <stdio.h> main() { int a,b,max; scanf (″%d,%d″, &a,&b); max=b; /*首先假设b为大的一个数*/ if ( a>b) max=a; /* 如果b不为大的一个数,则a是大的一个数*/ printf(″%d″, max); }
最后一个分支的default语句后面可以不加“break;”语句。 根据程序的需要在语句后面加或不加“break”,可以使 多分支处理变得非常灵活。如果多种情况需要共用一个 执行语句,可用case的常量表达式将多种情况列出,在 最后一种情况之后,才安排需执行的语句。例如: switch(i) { case l: case 2: case 3: printf(″ABC\n″); break; case 4: printf(″D\n″); break; default: printf(″E\n″); } 当表达式的值为l,2,3中任一个值,都会输出:ABC。
多分支选择结构
多分支选择结构的if语句形式如下: if(表达式1) 语句1; else if(表达式2) 语句2; else if(表达式3) 语句3; else …… if(表达式n) 语句n; else语句n+1;
执行多分支选择if语句时,如果表达式i的值为 非0,则执行语句i,后面的语句再不执行;否 则执行else后面的语句。 多分支选择的流程图如图4.3所示。
为了使程序结构清晰,避免产生逻辑错误,可以加花括 号来确定配对关系。 例如: if(x<=0) { if(x<=-10) /*当x<=-10*/ y=2*x; else /*当-10<x<=0*/ y=2+x; } else /*当x>0时走这条分支*/ { if(x<=10) /*当0<x<=l 0*/ y=x-2; else /*当10<x*/ y=x/10; } 添加花括号后可以很清楚地表示出else与外层if的配对情况。
图4.5 例题4.3的两层嵌套流程图
在if语句的嵌套结构中并不需要对称, 只根据需要决定嵌套的形式。在写if语句 的嵌套结构时,要注意else与if配对的规 则,else与同一层最接近它而又没有其他 else语句与之相匹配的if语句配对。如果 忽略了else与if配对,就会发生逻辑错误。 如果读者采用较好的编程习惯,即缩进形 式,那么if与else的配对也许就更明了 。
图4.1 单分支选择结构
例4.1 输入一个数,如果该数大于等于0, 则输出它的平方根,当它小于0,则不做 任何处理。 分析: (1)输入的数存入变量x; (2)使用选择if(x>=0)。
程序: #include <stdio.h> #include <math.h> main() { double x; scanf (″%lf″,&x), if ( x>=0) printf(″%10.6lf″,sqrt(x)); /* sqrt(x)开平方库函数调用*/ }
当表达式的值与某一个常量相等时,就执行常 量后面的语句。 case常量起的是语句标号的作用,程序并不在 此进行判断。当程序执行某个标号的语句,就会按 顺序执行以后的语句,直到遇到break语句或switch 语句结束。
若表达式的值与所有常量表达式的值都不相 等,则执行default:后面的语句。default语句一般 放在最后,否则会出现逻辑错误。
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;
switch语句一般形式如下: switch(表达式) { case常量1:语句1; case常量2:语句2; case常量3:语句3; …… case常量n:语句n; default: 语句n+1; }
语句中的“表达式”可以是数值型或是字符型, 表达式的值称为开关值。语句结构中各个case后常 量表达式的值必须互不相同,否则执行时将出现矛 盾,即同一个开关值,将对应多种执行方案。
图4.3 多分支选择的流程
例4.4 计算分段函数: 2*x x≤-10 y= 2+x -10<x≤0 x-2 0<x≤10 x/10 x>10 分析: 此多分支结构可用图4.4所示的流程图表 示。
图4.4 例题4.3的流程图
分支选择结构语句如下: if(x<=-10) y=2*x; else /*x>-10*/ if(x<=0) /*看x是否小于等于0*/ y=2+x; else /*当x>0*/ if(x<=10) /*看x是否小于等于10*/ y=x-2; else /*x>10*/ y=x/10;
例4.6 编程实现:根据两个数sex和tall分类,如 果sex为′F′,当tall大于等于150时,输出″A″,否 则输出″B″;若sex不为′F′,当tall大于等于170时, 输出A,否则输出B。 分析: (1)输入sex和tall (2)根据sex分支 (3)在sex为′F′的分支中判断tall≥150否 (4)在sex不为′ F′的分支中判断tall≥170否
例4.3 输入两个数,比较其大小,将较大的数输出。 在例4.2中,我们用单分支实现过这个程序。现在我们用双分支 实现。流程分析: (1)输入两个数据a,b; (2)如果a>b则输出a;否则,输出b。 使用if-else选择结构进行双分支,程序设计如下: #include <stdio.h> main() {loat a,b; scanf(″%f,%f″,&a,&b); if(a>b) printf(″%f″,a); else printf(″%f″,b); } 注意:else之前有一分号。如无此分号,则会出现语法错误。
若输入i的值为3,则与第3个常量相等,执行时会以 case3:为入口,执行此后的所有语句,其输出结果为: C D E 为了实现多分支,在执行了满足条件的语句后,就要使 流程跳出switch分支结构,而不执行其后续的case后面 的语句。因此,必须在常量表达式后面语句的最后,加 上“break"语句。具体形式如下: switch(i) { case l: printf(″A\n″); break; case 2: printf(″B\n″); break; case 3: printf(″C\n″); break; case 4: printf(″D\n″); break; default: printf(″E\n″); }
选择结构是根据运行时的情况自动选择要执行的 语句。在C语言中,用if语句或switch语句实现选择结 构。if语句称作条件语句,switch语句称作分情况语句。
如何表示条件,如何使用选择结构制程序流程,是学
习本章要掌握的主要内容。
§4.1
if 语句
先来看这样一个问题,计算分段函数: y= 3-x x≤0 2/x x>0 求解问题的流程如下: (1)输入x; (2)如果x<=0则y=3-x;否则y=2/x; (3)输出y的值。
注意: 虽说“表达式”可以是数值型,但由于浮点数 是用近似值表示的。“= =”用于两个浮点数的判断 时,由于存储误差,会得出错误的结果。 例如: 1.0/3.0 *3.0= =1.0 由于1.0/3.0得到的值用有限位保存,是近似 值,所以,1.0/3.0*3.0≠1.0。也就是说,“表达式” 中不可以是浮点数。
运行情况如下: 3,7,1↙ 1,3,7
在这个例子中,我们利用了一个中间变量t 来实现两个数的互换,这种方法将在许多地方用 到,读者可以自己好好地体会这种方法。 if语句中的“表达式”一般为逻辑表达式或 关系表达式,也可以是任意数值类型的表达式。 三种形式if语句中的执行语句可以是一条简单语 句,或一条空语句,或一条复合语句,也可以嵌 套其他流程控制语句。
对照前面的双分支结构,语句l的位置上嵌套了一个双 分支结构的if语句,语句2的位置上也嵌套了一个双分支结 构的if语句。 例题4.4的分段函数可以用两层嵌套来完成: if (x<=10) if(x<=-10) /*当x≤-10*/ y=2*x; /*当-10<x≤0*/ else /*当-10<x≤0 */ y=2+x; else /*当x>0时走这条分支*/ if(x<=10) /*当0<x≤l 0*/ y=x-2; else /*当10<x*/ y=x/10; 上述流程可以用图4.5表示。
双分支if语句
双分支选择语句为if-else,语句的结构形 式为: if(表达式) 语句1 else 语句2 当表达式值为非0,则执行语句1;当表达 式值为0,则执行语句2。 控制流程如图4.2所示。
图4.2 双分支选择结构
在例4.1中,若输入的数据大于等于0,输出它的平方根; 否则,就输出数据出错信息,用if-else结构形式的选择语句 可以实现两种处理的分支。 编程如下: #include <stdio.h> #include <math.h> main() { double x; scanf(″%lf″,&x); if(x>=0) printf(″%10.6lf″,sqrt(x)); /*sqrt(x)开平方库函数调用*/ else printf(″Enter data error! ″); /*输出数据错误信息*/ }
else { if(tall>=170)printf(″A″); else printf(″B″); } }
§4.2
switch 语句
switch语句是另一种分支控制语句, 其特点是可以根据一个表达式的多种值, 选择多个分支,因而也称为分情况语句 和开关语句。实际问题中常常需要用到 多分支结构,例如,学生成绩分档次(85 分以上为“A”等,70~84分为“B”等, 60~69分为“C”等……)。
相关文档
最新文档