结构化程序设计基础和C语言的控制结构课件_第1页
结构化程序设计基础和C语言的控制结构课件_第2页
结构化程序设计基础和C语言的控制结构课件_第3页
结构化程序设计基础和C语言的控制结构课件_第4页
结构化程序设计基础和C语言的控制结构课件_第5页
已阅读5页,还剩85页未读 继续免费阅读

下载本文档

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

文档简介

1、结构化程序设计基础和C语言的控制结构结构化程序的优点:结构化程序的优点: 具有结构清晰、可读性好、易于修改。具有结构清晰、可读性好、易于修改。 对于分支结构和循环结构都涉及到两个方面对于分支结构和循环结构都涉及到两个方面的基本问题:的基本问题:1 1)如何表示控制结构中的条件;)如何表示控制结构中的条件;2 2)对于控制结构中的条件如何判断成立与否;)对于控制结构中的条件如何判断成立与否; 程序设计语言中,用程序设计语言中,用关系运算关系运算和和逻辑运算逻辑运算来实现对程序控制结构中条件的描述和处理。来实现对程序控制结构中条件的描述和处理。 高优先级高优先级 例例2-1 2-1 关系运算示例。

2、关系运算示例。在在C C程序设计语言中没有逻辑数据类型,所以在进行程序设计语言中没有逻辑数据类型,所以在进行关系运算时关系运算时: :用数值用数值“1”1”表示逻辑概念上的表示逻辑概念上的“真真”,用数值用数值“0”0”表示逻辑概念上表示逻辑概念上的的“假假”; ;例如:例如:5=55=5/ /* *结果为结果为1 1* */ / 10=10 10=10/ /* *结果为结果为1 1* */ / 5 5!=5=5/ /* *结果为结果为0 0* */ / 53 53/ /* *结果为结果为1 1* */ / 35 35/ /* *结果为结果为0 0* */ / 该程序运行执行语句该程序运行执行

