第5章选择结构程序设计 要设计选择结构程序,要考虑两个方面的问题:一是 在C语言中如何来表示条件,二是在C语言中实现选择结 构用什么语句。 在C语言中表示条件,一般用关系表达式或逻辑表达 式,实现选择结构用ⅱ语句或 switch语句。 5,1ii语包 5,2关系运算及其表达式 5.3逻辑运算及其表达式 5.4 switch语包 5.5选择结构程序举例 良好的源程序书写风格—注释 REturn
第5章 选择结构程序设计 要设计选择结构程序,要考虑两个方面的问题:一是 在C语言中如何来表示条件,二是在C语言中实现选择结 构用什么语句。 在C语言中表示条件,一般用关系表达式或逻辑表达 式,实现选择结构用if语句或switch语句。 5.1 if语句 5.2 关系运算及其表达式 5.3 逻辑运算及其表达式 5.4 switch语句 5.5 选择结构程序举例 良好的源程序书写风格──注释 [Return]
例1:输入一个数X 例2:输出三个数a,b,c 若Ⅹ大于0,输出正数, 中最大的数 否则输出负数。 开始 开始 输入三个数n1,n2,n3 输入一数X N >1 N Iy[nn2交换 nI>n3 Y 输出正数输出负数 输出n1 输出n3 结束 结束
例1:输入一个数X, 若X大于0,输出正数, 否则输出负数。 开始 输入一数X X>0 输出正数 输出负数 结束 Y N 例2:输出三个数a,b,c 中最大的数。 y 开始 输入三个数n1,n2,n3 n1>n2 n1>n3 结束 输出n1 Y n1,n2交换 N 输出n3 N
5.1i语句和条件运算符 51i语句 案例5订输入任意三个整数nl、n2、n3,求三个数中的最大值 /*案例代码文件名:AL51C。*/ *功能:说明i语句的格式 maino fint nl, n2, n3, max printf("Please input three numbers scanf(" %od, %d, %d", &nl, &n2, &n3) if(n1>n2) max=n1: lse maxent if(n3>max) maxent printf( "The three numbers are: %d, %d, %dn" nl, n2, n3 printf("max=od n", max) 「程序演示
5.1 if语句和条件运算符 5.1 if语句 [案例5.1] 输入任意三个整数n1、n2、n3,求三个数中的最大值。 /*案例代码文件名:AL5_1.C。*/ /*功能:说明if 语句的格式。*/ main() {int n1,n2,n3,max; printf("Please input three numbers:"); scanf("%d,%d,%d",&n1,&n2,&n3); if (n1>n2) max=n1; else max=n2; if (n3>max) max=n3; printf("The three numbers are:%d,%d,%d\n",n1,n2,n3); printf("max=%d\n",max); } [程序演示]
程序运行情况如下: Please input three numbers: 1 1, 22, 18K The three numbers are: 11.22.18 max=22 本案例中的第1个i语句,可优化为如下不带else子句的 形式:max=nl; if(n2>max)max=n2 1.if语句的一般格式 f表达式 {语句组1;} else {语句组2} 1)if语句中的“表达式”必须用“(和“)括起来 (2)else子句(可选)是i语句的一部分,必须与i配 对使用,不能单独使用 (3)当i和else下面的语句组,仅由一条语句构成时, 也可不使用复合语句形式(即去掉花括号)
程序运行情况如下: Please input three numbers:11,22,18↙ The three numbers are:11,22,18 max=22 本案例中的第1个if语句,可优化为如下不带else子句的 形式:max=n1; if(n2>max) max=n2; 1.if语句的一般格式 if(表达式) {语句组1;} [else {语句组2;}] (1)if语句中的“表达式”必须用“(”和“)”括起来。 (2)else子句(可选)是if语句的一部分,必须与if配 对使用,不能单独使用。 (3)当if和else下面的语句组,仅由一条语句构成时, 也可不使用复合语句形式(即去掉花括号)
2.i语句的执行过程 if<表达式的 (1)缺省ele子句时 真 当“表达式”的值不等于 0(即判定为“逻辑真”)时, 语句组1 则执行语句组1,否则直接转 向执行下一条。如图 下一条语句 (2)指定else子句时 “表达式”的值不等于0 表达式的值 (即判定为“逻辑真”)时, 真 则执行语句组1,然后转向下 条语句;否则,执行语句组 语句组1语句组2 2。如图。 下一条语句
2.if语句的执行过程 (1)缺省else子句时 当“表达式”的值不等于 0(即判定为“逻辑真”)时, 则执行语句组1,否则直接转 向执行下一条。如图 (2)指定else子句时 当“表达式”的值不等于0 (即判定为“逻辑真”)时, 则执行语句组1,然后转向下 一条语句;否则,执行语句组 2。如图。 下一条语句 表达式的值 语句组1 真 假 下一条语句 表达式的值 语句组1 真 假 语句组2 if if else
案例52]输入任意三个数nl、n2、n3,按从小到大的顺序排序输 出 /*案例代码文件名:AL52C。* maint fintnl, n2, n3, temp printf("Please input three numbers: " scan"%d,%dd",&n1,&n2,&n3); if(nI>n2)(temp=nl; n1=n2; n2=temp; 3 if(n2>n3)(temp=n2; n2=n3; n3=temp;) if(n1>n2)(temp=nl; nl=n2; n2=temp: 3 printf( Three numbers after sorted: %od, %od, %dn",nl, n2, n3) 「程序演示 程序运行情况如下: Please input three numbers: 11, 22, 18K Three numbers after sorted 11.18.22
[案例5.2]输入任意三个数n1、n2、n3,按从小到大的顺序排序输 出。 /*案例代码文件名:AL5_2.C。*/ main() {int n1,n2,n3,temp; printf("Please input three numbers:"); scanf("%d,%d,%d",&n1,&n2,&n3); if (n1>n2){temp=n1;n1=n2;n2=temp;} if (n2>n3){temp=n2;n2=n3;n3=temp;} if (n1>n2){temp=n1;n1=n2;n2=temp;} printf("Three numbers after sorted: %d,%d,%d\n",n1,n2,n3); } [程序演示] 程序运行情况如下: Please input three numbers:11,22,18↙ Three numbers after sorted: 11,18,22
3.i语句的嵌套与嵌套匹配原则 if语句允许嵌套。所谓if语句的嵌套是指,在“语句 组1或(和)“语句组2”中,又包含有i语句的情况 if语句嵌套时,else子句与i的匹配原则:与在它上面、 距它最近、且尚未匹配的i配对。 为明确匹配关系,避免匹配错误,强烈建议:将内嵌 的i语句,一律用花括号括起来 if() if()语句1 f()语句1 else语句2」内嵌if else else if()语句2 if()语句3 else语句3内嵌if else语句4内嵌if
3.if语句的嵌套与嵌套匹配原则 if语句允许嵌套。所谓if语句的嵌套是指,在“语句 组1”或(和)“语句组2”中,又包含有if语句的情况。 if语句嵌套时,else子句与if的匹配原则:与在它上面、 距它最近、且尚未匹配的if配对。 为明确匹配关系,避免匹配错误,强烈建议:将内嵌 的if语句,一律用花括号括起来。 if ( ) if ( ) if ( ) 语句1 if ( ) 语句1 else 语句2 内嵌if else else if ( ) 语句2 if ( ) 语句3 else 语句3 内嵌if else 语句4 内嵌if
[案例53]写一程序,从键盘上输入1年份year(4位十 进制数),判断其是否闰年。闰年的条件是:能被4整除、 但不能被100整除,或者能被400整除。 算法设计要点: (1)如果Ⅹ能被Y整除,则余数为0,即如果Ⅹ%Y的值等于 0,则表示Ⅹ能被Y整除! (2)首先将是否闰年的标志leap预置为0(非闰年),这样仅 当year为闰年时将leap置为1即可。这种处理两种状态值的方法,对 优化算法和提高程序可读性非常有效,请读者仔细体会。参考程序 如下: /*功能:说明i语句的嵌套格式和用法。*/ mal fint year, leap=0 /*leap=0:预置为非闰年* printf("please input the year scanf("%od", &year)
[案例5.3] 写一程序,从键盘上输入1年份year(4位十 进制数),判断其是否闰年。闰年的条件是:能被4整除、 但不能被100整除,或者能被400整除。 算法设计要点: (1)如果X能被Y整除,则余数为0,即如果X%Y的值等于 0,则表示X能被Y整除! (2)首先将是否闰年的标志leap预置为0(非闰年),这样仅 当year为闰年时将leap置为1即可。这种处理两种状态值的方法,对 优化算法和提高程序可读性非常有效,请读者仔细体会。参考程序 如下: /*案例代码文件名:AL5_3.C。 */ /*功能:说明if语句的嵌套格式和用法。 */ main() {int year,leap=0; /* leap=0:预置为非闰年*/ printf("Please input the year:"); scanf("%d",&year);
if (year %4==0) if (year %100!=0)leap=1; else if (year %400==0)leap=l; if (leap) printf("%od is a leap yearIn", year) else printf("%d is not a leap year.",year); 利用逻辑运算能描述复杂条件的特点,可将上述程序优化如下 maino int year printf("Please input the year: " scanf("od", &year) if(year%4==0&&year%100=0)(year%400=0) printf("%d is a leap year. n" year); else printf("%d is not a leap year. n"year)
if (year % 4==0) {if (year % 100 != 0) leap=1;} else {if (year%400==0)leap=1; } if (leap) printf("%d is a leap year.\n",year); else printf("%d is not a leap year.\n",year); } 利用逻辑运算能描述复杂条件的特点,可将上述程序优化如下: main() {int year; printf("Please input the year:"); scanf("%d",&year); if ((year%4==0 && year%100!=0)||(year%400==0)) printf("%d is a leap year.\n",year); else printf("%d is not a leap year.\n",year); }
4.说明 (1)i后面的“表达式”,除常见的关系表达式或逻辑表 达式外,也允许是其它类型的数据,如整型、实型、字符型等 (2)i语句允许嵌套,但嵌套的层数不宜太多。在实际编 程时,应适当控制嵌套层数(2~3层)。 (3)“语句组1”和“语句组2,可以只包含一个简单语句, 也可以是复合语句 务必字记:不管是简单语句,还是复合语句中的各个语句, 每个语句后面的分号必不可少! 例如,[案例51中的: if(nI>n2)max=nl else max=n2;语句: if行后面的赋值语句“max=nl;分号不能省略。但不要误认 为ⅱ和else是2个独立的语句,它们都属于if语句中的一部分, else是i语句的子句
4.说明 (1)if后面的“表达式” ,除常见的关系表达式或逻辑表 达式外,也允许是其它类型的数据,如整型、实型、字符型等。 (2)if语句允许嵌套,但嵌套的层数不宜太多。在实际编 程时,应适当控制嵌套层数(2~3层)。 (3)“语句组1”和“语句组2” ,可以只包含一个简单语句, 也可以是复合语句。 务必牢记:不管是简单语句,还是复合语句中的各个语句, 每个语句后面的分号必不可少! 例如,[案例5.1]中的: if (n1>n2) max=n1; else max=n2;语句: if行后面的赋值语句“ max=n1;”分号不能省略。但不要误认 为if和else是2个独立的语句,它们都属于if语句中的一部分, else是if语句的子句