C语言程序设计课件 第4章_第1页
C语言程序设计课件 第4章_第2页
C语言程序设计课件 第4章_第3页
C语言程序设计课件 第4章_第4页
C语言程序设计课件 第4章_第5页
已阅读5页,还剩45页未读 继续免费阅读

下载本文档

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

文档简介

第4章循环结构4.1循环结构的要素4.2循环语句4.3循环嵌套4.4流程转移控制语句4.5循环结构的综合示例本章小结

4.1循环结构的要素

循环结构就是用来处理需要重复处理的问题的,所以循环结构又称为重复结构。循环结构有3个要素:循环控制变量、循环体和循环条件。

1.循环控制变量

循环控制变量通常用于控制循环的次数和进程。它在循环开始前被初始化,在循环过程中会发生变化,并且循环条件通常会依赖于这个变量的值。在for循环中,控制变量的初始化、条件检查和变量更新通常在循环语句的头部明确给出。

2.循环体

循环体包含了每次循环迭代时需要执行的代码块。只要循环条件为真,循环体内的代码就会被执行。循环体可以是一个简单的语句或一个复杂的代码块,包括更多的控制流语句,如条件判断、嵌套循环等。

3.循环条件

循环条件是一个逻辑表达式,其结果决定了循环是否继续执行。在每次循环迭代开始前(while和for循环)或结束时(do-while循环)检查这个条件。如果条件为真(即表达式结果非0),则循环继续执行;如果条件为假(即表达式结果为0),则循环结束,控制流转移到循环结构后的下一条语句。

循环有两种:无限循环和有限循环。无限循环,如地球绕太阳的转动或昼夜的连续交替,理论上永无止境。有限循环,在满足特定条件后便会停止,比如在处理完一个班级里所有50名学生的绩点计算之后循环停止。

循环结构是结构化程序设计的基本结构之一,它和顺序结构、分支结构共同作为各种复杂程序的基本构造单元。因此,熟练掌握循环结构的概念及使用方法是程序设计最基本的要求。

4.2循环语句

循环语句是一种在编程中使用的语句,它允许程序重复执行一段代码多次,直到满足某个条件为止。C语言中提供for、while、do-while这三种循环控制语句来实现循环结构。

4.2.1for语句

1. for语句的一般形式

for语句的一般形式为

for(表达式1;表达式2;表达式3)

循环体;

循环体;

其中:表达式1可以是赋值表达式、逗号表达式或函数调用表达式,它是循环控制的初始化部分,为循环中所使用的变量赋初值,即为循环作准备;表达式2通常是关系表达式或逻辑表达式,它是循环条件,循环体反复执行多次,必须在循环条件满足的情况下(即表达式2的值非0)才能进行,否则循环终止;表达式3是赋值表达式或算术表达式,它使循环变量的值或循环条件得到修改,使循环只能进行有限次;循环体是循环结构中反复执行的语句,它可以是空语句(单独用分号表示的一条语句)、单语句或复合语句。

2. for语句的执行过程

for语句的执行过程如下:

(1)计算表达式1。

(2)判断表达式2,若其值非0,则执行第(3)步;若为0,则执行第(6)步。

(3)执行循环体。

(4)计算表达式3。

(5)跳转到第(2)步继续执行。

(6)终止循环,执行for语句后的下一条语句。

for语句的执行流程如图4-1所示。

图4-1for语句的执行流程

3. for语句的说明

for语句的使用说明如下:

(1)在for语句中3个表达式都可以缺省,但其中的两个分号不可省。例如,下面的语句是正确的:

for(;;)

①若表达式1缺省,则必须将表达式1作为语句安排在for语句之前。如例4-1中的语句

for(s=0,n=1;n<=100;n++)

可改成

s=0;

n=1;

for(;n<=100;n++)

②若表达式2缺省,则系统默认循环条件为真(非0值),此时,如果不在循环体中加其他语句进行控制,循环将无限制进行下去,即出现死循环。如将例4-1中的循环语句改成

for(s=0,n=1;;n++)

s=s+n;

则会出现死循环。

③若表达式3缺省,可将它的语句放在循环体的最后。如可将例4-1中的循环语句改成

for(s=0,n=1;n<=100;)

{

s=s+n;

n++;

}

(2)若循环体中有多个语句,则循环体一定要用花括号括起来,以复合语句形式出现,且循环体中的变量在每一次循环过程中其值一般来说是不相同的。

如例4-1中,第一次循环,s的值是1,n的值是1;第二次循环,s的值是3,n的值是2。

(3)循环体可以为空语句,但必须有分号(即循环为空语句)。

(4)要注意循环终止后循环变量的值,一般来讲该值是循环变量最后一次循环值加步长。如例4-1中循环变量终止后n的值为100+1,即101。

4.程序举例

例4-2判断正整数x是否为素数。

