1、第四章第四章 循环结构循环结构结构化程序设计的三种控制结构结构化程序设计的三种控制结构顺序结构顺序结构选择结构选择结构循环结构循环结构TFTFFTTTFFFTFTF内容内容n4.1 循环结构概述循环结构概述n4.2 while循环循环n4.3 do-while循环循环n4.4 for循环循环n4.5 循环的嵌套循环的嵌套n4.6 循环的中途退出循环的中途退出n4.7 算法举例算法举例4.1 4.1 循环结构概述循环结构概述用循环程序实现14循环结构特点循环结构特点 在在给定条件成立给定条件成立时,时,反复执行反复执行某程序段,某程序段,直到条件不成立为止。直到条件不成立为止。给定的条件称为给定
2、的条件称为循环条件循环条件,反复执行的,反复执行的程序段称为程序段称为循环体循环体。C语言中,实现循环的语句语言中,实现循环的语句n1用用 语句语句n2用用 语句语句n3用用 语句语句n4用用 语句和语句和 语句构造循环语句构造循环do-whileforwhile4.2 while循环循环nwhile语句语句 一般形式一般形式 执行流程执行流程TFwhile循环特点循环特点说明:说明:循环体有可能一循环体有可能一次也不执行次也不执行(当循环条件不满足)(当循环条件不满足)while语句中的语句中的,常,常用的是关系表达式和逻辑表达式,只要表达式用的是关系表达式和逻辑表达式,只要表达式的值为真(
3、非的值为真(非0)即可继续循环)即可继续循环51ii用用while循循环求环求i sum 1 0 sum=0+1=1 i+2 1 sum=1+2=3 i+3 3 sum=3+3=6 i+4 6 sum=6+4=10 i+5 10 sum=10+5=15 i+6 151+2+3+100?100循环变量初值循环变量初值循环变量终值循环变量终值循环变量增值循环变量增值n当循环体当循环体,以复合语句形式出现。,以复合语句形式出现。n如果不加花括弧,如果不加花括弧,while语句的执行范围语句的执行范围只到只到while后面的第一个分号处后面的第一个分号处while(i=100);sum=sum+i;i
4、+;while(i=100)sum=sum+i;i+;while(i0?1:xb)printf(%d,a);else printf(%d,b);printf(%d,ab?a:b);求求 a+|b|value=b0?a+b:a-b;exp1取取exp2值值取取exp3值值非非0=0n结合方向:结合方向:如如:x0?1:x0?1:(xy?1:1.5/xy,值为值为1.0;x=y ,值为值为1.5输入两个正整数输入两个正整数a和和b,求其最大公约数,求其最大公约数 几个自然数公有的约数,叫做这几个数的公几个自然数公有的约数,叫做这几个数的公约数。其中最大的就是最大公约数。约数。其中最大的就是最大公约
5、数。n方法方法1定义法定义法具体步骤:具体步骤:从键盘上输入从键盘上输入m,n,求求k=mn?m:n;如果如果m%k=0且且n%k=0,则,则k为最大公约数为最大公约数 否则,否则,k-,继续继续直到满足条件为止直到满足条件为止n方法方法2辗转相除法辗转相除法n方法方法3相减法相减法输入两个正整数输入两个正整数m和和n,求其最大公约数,求其最大公约数请输入请输入2个数个数:32 12最大公约数最大公约数:4Press any key to continue 将一个大于将一个大于1的正整数分解成质因的正整数分解成质因数。例如:输入数。例如:输入90,打印出,打印出 90=2*3*3*5n题目分析
6、:为了将题目分析:为了将n分解成质因数,应先找到一分解成质因数,应先找到一个最小的质数个最小的质数k,然后按下述步骤完成:,然后按下述步骤完成:如果如果n=k,则说明分解质因数的过程,则说明分解质因数的过程已经结束,输出即可已经结束,输出即可 如果如果n!=k,但,但n能被能被k整除,则应打印整除,则应打印出出k的值,并用的值,并用n除以除以k的商的商,作为新的正整数作为新的正整数n,重复执行重复执行STEP1 如果如果n不能被不能被k整除,则用整除,则用k+1作为新作为新的的k,重复执行重复执行 1.while(1.while(0 0).).由于循环的条件表达式恒由于循环的条件表达式恒等于等
7、于0 0,循环体永远也不会执行,是编程者的错误。,循环体永远也不会执行,是编程者的错误。2.while(2.while(1 1).).由于循环的条件表达式恒由于循环的条件表达式恒等于等于1 1,所以不可能通过循环控制条件来结束循环,所以不可能通过循环控制条件来结束循环体的执行,称为体的执行,称为“死循环死循环”。3.3.为了保证循环正常运行,应该特别注意:为了保证循环正常运行,应该特别注意:u 循环条件循环条件 u 循环条件的初始状态(初始值)循环条件的初始状态(初始值)i=1;i=1;u 循环体内部对控制条件的影响循环体内部对控制条件的影响 i+;i+;While While 使用使用注意注
8、意4.3 do-while循环循环nDo-while语句语句 一般形式一般形式 执行流程执行流程TF表达式表达式循环体循环体FT循环体循环体while循环循环 特点:特点:说明:说明:至少执行一次循环体至少执行一次循环体dowhile可转化成可转化成while结构结构 从键盘输入一个整数,计算它的位数。从键盘输入一个整数,计算它的位数。例如:输入例如:输入12345,输出,输出5;输入输入-123,输出,输出3,输入输入0,输出,输出1。main()int number,count=0;scanf(“%d”,&number);if(number0)number=-number;do print
9、f(“%d”,number%10);number=number/10;count+;while(number!=0);printf(“,%d n,count);输入一个整数,反序输出该数。输入一个整数,反序输出该数。如输入如输入1234512345,输出,输出5432154321。12345%10 =512345/10 =12341234%10 =41234/10 =123123%10 =3123/10 =1212%10 =212/10 =11%10 =11/10 =0用格里高利公式求用格里高利公式求的近似值。要的近似值。要求精确到最后一项的绝对值小于求精确到最后一项的绝对值小于1e-5。n格
10、里高利公式为:格里高利公式为:n分子分子 flag:1,-1,1,-1n分母分母 n:1,3,5,7,.n项项 item=flag/n.71513114.715131114#include main()int i,sum=0;scanf(%d,&i);do sum=sum+i;i+;while(i=10);printf(sum=%d,sum);#include main()int i,sum=0;scanf(%d,&i);while(i=10)sum=sum+i;i+;printf(sum=%d,sum);while和和dowhile比较比较:1 sum=551 sum=5511 sum=01
11、1 sum=114.4 for循环循环nfor语句语句 一般形式一般形式 执行流程执行流程 for语句一般应用形式语句一般应用形式 说明说明for语句中语句中exp1,exp2,exp3类型任意,都可省略,类型任意,都可省略,但但无限循环无限循环:for(;)for语句可以转换成语句可以转换成while结构结构for(exp1;exp2;exp3)循环体语句;循环体语句;exp1;while(exp2)循环体语句;循环体语句;exp3;计算计算s=1+2+3+.+99+100 用用for语句实现,从语句实现,从0开始,输出开始,输出n个连续的偶数个连续的偶数 打印出所有打印出所有“水仙花数水仙
12、花数”。所谓。所谓“水仙水仙花数花数”是指一个三位数,其各位数字立方和等于该是指一个三位数,其各位数字立方和等于该数本身如:数本身如:153是一个是一个“水仙花数水仙花数”,因为,因为153=135333n题目分析:题目分析:利用利用for循环检验循环检验100-999中的每一个三位数中的每一个三位数 对于每个三位数分解出个位、十位、百位数,对于每个三位数分解出个位、十位、百位数,然后判断它是否为然后判断它是否为“水仙花数水仙花数”。设设n为一个三位数,为一个三位数,i、j、k分别为百位,十位分别为百位,十位和个位,怎样获得和个位,怎样获得i、j、k呢?呢?有一分数序列:有一分数序列:2/1,
13、3/2,5/3,8/5,3/8,.,求出这个数列的前,求出这个数列的前20项之和项之和n题目分析:题目分析:.81358352312fbaa=a+bb=at=a几种循环的比较几种循环的比较nfor和和while循环条件循环条件循环体,循环体,do-while语句语句循环体循环体循环条件。循环条件。nwhile、do-while、for可以相互替换使用。可以相互替换使用。n通常使用情况通常使用情况while语句多用于语句多用于的情况。的情况。for语句多用于语句多用于的情况。的情况。do-while语句多用于语句多用于循环控制循环控制(3 3)用)用forfor循循环语环语句句#include#
14、include void main()void main()int s=0,i;int s=0,i;for(i=1;i=10;i+)for(i=1;i=10;i+)s=s+i;s=s+i;printf(s=%d,s);printf(s=%d,s);54求求s=1+2+3+10,分别用,分别用三种循环语句实现,比较他们的异同。三种循环语句实现,比较他们的异同。(2 2)用)用dowhiledowhile循循环环#include#include void main()void main()int s=0,i=1;int s=0,i=1;do do s=s+i;s=s+i;i+;i+;while(i
15、=10);while(i=10);printf(s=%d,s);printf(s=%d,s);(1 1)用)用whilewhile循循环环#include void main()void main()int s=0,i=1;int s=0,i=1;while(i=10)while(i=10)s=s+i;s=s+i;i+;i+;printf(s=%d,s);printf(s=%d,s);4.5 循环的嵌套循环的嵌套n三种循环可互相嵌套三种循环可互相嵌套,层数不限层数不限 外层循环可包含两个以上内循环外层循环可包含两个以上内循环,但不能相互交叉但不能相互交叉内循环内循环外循环外循环相互交相互交叉叉
16、 分析程序的运行结果分析程序的运行结果000001000100011011ijk1*1=11*2=22*2=41*3=32*3=43*3=91*4=42*4=83*4=124*4=141*5=52*5=103*5=154*5=205*5=25 打印出打印出乘法九九表乘法九九表第第1列列第第2列列第第3列列第第4列列第第5列列第第1行行1*1=1第第2行行1*2=22*2=4第第3行行1*3=32*3=43*3=9第第4行行1*4=42*4=83*4=124*4=14第第5行行1*5=52*5=103*5=154*5=205*5=25n找一找找一找 i和和j的规律的规律 行行i从从19,即,即i
17、(1i9)列列j从从1i,即,即j(1ji)两个乒乓球队进行比赛,各出三人。两个乒乓球队进行比赛,各出三人。甲队为甲队为a、b、c三人,乙队为三人,乙队为x、y、z三人。已抽签三人。已抽签决定比赛名单。有人向队员打听比赛的名单。决定比赛名单。有人向队员打听比赛的名单。a说说他不和他不和x比,比,c说他不和说他不和x、z比,请编程序找出三对比,请编程序找出三对比赛选手的名单。比赛选手的名单。n题目分析题目分析 分别用三个字符变量分别用三个字符变量i、j、k表示甲队表示甲队a、b、c三人的对手三人的对手 用穷举法把所有的情况列出来,把用穷举法把所有的情况列出来,把a、b、c三三人对手是同一个人的情
18、况排除,再把人对手是同一个人的情况排除,再把a的对手的对手是是x,c的对手是的对手是x和和z的情况排除。的情况排除。1、简化问题、简化问题n1i5n1j52、稍复杂一点、稍复杂一点n1i5n1j3、再复杂一点、再复杂一点n1i5n1jij打印第打印第i行的空格行的空格打印第打印第i行的星号行的星号打印第打印第i行的换行符行的换行符4.6循环的中途退出循环的中途退出nbreak语句语句中止语句中止语句 功能功能:在循环语句和在循环语句和switch语句中语句中,终止并跳终止并跳出循环体或开关体出循环体或开关体 说明:说明:break只能只能终止并跳出终止并跳出的结构的结构Break只能只能用于用
19、于或或void main()int n;for(n=1;nn-1,则表明任意则表明任意i都不能整除都不能整除n,则则n是素数,否则是素数,否则n不是素数不是素数程序改进程序改进n为了提高程序的执行效率,缩小检验区间为了提高程序的执行效率,缩小检验区间检验区间:检验区间:2n-12sqrt(n)ncontinue语句语句中断语句中断语句 功能:结束本次循环,跳过循环体中尚未执行功能:结束本次循环,跳过循环体中尚未执行的语句,进行下一次是否执行循环体的判断的语句,进行下一次是否执行循环体的判断 仅用于循环语句中仅用于循环语句中void main()int n;for(n=1;n 输出能被输出能被3
20、和和7整除的三位正整数整除的三位正整数4.7算法举例算法举例n穷举法穷举法n递推法递推法n迭代法迭代法穷举法穷举法 基本思想:对问题的所有可能状态一一测试,基本思想:对问题的所有可能状态一一测试,直到找到解或将全部可能状态都测试过为止直到找到解或将全部可能状态都测试过为止 穷举法是一种重复型算法,通常使用循环穷举法是一种重复型算法,通常使用循环n穷举法的关键穷举法的关键 数学模型数学模型适宜进行穷举的数学模型适宜进行穷举的数学模型决定程序是否正确决定程序是否正确 穷举的范围穷举的范围明确的穷举终止条件明确的穷举终止条件决定穷举的效率,范围过大,则效率太低决定穷举的效率,范围过大,则效率太低百钱
21、买百鸡,这是一个经典的不定方百钱买百鸡,这是一个经典的不定方程的求解问题。其问题如下:公鸡程的求解问题。其问题如下:公鸡5元一只;母鸡元一只;母鸡3元一只;小鸡一元元一只;小鸡一元3只。问:用只。问:用100元钱买元钱买100只鸡,只鸡,公鸡、母鸡、小鸡各买多少只公鸡、母鸡、小鸡各买多少只?n题目分析:题目分析:设设:要买要买x只公鸡,只公鸡,y只母鸡,只母鸡,z只小鸡只小鸡 列出方程为:列出方程为:x+y+z=100 5x+3y+z/3=100531/30 x200y330z100 (z必须是必须是3的倍数的倍数)递推法递推法n基本思想基本思想 是从已知的初始条件出发,逐步推出题目所要是从已
22、知的初始条件出发,逐步推出题目所要求的各中间结果和最后结果的算法求的各中间结果和最后结果的算法1001ii10012ii!n求求n!n题目分析:题目分析:n!=1*2*3*n=n*(n-1)!;我们首先求出我们首先求出1!;计算!;计算2*1!,则推出,则推出2!;!;进一步推出进一步推出3!、!、4!n!打印出打印出Fibonacci数列的前数列的前20项项1 1 2 3 5 8 13F1F2F3)3()2(1)1(11221nFFFnFnFnnnf3=f1+f2f1=f2f2=f3迭代法迭代法n迭代法是常用的数值计算方法,所谓的迭迭代法是常用的数值计算方法,所谓的迭代是指重复执行一组语句,
23、在每次执行这代是指重复执行一组语句,在每次执行这组语句时,都从变量的原值推出它的一个组语句时,都从变量的原值推出它的一个新值新值利用牛顿迭代法求方程在利用牛顿迭代法求方程在1.5附近附近的根的根0634223xxxx0,f(x0)x1,0 x2,0 x1,f(x1)6342)(23xxxxf386)(2xxxfn在曲线上取一个初始点在曲线上取一个初始点(x0,f(x0),过点过点(x0,f(x0)作函数作函数f(x)曲线的切线与曲线的切线与x轴交轴交于于(x1,0)n则切线的斜率为:则切线的斜率为:f(x0)=f(x0)/(x0-x1),x1=x0-f(x0)/f(x0),n显然,所得到的显然
24、,所得到的x1更接近于方程的根更接近于方程的根n继续过点继续过点(x1,f(x1)作作f(x)的曲线的切线,的曲线的切线,与与x轴相交于轴相交于x2,则则x2=x1-f(x1)/f(x1),重复上述过程,可得迭代公式:重复上述过程,可得迭代公式:n当给定根的初始值当给定根的初始值x0和允许误差和允许误差后,就可以根据后,就可以根据以上迭代公式得到一个符合误差要求的近似实根以上迭代公式得到一个符合误差要求的近似实根6342)(23xxxxf386)(2xxxfn不要在不要在for、while后随便加后随便加;for(i=0;i100;i+);printf(%d ,i);n在循环体中不要任意修改循环变量在循环体中不要任意修改循环变量 for(i=0;i10;i+)sumsum+i;i=5;