3、语句c=5-1=a+2=a+2=a+2=a+2=和和=结合,即先计算表达式结合,即先计算表达式5-5-1=a+21=a+2得到结果得到结果0 0,然后计算表达式,然后计算表达式0=b-210c 且 a+cb 且 b+ca)。计算三角形的面积的公式为: 上面程序中,上面程序中,ifif结构的语句部分是复合语句:结构的语句部分是复合语句: s=(a+b+c)/2; s=(a+b+c)/2; area=sqrt(s area=sqrt(s* *(s-a)(s-a)* *(s-b)(s-b)* *(s-c);(s-c); printf(%fn,area); printf(%fn,area); 在在C

4、C程序的设计过程中,需要使用复合语句的地方必须使用复合语程序的设计过程中,需要使用复合语句的地方必须使用复合语句的形式,否则程序在语法上可能检查不出任何错误,但程序运行的结句的形式,否则程序在语法上可能检查不出任何错误,但程序运行的结果与程序设计者的期望会相去甚远。例如,如果将例果与程序设计者的期望会相去甚远。例如,如果将例2.52.5相关程序段描相关程序段描述为如下形式:述为如下形式:if(a+bc & a+cb & b+ca)/if(a+bc & a+cb & b+ca)/* *满足三角形条件时求其面积满足三角形条件时求其面积* */ /s=(a+b+c)/

5、2;s=(a+b+c)/2;area=sqrt(sarea=sqrt(s* *(s-a)(s-a)* *(s-b)(s-b)* *(s-c);(s-c);printf(%fn,area);printf(%fn,area); n双分支结构的形式:双分支结构的形式:if(expression) sentence1;else sentence2;2.2.3 if_else2.2.3 if_else语句与程序的双分支结构语句与程序的双分支结构注意注意: 作为条件的表达式可以是任何可以求出作为条件的表达式可以是任何可以求出0 0值或非值或非0 0值的表达式。值的表达式。 if if结构或结构或elsee

6、lse结构后语句部分都可以是结构后语句部分都可以是C C语言的任何合法语句。语言的任何合法语句。exps1s2yn例例2-6 2-6 求任意输入的求任意输入的3 3个整个整数中的最大数。数中的最大数。 2.2.4 2.2.4 条件运算符与条件表达式条件运算符与条件表达式 C C语言中,若语言中,若ifelseifelse语句结构中的语句部分满足语句结构中的语句部分满足下列两个条件:下列两个条件:无论表示条件的表达式取何值(真或假),语句部分无论表示条件的表达式取何值(真或假),语句部分都是一句简单的赋值语句。都是一句简单的赋值语句。两条赋值语句都是为同一个变量赋值。两条赋值语句都是为同一个变量

7、赋值。 则,可以使用则,可以使用C C语言中提供的条件运算符代替这种语言中提供的条件运算符代替这种ifelseifelse结构。结构。 条件运算符是条件运算符是C C语言中惟一的一个三元运算符,使用条语言中惟一的一个三元运算符,使用条件运算符构成的表达式称为条件表达式。件运算符构成的表达式称为条件表达式。exp1 ? exp2 : exp3exp1 ? exp2 : exp31) 条件表达式一般形式如下:条件表达式一般形式如下:2) 条件表达式的执行过程条件表达式的执行过程 : 首先计算表达式首先计算表达式exp1exp1的值,若的值,若exp1exp1的值为非的值为非0 0(真),则(真),

8、则计算出表达式计算出表达式exp2exp2的值作为整个条件表达式的值;若的值作为整个条件表达式的值;若exp1exp1的的值为值为0 0(假),则计算出表达式(假),则计算出表达式exp3exp3的值作为整个条件表达式的值作为整个条件表达式的值。的值。 条件运算符的优先级别高于赋值运算符,但条件运算符的优先级别高于赋值运算符,但低于关系运算符和算术运算符。低于关系运算符和算术运算符。 条件运算符的结合方向为右结合性,例如有条件运算符的结合方向为右结合性,例如有如下形式的条件表达式:如下形式的条件表达式: ab?a:cd?c:dab?a:cd?c:d可以看出,在数据对象可以看出,在数据对象cdc

9、d(关系表达式)的两边具(关系表达式)的两边具有同级的条件运算符(有同级的条件运算符(?:?:),由于条件运算符的结),由于条件运算符的结合性为右结合,数据对象合性为右结合,数据对象cdcd先与其右边的的条件运先与其右边的的条件运算符结合,即先计算算符结合,即先计算cd?c:dcd?c:d,所以整个条件表达式,所以整个条件表达式的计算过程与表达式的计算过程与表达式ab?a:(cd?c:d)ab?a:(cd?c:d)的计算过程相的计算过程相同。同。 例例2-7 2-7 从键盘上输入一个英文字母,若其是大写字母则转从键盘上输入一个英文字母,若其是大写字母则转换为小写字母输出;否则转换为大写字母输出

10、。换为小写字母输出;否则转换为大写字母输出。 在上面程序中,表达式在上面程序中,表达式ch=A&ch=A&ch=A&ch=A&ch=A&ch=Z?ch+32:ch-32; 2.2.5 if2.2.5 if语句的嵌套与程序的多分支结构语句的嵌套与程序的多分支结构 if if结构或者结构或者elseelse结构的语句部分又是一个另外一个结构的语句部分又是一个另外一个ifif结构,称为结构,称为ifif语句的嵌套。语句的嵌套。 在在C C程序设计中,程序设计中,ifif语句的嵌套结构用于解决在若干语句的嵌套结构用于解决在若干种相关情况中选择一种进行处理的问题。

11、种相关情况中选择一种进行处理的问题。 例如,在一个二分例如,在一个二分支支ifif语句的两个语语句的两个语句部分分别嵌入了句部分分别嵌入了一个二分支一个二分支ifif语句语句的形式为:的形式为: if(exp1) if(exp2)sentence1; elsesentence2;else if(exp3)sentence3; elsesentence4;例例2-8 2-8 公司按照公司按照销售人员收到的销售人员收到的订单金额数量评订单金额数量评定等级,订单总定等级,订单总金额超过一万的金额超过一万的为为A A等,等,5000999950009999为为B B等,等,25004999250049

12、99为为C C等,等,25002500以下为以下为D D等。等。编制程序对输入编制程序对输入的订单总金额数的订单总金额数判定等级。判定等级。 当被嵌套的当被嵌套的ifif结构均被嵌套在结构均被嵌套在elseelse的语句部分的语句部分时,形成了一种称为时,形成了一种称为else_ifelse_if的多分支选择结构,这的多分支选择结构,这是是if_elseif_else多重嵌套的变形。其一般形式为:多重嵌套的变形。其一般形式为: if(exp1) sentence1;else if(exp2)sentence2;else if(exp3)sentence3;else if(expN)senten

13、ceN;else sentenceN+1;注意:注意: 在这种特殊的在这种特殊的elseifelseif结构中,表示条件的表达式结构中,表示条件的表达式是相互排斥的,执行该结构时控制流程从是相互排斥的,执行该结构时控制流程从exp1exp1开始判断,开始判断,一旦有一个表达式的值为非一旦有一个表达式的值为非0 0(真)时,就执行与之匹(真)时,就执行与之匹配的语句,然后退出整个选择结构;如果所有表示条件配的语句,然后退出整个选择结构;如果所有表示条件的表达式值均为的表达式值均为0 0(假),则在执行语句(假),则在执行语句sentenceN+1sentenceN+1后后退出整个选择结构;如果当

14、所有的条件均为假时不需要退出整个选择结构;如果当所有的条件均为假时不需要进行任何操作,则最后的一个进行任何操作,则最后的一个elseelse和语句和语句sentenceN+1sentenceN+1可以缺省。嵌套的可以缺省。嵌套的elseifelseif结构执行流程如图结构执行流程如图2.62.6所示。所示。 例例2-9 2-9 编写程序求如下所示多分支方程的解。编写程序求如下所示多分支方程的解。 在程序中,变量在程序中,变量x x的取值区间为:(的取值区间为:(DBL_MINDBL_MIN,1 1)、)、11,1010)、)、1010,DBL_MAXDBL_MAX),其中),其中DBL_MIN

15、DBL_MIN和和DBL_MAXDBL_MAX分别表示双精度实型数据所能取得的最小值分别表示双精度实型数据所能取得的最小值和最大值。和最大值。 在包含了在包含了ifif语句嵌套结构的程序中,语句嵌套结构的程序中,elseelse子句与子句与ifif的的配对原则是非常重要的,按不同的方法配对则得到不同的配对原则是非常重要的,按不同的方法配对则得到不同的程序结构。程序结构。C C语言中规定:程序中的语言中规定:程序中的elseelse子句与在它前面距子句与在它前面距它最近的且尚未匹配的它最近的且尚未匹配的ifif配对。无论将程序书写为何种形配对。无论将程序书写为何种形式,系统总是按照上面的规定来解