解题思路素数是指除1和本身之外不能被其他数整除的数。设一个标志性变量flag,如果其值等于0,则x不为素数;如果其值等于1,则x为素数。先设flag = 1(即假设x为素数),另设变量n由2变化到x - 1,接着判断x是否能被n整除,只要有一个n值能使x被整除,则令flag=0。

N-S图如图4-2所示图4-2例4-2的N-S图

例4-3从键盘输入任意两个正整数x和y,求出这两数的最大公因子。

解题思路首先输入两个正整数,判断其大小,大的数放在x中,小的数放在y中。其次设r为余数,x与y的关系可写为x = ky + r,由于x与y有公因子f,因此r中必有公因子f。这样求大的数x与y的公因子,就可以转化为求小的数y与r的公因子f。这就是辗转相除法。当r = 0时,y值为最大公因子。

N-S图如图4-3所示,

图4-3例4-3的N-S图

例4-4输出斐波那契数列的前20项之值。

解题思路设f0、f1、f2是数列中的3个数,且有如下关系:f2 = f1 + f0。在循环计算过程中,始终使f1、f0指向两个相加的相邻数,f2始终为新计算出的和值。

4.2.2while语句

1. while语句的一般形式

while语句是一种当型循环语句,即先判断条件,后执行循环体。while语句的一般形式为

while(表达式)

循环体;

其中:圆括号中的表达式一般是关系表达式、逻辑表达式或算术表达式,运算结果是一个逻辑值,或为真(非0),或为假(0),它是循环控制的条件;循环体是循环反复执行的语句,它可以是空语句、单语句或复合语句。

2. while语句的执行过程

首先计算和判断表达式的值,如果表达式的值为“真”(非0),则执行循环体;然后程序转回去计算和判断表达式的值,当表达式的值为“假”(0)时,终止while循环,继续执行while语句后的下一条语句。

其N-S图如图4-4所示。图4-4while语句的N-S图

3.程序举例

例4-5求10个数(实数)中的最大数。

解题思路设存放最大数的变量为max。先输入第一个数,并将其值赋给max。然后输入第二个数,将其与当前max比较,如果输入的数大于max,则将max更新为当前最大数。接着输入第三个数、第四个数……

N-S图如图4-5所示

图4-5例4-5的算法N-S图

例4-6用while语句求s = 1 + 2 + 3 + … + 100。

解题思路首先s赋初值0,被加数n赋初值1,将n的值(1)累加到s中;然后将n加1后的值(2)累加到s中。这样,n的值不断加1并被累加到s中,直到将100也累加到s中为止,此时s中的值即为所求累加和。

4.2.3do-while语句

1. do-while语句的一般形式

do-while语句的一般形式为

do

{

循环体;

}while(表达式);

2. do-while语句的执行过程

do-while语句的作用是,首先无条件地执行循环体一次(无论表达式的值是否为0),然后计算和判断表达式的值,若表达式的值为“真”(非0),则程序转回去反复执行循环体,直到表达式的值为“假”(0),这时终止do-while语句,继续执行do-while语句后的下一条语句。do-while语句的N-S图如图4-6所示。图4-6do-while语句的N-S图

3.程序举例

例4-7求12 + 22 + 32 + … + n2 ≤ 10 000的最大n值。

解题思路定义累加和变量s和正整数n。当s小于或等于10 000的值为真时输出n - 1。

N-S图如图4-7所示图4-7例4-7的N-S图

例4-8求一个正整数(该数小于65535)的逆序数。

解题思路对于x的逆序数,按顺序分离它的每个数位t,设变量newd保存逆序数,初始值为0,按表达式“newd=newd*10+t”将t累加到newd变量中,则可实现转换。

例4-9用牛顿迭代法求方程3x3 - 4x2 + 3x - 6 = 0在1.5附近的根,要求绝对值误差小于1E-5,并输出迭代次数。

解题思路牛顿迭代法实际上是根据曲线f(x)的切线与x轴的交点来求非线性方程的近似解,其迭代公式为

x = x0 - f(x0) / f1(x0)

其中f1(x0)是f(x)的导函数在x0点的值。

4.2.4三种循环的比较

while循环和do-while循环由循环控制变量、循环条件和循环体组成,循环体中包含需要反复执行的操作和循环控制变量值的修改语句。而for语句则在它的一般形式中有4个固定位置,用4个表达式表示,其结构更加简洁。

while循环和for循环是先判断循环条件,后执行循环体,当第一次判断循环条件不满足时,循环体一次也不执行,称为当型循环;do-while循环是先执行循环体一次,后判断循环条件,所以循环体至少执行一次,称为直到型循环。

4.3循环嵌套

如果一个循环完全包含在另一个循环的循环体中,那么这样的结构称为循环嵌套。内嵌的循环中还可以再嵌套循环,这称为多重循环。三种循环控制语句for、while、do-while可以互相嵌套、自由组合。

例4-10求1~1000中的回文数(正读和反读相同的整数)的个数。

解题思路回文数是正读和反读相同的整数,即该数和它的逆序数相等。

例4-11求2~1000中所有素数的个数及这些素数的和。

