3(循环结构).ppt
Lifang 20144.1C程序设计第第4章章 循环结构程序设计循环结构程序设计 顺序结构顺序结构 选择(分支)结构选择(分支)结构 循环结构循环结构一段有限时间内去做一件或一系列有规律的重复性事情一段有限时间内去做一件或一系列有规律的重复性事情循环循环。Lifang 20144.2C程序设计#include#includevoid main()float a,b,c,s,area;printf(请输入三角形的三条边请输入三角形的三条边 a,b,c:);scanf(%f,%f,%f,&a,&b,&c);if(a+bc&a+cb&b+ca)s=1.0/2*(a+b+c);area=sqrt(s*(s-a)*(s-b)*(s-c);printf(a=%.2f b=%.2f c=%.2fn,a,b,c);printf(s=%.2f area=%.2fn,s,area);else printf(此三条边不能构成三角形!此三条边不能构成三角形!n);4.1 4.1 引例引例实现求三角形面积题目的交互反复运行。实现求三角形面积题目的交互反复运行。while(a!=0|b!=0|c!=0)scanf(%f,%f,%f,&a,&b,&c);Lifang 20144.3C程序设计4.1 4.1 引例引例例例4-2 一行打印一行打印60个个*程序代码:程序代码:include void main()intint i;i;i=1;i=1;while(iwhile(i=60)=60)/*/*重复输出重复输出*6060次次循环循环*/printfprintf(“*”););i+i+;/*/*作用同前例中的作用同前例中的scanfscanf,使循环能结束使循环能结束*/printf(printf(“nn”););Lifang 20144.4C程序设计循环结构的组成:循环结构的组成:循环条件和循环体循环条件和循环体表达式表达式语句语句假假真真语句语句表达式表达式真真假假一段有限时间内去做一件或一系列有规律的重复性事情一段有限时间内去做一件或一系列有规律的重复性事情循环循环。Lifang 20144.5C程序设计C C 语言提供了语言提供了whilewhile、do-whiledo-while和和 for for 三种循环语句三种循环语句 while(e)s;while:do s;while(e);do-while:for(e1;e2;e3)s;for:Lifang 20144.6C程序设计例例:4-2 :4-2 计算计算 1+2+3+.+1001+2+3+.+100 。(用(用 while)while)P47P47 设设:n:n为数列项变量和循环控制变量,为数列项变量和循环控制变量,snmsnm为累加和变量为累加和变量 。#includevoid main()int n,sum;n=1;/为循环计数变量赋初值。为循环计数变量赋初值。sum=0;while(n100时时,循环结束。循环结束。sum=sum+n;n+;/n+为使循环结束的语句。为使循环结束的语句。printf(“sum=%d n”,sum);sum=385循循环环体体练习练习4-2:计算:计算12+22+102。Lifang 20144.7C程序设计 1)while1)while语句的循环体中一定要有使循环结束的语句,否语句的循环体中一定要有使循环结束的语句,否则一旦进入循环,循环永不结束,出现则一旦进入循环,循环永不结束,出现“死循环死循环”。编程时应避免出现这些情况。编程时应避免出现这些情况。2)while(1)2)while(1),条件永远为真,条件永远为真“死循环死循环”。3)while3)while语句的作用范围。循环体如果包含一个以上的语语句的作用范围。循环体如果包含一个以上的语句,应该用花括号括起来,否则句,应该用花括号括起来,否则whilewhile循环体的作用范围只到循环体的作用范围只到whilewhile后面的第一个分号处。后面的第一个分号处。4)”4)”;”的问题的问题使用使用whilewhile循环注意:循环注意:P46P46程序循环与否取决于循环条件判断表达式值的真与假,真循环,假不循环。程序循环与否取决于循环条件判断表达式值的真与假,真循环,假不循环。必须树立的概念:必须树立的概念:while(a1);a+;Lifang 20144.8C程序设计采用穷举法求解采用穷举法求解#include void main()int i=300,sum=0;/*设循环控制变量初值为300*/while(i0)sum=sum+x;scanf(“%f”,&x);例例4-6 4-6 依次输入一批正数,并求正数之和,当输入负数或依次输入一批正数,并求正数之和,当输入负数或0 0时时结束结束 (用(用do-while)do-while)P49P49#include void main()float x,sum;sum=0.0;scanf(“%f”,&x);do sum=sum+x;scanf(“%f”,&x);while(x0.0);printf(“sum=%fn”,sum);Lifang 20144.10C程序设计 1 1、do-do-whilewhile循环语句中,循环语句中,while(e)while(e)之后的分号不要忘写。之后的分号不要忘写。2 2、do-do-whilewhile循环语句中循环语句中,不管循环体是否为单一语句,习不管循环体是否为单一语句,习惯上都用花括号把它括起来,并把惯上都用花括号把它括起来,并把while(e)while(e)直接写在直接写在“”的后面,以免把的后面,以免把while(e)while(e)部分误认为一个新的部分误认为一个新的whilewhile循环的循环的开始。开始。注意:注意:Lifang 20144.11C程序设计#include#include void main()float n,s,t,pi;t=1;pi=1;n=1.0;s=1;do n=n+2;s=-s;/*求符号位s,正负号变化*/t=s*1/n;/*求一个数列项的值t*/pi=pi+t;/*累加t*/while(fabs(t)=1e-6);/*fabs(t)绝对值函数*/pi=pi*4;printf(“pi=%fn”,pi);例例4-74-7:利用公式如下公式求利用公式如下公式求的近似值,直到最后一项的绝对值的近似值,直到最后一项的绝对值小于小于1010-6-6为止。为止。P49P49 Lifang 20144.12C程序设计forfor语句是比 while 语句功能更强而且更加灵活的一种循环结构。4.4.for 循环语句循环语句n=0;while(n10)s;n+;while:e1:循环变量赋初值循环变量赋初值e2:循环条件判断循环条件判断e e3 3:改变循环变量值改变循环变量值for(e1;e2;e3)s;for:Lifang 20144.13C程序设计例例:4-2 :4-2 计算计算 1+2+3+.+1001+2+3+.+100 。(用(用for)for)P51P51#includevoid main()int n,sum;sum=0;for(n=1;n100时时,循环结束。循环结束。sum=sum+n;n+;/n+为使循环结束的语句。为使循环结束的语句。printf(“sum=%d n”,sum);循循环环体体Lifang 20144.14C程序设计1.e11.e1、e2e2、e3e3三个表达式均可省略,但其中的分号三个表达式均可省略,但其中的分号“;”;”不能省略。不能省略。此时此时,完全等同于完全等同于 while(1),无终止地执行循环体。,无终止地执行循环体。for(;).s;2.2.只省略表达式只省略表达式e2e2,即即 for(e1;e3)for(e1;e3),省略循环判断的条件,也将无终省略循环判断的条件,也将无终止地执行循环体。止地执行循环体。3.3.如果只有表达式如果只有表达式e2e2,即即 for(;e2;)for(;e2;),则完全等同于则完全等同于 while(e)while(e)语句。语句。n=0;for(;n=10;)sum=sum+n;n+;n=0;while(n2n2时时,F(n)=F(n-1)+F(n-2)F(n)=F(n-1)+F(n-2)即即:n=1,F(1)=1;n=1,F(1)=1;n=2,F(2)=1;n=2,F(2)=1;n=3,F(3)=F(2)+f(1)=2;n=3,F(3)=F(2)+f(1)=2;n=4,F(4)=F(3)+F(2)=3;n=4,F(4)=F(3)+F(2)=3;.n2,F(n)=F(n-1)+F(n-2)n2,F(n)=F(n-1)+F(n-2)。例例4-8 Fibonacci(4-8 Fibonacci(斐波纳契斐波纳契)数列问题:编写程序,打印其前数列问题:编写程序,打印其前2020项项(它是意大利数学家(它是意大利数学家FibonacciFibonacci提出的)。提出的)。P52#include“stdio.h”main()int n,f1=1,f2=1,f3;printf(“%10d%10d”,f1,f2);for(n=3;n=20;n+)f3=f1+f2;printf(“%10d”,f3);f1=f2;f2=f3;迭代问题:迭代问题:用循环来解决数学上的递推数列问题(由递推用循环来解决数学上的递推数列问题(由递推关系和初始条件确定的数列)关系和初始条件确定的数列)迭代的过程。迭代的过程。Lifang 20144.16C程序设计内内层层循循环环外外层层循循环环非法嵌套非法嵌套外外循循环环内内循循环环合法嵌套合法嵌套C C 语言的三种循环语句都可以相互嵌套语言的三种循环语句都可以相互嵌套,并且被嵌入的循环又可以嵌套并且被嵌入的循环又可以嵌套循环,称之为循环,称之为多重循环多重循环。循环嵌套的原则循环嵌套的原则:被嵌套的一定是一个完整的循环结构,即两个循:被嵌套的一定是一个完整的循环结构,即两个循环结构不能相互交叉。环结构不能相互交叉。4.5 4.5 循环嵌套(多重循环)循环嵌套(多重循环)Lifang 20144.17C程序设计循环嵌套的执行过程:循环嵌套的执行过程:例:打印(例:打印(1 1,1 1)(9 9,9 9)所构成的矩形区域中的每个)所构成的矩形区域中的每个整数坐标点对应的坐标。整数坐标点对应的坐标。注意:注意:注意:注意:嵌套循环的循环控制变量不可同名,嵌套循环的循环控制变量不可同名,嵌套循环的循环控制变量不可同名,嵌套循环的循环控制变量不可同名,并列循环的循环控制变量可以同名;并列循环的循环控制变量可以同名;并列循环的循环控制变量可以同名;并列循环的循环控制变量可以同名;#includemain()int i,j;for(i=1;i=9;i+)for(j=1;j=9;j+)printf(%d,%d),i,j);printf(n);练习:99乘法表(矩形、三角阵)Lifang 20144.18C程序设计例例4-11:4-11:百钱买百鸡问题百钱买百鸡问题:公鸡公鸡1 1只只5 5元,母鸡元,母鸡1 1只只3 3元,小鸡元,小鸡3 3只只1 1元。元。(穷举法穷举法)P55P55main()/*法二法二*/int x,y,z;for(x=0;x=20;x+)for(y=0;y=33;y+)z=100-x-y;if(15*x+9*y+z=300)printf(%d%d%dn,x,y,z);main()/*法一法一*/int x,y,z;for(x=0;x=100;x+)for(y=0;y=100;y+)for(z=0;z=100;z+)if(x+y+z=100&15x+9y+z=300)printf(“%d%d%dn”,x,y,z);改错改错:x+y+z=100&15*x+9*y+z=300运行次数:运行次数:106 已知:公鸡:已知:公鸡:X只;只;母鸡:母鸡:Y只;小鸡:只;小鸡:Z只只 方程:方程:X+Y+Z=100 5X+3Y+Z/3=100 15X+9Y+Z=300Lifang 20144.19C程序设计main()float t=1,s=0;int n=20,m,i;for(i=1;i=n;i+)t=1;for(m=1;m=i;m+)t*=m;s+=t;printf(“1!+2!+3!+.+n!=%en”,s);例例 :用:用forfor循环语句计算循环语句计算 1!+2!+3!+.+n!1!+2!+3!+.+n!。n n 循环控制变量;循环控制变量;s s 为累加和变量;为累加和变量;t t 为阶乘变量。为阶乘变量。1!+2!+3!+.+n!=2.56133e+018Lifang 20144.20C程序设计main()float t=1,s=0;int n=20,i;for(i=1;i=n;i+)t*=i;s+=t;printf(“1!+2!+3!+.+n!=%en”,s);例例4-9 4-9:用:用forfor循环语句计算循环语句计算 1!+2!+3!+.+n!1!+2!+3!+.+n!。P53P53n n 循环控制变量;循环控制变量;s s 为累加和变量;为累加和变量;t t 为阶乘变量。为阶乘变量。for(s=0,t=1,i=1;i=n;i+)t*=i;s+=t;for for 循环语句中的第一个和第三个表达式循环语句中的第一个和第三个表达式e1e1、e3e3可以是逗号表达式,可以是逗号表达式,e2e2一般不可以!一般不可以!Lifang 20144.21C程序设计 C C语言的三种循环,都是根据循环判断表达式为语言的三种循环,都是根据循环判断表达式为0 0时来控时来控制循环结束,这种结束是制循环结束,这种结束是正规结束正规结束。在实际应用中,有时还要求在循环的中途退出循环在实际应用中,有时还要求在循环的中途退出循环,这这是一种是一种非正规非正规的循环退出的循环退出可以用可以用break break、continuecontinue语句实语句实现。现。4.6 break、continue 语句语句Lifang 20144.22C程序设计for(;).break;while().break;do .break;while();功能:退出当前功能:退出当前循环循环或当前或当前switchswitch结构结构,不能用于其他语句不能用于其他语句。作用:跳出当前的作用:跳出当前的循环或循环或switchswitch语句转向它们之后的语句执行。语句转向它们之后的语句执行。1)break 1)break 语句语句注意:注意:若若break语句处于多重循环中,语句处于多重循环中,break语句只是跳出当前层循环。语句只是跳出当前层循环。Lifang 20144.23C程序设计例例4-124-12 韩信点兵:韩信有一队兵,他想知道有多少人,便让士韩信点兵:韩信有一队兵,他想知道有多少人,便让士兵排队报数:按从兵排队报数:按从1 1至至5 5报数,最末一个士兵报的数为报数,最末一个士兵报的数为1 1;按从;按从1 1至至6 6报数,最末一个士兵报的数为报数,最末一个士兵报的数为5 5;按从;按从1 1至至7 7报数,最末一个士兵报数,最末一个士兵报的数为报的数为4 4;最后再按从;最后再按从1 1至至1111报数,最末一个士兵报的数为报数,最末一个士兵报的数为1010。下面程序的主要功能是计算韩信至少有多少兵。下面程序的主要功能是计算韩信至少有多少兵。P56P56程序代码程序代码:#include void main()int x;for(x=1;x+)if(x%5=1&x%6=5&x%7=4&x%11=10)printf(x=%dn,x);break;Lifang 20144.24C程序设计例例4-134-13:编一个程序,判断一个数:编一个程序,判断一个数m m是否为素数。是否为素数。P57P57分析:分析:素数就是只能被素数就是只能被1 1和它们自身整除的数。判断一个数是不是素和它们自身整除的数。判断一个数是不是素数,是用此数之数,是用此数之 前的所有数来试除前的所有数来试除,看其是否能被整除看其是否能被整除,如果都不能被如果都不能被整除整除,则认为该数是素数,否则不是素数。则认为该数是素数,否则不是素数。#include main()int i,k;scanf(“%d”,&k);for(i=2;i=k-1;i+)if(k%i=0)break;if(i=k)printf(“%d”,k);Lifang 20144.25C程序设计例:编程,求出例:编程,求出2 2和和100100之间的素数。之间的素数。#include main()int i,k;for(k=3;k=100;k+)for(i=2;ik;i+)if(k%i=0)break;if(i=k)printf(“%d”,k);内循环外循环 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97跳出内循环体结束当前层循环Lifang 20144.26C程序设计功能功能:结束本次结束本次循环循环。只适用于循环。只适用于循环语句。语句。不能用于不能用于switchswitch及其及其它语句。它语句。作用:作用:结束结束本次本次循环转向下一次循环条件的判断。如果循环条件循环转向下一次循环条件的判断。如果循环条件的判断结果为真,则继续循环,的判断结果为真,则继续循环,否则结束循环。否则结束循环。2)continue语句语句 Lifang 20144.27C程序设计例例9 9:编一个程序。求输入的:编一个程序。求输入的1010个数中正数的个数及平均值。个数中正数的个数及平均值。P58P58main()int i,n=0;float sum=0,f;printf(“Enter a real number:n”);for(i=1;i=10;i+)scanf(“%f”,&f);if(f0)0)sum+=f;sum+=f;n+;n+;Lifang 20144.28C程序设计 gotogoto语句是一个无条件转向语句。语句是一个无条件转向语句。功能功能:将程序转移到指定的位置继续执行。:将程序转移到指定的位置继续执行。格式格式:gotogoto 语句标号;语句标号;4.7 goto语句语句语句标号:语句标号是一个标识符,它标识程序的一个特定位置。不能用整数做不能用整数做标号标号Lifang 20144.29C程序设计4.8 循环应用循环应用例例4-15 求两个非负整数的最大公约数。求两个非负整数的最大公约数。分析:分析:1.一般方法一般方法(略略)2.采用相除取余的迭代算法。采用相除取余的迭代算法。已知:两正整数已知:两正整数 x、y,两数的余数为两数的余数为 r,若设若设gcd()为求公约数函数为求公约数函数根据数学原理,则有:根据数学原理,则有:gcd(x,y)=gcd(y,r)如此反复迭代,直到第如此反复迭代,直到第r为为0,y即为最大公约数。即为最大公约数。例如:例如:(24,9)=(9,6)=(6,3)=(3,0)=3Lifang 20144.30C程序设计#include void main()int x,y,r;scanf(“%d%d”,&x,&y);while(y!=0)r=x%y;/*相除取余*/x=y;y=r;/*迭代改变循环条件变量y的值*/printf(“最大公约数最大公约数=%dn”,x);由此,可继续求出最小公倍数:由此,可继续求出最小公倍数:x*y/最大公约数最大公约数程序代码:程序代码:Lifang 20144.31C程序设计例例4-16 牛顿迭代法(切线法)牛顿迭代法(切线法)用曲线弧一端的切线来代替曲线弧,从而求出用曲线弧一端的切线来代替曲线弧,从而求出方程实根的近似值的方法。方程实根的近似值的方法。x0f(x0)f(x1)x1牛顿迭代公式:牛顿迭代公式:f(x0)=(0-f(x0)/(x1-f(x0)=(0-f(x0)/(x1-x0)x0)x1=x0-f(x0)/f(x0)x1=x0-f(x0)/f(x0)Lifang 20144.32C程序设计例例4-16 用牛顿迭代法求下面方程在用牛顿迭代法求下面方程在1.5 附近的根。附近的根。2x3-4x2+3x-6=0。精度为精度为1e-5#include#includemain()float x,x0,f,f1;x=1.5;dox0=x;f=(2*x0-4)*x0+3)*x0-6;f1=(6*x0-8)*x0+3;x=x0-f/f1;printf(“%fn”,x);/输出中间结果输出中间结果while(fabs(x-x0)1e-5);printf(The root of equation is%5.2fn,x);Lifang 20144.33C程序设计分析:分析:Ai=(f(xi)+f(xi+h)/2*hAREA=例例4-18 用等距梯形法计算定积分用等距梯形法计算定积分 ,f(x)=x2+12x+4,x 的取值范围是的取值范围是1,4。Lifang 20144.34C程序设计程序代码:程序代码:#include void main()float x,a,b,h,f1,f2,area;int i,n;scanf(“%f%f%d”,&a,&b,&n);h=(b-a)/n;/*等分等分*/area=0;x=a;f1=x*x+12*x+4;for(i=1;i=n;i+)x=x+h;f2=x*x+12*x+4;area=area+(f1+f2)/2*h;/梯形面积梯形面积 f1=f2;printf(“area=%.2fn”,area);Lifang 20144.35C程序设计例例4-19 4-19 生成两个生成两个(0909)的随机数的随机数,完成两个随机数的算术四则运算完成两个随机数的算术四则运算#include#include#includevoid main()char op;int a=1,b=2,c;srand(time(0);printf(本程序提供四种运算功能:本程序提供四种运算功能:+,-,*,/n);printf(请选择你要进行的运算:请选择你要进行的运算:);doop=getchar();/scanf()一样有这个问题一样有这个问题getchar();a=rand()%10;b=rand()%10;switch(op)case+:c=a+b;printf(%d%c%d=%dn,a,op,b,c);break;case-:c=a-b;printf(%d%c%d=%dn,a,op,b,c);break;case*:c=a*b;printf(%d%c%d=%dn,a,op,b,c);break;case/:c=a/b;printf(%d%c%d=%dn,a,op,b,c);break;default:printf(wrong charactern);break;while(op!=0);Lifang 20144.36C程序设计小小 结结vC语言提供了语言提供了while、do-while、for三种语句来实现循环结三种语句来实现循环结构。构。for语句功能最强,使用最多。语句功能最强,使用最多。for、while语句是先判断语句是先判断后执行循环体,后执行循环体,do-while则是执行一次循环体后才判断。则是执行一次循环体后才判断。vbreak语句用于结束其所在的语句用于结束其所在的switch分支结构或分支结构或while、do-while、for循环结构;循环结构;continue语句用于结束本次循环。语句用于结束本次循环。vgoto语句用于控制程序转向指定点执行,在结构化程序设计语句用于控制程序转向指定点执行,在结构化程序设计中要求有节制地使用中要求有节制地使用goto语句。语句。