16、释程序的结构。式,系统总是按照上面的规定来解释程序的结构。 请看如下两个用于比较的程序段:请看如下两个用于比较的程序段: 例例2.102.10和例和例2.112.11描述了两种情况下程序的执行情况。其中:描述了两种情况下程序的执行情况。其中:例例2.102.10程序执行的结果为:程序执行的结果为:a=-1,b=10a=-1,b=10,例例2.112.11程序执行的结果为:程序执行的结果为:a=-1,b=11a=-1,b=11。例例2-10 else2-10 else与与ifif配对原则示例。配对原则示例。例例2-11 else2-11 else与与ifif配对原则示例(使用复合语句改变程序结构

17、)配对原则示例(使用复合语句改变程序结构) 2.2.6 switch2.2.6 switch语句与程序的多分支结构语句与程序的多分支结构 C C语言中可以使用语言中可以使用switchswitch语句结构实现对多分支选择结语句结构实现对多分支选择结构情况的直接处理。构情况的直接处理。1 1)switchswitch语句结构的一般形式如下:语句结构的一般形式如下: switch(expession)case constand1:sentences1; break;case constand2:sentences2;break;case constandN:sentencesN;break;def

18、ault:sentencesN+12 2)执行过程:)执行过程:首先,首先,对作为条件的表达式(对作为条件的表达式(expressionexpression)求值;)求值; 然后,然后,在语句结构的花括号内在语句结构的花括号内从上至下从上至下查找所有的查找所有的casecase分支,分支,当找到与条件表达式值相匹配的当找到与条件表达式值相匹配的casecase时,将其作为控制流程时,将其作为控制流程执行的入口,并执行的入口,并从此处开始执行相应的语句段,直到遇到从此处开始执行相应的语句段,直到遇到breakbreak语句或者是语句或者是switchswitch语句结构的右花括号语句结构的右花括

19、号“”为止。为止。 switch(number) case 1: statement1; case 2: statement2; case 3: statement3; default: statement4;statement5;?2作为条件的表达式作为条件的表达式expressionexpression的值必须是有序型的,即只的值必须是有序型的,即只能是能是整型、字符型、枚举型整型、字符型、枚举型三者之一。三者之一。语句段语句段sentencessentences可以是单条语句,也可以是多条语句,但可以是单条语句,也可以是多条语句,但这多条语句并不是复合语句,不需要使用花括号这多条语句并不

20、是复合语句,不需要使用花括号 。语句段语句段sentencessentences中的语句可以使任意合法的中的语句可以使任意合法的C C语句。语句。结构中的常数值应与表示条件的表达式值对应一致,且各结构中的常数值应与表示条件的表达式值对应一致,且各常数的值不能相同。常数的值不能相同。结构中的结构中的breakbreak语句和语句和defaultdefault可选项可选项可根据需要确定是否可根据需要确定是否选用。选用。 3 3)使用使用switchswitch语句结构时应注意的问题:语句结构时应注意的问题:例例2-12 2-12 从键盘上输入一个字符,判断它是数字、空格还是其它键;若从键盘上输入一

21、个字符,判断它是数字、空格还是其它键;若是数字,还要求显示出是哪一个数字。是数字,还要求显示出是哪一个数字。 在语句段中包含了在语句段中包含了switchswitch语句,称为语句,称为switchswitch语句的嵌套。对于内嵌的语句的嵌套。对于内嵌的switchswitch结构处理方法与单层结构处理方法与单层switchswitch结构处理方法相同,需要注意的是:当结构处理方法相同,需要注意的是:当从内嵌的从内嵌的switchswitch结构中退出(执行中遇到了内嵌结构中退出(执行中遇到了内嵌swithcswithc结构中的结构中的breakbreak语语句或执行到了内嵌句或执行到了内嵌s

22、witchswitch语句体的右边花括号)时语句体的右边花括号)时, ,只是退出内嵌的只是退出内嵌的switchswitch结构,而不是退出整个结构,而不是退出整个switchswitch结构,例结构,例2.132.13程序展示了这种情况程序展示了这种情况。 例例2-13 swithc2-13 swithc结构的嵌套示例。结构的嵌套示例。 多分支结构程序设计中:多分支结构程序设计中:ifif语句结构的嵌套可以解决任何条件下的多分支问题;语句结构的嵌套可以解决任何条件下的多分支问题;对于对于switchswitch语句结构,则要求条件是在某个范围内的一些语句结构,则要求条件是在某个范围内的一些离

23、散的等值点离散的等值点(描述为:与什么相匹配(描述为:与什么相匹配, ,就做什么)就做什么)。 在实际的程序设计过程中,可以使用在实际的程序设计过程中,可以使用switchswitch语句结构解语句结构解决的问题,一定也可以用决的问题,一定也可以用ifif语句结构的嵌套来解决;但语句结构的嵌套来解决;但用用ifif语句结构的嵌套可以解决得问题,使用语句结构的嵌套可以解决得问题,使用switchswitch语句语句结构就不一定能够解决。结构就不一定能够解决。 2.3 2.3 循环程序结构循环程序结构 在实际问题中经常会遇到许多在实际问题中经常会遇到许多具有规律性的重复计算处具有规律性的重复计算处