解题思路判断一个数x是否为素数,在例4-2中有详细做法,这里只需要遍历判断2~1000的每个数是否为素数即可。

二重循环的执行过程是:外循环执行一次,内循环执行一遍,之后,跳转到外循环,若外循环条件满足,则重复执行一遍内循环,如此反复;当外循环条件不满足时,结束整个循环。通俗地说,执行时由外循环进入内循环,退出则相反,由内循环退至外循环,直到外循环结束时才结束整个循环嵌套。

循环嵌套可以有效解决复杂问题,但在使用循环嵌套时,要注意以下几点:

(1)使用花括号明确定义每个循环体。

(2)区分各层循环的控制变量名。

(3)保持清晰的缩进层次。

(4)严格遵守循环的包含关系。

(5)循环要进行初始化

4.4流程转移控制语句

在C语言中,流程转移控制是指通过特定的语句改变程序的执行流程。主要的流程转移控制语句有break、continue等语句,这些控制语句允许程序根据条件跳过某些代码的执行或提前退出循环,使得代码的逻辑更加灵活。

4.4.1break语句

break语句经常放在循环语句的循环体中,且通常和if语句一起连用。break语句的一般形式为

break;

其作用是:在满足一定条件时,提前退出本层循环(不管循环条件是否成立),使程序流程转向该循环结构后的下一条语句。break语句示例如图4-8所示。图4-8break语句示例

例4-13求2~1000中超级素数的个数。

解题思路超级素数指一个素数从低位到高位依次去掉一位数后剩下的数还是素数。判断一个数x是否为素数,在例4-2中有详细介绍,若x是素数,则去掉x的一个数位,继续判断x是否为素数。

4.4.2continue语句

continue语句的一般形式为

continue;

其作用是:提前结束本次循环,即跳过循环体中某些还没有被执行的语句,开始新的一次循环。continue语句示例如图4-9所示,执行循环体中的continue时,提前结束本次循环,即循环体中continue后的语句不执行,接着进行下一次循环操作。图4-9continue语句示例

例4-14从键盘输入10个不为0的整数,统计其中负数的个数,并求所有正数的平均值。

解题思路程序中定义的变量count用于统计负数个数;变量avg在循环结构中用于统计正数的和,循环结束后用于计算平均值,

4.5循环结构的综合示例

例4-15祖冲之一生钻研自然科学,其主要贡献在数学、天文历法和机械制造三个方面。他在刘徽开创的探索圆周率的精确方法基础上,首次将圆周率精算到小数点后第7位,即在3.1415926和3.1415927之间。他提出的“祖率”对数学的研究具有重大贡献。请利用级数展开式求π的近似值,直到某一项的值小于10-8为止。

解题思路这是一个累加求和问题,但这里的循环次数是未知的,只能使用条件控制的循环来实现。由于控制循环结束的条件是累加的最后一项的绝对值小于10-8,因此循环继续的条件是累加的最后一项的绝对值大于或等于10-8。又由于累加项是由分子和分母两部分组成的,因此累加项的构成规律为

term=sign/n

由于相邻累加项的符号是正负交替变化的,因此可以令分子sign按+1,-1,+1,-1,…交替变化,这可通过反复取sign自身的相反数再重新赋值给自己(即sign=-sign)的方法来实现,注意sign需初始化为1。分母n则按1,3,5,7,…即每次递增2变化,这可通过n=n+2来实现,注意n也需初始化为1。此外,还要设置一个计数器变量count来统计累加的项数。count需初始化为0。在循环体中每累加一项,count的值就增1。

例4-16打印如下大小可变的菱形图案(下面菱形的大小是7):

解题思路菱形的大小size其实就是中间行中“*”号的个数,也是整个菱形的行数,其值必须是奇数。问题的关键之一是如何确定每行中“*”号的个数。经过分析得知:当行数i(假设最上面的一行为第1行)≤(size + 1)/2时,该行上的“*”号个数为“n=2*i-1”,否则“n=2*(size-i+1)-1”。问题的关键之二是如何确定每行显示的第一个“*”号的位置,也就是显示第一个*号之前应显示多少个空格。经过分析得知:每行应显示的空格数为m=(size-n)/2个。

例4-17我国古代数学家张丘建在《算经》一书中曾提出过著名的“百钱买百鸡”问题。该问题简述如下:公鸡5文钱一只,母鸡3文钱一只,小鸡3只一文钱,用100文钱买100只鸡,其中公鸡、母鸡、小鸡都必须要有。问:公鸡、母鸡、小鸡要买多少只刚好花去100文钱?

解题思路设公鸡、母鸡、小鸡分别为x、y、z,依题意列出方程组x + y + z = 100,5x + 3y + z/3 = 100,此题可采用穷举法求解。因100文钱买公鸡最多可买20只,买母鸡最多可买33只,故x从0变化到20,y从0变化到33,而z = 100 - x - y,只要判断5x + 

3

温馨提示

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

评论

0/150

提交评论