第二章程序基本结构 在上一章我们求解的问题都是一步一步按顺序执行的,我们称为顺序结 构。但在解决实际问题的过程中,一个稍微复杂点的问题,往往不可能顺序 完成。就像我们走路经常会遇到岔路口一样,有很多情况需要根据某些条件 决定下一步如何进行,也就是说程序产生了分支。还有一些工作需要重复很 多次才能完成。这就是我们在本章要介绍的分支结构和循环结构 顺序结构、分支结构、循环结构是程序的三种基本结构,已经证明:由 种基本结构顺序组成的算法结构,可以解决任何复杂的问题。由基本结构 组成的算法属于“结构化”算法 21分支结构 21.1单分支结构 【例2.1】输入两个整数,按从小到大的顺序输出这两个数。 分析:对于输入的这两个数a和b,我们可以比较它们的大小关系,将 较小的数存放在第一个变量中,较大的数存放在第二个变量中,然后按顺序 输出a和b。是否要交换两个变量的值,需要根据a和b的值来确定,这就 产生了分支情况 C语言提供了单分支选择结构解决上述问题,形式如下 j(表达式 语尔 其中“表达式”是判断条件,只要表达式的值不为“0”,就认为条件成 立。而“语句”可以是单语句,也可以是复合语句。所谓复合语句是用一对 花括号“{}”括起来的一组语句。单分支结构的执行过程如图21所示。 例21的C语言程序如下: #include <stdio. h> void main() 真(非0) int a, b, temp: 语句 printf("Input a, b: " scanf("%d%d", &a, &b) f(a>b)/*判断a、b的关系* 图21单分支条件语句执行过程
36 第二章 程序基本结构 在上一章我们求解的问题都是一步一步按顺序执行的,我们称为顺序结 构。但在解决实际问题的过程中,一个稍微复杂点的问题,往往不可能顺序 完成。就像我们走路经常会遇到岔路口一样,有很多情况需要根据某些条件 决定下一步如何进行,也就是说程序产生了分支。还有一些工作需要重复很 多次才能完成。这就是我们在本章要介绍的分支结构和循环结构。 顺序结构、分支结构、循环结构是程序的三种基本结构,已经证明:由 三种基本结构顺序组成的算法结构,可以解决任何复杂的问题。由基本结构 组成的算法属于“结构化”算法。 2.1 分支结构 2.1.1 单分支结构 【例 2.1】 输入两个整数,按从小到大的顺序输出这两个数。 分析:对于输入的这两个数 a 和 b,我们可以比较它们的大小关系,将 较小的数存放在第一个变量中,较大的数存放在第二个变量中,然后按顺序 输出 a 和 b。是否要交换两个变量的值,需要根据 a 和 b 的值来确定,这就 产生了分支情况。 C 语言提供了单分支选择结构解决上述问题,形式如下: if (表达式) 语句; 其中“表达式”是判断条件,只要表达式的值不为“0”,就认为条件成 立。而“语句”可以是单语句,也可以是复合语句。所谓复合语句是用一对 花括号“{ }”括起来的一组语句。单分支结构的执行过程如图 2.1 所示。 例 2.1 的 C 语言程序如下: #include <stdio.h> void main( ) { int a,b,temp; printf("Input a,b:"); scanf("%d%d",&a,&b); if (a>b) /* 判断 a、b 的关系 */ 表达式 语句 真(非 0) 假(0) 图 2.1 单分支条件语句执行过程
{temp=a;a=b;b=temp;}*a大于b,则交换a,b的值* printf(" Return is%d,%dn",ab),/*按从小到大顺序输出* 说明:“a>b”是关系运算,如果a的值大于b的值表示条件成立,表达 式的值为真,则执行if后的语句:否则表达式的值为假,不执行if后的语 212双分支结构 【例2.2】输入两个整数,输出其中较大的一个。 分析:输入的是两个整数,需要定义两个整型变量x和y。由于是随机 输入的两个数,这就分成三种情况 (1)如果x>y,输出x, (2)如果xy,输出y; (3)如果ⅹy,输出ⅹ或者y都可以。 输出ⅹ还是y,就需要根据x、y的值来决定,这就产生了分支情况。 1.双分支结构 C语言提供了双分支选择结构,形式如下: jf(表达式 语句l 真(非0 els 表达式 语句2 语句 表达式的值不为“0”,执行语句1,否 则执行语句2。同样,“语句1”和“语句2” 既可以是单语句,也可以是复合语句。双分图22双分支条件语句执行过程 支选择结构的执行过程如图22所示 例22的C语言程序如下: #include <stdio. h> void main() printf("Input x,y: ) scanf("%d%d", &x, &y ); f(x>=y)/*判断x、y的关系* itf"max=%dn"x),/*x大于或等于y,输出 printf("max=%dn"y),/*x小于y,输出y*
37 { temp=a; a=b; b=temp; } /* a 大于 b,则交换 a,b 的值 */ printf("Return is %d,%d\n",a,b); /*按从小到大顺序输出 */ } 说明:“a>b”是关系运算,如果 a 的值大于 b 的值表示条件成立,表达 式的值为真,则执行 if 后的语句;否则表达式的值为假,不执行 if 后的语 句。 2.1.2 双分支结构 【例 2.2】 输入两个整数,输出其中较大的一个。 分析:输入的是两个整数,需要定义两个整型变量 x 和 y。由于是随机 输入的两个数,这就分成三种情况: (1)如果 x>y,输出 x; (2)如果 x<y,输出 y; (3)如果 x=y,输出 x 或者 y 都可以。 输出 x 还是 y,就需要根据 x、y 的值来决定,这就产生了分支情况。 1. 双分支结构 C 语言提供了双分支选择结构,形式如下: if (表达式) 语句 1; else 语句 2; 表达式的值不为“0”,执行语句 1,否 则执行语句 2。同样,“语句 1”和“语句 2” 既可以是单语句,也可以是复合语句。双分 支选择结构的执行过程如图 2.2 所示。 例 2.2 的 C 语言程序如下: #include <stdio.h> void main( ) { int x,y; printf("Input x,y:"); scanf("%d%d",&x,&y); if (x>=y) /* 判断 x、y 的关系 */ printf("max=%d\n",x); /* x 大于或等于 y,输出 x */ else printf("max=%d\n",y); /* x 小于 y,输出 y */ } 表达式 语句 1 语句 2 真(非 0) 假(0) 图 2.2 双分支条件语句执行过程
说明:if语句中的“表达式”一般为关系表达式或逻辑表达式,但不限 于这两种表达式。是执行语句1,还是执行语句2,取决于“表达式”运算 的结果 【例2.3】输入三个数x1、x2、x3,按从小到大的顺序输出这三个数 分析:实际这就是一个排序的问题,如果x1>x2,则交换两个数,同理 x1和x3比较,x2和x3比较。这样经过比较交换三个数按从小到大的顺序 分别存储在x1、x2、x3中。数据的交换在程序设计中经常用到。 C语言程序如下 #include <stdio h> void main() int xl, x2, X3, temp scanf("%d%d%d", &xl, &x2, &x3) f(x1>x2)/交换x1和x2,temp作为临时变量暂存xl的值* {temp=xl;xl=x2,x2=temp,}*括号部分构成复合语句* If {temp=xl;,x1=x3;x3=temp,}经过两次交换,xl为三者中最小 的* if(x2>X3) i temp=x2: x2=X3: X3=temp; i printf("%d, %d, %d", x1, X2, x3), 21.3多分支结构 【例24】设有分段函数: -e2x+1+3 (x<-2) y={2x1 (-2≤x≤3) 3log1(3x+5)-11(x>3) 编写一个程序,输入x,输出y值 分析:在这里,涉及多个条件的判断,并根据判断结果选择不同的公式 计算y值。因此需要使用多分支结构。 多分支结构的形式为 f(表达式D 语句l else if(表达式2) 语句2; else if(表达式3
38 说明:if 语句中的“表达式”一般为关系表达式或逻辑表达式,但不限 于这两种表达式。是执行语句 1,还是执行语句 2,取决于“表达式”运算 的结果。 【例 2.3】 输入三个数 x1、x2、x3,按从小到大的顺序输出这三个数。 分析:实际这就是一个排序的问题,如果 x1>x2,则交换两个数,同理 x1 和 x3 比较,x2 和 x3 比较。这样经过比较交换三个数按从小到大的顺序 分别存储在 x1、x2、x3 中。数据的交换在程序设计中经常用到。 C 语言程序如下: #include <stdio.h> void main( ) { int x1,x2,x3,temp; scanf("%d%d%d",&x1,&x2,&x3); if (x1>x2) /*交换 x1 和 x2,temp 作为临时变量暂存 x1 的值*/ { temp=x1; x1=x2; x2=temp; } /*括号部分构成复合语句*/ if (x1>x3) { temp=x1; x1=x3; x3=temp; } /*经过两次交换,x1 为三者中最小 的*/ if (x2>x3) { temp=x2; x2=x3; x3=temp; } printf("%d,%d,%d",x1,x2,x3); } 2.1.3 多分支结构 【例 2.4】 设有分段函数: -e 2x+1+3 (x<-2) y= 2x-1 (-2≤x≤3) 3log10(3x+5)-11 (x>3) 编写一个程序,输入 x,输出 y 值。 分析:在这里,涉及多个条件的判断,并根据判断结果选择不同的公式 计算 y 值。因此需要使用多分支结构。 多分支结构的形式为: if (表达式 1) 语句 1; else if (表达式 2) 语句 2; else if (表达式 3)
语句3, else if(表达式m 语句 语句n+l 其功能为:按顺序求各表达式的值。如果某一表达式的值为真(非0),那 么执行其后相应的语句,执行完后整个语句结束,其余语句则不被执行: 如果没有一个表达式的值为真,那么执行最后的else语句。执行过程如图 2.3所示 句 表达式>直非0语句2 式3直非①[语句3 假(0) 假(0) 语句n 假(0) 图23多分支条件语句执行过程 例24的C语言程序 #include <stdio. h> #include<math. I void main() printf("Input: ) scanf("%lf", &x) if(x<-2) y=exp(2*x+1)+3;
39 语句 3; ┆ else if (表达式 n) 语句 n; else 语句 n+1; 其功能为:按顺序求各表达式的值。如果某一表达式的值为真(非 0),那 么执行其后相应的语句,执行完后整个 if 语句结束,其余语句则不被执行; 如果没有一个表达式的值为真,那么执行最后的 else 语句。执行过程如图 2.3 所示。 例 2.4 的 C 语言程序: #include <stdio.h> #include<math.h> void main( ) { double x,y; printf("Input x:"); scanf("%lf",&x); if (x<-2) y=-exp(2*x+1)+3; 表达式 1 语句 1 假(0) 真(非 0) 表达式 2 语句 2 表达式 3 语句 3 ┆ 表达式 n 语句 n 语句 n+1 真(非 0) 真(非 0) 真(非 0) 假(0) 假(0) 假(0) 假(0) 图 2.3 多分支条件语句执行过程
else if(x<=3)/表达式也可以写成:x>=2&&x<=3* Ise /*本行也可以写成: else if(x>3)* y=3°log10G3*x+5)-11; printf("=%. 2Ifn"y); 说明:在本例中,需要用到两个数学函数,即exp()和long10(,分别 是以e为底的指数函数和以10为底的对数函数,它们都只有一个参数,计 算结果均为 double型。这两个函数是系统提供的,为了使用这些数学函数 需要包含头文件“ math. h”。即增加语句 #include<math. h> 其他数学函数也是包含在该头文件中。 214if语句的嵌套 所谓if语句的嵌套是指i语句的if块或else块中,又包含一个语句。 一般形式为: f(表达式1 jf(表达式2)语句l; else语句2 else jf(表达式3语句3 else语句4 对于嵌套结构,应当注意else与if的配对关系。C语言规定else总是 与它前面最近的、而且没有与其他else配对的f进行配对。特别是 if. else 子句数目不一样时(if的数量只会大于或等于else的数量) 例如,下面的if语句中: if(表达式1) if(表达式2)语句1 else语句2; 根据C语言规定,else应与第二个f配对。如果希望else与第一个i配对, 可以将第二个用一对花括号“{}”括起来,即写成下面的形式: jf(表达式D {j(表达式2)语句l; else语句2 【例2.5】求一元二次方程ax2+bx+c=0的根,a,b,c由键盘输入 分析:对于一元二次方程有以下几种可能: a=0,不是二次方程
40 else if (x<=3) /* 表达式也可以写成:x>=-2&&x<=3 */ y=2*x-1; else /* 本行也可以写成:else if (x>3) */ y=3*log10(3*x+5)-11; printf("y=%.2lf\n",y); } 说明:在本例中,需要用到两个数学函数,即 exp( )和 long10( ),分别 是以 e 为底的指数函数和以 10 为底的对数函数,它们都只有一个参数,计 算结果均为 double 型。这两个函数是系统提供的,为了使用这些数学函数, 需要包含头文件“math.h”。即增加语句 #include<math.h> 其他数学函数也是包含在该头文件中。 2.1.4 if 语句的嵌套 所谓 if 语句的嵌套是指 if 语句的 if 块或 else 块中,又包含一个 if 语句。 一般形式为: if (表达式 1) if (表达式 2) 语句 1; else 语句 2; else if (表达式 3) 语句 3; else 语句 4; 对于嵌套结构,应当注意 else 与 if 的配对关系。C 语言规定 else 总是 与它前面最近的、而且没有与其他 else 配对的 if 进行配对。特别是 if…else 子句数目不一样时(if 的数量只会大于或等于 else 的数量)。 例如,下面的 if 语句中: if (表达式 1) if (表达式 2) 语句 1; else 语句 2; 根据 C 语言规定,else 应与第二个 if 配对。如果希望 else 与第一个 if 配对, 可以将第二个 if 用一对花括号“{ }”括起来,即写成下面的形式: if (表达式 1) { if (表达式 2) 语句 1; } else 语句 2; 【例 2.5】 求一元二次方程 ax2+bx+c=0 的根,a,b,c 由键盘输入。 分析:对于一元二次方程有以下几种可能: a=0,不是二次方程;