24、理理问题,在处理此类问题的程序中就需要将某些语句或语句问题,在处理此类问题的程序中就需要将某些语句或语句组重复执行多次。程序设计中,一组被重复执行的语句称之组重复执行多次。程序设计中,一组被重复执行的语句称之为为循环体循环体,每一次执行完循环体后都必须根据某种条件的判,每一次执行完循环体后都必须根据某种条件的判断决定是继续循环,还是停止循环;决定所依据的条件称之断决定是继续循环,还是停止循环;决定所依据的条件称之为为循环条件循环条件。这种由重复执行的语句或语句组,以及循环条。这种由重复执行的语句或语句组,以及循环条件的判断所构成的程序结构就称为件的判断所构成的程序结构就称为循环结构循环结构。

25、循环结构是结构化程序设计的三种基本结构之一,是构循环结构是结构化程序设计的三种基本结构之一,是构成各种复杂程序的基本构造单元。成各种复杂程序的基本构造单元。 在在C C语言中提供了三种用以实现程序循环结构的语句,语言中提供了三种用以实现程序循环结构的语句,它们是:它们是:whilewhile语句、语句、do_whiledo_while语句和语句和forfor语句语句。 2.3.1 while2.3.1 while型循环结构型循环结构1) while1) while型循环控制结构的一般形式为:型循环控制结构的一般形式为: while(exp)Loop-Body2) while2) while型循

26、环结构的执行过程型循环结构的执行过程: : 首先计算作为判断条件的表达式首先计算作为判断条件的表达式expexp的值;对表达式的值;对表达式expexp的值进行判的值进行判断,若条件表达式的值为非断,若条件表达式的值为非0 0(真),则执行一次循环体(真),则执行一次循环体Loop-BodyLoop-Body;然;然后再一次计算条件表达式后再一次计算条件表达式expexp的值,若计算结果仍为非的值,若计算结果仍为非0 0(真),再一次(真),再一次执行循环体。重复上述过程,直到某次计算出的条件表达式值为执行循环体。重复上述过程,直到某次计算出的条件表达式值为0 0(假)(假)时,则退出循环结构

27、;控制流程转到该循环结构之后的语句。时,则退出循环结构;控制流程转到该循环结构之后的语句。while循环控制结构的执行过程如图循环控制结构的执行过程如图2-4所示。所示。 3) 3) 使用使用whilewhile循环结构时需要注意以下几点:循环结构时需要注意以下几点: 由于整个结构的执行过程是先判断、后执行,因而循由于整个结构的执行过程是先判断、后执行,因而循环体有可能一次都不执行。环体有可能一次都不执行。 在循环结构的控制部分中,如果表示条件的表达式是在循环结构的控制部分中,如果表示条件的表达式是一个非一个非0 0值常量表达式,则构成了死循环。例如:值常量表达式,则构成了死循环。例如:whi

28、le(1)while(1)Loop-BodyLoop-Body C C程序设计中,如果不是有意造成死循环,则在程序设计中,如果不是有意造成死循环,则在whilewhile循循环结构的循环体内必须有能够改变循环控制条件的语句存环结构的循环体内必须有能够改变循环控制条件的语句存在。在。 循环结构的循环体可以是一条语句、一个复合语句、循环结构的循环体可以是一条语句、一个复合语句、空语句等任意合法的空语句等任意合法的C C语句。语句。 例例2-14 2-14 使用使用whilewhile循环控制结构求循环控制结构求 的值。的值。 在例在例2.142.14程序中,循环控制变量程序中,循环控制变量n n从

29、初值从初值1 1开始,在循环开始,在循环结构的执行过程中通过循环体中的表达式语句结构的执行过程中通过循环体中的表达式语句n+;n+;修改循环修改循环控制变量,使其逐渐趋近于控制变量,使其逐渐趋近于100100。循环结构中的循环体是由两。循环结构中的循环体是由两条条C C语句组成的,所以需要使用复合语句的形式。当然也可以语句组成的,所以需要使用复合语句的形式。当然也可以通过语句的组合使得循环体由一条语句构成,这样就不需通过语句的组合使得循环体由一条语句构成,这样就不需要使用复合语句形式,上面程序中的循环结构可以改写为如要使用复合语句形式,上面程序中的循环结构可以改写为如下形式:下形式: whil

30、e (n=100)while (n=100)sum+=i+;sum+=i+; 在程序中还需要注意变量在程序中还需要注意变量sumsum的初值问题,由于变量的初值问题,由于变量sumsum用用于存放和数,所以其初值必须从某一固定值开始。一般意义下,于存放和数,所以其初值必须从某一固定值开始。一般意义下,用于存放和数、计数等目的的变量初始值均应为用于存放和数、计数等目的的变量初始值均应为0 0值。值。 2.3.2 do_while2.3.2 do_while型循环结构型循环结构1 1) dowhiledowhile型循环控制结构的一般形式为:型循环控制结构的一般形式为: do Loop-Body

31、while(exp);2 2) dowhiledowhile型循环结构的执行过程型循环结构的执行过程 :首先执行一次循环体首先执行一次循环体Loop-Body;Loop-Body;然后计算作为判断条件的表达式然后计算作为判断条件的表达式expexp的的值;对表达式值;对表达式expexp的值进行判断,若表达式的值为非的值进行判断,若表达式的值为非0 0(真),则执行(真),则执行一次循环体;执行完循环体后再一次计算条件表达式的值,若计算结一次循环体;执行完循环体后再一次计算条件表达式的值,若计算结果仍为非果仍为非0 0(真),再一次执行循环体。重复上述过程,直到某次计算(真),再一次执行循环体

32、。重复上述过程,直到某次计算出的条件表达式值为出的条件表达式值为0 0(假)时,则退出循环结构;控制流程转到该循(假)时,则退出循环结构;控制流程转到该循环结构之后的语句。环结构之后的语句。Do_while循环控制结构的执行过程如图循环控制结构的执行过程如图2.10所示。所示。 3) 3) 在使用在使用do_whiledo_while循环结构时需要注意以下几点:循环结构时需要注意以下几点: 由于整个结构的执行过程是先执行、后判断,所以循环由于整个结构的执行过程是先执行、后判断,所以循环结构中的循环体至少被执行一次。结构中的循环体至少被执行一次。 在循环结构的控制部分中,如果表示条件的表达式是一

33、在循环结构的控制部分中,如果表示条件的表达式是一个非个非0 0值常量表达式,则构成了死循环。例如:值常量表达式,则构成了死循环。例如:dodo Loop-Body Loop-Body while(1); while(1);C C程序设计中,如果不是有意造成死循环,则在程序设计中,如果不是有意造成死循环,则在do_whiledo_while循循环结构的循环体内必须有能改变循环控制条件的语句存在。环结构的循环体内必须有能改变循环控制条件的语句存在。 循环结构的循环体可以是一条语句、一个复合语句、空循环结构的循环体可以是一条语句、一个复合语句、空语句等任意合法的语句等任意合法的C C语句。语句。 例

34、例2-15 2-15 使用使用do_whiledo_while循环控制结构求循环控制结构求 的值。的值。 例例2-16 2-16 编程序实现功能:将一个整数的各位数字颠倒后输出。编程序实现功能:将一个整数的各位数字颠倒后输出。 2.3.3 for2.3.3 for型循环结构型循环结构 for for语句构成的循环是语句构成的循环是C C语言中提供的使用最为灵活、语言中提供的使用最为灵活、适应范围最广的循环结构,它不仅可以用于循环次数已确适应范围最广的循环结构,它不仅可以用于循环次数已确定的情况,而且也可以用于循环次数不确定但能给出循环定的情况,而且也可以用于循环次数不确定但能给出循环结束条件的

35、循环结束条件的循环 。1 1) forfor循环结构的一般形式为:循环结构的一般形式为: for(exp1; exp2; exp3) Loop-Body 其中,括号内的三个表达式称为循环控制表达式,其中,括号内的三个表达式称为循环控制表达式,exp1exp1的作用的作用是为循环控制变量赋初值或者为循环体中的其他数据对象赋初值,是为循环控制变量赋初值或者为循环体中的其他数据对象赋初值,exp2exp2的作用是作为条件用于控制循环的执行,的作用是作为条件用于控制循环的执行,exp3exp3的主要作用是对的主要作用是对循环控制变量进行修改,三个表达式之间用分号分隔。循环控制变量进行修改,三个表达式之

36、间用分号分隔。 2 2) forfor循环结构的执行过程:循环结构的执行过程: 首先计算表达式首先计算表达式exp1exp1的值对循环控制变量进行初始的值对循环控制变量进行初始化,如果有需要也同时对循环体中的其他数据对象进行化,如果有需要也同时对循环体中的其他数据对象进行初始化操作;然后计算作为循环控制条件使用的表达式初始化操作;然后计算作为循环控制条件使用的表达式exp2exp2的值;根据的值;根据exp2exp2计算的结果决定循环是否进行,当计算的结果决定循环是否进行,当exp2exp2的值为真(非的值为真(非0 0)时则执行循环体)时则执行循环体Loop-BodyLoop-Body一次;

37、一次;执行完循环体后,计算表达式执行完循环体后,计算表达式exp3exp3的值以修改循环控制的值以修改循环控制变量;然后再次计算表达式变量;然后再次计算表达式exp2exp2的值以确定是否再次执的值以确定是否再次执行循环体;反复执行上述过程直到某一次表达式行循环体;反复执行上述过程直到某一次表达式exp2exp2的的值为值为0 0(假)为止(假)为止 。 forfor循环控制结构的执行过程如图循环控制结构的执行过程如图2.122.12所示。所示。 3 3)使用)使用forfor循环结构时需要注意以下几点:循环结构时需要注意以下几点: 由于整个结构的执行过程是先判断、后执行,因而循环体有可能一次

38、由于整个结构的执行过程是先判断、后执行,因而循环体有可能一次都不执行。都不执行。 C C语言的语言的forfor循环控制结构不仅提供在其控制部分的表达式循环控制结构不仅提供在其控制部分的表达式3 3中修改循环中修改循环控制变量的值,而去还允许在控制变量的值,而去还允许在forfor循环的循环体中存在能改变循环控制条循环的循环体中存在能改变循环控制条件的语句,使用时需特别注意。件的语句,使用时需特别注意。 循环结构的循环体可以是一条语句、一个复合语句、空语句等任意合循环结构的循环体可以是一条语句、一个复合语句、空语句等任意合法的法的C C语句。语句。 根据程序功能的需要,循环控制部分的三个表达式

39、分别都可以逗号表根据程序功能的需要,循环控制部分的三个表达式分别都可以逗号表达式,这也是逗号表达式最主要的用法之一。达式,这也是逗号表达式最主要的用法之一。 根据程序功能的需要,循环控制部分的三个表达式中可以缺省一个、根据程序功能的需要,循环控制部分的三个表达式中可以缺省一个、两个、三个,但作为分隔符使用的分号不能缺省。两个、三个,但作为分隔符使用的分号不能缺省。 例例2-18 2-18 编程序实现功能:判断从键盘输入一个大于编程序实现功能:判断从键盘输入一个大于2 2的正整数是否为的正整数是否为素数。素数。 所谓素数,就是只能被所谓素数,就是只能被1 1和自身整除的自然数。根据素数的和自身整

40、除的自然数。根据素数的定义,判断一个正整数定义,判断一个正整数m m是否为素数最简单的方法就是:将是否为素数最简单的方法就是:将2 2到到m-1m-1之间的每一个整数去除之间的每一个整数去除m m,若其间有一个能整除,若其间有一个能整除m m,则则m m不是素数;若不是素数;若2 2到到m-1m-1之间的所有整数都不能整除之间的所有整数都不能整除m m,则,则m m为素数。为素数。 例例2-17 2-17 使用使用forfor循环控制结构求循环控制结构求 的值。的值。 2.3.4 2.3.4 空语句及其在程序中的使用空语句及其在程序中的使用 在在C C语言中,只由分号语言中,只由分号“;”构成

41、的构成的C C语句称为语句称为空语句空语句。 空语句不进行任何操作(或者称之为进行空操作),在空语句不进行任何操作(或者称之为进行空操作),在C C程序的设计中,程序的某个位置从程序的设计中,程序的某个位置从C C语言的语法要求上应该语言的语法要求上应该有一个有一个C C语句存在,但语义上(即程序的逻辑功能上)又不语句存在,但语义上(即程序的逻辑功能上)又不需要进行任何操作时,就可以使用空语句来占据这个语句需要进行任何操作时,就可以使用空语句来占据这个语句位置以同时满足语法和语义上的需求。位置以同时满足语法和语义上的需求。例如有如下形式的例如有如下形式的C C程序段:程序段: while(ge

42、tchar()!=n)while(getchar()!=n) ; ; 该段程序中,当循环条件为真时(即接收到的字符不该段程序中,当循环条件为真时(即接收到的字符不是换行符时),程序不进行任何操作(执行空语句后)进是换行符时),程序不进行任何操作(执行空语句后)进入下一次循环过程。该段程序通过这样的方式实现了入下一次循环过程。该段程序通过这样的方式实现了“反反复从键盘上接收输入字符直至换行为止复从键盘上接收输入字符直至换行为止”的语义。的语义。例例2-19 2-19 编写程序实现求阶乘的功能,要求循环体用空语句实现。编写程序实现求阶乘的功能,要求循环体用空语句实现。 2.3.5 2.3.5 循环

43、的嵌套循环的嵌套 一个循环结构的循环体内又包含另外一个完整的一个循环结构的循环体内又包含另外一个完整的循环结构,称为循环结构,称为循环的嵌套循环的嵌套。 循环的嵌套层数可以是多层,称为循环的嵌套层数可以是多层,称为多重循环多重循环。 在在C C语言中三种循环结构语句语言中三种循环结构语句“do.whiledo.while循环循环”、“whilewhile循环循环”、“forfor循环循环”可以根据需要,任意地互可以根据需要,任意地互相嵌套,下面是一些常见的循环嵌套结构:相嵌套,下面是一些常见的循环嵌套结构: 使用多重循环结构时应注意以下几点:使用多重循环结构时应注意以下几点: 三种循环结构(三

44、种循环结构(“whilewhile循环循环”结构、结构、“dowhiledowhile循环循环”结构、结构、“forfor循环循环”结构)可以相互嵌套。结构)可以相互嵌套。 一般情况下,嵌套结构中的外层循环和内层循环的一般情况下,嵌套结构中的外层循环和内层循环的循环控制变量不得同名。循环控制变量不得同名。 例例2-20 2-20 编程序输出如下所示由字符构成的图形。编程序输出如下所示由字符构成的图形。 例例2.202.20程序是一个双重循环结构,其中外程序是一个双重循环结构,其中外层循环结构控制输出图形的行数。层循环结构控制输出图形的行数。循环体中完成了循环体中完成了3 3件事情:件事情:按照

45、要求输出按照要求输出前导空格,使用了一个内嵌的循环结构完前导空格,使用了一个内嵌的循环结构完成该功能,注意该内嵌循环结构的控制条成该功能,注意该内嵌循环结构的控制条件件j5-ij5-i使得其输出的前导空格数会随着外使得其输出的前导空格数会随着外层循环的控制变量值得变化而变化,从而层循环的控制变量值得变化而变化,从而实现每行少输出一个前导空格的要求;实现每行少输出一个前导空格的要求;按照要求输出若干规定的字符(本例中通按照要求输出若干规定的字符(本例中通过过ch+i-jch+i-j计算得到),同样使用了一个内计算得到),同样使用了一个内嵌的循环结构完成该功能,请注意内嵌内嵌的循环结构完成该功能,

46、请注意内嵌内嵌循环结构的控制条件嵌循环结构的控制条件j=ij=i的意义;的意义;使使用用printf(n);printf(n);语句实现输出一行字符后语句实现输出一行字符后的换行功能。的换行功能。 例例2-21 2-21 编程序在屏幕上打印出如下所示的乘法九九表。编程序在屏幕上打印出如下所示的乘法九九表。 * 1 2 3 4 5 6 7 8 9 1 1 2 2 4 3 3 6 9 4 4 8 12 16 5 5 10 15 20 25 6 6 12 18 24 30 36 7 7 14 21 28 35 42 49 8 8 16 24 32 40 48 56 64 9 9 18 27 36 4

47、5 54 63 72 812.4 C2.4 C语言中的其它简单控制结构语言中的其它简单控制结构 2.4.1 break2.4.1 break语句语句 breakbreak语句是一条限定转移语句,其一般形式为:语句是一条限定转移语句,其一般形式为: break; break语句的使用范围只能在下面两种程序结构之一: switch语句结构中。 循环控制结构中。breakbreak语句的功能:语句的功能: 把程序的控制流程从直接包含该把程序的控制流程从直接包含该breakbreak语句的循环控制语句的循环控制结构或结构或switchswitch语句结构中转出。语句结构中转出。 C C程序中的程序中的

48、breakbreak语句总是出现在语句总是出现在ifif结构的语句部分,构成如下结构的语句部分,构成如下形式的语句结构形式:形式的语句结构形式: if(exp)if(exp) break; break;例如,在下面例如,在下面C C程序段中,程序段中,breakbreak语句结束了语句结束了for for 循环,使得循环,使得for for 循环不是循环不是i i从从1 1到到100100循环,而是循环,而是i i从从1 1到到1010循环。循环。 for(i=1;i=100;i+)/for(i=1;i9) break; if(i9) break; 表表2.22.2中分别给出的是中分别给出的是

49、whilewhile、forfor和和do whiledo while三种循环三种循环结构循环体中包含的结构循环体中包含的breakbreak语句执行时控制流程的转向情况。语句执行时控制流程的转向情况。 例例2-22 2-22 编制程序实现功能:从键盘输入两个正整数编制程序实现功能:从键盘输入两个正整数a(a2)a(a2)和和b b,求,求a a与与b b之间的全部素数。之间的全部素数。 例例2-23 2-23 编程需实现功能:求调和级数中至多少项后的和值编程需实现功能:求调和级数中至多少项后的和值大于大于1010。 分析:需要判定数分析:需要判定数n n是否为素数时,可以用是否为素数时,可以

50、用2 2到到sqrt(n)sqrt(n)之之间的所有整数去除间的所有整数去除n n,若其中任意一次能够除尽,则说明,若其中任意一次能够除尽,则说明n n不是素数;否则不是素数;否则n n是素数。是素数。分析:调和级数的第分析:调和级数的第n n项形式为:项形式为: 2.4.2 continue2.4.2 continue语句语句continuecontinue语句是一条限定转移语句,其一般形式为:语句是一条限定转移语句,其一般形式为:continue; continue; continue语句的功能:语句的功能: 提前结束本次循环体的执行过程而直接进入下提前结束本次循环体的执行过程而直接进入下

51、一次循环。一次循环。 continue语句只能使用在循环结构的循环体中。 C C程序中的程序中的continuecontinue语句总是出现在语句总是出现在ifif结构的语结构的语句部分,构成如下形式的语句结构形式:句部分,构成如下形式的语句结构形式: if(expression)if(expression) continue; continue; 表表2.32.3中分别给出的是中分别给出的是whilewhile、forfor和和do whiledo while三种循环结构循环体中包含的三种循环结构循环体中包含的continuecontinue语句执行时语句执行时控制流程的转向情况。控制流程的

52、转向情况。 例例2-24 2-24 编程序实现功能:检测从键盘上输入的以换行符结束编程序实现功能:检测从键盘上输入的以换行符结束的字符流,统计非字母字符的个数。的字符流,统计非字母字符的个数。 程序通过循环依次检查每一个输入的字符,当字符不是换程序通过循环依次检查每一个输入的字符,当字符不是换行符并且是字母时通过执行行符并且是字母时通过执行continuecontinue语句提前结束本轮循环语句提前结束本轮循环(即不执行循环体中的(即不执行循环体中的counter+;counter+;语句);当字符不是换行符语句);当字符不是换行符并且是不是字母时,条件并且是不是字母时,条件c=A&c

53、=a&c=A&c=a&c=z不成立,不会执行不成立,不会执行continuecontinue语句,从而程序执行计数器增一的操作语句,从而程序执行计数器增一的操作counter+;counter+;;当遇到换行字符是循环结束并输出变量当遇到换行字符是循环结束并输出变量countercounter的值。的值。 程序的某次执行情况和输出结果如下所示:程序的某次执行情况和输出结果如下所示:Input a string: Input a string: skjdf4623784908% skjdf4623784908%* *& &* *(%SDFsdfk(%SDF

54、sdfk Counter=18 Counter=18 2.4.3 goto2.4.3 goto语句和标号语句语句和标号语句gotogoto语句是无条件转移语句,其一般形式为:语句是无条件转移语句,其一般形式为:goto goto 语句标号;语句标号; 其中:标号语句用标识符加上冒号表示,其定义规则同变量,即由字其中:标号语句用标识符加上冒号表示,其定义规则同变量,即由字母、数字和下划线组成且第一个字符必须是字母或下划线。母、数字和下划线组成且第一个字符必须是字母或下划线。 gotogoto语句的功能:语句的功能: 将程序的控制流程无条件地转移到语句标号所指的标号将程序的控制流程无条件地转移到语

55、句标号所指的标号语句处。语句处。 注意:注意:gotogoto语句的使用范围局限于函数内部,不允许在一语句的使用范围局限于函数内部,不允许在一个函数中使用个函数中使用gotogoto语句将程序控制转移到本函数之外。语句将程序控制转移到本函数之外。 在程序设计中,使用在程序设计中,使用gotogoto语句和语句和ifif语句配合也可以构语句配合也可以构成循环结构,但不提倡使用成循环结构,但不提倡使用gotogoto语句来构成循环结构。例如语句来构成循环结构。例如下面循环结构程序的形式:下面循环结构程序的形式:#include #include void main()void main() int

56、 j=1,sum=0; int j=1,sum=0;loop: loop: if(k=100)if(knmn)的最大公倍数可以使用)的最大公倍数可以使用辗转相除法。其算法可以描述为:辗转相除法。其算法可以描述为: m m除以除以n n得到余数得到余数r(0rr(0rn)n)。 若若r=0r=0则算法结束,则算法结束,n n为最大公约数。否则执行步骤为最大公约数。否则执行步骤。mnmn,nrnr,转回到步骤,转回到步骤。 当已知两个非负整数当已知两个非负整数m m和和n n的最大公约数后,求其最小公的最大公约数后,求其最小公倍数的算法可以简单描述为:两个正整数之积除以它们的倍数的算法可以简单描述

57、为:两个正整数之积除以它们的最大公约数。最大公约数。 例例2-25 2-25 求两个正整数的最大公约数和最小公倍数。求两个正整数的最大公约数和最小公倍数。 2.5.2 2.5.2 穷举思想及程序实现穷举思想及程序实现 在计算机的应用中,许多问题的解在计算机的应用中,许多问题的解“隐藏隐藏”在多个的可在多个的可能之中。穷举就是对多种可能的情形一一测试,从众多的可能之中。穷举就是对多种可能的情形一一测试,从众多的可能中找出符合条件的能中找出符合条件的( (一个或一组一个或一组) )解,或者无解的结论。在解,或者无解的结论。在一个集合内对集合中的每一个元素进行一一测试的方法称为一个集合内对集合中的每

58、一个元素进行一一测试的方法称为穷举法。穷举本质上就是在某个特定范围中的查找,是一种穷举法。穷举本质上就是在某个特定范围中的查找,是一种典型的重复型算法,其重复操作(循环体)的核心是对问题典型的重复型算法,其重复操作(循环体)的核心是对问题的一种可能状态的测试。的一种可能状态的测试。 穷举方法的实现主要依赖于以下两个基本要点:穷举方法的实现主要依赖于以下两个基本要点: 搜寻可能值的范围如何确定。搜寻可能值的范围如何确定。 被搜寻可能值的判定方法。被搜寻可能值的判定方法。 对于被搜索的可能值,一般都是问题中所要查找对于被搜索的可能值,一般都是问题中所要查找的对象或者是要查找对象应该满足的条件,因而

59、在问的对象或者是要查找对象应该满足的条件,因而在问题中都会有清晰的描述。但对于搜寻范围,在有些问题中都会有清晰的描述。但对于搜寻范围,在有些问题是比较确定的,而在另外一些问题则是不确定的。题是比较确定的,而在另外一些问题则是不确定的。 例例2-26 2-26 编程序找出所有的编程序找出所有的“水仙花数水仙花数”。“水仙花数水仙花数”是指一个是指一个3 3位数,位数,其各位上数字的立方之和等于这个数本身。例如其各位上数字的立方之和等于这个数本身。例如153=1153=13 3+5+53 3+3+33 3,所以,所以153153是是“水仙花数水仙花数”。 分析:依题意可以得出,搜寻可能值的范围为分

60、析:依题意可以得出,搜寻可能值的范围为100999100999;判定方法为各位上数字的立方之和等于被判定数。程序可判定方法为各位上数字的立方之和等于被判定数。程序可以依次取出区间以依次取出区间100100,999999之间的每一个数,然后将该数之间的每一个数,然后将该数分解为分解为3 3个数字,按照判定条件判定即可。个数字,按照判定条件判定即可。 上面求取上面求取“水仙花数水仙花数”的可以称之为的可以称之为分离数据的方法。分离数据的方法。 除此之外还可以使用组合数据的方法求取除此之外还可以使用组合数据的方法求取“水仙花数水仙花数”。如果用如果用a a、b b和和c c分别表示分别表示3 3位数的百位、十位和个位,则该位数的百位、十位和个位,则该3 3位位数可以表示为:数可以表示为:a a* *100+b100+b* *10+c1

温馨提示

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

评论

0/150

提交评论